fabric-rails 1.0.12 → 1.0.12.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.
- data/CHANGELOG.md +16 -0
- data/README.md +1 -1
- data/lib/fabric/rails/version.rb +2 -2
- data/vendor/assets/javascripts/event.js +1909 -0
- data/vendor/assets/javascripts/fabric.js +64 -16464
- data/vendor/assets/javascripts/fabric/HEADER.js +31 -0
- data/vendor/assets/javascripts/fabric/canvas.class.js +1007 -0
- data/vendor/assets/javascripts/fabric/canvas_animation.mixin.js +113 -0
- data/vendor/assets/javascripts/fabric/canvas_events.mixin.js +482 -0
- data/vendor/assets/javascripts/fabric/canvas_gestures.mixin.js +79 -0
- data/vendor/assets/javascripts/fabric/canvas_serialization.mixin.js +311 -0
- data/vendor/assets/javascripts/fabric/circle.class.js +182 -0
- data/vendor/assets/javascripts/fabric/color.class.js +284 -0
- data/vendor/assets/javascripts/fabric/ellipse.class.js +169 -0
- data/vendor/assets/javascripts/fabric/freedrawing.class.js +256 -0
- data/vendor/assets/javascripts/fabric/gradient.class.js +211 -0
- data/vendor/assets/javascripts/fabric/group.class.js +556 -0
- data/vendor/assets/javascripts/fabric/image.class.js +418 -0
- data/vendor/assets/javascripts/fabric/image_filters.js +809 -0
- data/vendor/assets/javascripts/fabric/intersection.class.js +178 -0
- data/vendor/assets/javascripts/fabric/line.class.js +188 -0
- data/vendor/assets/javascripts/fabric/log.js +26 -0
- data/vendor/assets/javascripts/fabric/node.js +149 -0
- data/vendor/assets/javascripts/fabric/object.class.js +1068 -0
- data/vendor/assets/javascripts/fabric/object_geometry.mixin.js +308 -0
- data/vendor/assets/javascripts/fabric/object_interactivity.mixin.js +496 -0
- data/vendor/assets/javascripts/fabric/object_origin.mixin.js +207 -0
- data/vendor/assets/javascripts/fabric/object_straightening.mixin.js +94 -0
- data/vendor/assets/javascripts/fabric/observable.mixin.js +91 -0
- data/vendor/assets/javascripts/fabric/parser.js +750 -0
- data/vendor/assets/javascripts/fabric/path.class.js +794 -0
- data/vendor/assets/javascripts/fabric/path_group.class.js +240 -0
- data/vendor/assets/javascripts/fabric/pattern.class.js +69 -0
- data/vendor/assets/javascripts/fabric/point.class.js +327 -0
- data/vendor/assets/javascripts/fabric/polygon.class.js +184 -0
- data/vendor/assets/javascripts/fabric/polyline.class.js +157 -0
- data/vendor/assets/javascripts/fabric/rect.class.js +298 -0
- data/vendor/assets/javascripts/fabric/scout.js +45 -0
- data/vendor/assets/javascripts/fabric/shadow.class.js +70 -0
- data/vendor/assets/javascripts/fabric/stateful.js +88 -0
- data/vendor/assets/javascripts/fabric/static_canvas.class.js +1298 -0
- data/vendor/assets/javascripts/fabric/text.class.js +934 -0
- data/vendor/assets/javascripts/fabric/triangle.class.js +108 -0
- data/vendor/assets/javascripts/fabric/util/anim_ease.js +360 -0
- data/vendor/assets/javascripts/fabric/util/dom_event.js +237 -0
- data/vendor/assets/javascripts/fabric/util/dom_misc.js +245 -0
- data/vendor/assets/javascripts/fabric/util/dom_request.js +72 -0
- data/vendor/assets/javascripts/fabric/util/dom_style.js +71 -0
- data/vendor/assets/javascripts/fabric/util/lang_array.js +250 -0
- data/vendor/assets/javascripts/fabric/util/lang_class.js +97 -0
- data/vendor/assets/javascripts/fabric/util/lang_function.js +35 -0
- data/vendor/assets/javascripts/fabric/util/lang_object.js +34 -0
- data/vendor/assets/javascripts/fabric/util/lang_string.js +60 -0
- data/vendor/assets/javascripts/fabric/util/misc.js +406 -0
- data/vendor/assets/javascripts/json2.js +491 -0
- metadata +53 -2
@@ -0,0 +1,237 @@
|
|
1
|
+
(function () {
|
2
|
+
|
3
|
+
/* EVENT HANDLING */
|
4
|
+
|
5
|
+
function areHostMethods(object) {
|
6
|
+
var methodNames = Array.prototype.slice.call(arguments, 1),
|
7
|
+
t, i, len = methodNames.length;
|
8
|
+
for (i = 0; i < len; i++) {
|
9
|
+
t = typeof object[methodNames[i]];
|
10
|
+
if (!(/^(?:function|object|unknown)$/).test(t)) return false;
|
11
|
+
}
|
12
|
+
return true;
|
13
|
+
}
|
14
|
+
var getUniqueId = (function () {
|
15
|
+
var uid = 0;
|
16
|
+
return function (element) {
|
17
|
+
return element.__uniqueID || (element.__uniqueID = 'uniqueID__' + uid++);
|
18
|
+
};
|
19
|
+
})();
|
20
|
+
|
21
|
+
/** @ignore */
|
22
|
+
var getElement, setElement;
|
23
|
+
|
24
|
+
(function () {
|
25
|
+
var elements = { };
|
26
|
+
/** @ignore */
|
27
|
+
getElement = function (uid) {
|
28
|
+
return elements[uid];
|
29
|
+
};
|
30
|
+
/** @ignore */
|
31
|
+
setElement = function (uid, element) {
|
32
|
+
elements[uid] = element;
|
33
|
+
};
|
34
|
+
})();
|
35
|
+
|
36
|
+
function createListener(uid, handler) {
|
37
|
+
return {
|
38
|
+
handler: handler,
|
39
|
+
wrappedHandler: createWrappedHandler(uid, handler)
|
40
|
+
};
|
41
|
+
}
|
42
|
+
|
43
|
+
function createWrappedHandler(uid, handler) {
|
44
|
+
return function (e) {
|
45
|
+
handler.call(getElement(uid), e || fabric.window.event);
|
46
|
+
};
|
47
|
+
}
|
48
|
+
|
49
|
+
function createDispatcher(uid, eventName) {
|
50
|
+
return function (e) {
|
51
|
+
if (handlers[uid] && handlers[uid][eventName]) {
|
52
|
+
var handlersForEvent = handlers[uid][eventName];
|
53
|
+
for (var i = 0, len = handlersForEvent.length; i < len; i++) {
|
54
|
+
handlersForEvent[i].call(this, e || fabric.window.event);
|
55
|
+
}
|
56
|
+
}
|
57
|
+
};
|
58
|
+
}
|
59
|
+
|
60
|
+
var shouldUseAddListenerRemoveListener = (
|
61
|
+
areHostMethods(fabric.document.documentElement, 'addEventListener', 'removeEventListener') &&
|
62
|
+
areHostMethods(fabric.window, 'addEventListener', 'removeEventListener')),
|
63
|
+
|
64
|
+
shouldUseAttachEventDetachEvent = (
|
65
|
+
areHostMethods(fabric.document.documentElement, 'attachEvent', 'detachEvent') &&
|
66
|
+
areHostMethods(fabric.window, 'attachEvent', 'detachEvent')),
|
67
|
+
|
68
|
+
// IE branch
|
69
|
+
listeners = { },
|
70
|
+
|
71
|
+
// DOM L0 branch
|
72
|
+
handlers = { },
|
73
|
+
|
74
|
+
addListener, removeListener;
|
75
|
+
|
76
|
+
if (shouldUseAddListenerRemoveListener) {
|
77
|
+
/** @ignore */
|
78
|
+
addListener = function (element, eventName, handler) {
|
79
|
+
element.addEventListener(eventName, handler, false);
|
80
|
+
};
|
81
|
+
/** @ignore */
|
82
|
+
removeListener = function (element, eventName, handler) {
|
83
|
+
element.removeEventListener(eventName, handler, false);
|
84
|
+
};
|
85
|
+
}
|
86
|
+
|
87
|
+
else if (shouldUseAttachEventDetachEvent) {
|
88
|
+
/** @ignore */
|
89
|
+
addListener = function (element, eventName, handler) {
|
90
|
+
var uid = getUniqueId(element);
|
91
|
+
setElement(uid, element);
|
92
|
+
if (!listeners[uid]) {
|
93
|
+
listeners[uid] = { };
|
94
|
+
}
|
95
|
+
if (!listeners[uid][eventName]) {
|
96
|
+
listeners[uid][eventName] = [ ];
|
97
|
+
|
98
|
+
}
|
99
|
+
var listener = createListener(uid, handler);
|
100
|
+
listeners[uid][eventName].push(listener);
|
101
|
+
element.attachEvent('on' + eventName, listener.wrappedHandler);
|
102
|
+
};
|
103
|
+
/** @ignore */
|
104
|
+
removeListener = function (element, eventName, handler) {
|
105
|
+
var uid = getUniqueId(element), listener;
|
106
|
+
if (listeners[uid] && listeners[uid][eventName]) {
|
107
|
+
for (var i = 0, len = listeners[uid][eventName].length; i < len; i++) {
|
108
|
+
listener = listeners[uid][eventName][i];
|
109
|
+
if (listener && listener.handler === handler) {
|
110
|
+
element.detachEvent('on' + eventName, listener.wrappedHandler);
|
111
|
+
listeners[uid][eventName][i] = null;
|
112
|
+
}
|
113
|
+
}
|
114
|
+
}
|
115
|
+
};
|
116
|
+
}
|
117
|
+
else {
|
118
|
+
/** @ignore */
|
119
|
+
addListener = function (element, eventName, handler) {
|
120
|
+
var uid = getUniqueId(element);
|
121
|
+
if (!handlers[uid]) {
|
122
|
+
handlers[uid] = { };
|
123
|
+
}
|
124
|
+
if (!handlers[uid][eventName]) {
|
125
|
+
handlers[uid][eventName] = [ ];
|
126
|
+
var existingHandler = element['on' + eventName];
|
127
|
+
if (existingHandler) {
|
128
|
+
handlers[uid][eventName].push(existingHandler);
|
129
|
+
}
|
130
|
+
element['on' + eventName] = createDispatcher(uid, eventName);
|
131
|
+
}
|
132
|
+
handlers[uid][eventName].push(handler);
|
133
|
+
};
|
134
|
+
/** @ignore */
|
135
|
+
removeListener = function (element, eventName, handler) {
|
136
|
+
var uid = getUniqueId(element);
|
137
|
+
if (handlers[uid] && handlers[uid][eventName]) {
|
138
|
+
var handlersForEvent = handlers[uid][eventName];
|
139
|
+
for (var i = 0, len = handlersForEvent.length; i < len; i++) {
|
140
|
+
if (handlersForEvent[i] === handler) {
|
141
|
+
handlersForEvent.splice(i, 1);
|
142
|
+
}
|
143
|
+
}
|
144
|
+
}
|
145
|
+
};
|
146
|
+
}
|
147
|
+
|
148
|
+
/**
|
149
|
+
* Adds an event listener to an element
|
150
|
+
* @mthod addListener
|
151
|
+
* @memberOf fabric.util
|
152
|
+
* @function
|
153
|
+
* @param {HTMLElement} element
|
154
|
+
* @param {String} eventName
|
155
|
+
* @param {Function} handler
|
156
|
+
*/
|
157
|
+
fabric.util.addListener = addListener;
|
158
|
+
|
159
|
+
/**
|
160
|
+
* Removes an event listener from an element
|
161
|
+
* @mthod removeListener
|
162
|
+
* @memberOf fabric.util
|
163
|
+
* @function
|
164
|
+
* @param {HTMLElement} element
|
165
|
+
* @param {String} eventName
|
166
|
+
* @param {Function} handler
|
167
|
+
*/
|
168
|
+
fabric.util.removeListener = removeListener;
|
169
|
+
|
170
|
+
/**
|
171
|
+
* Cross-browser wrapper for getting event's coordinates
|
172
|
+
* @method getPointer
|
173
|
+
* @memberOf fabric.util
|
174
|
+
* @param {Event} event
|
175
|
+
* @param {HTMLCanvasElement} upperCanvasEl <canvas> element on which object selection is drawn
|
176
|
+
*/
|
177
|
+
function getPointer(event, upperCanvasEl) {
|
178
|
+
event || (event = fabric.window.event);
|
179
|
+
|
180
|
+
var element = event.target || (typeof event.srcElement !== 'unknown' ? event.srcElement : null),
|
181
|
+
body = fabric.document.body || {scrollLeft: 0, scrollTop: 0},
|
182
|
+
docElement = fabric.document.documentElement,
|
183
|
+
orgElement = element,
|
184
|
+
scrollLeft = 0,
|
185
|
+
scrollTop = 0,
|
186
|
+
firstFixedAncestor;
|
187
|
+
|
188
|
+
while (element && element.parentNode && !firstFixedAncestor) {
|
189
|
+
element = element.parentNode;
|
190
|
+
|
191
|
+
if (element !== fabric.document && fabric.util.getElementPosition(element) === 'fixed') firstFixedAncestor = element;
|
192
|
+
|
193
|
+
if (element !== fabric.document && orgElement !== upperCanvasEl && fabric.util.getElementPosition(element) === 'absolute') {
|
194
|
+
scrollLeft = 0;
|
195
|
+
scrollTop = 0;
|
196
|
+
}
|
197
|
+
else if (element === fabric.document && orgElement !== upperCanvasEl) {
|
198
|
+
scrollLeft = body.scrollLeft || docElement.scrollLeft || 0;
|
199
|
+
scrollTop = body.scrollTop || docElement.scrollTop || 0;
|
200
|
+
}
|
201
|
+
else {
|
202
|
+
scrollLeft += element.scrollLeft || 0;
|
203
|
+
scrollTop += element.scrollTop || 0;
|
204
|
+
}
|
205
|
+
}
|
206
|
+
|
207
|
+
return {
|
208
|
+
x: pointerX(event) + scrollLeft,
|
209
|
+
y: pointerY(event) + scrollTop
|
210
|
+
};
|
211
|
+
}
|
212
|
+
|
213
|
+
var pointerX = function(event) {
|
214
|
+
// looks like in IE (<9) clientX at certain point (apparently when mouseup fires on VML element)
|
215
|
+
// is represented as COM object, with all the consequences, like "unknown" type and error on [[Get]]
|
216
|
+
// need to investigate later
|
217
|
+
return (typeof event.clientX !== 'unknown' ? event.clientX : 0);
|
218
|
+
};
|
219
|
+
|
220
|
+
var pointerY = function(event) {
|
221
|
+
return (typeof event.clientY !== 'unknown' ? event.clientY : 0);
|
222
|
+
};
|
223
|
+
|
224
|
+
if (fabric.isTouchSupported) {
|
225
|
+
pointerX = function(event) {
|
226
|
+
return (event.touches && event.touches[0] ? (event.touches[0].pageX - (event.touches[0].pageX - event.touches[0].clientX)) || event.clientX : event.clientX);
|
227
|
+
};
|
228
|
+
pointerY = function(event) {
|
229
|
+
return (event.touches && event.touches[0] ? (event.touches[0].pageY - (event.touches[0].pageY - event.touches[0].clientY)) || event.clientY : event.clientY);
|
230
|
+
};
|
231
|
+
}
|
232
|
+
|
233
|
+
fabric.util.getPointer = getPointer;
|
234
|
+
|
235
|
+
fabric.util.object.extend(fabric.util, fabric.Observable);
|
236
|
+
|
237
|
+
})();
|
@@ -0,0 +1,245 @@
|
|
1
|
+
(function() {
|
2
|
+
|
3
|
+
var _slice = Array.prototype.slice;
|
4
|
+
|
5
|
+
/**
|
6
|
+
* Takes id and returns an element with that id (if one exists in a document)
|
7
|
+
* @method getById
|
8
|
+
* @memberOf fabric.util
|
9
|
+
* @param {String|HTMLElement} id
|
10
|
+
* @return {HTMLElement|null}
|
11
|
+
*/
|
12
|
+
function getById(id) {
|
13
|
+
return typeof id === 'string' ? fabric.document.getElementById(id) : id;
|
14
|
+
}
|
15
|
+
|
16
|
+
/**
|
17
|
+
* Converts an array-like object (e.g. arguments or NodeList) to an array
|
18
|
+
* @method toArray
|
19
|
+
* @memberOf fabric.util
|
20
|
+
* @param {Object} arrayLike
|
21
|
+
* @return {Array}
|
22
|
+
*/
|
23
|
+
var toArray = function(arrayLike) {
|
24
|
+
return _slice.call(arrayLike, 0);
|
25
|
+
};
|
26
|
+
|
27
|
+
var sliceCanConvertNodelists;
|
28
|
+
try {
|
29
|
+
sliceCanConvertNodelists = toArray(fabric.document.childNodes) instanceof Array;
|
30
|
+
}
|
31
|
+
catch(err) { }
|
32
|
+
|
33
|
+
if (!sliceCanConvertNodelists) {
|
34
|
+
toArray = function(arrayLike) {
|
35
|
+
var arr = new Array(arrayLike.length), i = arrayLike.length;
|
36
|
+
while (i--) {
|
37
|
+
arr[i] = arrayLike[i];
|
38
|
+
}
|
39
|
+
return arr;
|
40
|
+
};
|
41
|
+
}
|
42
|
+
|
43
|
+
/**
|
44
|
+
* Creates specified element with specified attributes
|
45
|
+
* @method makeElement
|
46
|
+
* @memberOf fabric.util
|
47
|
+
* @param {String} tagName Type of an element to create
|
48
|
+
* @param {Object} [attributes] Attributes to set on an element
|
49
|
+
* @return {HTMLElement} Newly created element
|
50
|
+
*/
|
51
|
+
function makeElement(tagName, attributes) {
|
52
|
+
var el = fabric.document.createElement(tagName);
|
53
|
+
for (var prop in attributes) {
|
54
|
+
if (prop === 'class') {
|
55
|
+
el.className = attributes[prop];
|
56
|
+
}
|
57
|
+
else if (prop === 'for') {
|
58
|
+
el.htmlFor = attributes[prop];
|
59
|
+
}
|
60
|
+
else {
|
61
|
+
el.setAttribute(prop, attributes[prop]);
|
62
|
+
}
|
63
|
+
}
|
64
|
+
return el;
|
65
|
+
}
|
66
|
+
|
67
|
+
/**
|
68
|
+
* Adds class to an element
|
69
|
+
* @method addClass
|
70
|
+
* @memberOf fabric.util
|
71
|
+
* @param {HTMLElement} element Element to add class to
|
72
|
+
* @param {String} className Class to add to an element
|
73
|
+
*/
|
74
|
+
function addClass(element, className) {
|
75
|
+
if ((' ' + element.className + ' ').indexOf(' ' + className + ' ') === -1) {
|
76
|
+
element.className += (element.className ? ' ' : '') + className;
|
77
|
+
}
|
78
|
+
}
|
79
|
+
|
80
|
+
/**
|
81
|
+
* Wraps element with another element
|
82
|
+
* @method wrapElement
|
83
|
+
* @memberOf fabric.util
|
84
|
+
* @param {HTMLElement} element Element to wrap
|
85
|
+
* @param {HTMLElement|String} wrapper Element to wrap with
|
86
|
+
* @param {Object} [attributes] Attributes to set on a wrapper
|
87
|
+
* @return {HTMLElement} wrapper
|
88
|
+
*/
|
89
|
+
function wrapElement(element, wrapper, attributes) {
|
90
|
+
if (typeof wrapper === 'string') {
|
91
|
+
wrapper = makeElement(wrapper, attributes);
|
92
|
+
}
|
93
|
+
if (element.parentNode) {
|
94
|
+
element.parentNode.replaceChild(wrapper, element);
|
95
|
+
}
|
96
|
+
wrapper.appendChild(element);
|
97
|
+
return wrapper;
|
98
|
+
}
|
99
|
+
|
100
|
+
/**
|
101
|
+
* Returns offset for a given element
|
102
|
+
* @method getElementOffset
|
103
|
+
* @function
|
104
|
+
* @memberOf fabric.util
|
105
|
+
* @param {HTMLElement} element Element to get offset for
|
106
|
+
* @return {Object} Object with "left" and "top" properties
|
107
|
+
*/
|
108
|
+
function getElementOffset(element) {
|
109
|
+
// TODO (kangax): need to fix this method
|
110
|
+
var valueT = 0, valueL = 0;
|
111
|
+
do {
|
112
|
+
valueT += element.offsetTop || 0;
|
113
|
+
valueL += element.offsetLeft || 0;
|
114
|
+
element = element.offsetParent;
|
115
|
+
}
|
116
|
+
while (element);
|
117
|
+
return ({ left: valueL, top: valueT });
|
118
|
+
}
|
119
|
+
|
120
|
+
/**
|
121
|
+
* Returns position of a given element
|
122
|
+
* @method getElementPosition
|
123
|
+
* @function
|
124
|
+
* @memberOf fabric.util
|
125
|
+
* @param {HTMLElement} element Element to get offset for
|
126
|
+
* @return {Object} position of the given element.
|
127
|
+
*/
|
128
|
+
var getElementPosition;
|
129
|
+
if (fabric.document.defaultView && fabric.document.defaultView.getComputedStyle) {
|
130
|
+
getElementPosition = function (element) {
|
131
|
+
return fabric.document.defaultView.getComputedStyle(element, null).position;
|
132
|
+
};
|
133
|
+
}
|
134
|
+
else {
|
135
|
+
/** @ignore */
|
136
|
+
getElementPosition = function (element) {
|
137
|
+
var value = element.style.position;
|
138
|
+
if (!value && element.currentStyle) value = element.currentStyle.position;
|
139
|
+
return value;
|
140
|
+
};
|
141
|
+
}
|
142
|
+
|
143
|
+
(function () {
|
144
|
+
var style = fabric.document.documentElement.style;
|
145
|
+
|
146
|
+
var selectProp = 'userSelect' in style
|
147
|
+
? 'userSelect'
|
148
|
+
: 'MozUserSelect' in style
|
149
|
+
? 'MozUserSelect'
|
150
|
+
: 'WebkitUserSelect' in style
|
151
|
+
? 'WebkitUserSelect'
|
152
|
+
: 'KhtmlUserSelect' in style
|
153
|
+
? 'KhtmlUserSelect'
|
154
|
+
: '';
|
155
|
+
|
156
|
+
/**
|
157
|
+
* Makes element unselectable
|
158
|
+
* @method makeElementUnselectable
|
159
|
+
* @memberOf fabric.util
|
160
|
+
* @param {HTMLElement} element Element to make unselectable
|
161
|
+
* @return {HTMLElement} Element that was passed in
|
162
|
+
*/
|
163
|
+
function makeElementUnselectable(element) {
|
164
|
+
if (typeof element.onselectstart !== 'undefined') {
|
165
|
+
element.onselectstart = fabric.util.falseFunction;
|
166
|
+
}
|
167
|
+
if (selectProp) {
|
168
|
+
element.style[selectProp] = 'none';
|
169
|
+
}
|
170
|
+
else if (typeof element.unselectable === 'string') {
|
171
|
+
element.unselectable = 'on';
|
172
|
+
}
|
173
|
+
return element;
|
174
|
+
}
|
175
|
+
|
176
|
+
/**
|
177
|
+
* Makes element selectable
|
178
|
+
* @method makeElementSelectable
|
179
|
+
* @memberOf fabric.util
|
180
|
+
* @param {HTMLElement} element Element to make selectable
|
181
|
+
* @return {HTMLElement} Element that was passed in
|
182
|
+
*/
|
183
|
+
function makeElementSelectable(element) {
|
184
|
+
if (typeof element.onselectstart !== 'undefined') {
|
185
|
+
element.onselectstart = null;
|
186
|
+
}
|
187
|
+
if (selectProp) {
|
188
|
+
element.style[selectProp] = '';
|
189
|
+
}
|
190
|
+
else if (typeof element.unselectable === 'string') {
|
191
|
+
element.unselectable = '';
|
192
|
+
}
|
193
|
+
return element;
|
194
|
+
}
|
195
|
+
|
196
|
+
fabric.util.makeElementUnselectable = makeElementUnselectable;
|
197
|
+
fabric.util.makeElementSelectable = makeElementSelectable;
|
198
|
+
})();
|
199
|
+
|
200
|
+
(function() {
|
201
|
+
|
202
|
+
/**
|
203
|
+
* Inserts a script element with a given url into a document; invokes callback, when that script is finished loading
|
204
|
+
* @method getScript
|
205
|
+
* @memberOf fabric.util
|
206
|
+
* @param {String} url URL of a script to load
|
207
|
+
* @param {Function} callback Callback to execute when script is finished loading
|
208
|
+
*/
|
209
|
+
function getScript(url, callback) {
|
210
|
+
var headEl = fabric.document.getElementsByTagName("head")[0],
|
211
|
+
scriptEl = fabric.document.createElement('script'),
|
212
|
+
loading = true;
|
213
|
+
|
214
|
+
scriptEl.type = 'text/javascript';
|
215
|
+
scriptEl.setAttribute('runat', 'server');
|
216
|
+
|
217
|
+
/** @ignore */
|
218
|
+
scriptEl.onload = /** @ignore */ scriptEl.onreadystatechange = function(e) {
|
219
|
+
if (loading) {
|
220
|
+
if (typeof this.readyState === 'string' &&
|
221
|
+
this.readyState !== 'loaded' &&
|
222
|
+
this.readyState !== 'complete') return;
|
223
|
+
loading = false;
|
224
|
+
callback(e || fabric.window.event);
|
225
|
+
scriptEl = scriptEl.onload = scriptEl.onreadystatechange = null;
|
226
|
+
}
|
227
|
+
};
|
228
|
+
scriptEl.src = url;
|
229
|
+
headEl.appendChild(scriptEl);
|
230
|
+
// causes issue in Opera
|
231
|
+
// headEl.removeChild(scriptEl);
|
232
|
+
}
|
233
|
+
|
234
|
+
fabric.util.getScript = getScript;
|
235
|
+
})();
|
236
|
+
|
237
|
+
fabric.util.getById = getById;
|
238
|
+
fabric.util.toArray = toArray;
|
239
|
+
fabric.util.makeElement = makeElement;
|
240
|
+
fabric.util.addClass = addClass;
|
241
|
+
fabric.util.wrapElement = wrapElement;
|
242
|
+
fabric.util.getElementOffset = getElementOffset;
|
243
|
+
fabric.util.getElementPosition = getElementPosition;
|
244
|
+
|
245
|
+
})();
|