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.
Files changed (56) hide show
  1. data/CHANGELOG.md +16 -0
  2. data/README.md +1 -1
  3. data/lib/fabric/rails/version.rb +2 -2
  4. data/vendor/assets/javascripts/event.js +1909 -0
  5. data/vendor/assets/javascripts/fabric.js +64 -16464
  6. data/vendor/assets/javascripts/fabric/HEADER.js +31 -0
  7. data/vendor/assets/javascripts/fabric/canvas.class.js +1007 -0
  8. data/vendor/assets/javascripts/fabric/canvas_animation.mixin.js +113 -0
  9. data/vendor/assets/javascripts/fabric/canvas_events.mixin.js +482 -0
  10. data/vendor/assets/javascripts/fabric/canvas_gestures.mixin.js +79 -0
  11. data/vendor/assets/javascripts/fabric/canvas_serialization.mixin.js +311 -0
  12. data/vendor/assets/javascripts/fabric/circle.class.js +182 -0
  13. data/vendor/assets/javascripts/fabric/color.class.js +284 -0
  14. data/vendor/assets/javascripts/fabric/ellipse.class.js +169 -0
  15. data/vendor/assets/javascripts/fabric/freedrawing.class.js +256 -0
  16. data/vendor/assets/javascripts/fabric/gradient.class.js +211 -0
  17. data/vendor/assets/javascripts/fabric/group.class.js +556 -0
  18. data/vendor/assets/javascripts/fabric/image.class.js +418 -0
  19. data/vendor/assets/javascripts/fabric/image_filters.js +809 -0
  20. data/vendor/assets/javascripts/fabric/intersection.class.js +178 -0
  21. data/vendor/assets/javascripts/fabric/line.class.js +188 -0
  22. data/vendor/assets/javascripts/fabric/log.js +26 -0
  23. data/vendor/assets/javascripts/fabric/node.js +149 -0
  24. data/vendor/assets/javascripts/fabric/object.class.js +1068 -0
  25. data/vendor/assets/javascripts/fabric/object_geometry.mixin.js +308 -0
  26. data/vendor/assets/javascripts/fabric/object_interactivity.mixin.js +496 -0
  27. data/vendor/assets/javascripts/fabric/object_origin.mixin.js +207 -0
  28. data/vendor/assets/javascripts/fabric/object_straightening.mixin.js +94 -0
  29. data/vendor/assets/javascripts/fabric/observable.mixin.js +91 -0
  30. data/vendor/assets/javascripts/fabric/parser.js +750 -0
  31. data/vendor/assets/javascripts/fabric/path.class.js +794 -0
  32. data/vendor/assets/javascripts/fabric/path_group.class.js +240 -0
  33. data/vendor/assets/javascripts/fabric/pattern.class.js +69 -0
  34. data/vendor/assets/javascripts/fabric/point.class.js +327 -0
  35. data/vendor/assets/javascripts/fabric/polygon.class.js +184 -0
  36. data/vendor/assets/javascripts/fabric/polyline.class.js +157 -0
  37. data/vendor/assets/javascripts/fabric/rect.class.js +298 -0
  38. data/vendor/assets/javascripts/fabric/scout.js +45 -0
  39. data/vendor/assets/javascripts/fabric/shadow.class.js +70 -0
  40. data/vendor/assets/javascripts/fabric/stateful.js +88 -0
  41. data/vendor/assets/javascripts/fabric/static_canvas.class.js +1298 -0
  42. data/vendor/assets/javascripts/fabric/text.class.js +934 -0
  43. data/vendor/assets/javascripts/fabric/triangle.class.js +108 -0
  44. data/vendor/assets/javascripts/fabric/util/anim_ease.js +360 -0
  45. data/vendor/assets/javascripts/fabric/util/dom_event.js +237 -0
  46. data/vendor/assets/javascripts/fabric/util/dom_misc.js +245 -0
  47. data/vendor/assets/javascripts/fabric/util/dom_request.js +72 -0
  48. data/vendor/assets/javascripts/fabric/util/dom_style.js +71 -0
  49. data/vendor/assets/javascripts/fabric/util/lang_array.js +250 -0
  50. data/vendor/assets/javascripts/fabric/util/lang_class.js +97 -0
  51. data/vendor/assets/javascripts/fabric/util/lang_function.js +35 -0
  52. data/vendor/assets/javascripts/fabric/util/lang_object.js +34 -0
  53. data/vendor/assets/javascripts/fabric/util/lang_string.js +60 -0
  54. data/vendor/assets/javascripts/fabric/util/misc.js +406 -0
  55. data/vendor/assets/javascripts/json2.js +491 -0
  56. 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 &lt;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
+ })();