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.
- checksums.yaml +4 -4
- data/lib/vis/rails/version.rb +1 -1
- data/vendor/assets/javascripts/vis.js +26 -26
- metadata +16 -85
- data/vendor/assets/vis/DataSet.js +0 -926
- data/vendor/assets/vis/DataView.js +0 -283
- data/vendor/assets/vis/graph/Edge.js +0 -957
- data/vendor/assets/vis/graph/Graph.js +0 -2291
- data/vendor/assets/vis/graph/Groups.js +0 -80
- data/vendor/assets/vis/graph/Images.js +0 -41
- data/vendor/assets/vis/graph/Node.js +0 -966
- data/vendor/assets/vis/graph/Popup.js +0 -132
- data/vendor/assets/vis/graph/css/graph-manipulation.css +0 -128
- data/vendor/assets/vis/graph/css/graph-navigation.css +0 -66
- data/vendor/assets/vis/graph/dotparser.js +0 -829
- data/vendor/assets/vis/graph/graphMixins/ClusterMixin.js +0 -1143
- data/vendor/assets/vis/graph/graphMixins/HierarchicalLayoutMixin.js +0 -311
- data/vendor/assets/vis/graph/graphMixins/ManipulationMixin.js +0 -576
- data/vendor/assets/vis/graph/graphMixins/MixinLoader.js +0 -199
- data/vendor/assets/vis/graph/graphMixins/NavigationMixin.js +0 -205
- data/vendor/assets/vis/graph/graphMixins/SectorsMixin.js +0 -552
- data/vendor/assets/vis/graph/graphMixins/SelectionMixin.js +0 -648
- data/vendor/assets/vis/graph/graphMixins/physics/BarnesHut.js +0 -398
- data/vendor/assets/vis/graph/graphMixins/physics/HierarchialRepulsion.js +0 -64
- data/vendor/assets/vis/graph/graphMixins/physics/PhysicsMixin.js +0 -697
- data/vendor/assets/vis/graph/graphMixins/physics/Repulsion.js +0 -66
- data/vendor/assets/vis/graph/img/acceptDeleteIcon.png +0 -0
- data/vendor/assets/vis/graph/img/addNodeIcon.png +0 -0
- data/vendor/assets/vis/graph/img/backIcon.png +0 -0
- data/vendor/assets/vis/graph/img/connectIcon.png +0 -0
- data/vendor/assets/vis/graph/img/cross.png +0 -0
- data/vendor/assets/vis/graph/img/cross2.png +0 -0
- data/vendor/assets/vis/graph/img/deleteIcon.png +0 -0
- data/vendor/assets/vis/graph/img/downArrow.png +0 -0
- data/vendor/assets/vis/graph/img/editIcon.png +0 -0
- data/vendor/assets/vis/graph/img/leftArrow.png +0 -0
- data/vendor/assets/vis/graph/img/minus.png +0 -0
- data/vendor/assets/vis/graph/img/plus.png +0 -0
- data/vendor/assets/vis/graph/img/rightArrow.png +0 -0
- data/vendor/assets/vis/graph/img/upArrow.png +0 -0
- data/vendor/assets/vis/graph/img/zoomExtends.png +0 -0
- data/vendor/assets/vis/graph/shapes.js +0 -225
- data/vendor/assets/vis/graph3d/Graph3d.js +0 -3306
- data/vendor/assets/vis/module/exports.js +0 -65
- data/vendor/assets/vis/module/header.js +0 -24
- data/vendor/assets/vis/module/imports.js +0 -31
- data/vendor/assets/vis/shim.js +0 -252
- data/vendor/assets/vis/timeline/Range.js +0 -532
- data/vendor/assets/vis/timeline/TimeStep.js +0 -466
- data/vendor/assets/vis/timeline/Timeline.js +0 -851
- data/vendor/assets/vis/timeline/component/Component.js +0 -52
- data/vendor/assets/vis/timeline/component/CurrentTime.js +0 -128
- data/vendor/assets/vis/timeline/component/CustomTime.js +0 -182
- data/vendor/assets/vis/timeline/component/Group.js +0 -470
- data/vendor/assets/vis/timeline/component/ItemSet.js +0 -1332
- data/vendor/assets/vis/timeline/component/TimeAxis.js +0 -389
- data/vendor/assets/vis/timeline/component/css/animation.css +0 -33
- data/vendor/assets/vis/timeline/component/css/currenttime.css +0 -5
- data/vendor/assets/vis/timeline/component/css/customtime.css +0 -6
- data/vendor/assets/vis/timeline/component/css/item.css +0 -107
- data/vendor/assets/vis/timeline/component/css/itemset.css +0 -33
- data/vendor/assets/vis/timeline/component/css/labelset.css +0 -36
- data/vendor/assets/vis/timeline/component/css/panel.css +0 -71
- data/vendor/assets/vis/timeline/component/css/timeaxis.css +0 -48
- data/vendor/assets/vis/timeline/component/css/timeline.css +0 -2
- data/vendor/assets/vis/timeline/component/item/Item.js +0 -139
- data/vendor/assets/vis/timeline/component/item/ItemBox.js +0 -230
- data/vendor/assets/vis/timeline/component/item/ItemPoint.js +0 -190
- data/vendor/assets/vis/timeline/component/item/ItemRange.js +0 -262
- data/vendor/assets/vis/timeline/component/item/ItemRangeOverflow.js +0 -57
- data/vendor/assets/vis/timeline/img/delete.png +0 -0
- data/vendor/assets/vis/timeline/stack.js +0 -112
- data/vendor/assets/vis/util.js +0 -990
@@ -1,57 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* @constructor ItemRangeOverflow
|
3
|
-
* @extends ItemRange
|
4
|
-
* @param {Object} data Object containing parameters start, end
|
5
|
-
* content, className.
|
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
|
10
|
-
*/
|
11
|
-
function ItemRangeOverflow (data, conversion, options) {
|
12
|
-
this.props = {
|
13
|
-
content: {
|
14
|
-
left: 0,
|
15
|
-
width: 0
|
16
|
-
}
|
17
|
-
};
|
18
|
-
|
19
|
-
ItemRange.call(this, data, conversion, options);
|
20
|
-
}
|
21
|
-
|
22
|
-
ItemRangeOverflow.prototype = new ItemRange (null, null, null);
|
23
|
-
|
24
|
-
ItemRangeOverflow.prototype.baseClassName = 'item rangeoverflow';
|
25
|
-
|
26
|
-
/**
|
27
|
-
* Reposition the item horizontally
|
28
|
-
* @Override
|
29
|
-
*/
|
30
|
-
ItemRangeOverflow.prototype.repositionX = function() {
|
31
|
-
var parentWidth = this.parent.width,
|
32
|
-
start = this.conversion.toScreen(this.data.start),
|
33
|
-
end = this.conversion.toScreen(this.data.end),
|
34
|
-
contentLeft;
|
35
|
-
|
36
|
-
// limit the width of the this, as browsers cannot draw very wide divs
|
37
|
-
if (start < -parentWidth) {
|
38
|
-
start = -parentWidth;
|
39
|
-
}
|
40
|
-
if (end > 2 * parentWidth) {
|
41
|
-
end = 2 * parentWidth;
|
42
|
-
}
|
43
|
-
|
44
|
-
// when range exceeds left of the window, position the contents at the left of the visible area
|
45
|
-
contentLeft = Math.max(-start, 0);
|
46
|
-
|
47
|
-
this.left = start;
|
48
|
-
var boxWidth = Math.max(end - start, 1);
|
49
|
-
this.width = boxWidth + this.props.content.width;
|
50
|
-
// Note: The calculation of width is an optimistic calculation, giving
|
51
|
-
// a width which will not change when moving the Timeline
|
52
|
-
// So no restacking needed, which is nicer for the eye
|
53
|
-
|
54
|
-
this.dom.box.style.left = this.left + 'px';
|
55
|
-
this.dom.box.style.width = boxWidth + 'px';
|
56
|
-
this.dom.content.style.left = contentLeft + 'px';
|
57
|
-
};
|
Binary file
|
@@ -1,112 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* Utility functions for ordering and stacking of items
|
3
|
-
*/
|
4
|
-
var stack = {};
|
5
|
-
|
6
|
-
/**
|
7
|
-
* Order items by their start data
|
8
|
-
* @param {Item[]} items
|
9
|
-
*/
|
10
|
-
stack.orderByStart = function(items) {
|
11
|
-
items.sort(function (a, b) {
|
12
|
-
return a.data.start - b.data.start;
|
13
|
-
});
|
14
|
-
};
|
15
|
-
|
16
|
-
/**
|
17
|
-
* Order items by their end date. If they have no end date, their start date
|
18
|
-
* is used.
|
19
|
-
* @param {Item[]} items
|
20
|
-
*/
|
21
|
-
stack.orderByEnd = function(items) {
|
22
|
-
items.sort(function (a, b) {
|
23
|
-
var aTime = ('end' in a.data) ? a.data.end : a.data.start,
|
24
|
-
bTime = ('end' in b.data) ? b.data.end : b.data.start;
|
25
|
-
|
26
|
-
return aTime - bTime;
|
27
|
-
});
|
28
|
-
};
|
29
|
-
|
30
|
-
/**
|
31
|
-
* Adjust vertical positions of the items such that they don't overlap each
|
32
|
-
* other.
|
33
|
-
* @param {Item[]} items
|
34
|
-
* All visible items
|
35
|
-
* @param {{item: number, axis: number}} margin
|
36
|
-
* Margins between items and between items and the axis.
|
37
|
-
* @param {boolean} [force=false]
|
38
|
-
* If true, all items will be repositioned. If false (default), only
|
39
|
-
* items having a top===null will be re-stacked
|
40
|
-
*/
|
41
|
-
stack.stack = function(items, margin, force) {
|
42
|
-
var i, iMax;
|
43
|
-
|
44
|
-
if (force) {
|
45
|
-
// reset top position of all items
|
46
|
-
for (i = 0, iMax = items.length; i < iMax; i++) {
|
47
|
-
items[i].top = null;
|
48
|
-
}
|
49
|
-
}
|
50
|
-
|
51
|
-
// calculate new, non-overlapping positions
|
52
|
-
for (i = 0, iMax = items.length; i < iMax; i++) {
|
53
|
-
var item = items[i];
|
54
|
-
if (item.top === null) {
|
55
|
-
// initialize top position
|
56
|
-
item.top = margin.axis;
|
57
|
-
|
58
|
-
do {
|
59
|
-
// TODO: optimize checking for overlap. when there is a gap without items,
|
60
|
-
// you only need to check for items from the next item on, not from zero
|
61
|
-
var collidingItem = null;
|
62
|
-
for (var j = 0, jj = items.length; j < jj; j++) {
|
63
|
-
var other = items[j];
|
64
|
-
if (other.top !== null && other !== item && stack.collision(item, other, margin.item)) {
|
65
|
-
collidingItem = other;
|
66
|
-
break;
|
67
|
-
}
|
68
|
-
}
|
69
|
-
|
70
|
-
if (collidingItem != null) {
|
71
|
-
// There is a collision. Reposition the items above the colliding element
|
72
|
-
item.top = collidingItem.top + collidingItem.height + margin.item;
|
73
|
-
}
|
74
|
-
} while (collidingItem);
|
75
|
-
}
|
76
|
-
}
|
77
|
-
};
|
78
|
-
|
79
|
-
/**
|
80
|
-
* Adjust vertical positions of the items without stacking them
|
81
|
-
* @param {Item[]} items
|
82
|
-
* All visible items
|
83
|
-
* @param {{item: number, axis: number}} margin
|
84
|
-
* Margins between items and between items and the axis.
|
85
|
-
*/
|
86
|
-
stack.nostack = function(items, margin) {
|
87
|
-
var i, iMax;
|
88
|
-
|
89
|
-
// reset top position of all items
|
90
|
-
for (i = 0, iMax = items.length; i < iMax; i++) {
|
91
|
-
items[i].top = margin.axis;
|
92
|
-
}
|
93
|
-
};
|
94
|
-
|
95
|
-
/**
|
96
|
-
* Test if the two provided items collide
|
97
|
-
* The items must have parameters left, width, top, and height.
|
98
|
-
* @param {Item} a The first item
|
99
|
-
* @param {Item} b The second item
|
100
|
-
* @param {Number} margin A minimum required margin.
|
101
|
-
* If margin is provided, the two items will be
|
102
|
-
* marked colliding when they overlap or
|
103
|
-
* when the margin between the two is smaller than
|
104
|
-
* the requested margin.
|
105
|
-
* @return {boolean} true if a and b collide, else false
|
106
|
-
*/
|
107
|
-
stack.collision = function(a, b, margin) {
|
108
|
-
return ((a.left - margin) < (b.left + b.width) &&
|
109
|
-
(a.left + a.width + margin) > b.left &&
|
110
|
-
(a.top - margin) < (b.top + b.height) &&
|
111
|
-
(a.top + a.height + margin) > b.top);
|
112
|
-
};
|
data/vendor/assets/vis/util.js
DELETED
@@ -1,990 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* utility functions
|
3
|
-
*/
|
4
|
-
var util = {};
|
5
|
-
|
6
|
-
/**
|
7
|
-
* Test whether given object is a number
|
8
|
-
* @param {*} object
|
9
|
-
* @return {Boolean} isNumber
|
10
|
-
*/
|
11
|
-
util.isNumber = function(object) {
|
12
|
-
return (object instanceof Number || typeof object == 'number');
|
13
|
-
};
|
14
|
-
|
15
|
-
/**
|
16
|
-
* Test whether given object is a string
|
17
|
-
* @param {*} object
|
18
|
-
* @return {Boolean} isString
|
19
|
-
*/
|
20
|
-
util.isString = function(object) {
|
21
|
-
return (object instanceof String || typeof object == 'string');
|
22
|
-
};
|
23
|
-
|
24
|
-
/**
|
25
|
-
* Test whether given object is a Date, or a String containing a Date
|
26
|
-
* @param {Date | String} object
|
27
|
-
* @return {Boolean} isDate
|
28
|
-
*/
|
29
|
-
util.isDate = function(object) {
|
30
|
-
if (object instanceof Date) {
|
31
|
-
return true;
|
32
|
-
}
|
33
|
-
else if (util.isString(object)) {
|
34
|
-
// test whether this string contains a date
|
35
|
-
var match = ASPDateRegex.exec(object);
|
36
|
-
if (match) {
|
37
|
-
return true;
|
38
|
-
}
|
39
|
-
else if (!isNaN(Date.parse(object))) {
|
40
|
-
return true;
|
41
|
-
}
|
42
|
-
}
|
43
|
-
|
44
|
-
return false;
|
45
|
-
};
|
46
|
-
|
47
|
-
/**
|
48
|
-
* Test whether given object is an instance of google.visualization.DataTable
|
49
|
-
* @param {*} object
|
50
|
-
* @return {Boolean} isDataTable
|
51
|
-
*/
|
52
|
-
util.isDataTable = function(object) {
|
53
|
-
return (typeof (google) !== 'undefined') &&
|
54
|
-
(google.visualization) &&
|
55
|
-
(google.visualization.DataTable) &&
|
56
|
-
(object instanceof google.visualization.DataTable);
|
57
|
-
};
|
58
|
-
|
59
|
-
/**
|
60
|
-
* Create a semi UUID
|
61
|
-
* source: http://stackoverflow.com/a/105074/1262753
|
62
|
-
* @return {String} uuid
|
63
|
-
*/
|
64
|
-
util.randomUUID = function() {
|
65
|
-
var S4 = function () {
|
66
|
-
return Math.floor(
|
67
|
-
Math.random() * 0x10000 /* 65536 */
|
68
|
-
).toString(16);
|
69
|
-
};
|
70
|
-
|
71
|
-
return (
|
72
|
-
S4() + S4() + '-' +
|
73
|
-
S4() + '-' +
|
74
|
-
S4() + '-' +
|
75
|
-
S4() + '-' +
|
76
|
-
S4() + S4() + S4()
|
77
|
-
);
|
78
|
-
};
|
79
|
-
|
80
|
-
/**
|
81
|
-
* Extend object a with the properties of object b or a series of objects
|
82
|
-
* Only properties with defined values are copied
|
83
|
-
* @param {Object} a
|
84
|
-
* @param {... Object} b
|
85
|
-
* @return {Object} a
|
86
|
-
*/
|
87
|
-
util.extend = function (a, b) {
|
88
|
-
for (var i = 1, len = arguments.length; i < len; i++) {
|
89
|
-
var other = arguments[i];
|
90
|
-
for (var prop in other) {
|
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)) {
|
119
|
-
a[prop] = other[prop];
|
120
|
-
}
|
121
|
-
}
|
122
|
-
}
|
123
|
-
|
124
|
-
return a;
|
125
|
-
};
|
126
|
-
|
127
|
-
/**
|
128
|
-
* Deep extend an object a with the properties of object b
|
129
|
-
* @param {Object} a
|
130
|
-
* @param {Object} b
|
131
|
-
* @returns {Object}
|
132
|
-
*/
|
133
|
-
util.deepExtend = function(a, b) {
|
134
|
-
// TODO: add support for Arrays to deepExtend
|
135
|
-
if (Array.isArray(b)) {
|
136
|
-
throw new TypeError('Arrays are not supported by deepExtend');
|
137
|
-
}
|
138
|
-
|
139
|
-
for (var prop in b) {
|
140
|
-
if (b.hasOwnProperty(prop)) {
|
141
|
-
if (b[prop] && b[prop].constructor === Object) {
|
142
|
-
if (a[prop] === undefined) {
|
143
|
-
a[prop] = {};
|
144
|
-
}
|
145
|
-
if (a[prop].constructor === Object) {
|
146
|
-
util.deepExtend(a[prop], b[prop]);
|
147
|
-
}
|
148
|
-
else {
|
149
|
-
a[prop] = b[prop];
|
150
|
-
}
|
151
|
-
} else if (Array.isArray(b[prop])) {
|
152
|
-
throw new TypeError('Arrays are not supported by deepExtend');
|
153
|
-
} else {
|
154
|
-
a[prop] = b[prop];
|
155
|
-
}
|
156
|
-
}
|
157
|
-
}
|
158
|
-
return a;
|
159
|
-
};
|
160
|
-
|
161
|
-
/**
|
162
|
-
* Test whether all elements in two arrays are equal.
|
163
|
-
* @param {Array} a
|
164
|
-
* @param {Array} b
|
165
|
-
* @return {boolean} Returns true if both arrays have the same length and same
|
166
|
-
* elements.
|
167
|
-
*/
|
168
|
-
util.equalArray = function (a, b) {
|
169
|
-
if (a.length != b.length) return false;
|
170
|
-
|
171
|
-
for (var i = 0, len = a.length; i < len; i++) {
|
172
|
-
if (a[i] != b[i]) return false;
|
173
|
-
}
|
174
|
-
|
175
|
-
return true;
|
176
|
-
};
|
177
|
-
|
178
|
-
/**
|
179
|
-
* Convert an object to another type
|
180
|
-
* @param {Boolean | Number | String | Date | Moment | Null | undefined} object
|
181
|
-
* @param {String | undefined} type Name of the type. Available types:
|
182
|
-
* 'Boolean', 'Number', 'String',
|
183
|
-
* 'Date', 'Moment', ISODate', 'ASPDate'.
|
184
|
-
* @return {*} object
|
185
|
-
* @throws Error
|
186
|
-
*/
|
187
|
-
util.convert = function(object, type) {
|
188
|
-
var match;
|
189
|
-
|
190
|
-
if (object === undefined) {
|
191
|
-
return undefined;
|
192
|
-
}
|
193
|
-
if (object === null) {
|
194
|
-
return null;
|
195
|
-
}
|
196
|
-
|
197
|
-
if (!type) {
|
198
|
-
return object;
|
199
|
-
}
|
200
|
-
if (!(typeof type === 'string') && !(type instanceof String)) {
|
201
|
-
throw new Error('Type must be a string');
|
202
|
-
}
|
203
|
-
|
204
|
-
//noinspection FallthroughInSwitchStatementJS
|
205
|
-
switch (type) {
|
206
|
-
case 'boolean':
|
207
|
-
case 'Boolean':
|
208
|
-
return Boolean(object);
|
209
|
-
|
210
|
-
case 'number':
|
211
|
-
case 'Number':
|
212
|
-
return Number(object.valueOf());
|
213
|
-
|
214
|
-
case 'string':
|
215
|
-
case 'String':
|
216
|
-
return String(object);
|
217
|
-
|
218
|
-
case 'Date':
|
219
|
-
if (util.isNumber(object)) {
|
220
|
-
return new Date(object);
|
221
|
-
}
|
222
|
-
if (object instanceof Date) {
|
223
|
-
return new Date(object.valueOf());
|
224
|
-
}
|
225
|
-
else if (moment.isMoment(object)) {
|
226
|
-
return new Date(object.valueOf());
|
227
|
-
}
|
228
|
-
if (util.isString(object)) {
|
229
|
-
match = ASPDateRegex.exec(object);
|
230
|
-
if (match) {
|
231
|
-
// object is an ASP date
|
232
|
-
return new Date(Number(match[1])); // parse number
|
233
|
-
}
|
234
|
-
else {
|
235
|
-
return moment(object).toDate(); // parse string
|
236
|
-
}
|
237
|
-
}
|
238
|
-
else {
|
239
|
-
throw new Error(
|
240
|
-
'Cannot convert object of type ' + util.getType(object) +
|
241
|
-
' to type Date');
|
242
|
-
}
|
243
|
-
|
244
|
-
case 'Moment':
|
245
|
-
if (util.isNumber(object)) {
|
246
|
-
return moment(object);
|
247
|
-
}
|
248
|
-
if (object instanceof Date) {
|
249
|
-
return moment(object.valueOf());
|
250
|
-
}
|
251
|
-
else if (moment.isMoment(object)) {
|
252
|
-
return moment(object);
|
253
|
-
}
|
254
|
-
if (util.isString(object)) {
|
255
|
-
match = ASPDateRegex.exec(object);
|
256
|
-
if (match) {
|
257
|
-
// object is an ASP date
|
258
|
-
return moment(Number(match[1])); // parse number
|
259
|
-
}
|
260
|
-
else {
|
261
|
-
return moment(object); // parse string
|
262
|
-
}
|
263
|
-
}
|
264
|
-
else {
|
265
|
-
throw new Error(
|
266
|
-
'Cannot convert object of type ' + util.getType(object) +
|
267
|
-
' to type Date');
|
268
|
-
}
|
269
|
-
|
270
|
-
case 'ISODate':
|
271
|
-
if (util.isNumber(object)) {
|
272
|
-
return new Date(object);
|
273
|
-
}
|
274
|
-
else if (object instanceof Date) {
|
275
|
-
return object.toISOString();
|
276
|
-
}
|
277
|
-
else if (moment.isMoment(object)) {
|
278
|
-
return object.toDate().toISOString();
|
279
|
-
}
|
280
|
-
else if (util.isString(object)) {
|
281
|
-
match = ASPDateRegex.exec(object);
|
282
|
-
if (match) {
|
283
|
-
// object is an ASP date
|
284
|
-
return new Date(Number(match[1])).toISOString(); // parse number
|
285
|
-
}
|
286
|
-
else {
|
287
|
-
return new Date(object).toISOString(); // parse string
|
288
|
-
}
|
289
|
-
}
|
290
|
-
else {
|
291
|
-
throw new Error(
|
292
|
-
'Cannot convert object of type ' + util.getType(object) +
|
293
|
-
' to type ISODate');
|
294
|
-
}
|
295
|
-
|
296
|
-
case 'ASPDate':
|
297
|
-
if (util.isNumber(object)) {
|
298
|
-
return '/Date(' + object + ')/';
|
299
|
-
}
|
300
|
-
else if (object instanceof Date) {
|
301
|
-
return '/Date(' + object.valueOf() + ')/';
|
302
|
-
}
|
303
|
-
else if (util.isString(object)) {
|
304
|
-
match = ASPDateRegex.exec(object);
|
305
|
-
var value;
|
306
|
-
if (match) {
|
307
|
-
// object is an ASP date
|
308
|
-
value = new Date(Number(match[1])).valueOf(); // parse number
|
309
|
-
}
|
310
|
-
else {
|
311
|
-
value = new Date(object).valueOf(); // parse string
|
312
|
-
}
|
313
|
-
return '/Date(' + value + ')/';
|
314
|
-
}
|
315
|
-
else {
|
316
|
-
throw new Error(
|
317
|
-
'Cannot convert object of type ' + util.getType(object) +
|
318
|
-
' to type ASPDate');
|
319
|
-
}
|
320
|
-
|
321
|
-
default:
|
322
|
-
throw new Error('Unknown type "' + type + '"');
|
323
|
-
}
|
324
|
-
};
|
325
|
-
|
326
|
-
// parse ASP.Net Date pattern,
|
327
|
-
// for example '/Date(1198908717056)/' or '/Date(1198908717056-0700)/'
|
328
|
-
// code from http://momentjs.com/
|
329
|
-
var ASPDateRegex = /^\/?Date\((\-?\d+)/i;
|
330
|
-
|
331
|
-
/**
|
332
|
-
* Get the type of an object, for example util.getType([]) returns 'Array'
|
333
|
-
* @param {*} object
|
334
|
-
* @return {String} type
|
335
|
-
*/
|
336
|
-
util.getType = function(object) {
|
337
|
-
var type = typeof object;
|
338
|
-
|
339
|
-
if (type == 'object') {
|
340
|
-
if (object == null) {
|
341
|
-
return 'null';
|
342
|
-
}
|
343
|
-
if (object instanceof Boolean) {
|
344
|
-
return 'Boolean';
|
345
|
-
}
|
346
|
-
if (object instanceof Number) {
|
347
|
-
return 'Number';
|
348
|
-
}
|
349
|
-
if (object instanceof String) {
|
350
|
-
return 'String';
|
351
|
-
}
|
352
|
-
if (object instanceof Array) {
|
353
|
-
return 'Array';
|
354
|
-
}
|
355
|
-
if (object instanceof Date) {
|
356
|
-
return 'Date';
|
357
|
-
}
|
358
|
-
return 'Object';
|
359
|
-
}
|
360
|
-
else if (type == 'number') {
|
361
|
-
return 'Number';
|
362
|
-
}
|
363
|
-
else if (type == 'boolean') {
|
364
|
-
return 'Boolean';
|
365
|
-
}
|
366
|
-
else if (type == 'string') {
|
367
|
-
return 'String';
|
368
|
-
}
|
369
|
-
|
370
|
-
return type;
|
371
|
-
};
|
372
|
-
|
373
|
-
/**
|
374
|
-
* Retrieve the absolute left value of a DOM element
|
375
|
-
* @param {Element} elem A dom element, for example a div
|
376
|
-
* @return {number} left The absolute left position of this element
|
377
|
-
* in the browser page.
|
378
|
-
*/
|
379
|
-
util.getAbsoluteLeft = function(elem) {
|
380
|
-
var doc = document.documentElement;
|
381
|
-
var body = document.body;
|
382
|
-
|
383
|
-
var left = elem.offsetLeft;
|
384
|
-
var e = elem.offsetParent;
|
385
|
-
while (e != null && e != body && e != doc) {
|
386
|
-
left += e.offsetLeft;
|
387
|
-
left -= e.scrollLeft;
|
388
|
-
e = e.offsetParent;
|
389
|
-
}
|
390
|
-
return left;
|
391
|
-
};
|
392
|
-
|
393
|
-
/**
|
394
|
-
* Retrieve the absolute top value of a DOM element
|
395
|
-
* @param {Element} elem A dom element, for example a div
|
396
|
-
* @return {number} top The absolute top position of this element
|
397
|
-
* in the browser page.
|
398
|
-
*/
|
399
|
-
util.getAbsoluteTop = function(elem) {
|
400
|
-
var doc = document.documentElement;
|
401
|
-
var body = document.body;
|
402
|
-
|
403
|
-
var top = elem.offsetTop;
|
404
|
-
var e = elem.offsetParent;
|
405
|
-
while (e != null && e != body && e != doc) {
|
406
|
-
top += e.offsetTop;
|
407
|
-
top -= e.scrollTop;
|
408
|
-
e = e.offsetParent;
|
409
|
-
}
|
410
|
-
return top;
|
411
|
-
};
|
412
|
-
|
413
|
-
/**
|
414
|
-
* Get the absolute, vertical mouse position from an event.
|
415
|
-
* @param {Event} event
|
416
|
-
* @return {Number} pageY
|
417
|
-
*/
|
418
|
-
util.getPageY = function(event) {
|
419
|
-
if ('pageY' in event) {
|
420
|
-
return event.pageY;
|
421
|
-
}
|
422
|
-
else {
|
423
|
-
var clientY;
|
424
|
-
if (('targetTouches' in event) && event.targetTouches.length) {
|
425
|
-
clientY = event.targetTouches[0].clientY;
|
426
|
-
}
|
427
|
-
else {
|
428
|
-
clientY = event.clientY;
|
429
|
-
}
|
430
|
-
|
431
|
-
var doc = document.documentElement;
|
432
|
-
var body = document.body;
|
433
|
-
return clientY +
|
434
|
-
( doc && doc.scrollTop || body && body.scrollTop || 0 ) -
|
435
|
-
( doc && doc.clientTop || body && body.clientTop || 0 );
|
436
|
-
}
|
437
|
-
};
|
438
|
-
|
439
|
-
/**
|
440
|
-
* Get the absolute, horizontal mouse position from an event.
|
441
|
-
* @param {Event} event
|
442
|
-
* @return {Number} pageX
|
443
|
-
*/
|
444
|
-
util.getPageX = function(event) {
|
445
|
-
if ('pageY' in event) {
|
446
|
-
return event.pageX;
|
447
|
-
}
|
448
|
-
else {
|
449
|
-
var clientX;
|
450
|
-
if (('targetTouches' in event) && event.targetTouches.length) {
|
451
|
-
clientX = event.targetTouches[0].clientX;
|
452
|
-
}
|
453
|
-
else {
|
454
|
-
clientX = event.clientX;
|
455
|
-
}
|
456
|
-
|
457
|
-
var doc = document.documentElement;
|
458
|
-
var body = document.body;
|
459
|
-
return clientX +
|
460
|
-
( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) -
|
461
|
-
( doc && doc.clientLeft || body && body.clientLeft || 0 );
|
462
|
-
}
|
463
|
-
};
|
464
|
-
|
465
|
-
/**
|
466
|
-
* add a className to the given elements style
|
467
|
-
* @param {Element} elem
|
468
|
-
* @param {String} className
|
469
|
-
*/
|
470
|
-
util.addClassName = function(elem, className) {
|
471
|
-
var classes = elem.className.split(' ');
|
472
|
-
if (classes.indexOf(className) == -1) {
|
473
|
-
classes.push(className); // add the class to the array
|
474
|
-
elem.className = classes.join(' ');
|
475
|
-
}
|
476
|
-
};
|
477
|
-
|
478
|
-
/**
|
479
|
-
* add a className to the given elements style
|
480
|
-
* @param {Element} elem
|
481
|
-
* @param {String} className
|
482
|
-
*/
|
483
|
-
util.removeClassName = function(elem, className) {
|
484
|
-
var classes = elem.className.split(' ');
|
485
|
-
var index = classes.indexOf(className);
|
486
|
-
if (index != -1) {
|
487
|
-
classes.splice(index, 1); // remove the class from the array
|
488
|
-
elem.className = classes.join(' ');
|
489
|
-
}
|
490
|
-
};
|
491
|
-
|
492
|
-
/**
|
493
|
-
* For each method for both arrays and objects.
|
494
|
-
* In case of an array, the built-in Array.forEach() is applied.
|
495
|
-
* In case of an Object, the method loops over all properties of the object.
|
496
|
-
* @param {Object | Array} object An Object or Array
|
497
|
-
* @param {function} callback Callback method, called for each item in
|
498
|
-
* the object or array with three parameters:
|
499
|
-
* callback(value, index, object)
|
500
|
-
*/
|
501
|
-
util.forEach = function(object, callback) {
|
502
|
-
var i,
|
503
|
-
len;
|
504
|
-
if (object instanceof Array) {
|
505
|
-
// array
|
506
|
-
for (i = 0, len = object.length; i < len; i++) {
|
507
|
-
callback(object[i], i, object);
|
508
|
-
}
|
509
|
-
}
|
510
|
-
else {
|
511
|
-
// object
|
512
|
-
for (i in object) {
|
513
|
-
if (object.hasOwnProperty(i)) {
|
514
|
-
callback(object[i], i, object);
|
515
|
-
}
|
516
|
-
}
|
517
|
-
}
|
518
|
-
};
|
519
|
-
|
520
|
-
/**
|
521
|
-
* Convert an object into an array: all objects properties are put into the
|
522
|
-
* array. The resulting array is unordered.
|
523
|
-
* @param {Object} object
|
524
|
-
* @param {Array} array
|
525
|
-
*/
|
526
|
-
util.toArray = function(object) {
|
527
|
-
var array = [];
|
528
|
-
|
529
|
-
for (var prop in object) {
|
530
|
-
if (object.hasOwnProperty(prop)) array.push(object[prop]);
|
531
|
-
}
|
532
|
-
|
533
|
-
return array;
|
534
|
-
}
|
535
|
-
|
536
|
-
/**
|
537
|
-
* Update a property in an object
|
538
|
-
* @param {Object} object
|
539
|
-
* @param {String} key
|
540
|
-
* @param {*} value
|
541
|
-
* @return {Boolean} changed
|
542
|
-
*/
|
543
|
-
util.updateProperty = function(object, key, value) {
|
544
|
-
if (object[key] !== value) {
|
545
|
-
object[key] = value;
|
546
|
-
return true;
|
547
|
-
}
|
548
|
-
else {
|
549
|
-
return false;
|
550
|
-
}
|
551
|
-
};
|
552
|
-
|
553
|
-
/**
|
554
|
-
* Add and event listener. Works for all browsers
|
555
|
-
* @param {Element} element An html element
|
556
|
-
* @param {string} action The action, for example "click",
|
557
|
-
* without the prefix "on"
|
558
|
-
* @param {function} listener The callback function to be executed
|
559
|
-
* @param {boolean} [useCapture]
|
560
|
-
*/
|
561
|
-
util.addEventListener = function(element, action, listener, useCapture) {
|
562
|
-
if (element.addEventListener) {
|
563
|
-
if (useCapture === undefined)
|
564
|
-
useCapture = false;
|
565
|
-
|
566
|
-
if (action === "mousewheel" && navigator.userAgent.indexOf("Firefox") >= 0) {
|
567
|
-
action = "DOMMouseScroll"; // For Firefox
|
568
|
-
}
|
569
|
-
|
570
|
-
element.addEventListener(action, listener, useCapture);
|
571
|
-
} else {
|
572
|
-
element.attachEvent("on" + action, listener); // IE browsers
|
573
|
-
}
|
574
|
-
};
|
575
|
-
|
576
|
-
/**
|
577
|
-
* Remove an event listener from an element
|
578
|
-
* @param {Element} element An html dom element
|
579
|
-
* @param {string} action The name of the event, for example "mousedown"
|
580
|
-
* @param {function} listener The listener function
|
581
|
-
* @param {boolean} [useCapture]
|
582
|
-
*/
|
583
|
-
util.removeEventListener = function(element, action, listener, useCapture) {
|
584
|
-
if (element.removeEventListener) {
|
585
|
-
// non-IE browsers
|
586
|
-
if (useCapture === undefined)
|
587
|
-
useCapture = false;
|
588
|
-
|
589
|
-
if (action === "mousewheel" && navigator.userAgent.indexOf("Firefox") >= 0) {
|
590
|
-
action = "DOMMouseScroll"; // For Firefox
|
591
|
-
}
|
592
|
-
|
593
|
-
element.removeEventListener(action, listener, useCapture);
|
594
|
-
} else {
|
595
|
-
// IE browsers
|
596
|
-
element.detachEvent("on" + action, listener);
|
597
|
-
}
|
598
|
-
};
|
599
|
-
|
600
|
-
|
601
|
-
/**
|
602
|
-
* Get HTML element which is the target of the event
|
603
|
-
* @param {Event} event
|
604
|
-
* @return {Element} target element
|
605
|
-
*/
|
606
|
-
util.getTarget = function(event) {
|
607
|
-
// code from http://www.quirksmode.org/js/events_properties.html
|
608
|
-
if (!event) {
|
609
|
-
event = window.event;
|
610
|
-
}
|
611
|
-
|
612
|
-
var target;
|
613
|
-
|
614
|
-
if (event.target) {
|
615
|
-
target = event.target;
|
616
|
-
}
|
617
|
-
else if (event.srcElement) {
|
618
|
-
target = event.srcElement;
|
619
|
-
}
|
620
|
-
|
621
|
-
if (target.nodeType != undefined && target.nodeType == 3) {
|
622
|
-
// defeat Safari bug
|
623
|
-
target = target.parentNode;
|
624
|
-
}
|
625
|
-
|
626
|
-
return target;
|
627
|
-
};
|
628
|
-
|
629
|
-
/**
|
630
|
-
* Fake a hammer.js gesture. Event can be a ScrollEvent or MouseMoveEvent
|
631
|
-
* @param {Element} element
|
632
|
-
* @param {Event} event
|
633
|
-
*/
|
634
|
-
util.fakeGesture = function(element, event) {
|
635
|
-
var eventType = null;
|
636
|
-
|
637
|
-
// for hammer.js 1.0.5
|
638
|
-
//var gesture = Hammer.event.collectEventData(this, eventType, event);
|
639
|
-
|
640
|
-
// for hammer.js 1.0.6
|
641
|
-
var touches = Hammer.event.getTouchList(event, eventType);
|
642
|
-
var gesture = Hammer.event.collectEventData(this, eventType, touches, event);
|
643
|
-
|
644
|
-
// on IE in standards mode, no touches are recognized by hammer.js,
|
645
|
-
// resulting in NaN values for center.pageX and center.pageY
|
646
|
-
if (isNaN(gesture.center.pageX)) {
|
647
|
-
gesture.center.pageX = event.pageX;
|
648
|
-
}
|
649
|
-
if (isNaN(gesture.center.pageY)) {
|
650
|
-
gesture.center.pageY = event.pageY;
|
651
|
-
}
|
652
|
-
|
653
|
-
return gesture;
|
654
|
-
};
|
655
|
-
|
656
|
-
util.option = {};
|
657
|
-
|
658
|
-
/**
|
659
|
-
* Convert a value into a boolean
|
660
|
-
* @param {Boolean | function | undefined} value
|
661
|
-
* @param {Boolean} [defaultValue]
|
662
|
-
* @returns {Boolean} bool
|
663
|
-
*/
|
664
|
-
util.option.asBoolean = function (value, defaultValue) {
|
665
|
-
if (typeof value == 'function') {
|
666
|
-
value = value();
|
667
|
-
}
|
668
|
-
|
669
|
-
if (value != null) {
|
670
|
-
return (value != false);
|
671
|
-
}
|
672
|
-
|
673
|
-
return defaultValue || null;
|
674
|
-
};
|
675
|
-
|
676
|
-
/**
|
677
|
-
* Convert a value into a number
|
678
|
-
* @param {Boolean | function | undefined} value
|
679
|
-
* @param {Number} [defaultValue]
|
680
|
-
* @returns {Number} number
|
681
|
-
*/
|
682
|
-
util.option.asNumber = function (value, defaultValue) {
|
683
|
-
if (typeof value == 'function') {
|
684
|
-
value = value();
|
685
|
-
}
|
686
|
-
|
687
|
-
if (value != null) {
|
688
|
-
return Number(value) || defaultValue || null;
|
689
|
-
}
|
690
|
-
|
691
|
-
return defaultValue || null;
|
692
|
-
};
|
693
|
-
|
694
|
-
/**
|
695
|
-
* Convert a value into a string
|
696
|
-
* @param {String | function | undefined} value
|
697
|
-
* @param {String} [defaultValue]
|
698
|
-
* @returns {String} str
|
699
|
-
*/
|
700
|
-
util.option.asString = function (value, defaultValue) {
|
701
|
-
if (typeof value == 'function') {
|
702
|
-
value = value();
|
703
|
-
}
|
704
|
-
|
705
|
-
if (value != null) {
|
706
|
-
return String(value);
|
707
|
-
}
|
708
|
-
|
709
|
-
return defaultValue || null;
|
710
|
-
};
|
711
|
-
|
712
|
-
/**
|
713
|
-
* Convert a size or location into a string with pixels or a percentage
|
714
|
-
* @param {String | Number | function | undefined} value
|
715
|
-
* @param {String} [defaultValue]
|
716
|
-
* @returns {String} size
|
717
|
-
*/
|
718
|
-
util.option.asSize = function (value, defaultValue) {
|
719
|
-
if (typeof value == 'function') {
|
720
|
-
value = value();
|
721
|
-
}
|
722
|
-
|
723
|
-
if (util.isString(value)) {
|
724
|
-
return value;
|
725
|
-
}
|
726
|
-
else if (util.isNumber(value)) {
|
727
|
-
return value + 'px';
|
728
|
-
}
|
729
|
-
else {
|
730
|
-
return defaultValue || null;
|
731
|
-
}
|
732
|
-
};
|
733
|
-
|
734
|
-
/**
|
735
|
-
* Convert a value into a DOM element
|
736
|
-
* @param {HTMLElement | function | undefined} value
|
737
|
-
* @param {HTMLElement} [defaultValue]
|
738
|
-
* @returns {HTMLElement | null} dom
|
739
|
-
*/
|
740
|
-
util.option.asElement = function (value, defaultValue) {
|
741
|
-
if (typeof value == 'function') {
|
742
|
-
value = value();
|
743
|
-
}
|
744
|
-
|
745
|
-
return value || defaultValue || null;
|
746
|
-
};
|
747
|
-
|
748
|
-
|
749
|
-
|
750
|
-
util.GiveDec = function(Hex) {
|
751
|
-
var Value;
|
752
|
-
|
753
|
-
if (Hex == "A")
|
754
|
-
Value = 10;
|
755
|
-
else if (Hex == "B")
|
756
|
-
Value = 11;
|
757
|
-
else if (Hex == "C")
|
758
|
-
Value = 12;
|
759
|
-
else if (Hex == "D")
|
760
|
-
Value = 13;
|
761
|
-
else if (Hex == "E")
|
762
|
-
Value = 14;
|
763
|
-
else if (Hex == "F")
|
764
|
-
Value = 15;
|
765
|
-
else
|
766
|
-
Value = eval(Hex);
|
767
|
-
|
768
|
-
return Value;
|
769
|
-
};
|
770
|
-
|
771
|
-
util.GiveHex = function(Dec) {
|
772
|
-
var Value;
|
773
|
-
|
774
|
-
if(Dec == 10)
|
775
|
-
Value = "A";
|
776
|
-
else if (Dec == 11)
|
777
|
-
Value = "B";
|
778
|
-
else if (Dec == 12)
|
779
|
-
Value = "C";
|
780
|
-
else if (Dec == 13)
|
781
|
-
Value = "D";
|
782
|
-
else if (Dec == 14)
|
783
|
-
Value = "E";
|
784
|
-
else if (Dec == 15)
|
785
|
-
Value = "F";
|
786
|
-
else
|
787
|
-
Value = "" + Dec;
|
788
|
-
|
789
|
-
return Value;
|
790
|
-
};
|
791
|
-
|
792
|
-
/**
|
793
|
-
* Parse a color property into an object with border, background, and
|
794
|
-
* highlight colors
|
795
|
-
* @param {Object | String} color
|
796
|
-
* @return {Object} colorObject
|
797
|
-
*/
|
798
|
-
util.parseColor = function(color) {
|
799
|
-
var c;
|
800
|
-
if (util.isString(color)) {
|
801
|
-
if (util.isValidHex(color)) {
|
802
|
-
var hsv = util.hexToHSV(color);
|
803
|
-
var lighterColorHSV = {h:hsv.h,s:hsv.s * 0.45,v:Math.min(1,hsv.v * 1.05)};
|
804
|
-
var darkerColorHSV = {h:hsv.h,s:Math.min(1,hsv.v * 1.25),v:hsv.v*0.6};
|
805
|
-
var darkerColorHex = util.HSVToHex(darkerColorHSV.h ,darkerColorHSV.h ,darkerColorHSV.v);
|
806
|
-
var lighterColorHex = util.HSVToHex(lighterColorHSV.h,lighterColorHSV.s,lighterColorHSV.v);
|
807
|
-
|
808
|
-
c = {
|
809
|
-
background: color,
|
810
|
-
border:darkerColorHex,
|
811
|
-
highlight: {
|
812
|
-
background:lighterColorHex,
|
813
|
-
border:darkerColorHex
|
814
|
-
},
|
815
|
-
hover: {
|
816
|
-
background:lighterColorHex,
|
817
|
-
border:darkerColorHex
|
818
|
-
}
|
819
|
-
};
|
820
|
-
}
|
821
|
-
else {
|
822
|
-
c = {
|
823
|
-
background:color,
|
824
|
-
border:color,
|
825
|
-
highlight: {
|
826
|
-
background:color,
|
827
|
-
border:color
|
828
|
-
},
|
829
|
-
hover: {
|
830
|
-
background:color,
|
831
|
-
border:color
|
832
|
-
}
|
833
|
-
};
|
834
|
-
}
|
835
|
-
}
|
836
|
-
else {
|
837
|
-
c = {};
|
838
|
-
c.background = color.background || 'white';
|
839
|
-
c.border = color.border || c.background;
|
840
|
-
|
841
|
-
if (util.isString(color.highlight)) {
|
842
|
-
c.highlight = {
|
843
|
-
border: color.highlight,
|
844
|
-
background: color.highlight
|
845
|
-
}
|
846
|
-
}
|
847
|
-
else {
|
848
|
-
c.highlight = {};
|
849
|
-
c.highlight.background = color.highlight && color.highlight.background || c.background;
|
850
|
-
c.highlight.border = color.highlight && color.highlight.border || c.border;
|
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
|
-
}
|
864
|
-
}
|
865
|
-
|
866
|
-
return c;
|
867
|
-
};
|
868
|
-
|
869
|
-
/**
|
870
|
-
* http://www.yellowpipe.com/yis/tools/hex-to-rgb/color-converter.php
|
871
|
-
*
|
872
|
-
* @param {String} hex
|
873
|
-
* @returns {{r: *, g: *, b: *}}
|
874
|
-
*/
|
875
|
-
util.hexToRGB = function(hex) {
|
876
|
-
hex = hex.replace("#","").toUpperCase();
|
877
|
-
|
878
|
-
var a = util.GiveDec(hex.substring(0, 1));
|
879
|
-
var b = util.GiveDec(hex.substring(1, 2));
|
880
|
-
var c = util.GiveDec(hex.substring(2, 3));
|
881
|
-
var d = util.GiveDec(hex.substring(3, 4));
|
882
|
-
var e = util.GiveDec(hex.substring(4, 5));
|
883
|
-
var f = util.GiveDec(hex.substring(5, 6));
|
884
|
-
|
885
|
-
var r = (a * 16) + b;
|
886
|
-
var g = (c * 16) + d;
|
887
|
-
var b = (e * 16) + f;
|
888
|
-
|
889
|
-
return {r:r,g:g,b:b};
|
890
|
-
};
|
891
|
-
|
892
|
-
util.RGBToHex = function(red,green,blue) {
|
893
|
-
var a = util.GiveHex(Math.floor(red / 16));
|
894
|
-
var b = util.GiveHex(red % 16);
|
895
|
-
var c = util.GiveHex(Math.floor(green / 16));
|
896
|
-
var d = util.GiveHex(green % 16);
|
897
|
-
var e = util.GiveHex(Math.floor(blue / 16));
|
898
|
-
var f = util.GiveHex(blue % 16);
|
899
|
-
|
900
|
-
var hex = a + b + c + d + e + f;
|
901
|
-
return "#" + hex;
|
902
|
-
};
|
903
|
-
|
904
|
-
|
905
|
-
/**
|
906
|
-
* http://www.javascripter.net/faq/rgb2hsv.htm
|
907
|
-
*
|
908
|
-
* @param red
|
909
|
-
* @param green
|
910
|
-
* @param blue
|
911
|
-
* @returns {*}
|
912
|
-
* @constructor
|
913
|
-
*/
|
914
|
-
util.RGBToHSV = function(red,green,blue) {
|
915
|
-
red=red/255; green=green/255; blue=blue/255;
|
916
|
-
var minRGB = Math.min(red,Math.min(green,blue));
|
917
|
-
var maxRGB = Math.max(red,Math.max(green,blue));
|
918
|
-
|
919
|
-
// Black-gray-white
|
920
|
-
if (minRGB == maxRGB) {
|
921
|
-
return {h:0,s:0,v:minRGB};
|
922
|
-
}
|
923
|
-
|
924
|
-
// Colors other than black-gray-white:
|
925
|
-
var d = (red==minRGB) ? green-blue : ((blue==minRGB) ? red-green : blue-red);
|
926
|
-
var h = (red==minRGB) ? 3 : ((blue==minRGB) ? 1 : 5);
|
927
|
-
var hue = 60*(h - d/(maxRGB - minRGB))/360;
|
928
|
-
var saturation = (maxRGB - minRGB)/maxRGB;
|
929
|
-
var value = maxRGB;
|
930
|
-
return {h:hue,s:saturation,v:value};
|
931
|
-
};
|
932
|
-
|
933
|
-
|
934
|
-
/**
|
935
|
-
* https://gist.github.com/mjijackson/5311256
|
936
|
-
* @param hue
|
937
|
-
* @param saturation
|
938
|
-
* @param value
|
939
|
-
* @returns {{r: number, g: number, b: number}}
|
940
|
-
* @constructor
|
941
|
-
*/
|
942
|
-
util.HSVToRGB = function(h, s, v) {
|
943
|
-
var r, g, b;
|
944
|
-
|
945
|
-
var i = Math.floor(h * 6);
|
946
|
-
var f = h * 6 - i;
|
947
|
-
var p = v * (1 - s);
|
948
|
-
var q = v * (1 - f * s);
|
949
|
-
var t = v * (1 - (1 - f) * s);
|
950
|
-
|
951
|
-
switch (i % 6) {
|
952
|
-
case 0: r = v, g = t, b = p; break;
|
953
|
-
case 1: r = q, g = v, b = p; break;
|
954
|
-
case 2: r = p, g = v, b = t; break;
|
955
|
-
case 3: r = p, g = q, b = v; break;
|
956
|
-
case 4: r = t, g = p, b = v; break;
|
957
|
-
case 5: r = v, g = p, b = q; break;
|
958
|
-
}
|
959
|
-
|
960
|
-
return {r:Math.floor(r * 255), g:Math.floor(g * 255), b:Math.floor(b * 255) };
|
961
|
-
};
|
962
|
-
|
963
|
-
util.HSVToHex = function(h, s, v) {
|
964
|
-
var rgb = util.HSVToRGB(h, s, v);
|
965
|
-
return util.RGBToHex(rgb.r, rgb.g, rgb.b);
|
966
|
-
};
|
967
|
-
|
968
|
-
util.hexToHSV = function(hex) {
|
969
|
-
var rgb = util.hexToRGB(hex);
|
970
|
-
return util.RGBToHSV(rgb.r, rgb.g, rgb.b);
|
971
|
-
};
|
972
|
-
|
973
|
-
util.isValidHex = function(hex) {
|
974
|
-
var isOk = /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(hex);
|
975
|
-
return isOk;
|
976
|
-
};
|
977
|
-
|
978
|
-
util.copyObject = function(objectFrom, objectTo) {
|
979
|
-
for (var i in objectFrom) {
|
980
|
-
if (objectFrom.hasOwnProperty(i)) {
|
981
|
-
if (typeof objectFrom[i] == "object") {
|
982
|
-
objectTo[i] = {};
|
983
|
-
util.copyObject(objectFrom[i], objectTo[i]);
|
984
|
-
}
|
985
|
-
else {
|
986
|
-
objectTo[i] = objectFrom[i];
|
987
|
-
}
|
988
|
-
}
|
989
|
-
}
|
990
|
-
};
|