vis-rails 2.0.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
-
};
|