sn-jquery-ui-rails 6.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (177) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +2 -0
  3. data/.gitmodules +3 -0
  4. data/.travis.yml +2 -0
  5. data/Gemfile +3 -0
  6. data/History.md +168 -0
  7. data/License.txt +2 -0
  8. data/README.md +311 -0
  9. data/Rakefile +258 -0
  10. data/VERSIONS.md +39 -0
  11. data/app/assets/images/jquery-ui/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  12. data/app/assets/images/jquery-ui/ui-icons_444444_256x240.png +0 -0
  13. data/app/assets/images/jquery-ui/ui-icons_555555_256x240.png +0 -0
  14. data/app/assets/images/jquery-ui/ui-icons_777620_256x240.png +0 -0
  15. data/app/assets/images/jquery-ui/ui-icons_777777_256x240.png +0 -0
  16. data/app/assets/images/jquery-ui/ui-icons_cc0000_256x240.png +0 -0
  17. data/app/assets/images/jquery-ui/ui-icons_ffffff_256x240.png +0 -0
  18. data/app/assets/javascripts/jquery-ui/core.js +15 -0
  19. data/app/assets/javascripts/jquery-ui/data.js +41 -0
  20. data/app/assets/javascripts/jquery-ui/disable-selection.js +48 -0
  21. data/app/assets/javascripts/jquery-ui/effect.all.js +15 -0
  22. data/app/assets/javascripts/jquery-ui/effect.js +1637 -0
  23. data/app/assets/javascripts/jquery-ui/effects/effect-blind.js +73 -0
  24. data/app/assets/javascripts/jquery-ui/effects/effect-bounce.js +113 -0
  25. data/app/assets/javascripts/jquery-ui/effects/effect-clip.js +68 -0
  26. data/app/assets/javascripts/jquery-ui/effects/effect-drop.js +72 -0
  27. data/app/assets/javascripts/jquery-ui/effects/effect-explode.js +114 -0
  28. data/app/assets/javascripts/jquery-ui/effects/effect-fade.js +50 -0
  29. data/app/assets/javascripts/jquery-ui/effects/effect-fold.js +92 -0
  30. data/app/assets/javascripts/jquery-ui/effects/effect-highlight.js +60 -0
  31. data/app/assets/javascripts/jquery-ui/effects/effect-puff.js +46 -0
  32. data/app/assets/javascripts/jquery-ui/effects/effect-pulsate.js +67 -0
  33. data/app/assets/javascripts/jquery-ui/effects/effect-scale.js +60 -0
  34. data/app/assets/javascripts/jquery-ui/effects/effect-shake.js +77 -0
  35. data/app/assets/javascripts/jquery-ui/effects/effect-size.js +194 -0
  36. data/app/assets/javascripts/jquery-ui/effects/effect-slide.js +79 -0
  37. data/app/assets/javascripts/jquery-ui/effects/effect-transfer.js +43 -0
  38. data/app/assets/javascripts/jquery-ui/escape-selector.js +23 -0
  39. data/app/assets/javascripts/jquery-ui/focusable.js +86 -0
  40. data/app/assets/javascripts/jquery-ui/form-reset-mixin.js +80 -0
  41. data/app/assets/javascripts/jquery-ui/form.js +22 -0
  42. data/app/assets/javascripts/jquery-ui/i18n/datepicker-af.js +37 -0
  43. data/app/assets/javascripts/jquery-ui/i18n/datepicker-ar-DZ.js +39 -0
  44. data/app/assets/javascripts/jquery-ui/i18n/datepicker-ar.js +39 -0
  45. data/app/assets/javascripts/jquery-ui/i18n/datepicker-az.js +37 -0
  46. data/app/assets/javascripts/jquery-ui/i18n/datepicker-be.js +37 -0
  47. data/app/assets/javascripts/jquery-ui/i18n/datepicker-bg.js +38 -0
  48. data/app/assets/javascripts/jquery-ui/i18n/datepicker-bs.js +37 -0
  49. data/app/assets/javascripts/jquery-ui/i18n/datepicker-ca.js +37 -0
  50. data/app/assets/javascripts/jquery-ui/i18n/datepicker-cs.js +37 -0
  51. data/app/assets/javascripts/jquery-ui/i18n/datepicker-cy-GB.js +45 -0
  52. data/app/assets/javascripts/jquery-ui/i18n/datepicker-da.js +37 -0
  53. data/app/assets/javascripts/jquery-ui/i18n/datepicker-de.js +37 -0
  54. data/app/assets/javascripts/jquery-ui/i18n/datepicker-el.js +37 -0
  55. data/app/assets/javascripts/jquery-ui/i18n/datepicker-en-AU.js +37 -0
  56. data/app/assets/javascripts/jquery-ui/i18n/datepicker-en-GB.js +37 -0
  57. data/app/assets/javascripts/jquery-ui/i18n/datepicker-en-NZ.js +37 -0
  58. data/app/assets/javascripts/jquery-ui/i18n/datepicker-eo.js +37 -0
  59. data/app/assets/javascripts/jquery-ui/i18n/datepicker-es.js +37 -0
  60. data/app/assets/javascripts/jquery-ui/i18n/datepicker-et.js +45 -0
  61. data/app/assets/javascripts/jquery-ui/i18n/datepicker-eu.js +36 -0
  62. data/app/assets/javascripts/jquery-ui/i18n/datepicker-fa.js +73 -0
  63. data/app/assets/javascripts/jquery-ui/i18n/datepicker-fi.js +37 -0
  64. data/app/assets/javascripts/jquery-ui/i18n/datepicker-fo.js +45 -0
  65. data/app/assets/javascripts/jquery-ui/i18n/datepicker-fr-CA.js +37 -0
  66. data/app/assets/javascripts/jquery-ui/i18n/datepicker-fr-CH.js +37 -0
  67. data/app/assets/javascripts/jquery-ui/i18n/datepicker-fr.js +39 -0
  68. data/app/assets/javascripts/jquery-ui/i18n/datepicker-gl.js +37 -0
  69. data/app/assets/javascripts/jquery-ui/i18n/datepicker-he.js +37 -0
  70. data/app/assets/javascripts/jquery-ui/i18n/datepicker-hi.js +37 -0
  71. data/app/assets/javascripts/jquery-ui/i18n/datepicker-hr.js +37 -0
  72. data/app/assets/javascripts/jquery-ui/i18n/datepicker-hu.js +36 -0
  73. data/app/assets/javascripts/jquery-ui/i18n/datepicker-hy.js +37 -0
  74. data/app/assets/javascripts/jquery-ui/i18n/datepicker-id.js +37 -0
  75. data/app/assets/javascripts/jquery-ui/i18n/datepicker-is.js +45 -0
  76. data/app/assets/javascripts/jquery-ui/i18n/datepicker-it-CH.js +37 -0
  77. data/app/assets/javascripts/jquery-ui/i18n/datepicker-it.js +37 -0
  78. data/app/assets/javascripts/jquery-ui/i18n/datepicker-ja.js +37 -0
  79. data/app/assets/javascripts/jquery-ui/i18n/datepicker-ka.js +48 -0
  80. data/app/assets/javascripts/jquery-ui/i18n/datepicker-kk.js +37 -0
  81. data/app/assets/javascripts/jquery-ui/i18n/datepicker-km.js +37 -0
  82. data/app/assets/javascripts/jquery-ui/i18n/datepicker-ko.js +37 -0
  83. data/app/assets/javascripts/jquery-ui/i18n/datepicker-ky.js +38 -0
  84. data/app/assets/javascripts/jquery-ui/i18n/datepicker-lb.js +45 -0
  85. data/app/assets/javascripts/jquery-ui/i18n/datepicker-lt.js +45 -0
  86. data/app/assets/javascripts/jquery-ui/i18n/datepicker-lv.js +45 -0
  87. data/app/assets/javascripts/jquery-ui/i18n/datepicker-mk.js +37 -0
  88. data/app/assets/javascripts/jquery-ui/i18n/datepicker-ml.js +37 -0
  89. data/app/assets/javascripts/jquery-ui/i18n/datepicker-ms.js +37 -0
  90. data/app/assets/javascripts/jquery-ui/i18n/datepicker-nb.js +49 -0
  91. data/app/assets/javascripts/jquery-ui/i18n/datepicker-nl-BE.js +37 -0
  92. data/app/assets/javascripts/jquery-ui/i18n/datepicker-nl.js +37 -0
  93. data/app/assets/javascripts/jquery-ui/i18n/datepicker-nn.js +49 -0
  94. data/app/assets/javascripts/jquery-ui/i18n/datepicker-no.js +50 -0
  95. data/app/assets/javascripts/jquery-ui/i18n/datepicker-pl.js +37 -0
  96. data/app/assets/javascripts/jquery-ui/i18n/datepicker-pt-BR.js +45 -0
  97. data/app/assets/javascripts/jquery-ui/i18n/datepicker-pt.js +44 -0
  98. data/app/assets/javascripts/jquery-ui/i18n/datepicker-rm.js +61 -0
  99. data/app/assets/javascripts/jquery-ui/i18n/datepicker-ro.js +40 -0
  100. data/app/assets/javascripts/jquery-ui/i18n/datepicker-ru.js +37 -0
  101. data/app/assets/javascripts/jquery-ui/i18n/datepicker-sk.js +37 -0
  102. data/app/assets/javascripts/jquery-ui/i18n/datepicker-sl.js +38 -0
  103. data/app/assets/javascripts/jquery-ui/i18n/datepicker-sq.js +37 -0
  104. data/app/assets/javascripts/jquery-ui/i18n/datepicker-sr-SR.js +37 -0
  105. data/app/assets/javascripts/jquery-ui/i18n/datepicker-sr.js +37 -0
  106. data/app/assets/javascripts/jquery-ui/i18n/datepicker-sv.js +37 -0
  107. data/app/assets/javascripts/jquery-ui/i18n/datepicker-ta.js +53 -0
  108. data/app/assets/javascripts/jquery-ui/i18n/datepicker-th.js +37 -0
  109. data/app/assets/javascripts/jquery-ui/i18n/datepicker-tj.js +37 -0
  110. data/app/assets/javascripts/jquery-ui/i18n/datepicker-tr.js +37 -0
  111. data/app/assets/javascripts/jquery-ui/i18n/datepicker-uk.js +38 -0
  112. data/app/assets/javascripts/jquery-ui/i18n/datepicker-vi.js +37 -0
  113. data/app/assets/javascripts/jquery-ui/i18n/datepicker-zh-CN.js +37 -0
  114. data/app/assets/javascripts/jquery-ui/i18n/datepicker-zh-HK.js +37 -0
  115. data/app/assets/javascripts/jquery-ui/i18n/datepicker-zh-TW.js +37 -0
  116. data/app/assets/javascripts/jquery-ui/ie.js +17 -0
  117. data/app/assets/javascripts/jquery-ui/jquery-1-7.js +91 -0
  118. data/app/assets/javascripts/jquery-ui/keycode.js +47 -0
  119. data/app/assets/javascripts/jquery-ui/labels.js +65 -0
  120. data/app/assets/javascripts/jquery-ui/plugin.js +46 -0
  121. data/app/assets/javascripts/jquery-ui/position.js +500 -0
  122. data/app/assets/javascripts/jquery-ui/safe-active-element.js +42 -0
  123. data/app/assets/javascripts/jquery-ui/safe-blur.js +23 -0
  124. data/app/assets/javascripts/jquery-ui/scroll-parent.js +47 -0
  125. data/app/assets/javascripts/jquery-ui/tabbable.js +38 -0
  126. data/app/assets/javascripts/jquery-ui/unique-id.js +51 -0
  127. data/app/assets/javascripts/jquery-ui/version.js +17 -0
  128. data/app/assets/javascripts/jquery-ui/widget.js +735 -0
  129. data/app/assets/javascripts/jquery-ui/widgets/accordion.js +618 -0
  130. data/app/assets/javascripts/jquery-ui/widgets/autocomplete.js +689 -0
  131. data/app/assets/javascripts/jquery-ui/widgets/button.js +391 -0
  132. data/app/assets/javascripts/jquery-ui/widgets/checkboxradio.js +291 -0
  133. data/app/assets/javascripts/jquery-ui/widgets/controlgroup.js +300 -0
  134. data/app/assets/javascripts/jquery-ui/widgets/datepicker.js +2123 -0
  135. data/app/assets/javascripts/jquery-ui/widgets/dialog.js +954 -0
  136. data/app/assets/javascripts/jquery-ui/widgets/draggable.js +1259 -0
  137. data/app/assets/javascripts/jquery-ui/widgets/droppable.js +502 -0
  138. data/app/assets/javascripts/jquery-ui/widgets/menu.js +680 -0
  139. data/app/assets/javascripts/jquery-ui/widgets/mouse.js +230 -0
  140. data/app/assets/javascripts/jquery-ui/widgets/progressbar.js +181 -0
  141. data/app/assets/javascripts/jquery-ui/widgets/resizable.js +1207 -0
  142. data/app/assets/javascripts/jquery-ui/widgets/selectable.js +314 -0
  143. data/app/assets/javascripts/jquery-ui/widgets/selectmenu.js +697 -0
  144. data/app/assets/javascripts/jquery-ui/widgets/slider.js +757 -0
  145. data/app/assets/javascripts/jquery-ui/widgets/sortable.js +1561 -0
  146. data/app/assets/javascripts/jquery-ui/widgets/spinner.js +581 -0
  147. data/app/assets/javascripts/jquery-ui/widgets/tabs.js +931 -0
  148. data/app/assets/javascripts/jquery-ui/widgets/tooltip.js +526 -0
  149. data/app/assets/javascripts/jquery-ui.js +56 -0
  150. data/app/assets/stylesheets/jquery-ui/accordion.css +26 -0
  151. data/app/assets/stylesheets/jquery-ui/all.css +14 -0
  152. data/app/assets/stylesheets/jquery-ui/autocomplete.css +19 -0
  153. data/app/assets/stylesheets/jquery-ui/base.css +32 -0
  154. data/app/assets/stylesheets/jquery-ui/button.css +85 -0
  155. data/app/assets/stylesheets/jquery-ui/checkboxradio.css +37 -0
  156. data/app/assets/stylesheets/jquery-ui/controlgroup.css +68 -0
  157. data/app/assets/stylesheets/jquery-ui/core.css +100 -0
  158. data/app/assets/stylesheets/jquery-ui/datepicker.css +188 -0
  159. data/app/assets/stylesheets/jquery-ui/dialog.css +104 -0
  160. data/app/assets/stylesheets/jquery-ui/draggable.css +15 -0
  161. data/app/assets/stylesheets/jquery-ui/menu.css +67 -0
  162. data/app/assets/stylesheets/jquery-ui/progressbar.css +31 -0
  163. data/app/assets/stylesheets/jquery-ui/resizable.css +81 -0
  164. data/app/assets/stylesheets/jquery-ui/selectable.css +20 -0
  165. data/app/assets/stylesheets/jquery-ui/selectmenu.css +53 -0
  166. data/app/assets/stylesheets/jquery-ui/slider.css +78 -0
  167. data/app/assets/stylesheets/jquery-ui/sortable.css +15 -0
  168. data/app/assets/stylesheets/jquery-ui/spinner.css +55 -0
  169. data/app/assets/stylesheets/jquery-ui/tabs.css +54 -0
  170. data/app/assets/stylesheets/jquery-ui/theme.css.erb +453 -0
  171. data/app/assets/stylesheets/jquery-ui/tooltip.css +22 -0
  172. data/app/assets/stylesheets/jquery-ui.css +1 -0
  173. data/lib/jquery/ui/rails/engine.rb +8 -0
  174. data/lib/jquery/ui/rails/version.rb +8 -0
  175. data/lib/jquery/ui/rails.rb +2 -0
  176. data/lib/jquery-ui-rails.rb +1 -0
  177. metadata +248 -0
@@ -0,0 +1,1259 @@
1
+ //= require jquery-ui/widgets/mouse
2
+ //= require jquery-ui/data
3
+ //= require jquery-ui/plugin
4
+ //= require jquery-ui/safe-active-element
5
+ //= require jquery-ui/safe-blur
6
+ //= require jquery-ui/scroll-parent
7
+ //= require jquery-ui/version
8
+ //= require jquery-ui/widget
9
+
10
+ /*!
11
+ * jQuery UI Draggable 1.12.1
12
+ * http://jqueryui.com
13
+ *
14
+ * Copyright jQuery Foundation and other contributors
15
+ * Released under the MIT license.
16
+ * http://jquery.org/license
17
+ */
18
+
19
+ //>>label: Draggable
20
+ //>>group: Interactions
21
+ //>>description: Enables dragging functionality for any element.
22
+ //>>docs: http://api.jqueryui.com/draggable/
23
+ //>>demos: http://jqueryui.com/draggable/
24
+ //>>css.structure: ../../themes/base/draggable.css
25
+
26
+ ( function( factory ) {
27
+ if ( typeof define === "function" && define.amd ) {
28
+
29
+ // AMD. Register as an anonymous module.
30
+ define( [
31
+ "jquery",
32
+ "./mouse",
33
+ "../data",
34
+ "../plugin",
35
+ "../safe-active-element",
36
+ "../safe-blur",
37
+ "../scroll-parent",
38
+ "../version",
39
+ "../widget"
40
+ ], factory );
41
+ } else {
42
+
43
+ // Browser globals
44
+ factory( jQuery );
45
+ }
46
+ }( function( $ ) {
47
+
48
+ $.widget( "ui.draggable", $.ui.mouse, {
49
+ version: "1.12.1",
50
+ widgetEventPrefix: "drag",
51
+ options: {
52
+ addClasses: true,
53
+ appendTo: "parent",
54
+ axis: false,
55
+ connectToSortable: false,
56
+ containment: false,
57
+ cursor: "auto",
58
+ cursorAt: false,
59
+ grid: false,
60
+ handle: false,
61
+ helper: "original",
62
+ iframeFix: false,
63
+ opacity: false,
64
+ refreshPositions: false,
65
+ revert: false,
66
+ revertDuration: 500,
67
+ scope: "default",
68
+ scroll: true,
69
+ scrollSensitivity: 20,
70
+ scrollSpeed: 20,
71
+ snap: false,
72
+ snapMode: "both",
73
+ snapTolerance: 20,
74
+ stack: false,
75
+ zIndex: false,
76
+
77
+ // Callbacks
78
+ drag: null,
79
+ start: null,
80
+ stop: null
81
+ },
82
+ _create: function() {
83
+
84
+ if ( this.options.helper === "original" ) {
85
+ this._setPositionRelative();
86
+ }
87
+ if ( this.options.addClasses ) {
88
+ this._addClass( "ui-draggable" );
89
+ }
90
+ this._setHandleClassName();
91
+
92
+ this._mouseInit();
93
+ },
94
+
95
+ _setOption: function( key, value ) {
96
+ this._super( key, value );
97
+ if ( key === "handle" ) {
98
+ this._removeHandleClassName();
99
+ this._setHandleClassName();
100
+ }
101
+ },
102
+
103
+ _destroy: function() {
104
+ if ( ( this.helper || this.element ).is( ".ui-draggable-dragging" ) ) {
105
+ this.destroyOnClear = true;
106
+ return;
107
+ }
108
+ this._removeHandleClassName();
109
+ this._mouseDestroy();
110
+ },
111
+
112
+ _mouseCapture: function( event ) {
113
+ var o = this.options;
114
+
115
+ // Among others, prevent a drag on a resizable-handle
116
+ if ( this.helper || o.disabled ||
117
+ $( event.target ).closest( ".ui-resizable-handle" ).length > 0 ) {
118
+ return false;
119
+ }
120
+
121
+ //Quit if we're not on a valid handle
122
+ this.handle = this._getHandle( event );
123
+ if ( !this.handle ) {
124
+ return false;
125
+ }
126
+
127
+ this._blurActiveElement( event );
128
+
129
+ this._blockFrames( o.iframeFix === true ? "iframe" : o.iframeFix );
130
+
131
+ return true;
132
+
133
+ },
134
+
135
+ _blockFrames: function( selector ) {
136
+ this.iframeBlocks = this.document.find( selector ).map( function() {
137
+ var iframe = $( this );
138
+
139
+ return $( "<div>" )
140
+ .css( "position", "absolute" )
141
+ .appendTo( iframe.parent() )
142
+ .outerWidth( iframe.outerWidth() )
143
+ .outerHeight( iframe.outerHeight() )
144
+ .offset( iframe.offset() )[ 0 ];
145
+ } );
146
+ },
147
+
148
+ _unblockFrames: function() {
149
+ if ( this.iframeBlocks ) {
150
+ this.iframeBlocks.remove();
151
+ delete this.iframeBlocks;
152
+ }
153
+ },
154
+
155
+ _blurActiveElement: function( event ) {
156
+ var activeElement = $.ui.safeActiveElement( this.document[ 0 ] ),
157
+ target = $( event.target );
158
+
159
+ // Don't blur if the event occurred on an element that is within
160
+ // the currently focused element
161
+ // See #10527, #12472
162
+ if ( target.closest( activeElement ).length ) {
163
+ return;
164
+ }
165
+
166
+ // Blur any element that currently has focus, see #4261
167
+ $.ui.safeBlur( activeElement );
168
+ },
169
+
170
+ _mouseStart: function( event ) {
171
+
172
+ var o = this.options;
173
+
174
+ //Create and append the visible helper
175
+ this.helper = this._createHelper( event );
176
+
177
+ this._addClass( this.helper, "ui-draggable-dragging" );
178
+
179
+ //Cache the helper size
180
+ this._cacheHelperProportions();
181
+
182
+ //If ddmanager is used for droppables, set the global draggable
183
+ if ( $.ui.ddmanager ) {
184
+ $.ui.ddmanager.current = this;
185
+ }
186
+
187
+ /*
188
+ * - Position generation -
189
+ * This block generates everything position related - it's the core of draggables.
190
+ */
191
+
192
+ //Cache the margins of the original element
193
+ this._cacheMargins();
194
+
195
+ //Store the helper's css position
196
+ this.cssPosition = this.helper.css( "position" );
197
+ this.scrollParent = this.helper.scrollParent( true );
198
+ this.offsetParent = this.helper.offsetParent();
199
+ this.hasFixedAncestor = this.helper.parents().filter( function() {
200
+ return $( this ).css( "position" ) === "fixed";
201
+ } ).length > 0;
202
+
203
+ //The element's absolute position on the page minus margins
204
+ this.positionAbs = this.element.offset();
205
+ this._refreshOffsets( event );
206
+
207
+ //Generate the original position
208
+ this.originalPosition = this.position = this._generatePosition( event, false );
209
+ this.originalPageX = event.pageX;
210
+ this.originalPageY = event.pageY;
211
+
212
+ //Adjust the mouse offset relative to the helper if "cursorAt" is supplied
213
+ ( o.cursorAt && this._adjustOffsetFromHelper( o.cursorAt ) );
214
+
215
+ //Set a containment if given in the options
216
+ this._setContainment();
217
+
218
+ //Trigger event + callbacks
219
+ if ( this._trigger( "start", event ) === false ) {
220
+ this._clear();
221
+ return false;
222
+ }
223
+
224
+ //Recache the helper size
225
+ this._cacheHelperProportions();
226
+
227
+ //Prepare the droppable offsets
228
+ if ( $.ui.ddmanager && !o.dropBehaviour ) {
229
+ $.ui.ddmanager.prepareOffsets( this, event );
230
+ }
231
+
232
+ // Execute the drag once - this causes the helper not to be visible before getting its
233
+ // correct position
234
+ this._mouseDrag( event, true );
235
+
236
+ // If the ddmanager is used for droppables, inform the manager that dragging has started
237
+ // (see #5003)
238
+ if ( $.ui.ddmanager ) {
239
+ $.ui.ddmanager.dragStart( this, event );
240
+ }
241
+
242
+ return true;
243
+ },
244
+
245
+ _refreshOffsets: function( event ) {
246
+ this.offset = {
247
+ top: this.positionAbs.top - this.margins.top,
248
+ left: this.positionAbs.left - this.margins.left,
249
+ scroll: false,
250
+ parent: this._getParentOffset(),
251
+ relative: this._getRelativeOffset()
252
+ };
253
+
254
+ this.offset.click = {
255
+ left: event.pageX - this.offset.left,
256
+ top: event.pageY - this.offset.top
257
+ };
258
+ },
259
+
260
+ _mouseDrag: function( event, noPropagation ) {
261
+
262
+ // reset any necessary cached properties (see #5009)
263
+ if ( this.hasFixedAncestor ) {
264
+ this.offset.parent = this._getParentOffset();
265
+ }
266
+
267
+ //Compute the helpers position
268
+ this.position = this._generatePosition( event, true );
269
+ this.positionAbs = this._convertPositionTo( "absolute" );
270
+
271
+ //Call plugins and callbacks and use the resulting position if something is returned
272
+ if ( !noPropagation ) {
273
+ var ui = this._uiHash();
274
+ if ( this._trigger( "drag", event, ui ) === false ) {
275
+ this._mouseUp( new $.Event( "mouseup", event ) );
276
+ return false;
277
+ }
278
+ this.position = ui.position;
279
+ }
280
+
281
+ this.helper[ 0 ].style.left = this.position.left + "px";
282
+ this.helper[ 0 ].style.top = this.position.top + "px";
283
+
284
+ if ( $.ui.ddmanager ) {
285
+ $.ui.ddmanager.drag( this, event );
286
+ }
287
+
288
+ return false;
289
+ },
290
+
291
+ _mouseStop: function( event ) {
292
+
293
+ //If we are using droppables, inform the manager about the drop
294
+ var that = this,
295
+ dropped = false;
296
+ if ( $.ui.ddmanager && !this.options.dropBehaviour ) {
297
+ dropped = $.ui.ddmanager.drop( this, event );
298
+ }
299
+
300
+ //if a drop comes from outside (a sortable)
301
+ if ( this.dropped ) {
302
+ dropped = this.dropped;
303
+ this.dropped = false;
304
+ }
305
+
306
+ if ( ( this.options.revert === "invalid" && !dropped ) ||
307
+ ( this.options.revert === "valid" && dropped ) ||
308
+ this.options.revert === true || ( $.isFunction( this.options.revert ) &&
309
+ this.options.revert.call( this.element, dropped ) )
310
+ ) {
311
+ $( this.helper ).animate(
312
+ this.originalPosition,
313
+ parseInt( this.options.revertDuration, 10 ),
314
+ function() {
315
+ if ( that._trigger( "stop", event ) !== false ) {
316
+ that._clear();
317
+ }
318
+ }
319
+ );
320
+ } else {
321
+ if ( this._trigger( "stop", event ) !== false ) {
322
+ this._clear();
323
+ }
324
+ }
325
+
326
+ return false;
327
+ },
328
+
329
+ _mouseUp: function( event ) {
330
+ this._unblockFrames();
331
+
332
+ // If the ddmanager is used for droppables, inform the manager that dragging has stopped
333
+ // (see #5003)
334
+ if ( $.ui.ddmanager ) {
335
+ $.ui.ddmanager.dragStop( this, event );
336
+ }
337
+
338
+ // Only need to focus if the event occurred on the draggable itself, see #10527
339
+ if ( this.handleElement.is( event.target ) ) {
340
+
341
+ // The interaction is over; whether or not the click resulted in a drag,
342
+ // focus the element
343
+ this.element.trigger( "focus" );
344
+ }
345
+
346
+ return $.ui.mouse.prototype._mouseUp.call( this, event );
347
+ },
348
+
349
+ cancel: function() {
350
+
351
+ if ( this.helper.is( ".ui-draggable-dragging" ) ) {
352
+ this._mouseUp( new $.Event( "mouseup", { target: this.element[ 0 ] } ) );
353
+ } else {
354
+ this._clear();
355
+ }
356
+
357
+ return this;
358
+
359
+ },
360
+
361
+ _getHandle: function( event ) {
362
+ return this.options.handle ?
363
+ !!$( event.target ).closest( this.element.find( this.options.handle ) ).length :
364
+ true;
365
+ },
366
+
367
+ _setHandleClassName: function() {
368
+ this.handleElement = this.options.handle ?
369
+ this.element.find( this.options.handle ) : this.element;
370
+ this._addClass( this.handleElement, "ui-draggable-handle" );
371
+ },
372
+
373
+ _removeHandleClassName: function() {
374
+ this._removeClass( this.handleElement, "ui-draggable-handle" );
375
+ },
376
+
377
+ _createHelper: function( event ) {
378
+
379
+ var o = this.options,
380
+ helperIsFunction = $.isFunction( o.helper ),
381
+ helper = helperIsFunction ?
382
+ $( o.helper.apply( this.element[ 0 ], [ event ] ) ) :
383
+ ( o.helper === "clone" ?
384
+ this.element.clone().removeAttr( "id" ) :
385
+ this.element );
386
+
387
+ if ( !helper.parents( "body" ).length ) {
388
+ helper.appendTo( ( o.appendTo === "parent" ?
389
+ this.element[ 0 ].parentNode :
390
+ o.appendTo ) );
391
+ }
392
+
393
+ // Http://bugs.jqueryui.com/ticket/9446
394
+ // a helper function can return the original element
395
+ // which wouldn't have been set to relative in _create
396
+ if ( helperIsFunction && helper[ 0 ] === this.element[ 0 ] ) {
397
+ this._setPositionRelative();
398
+ }
399
+
400
+ if ( helper[ 0 ] !== this.element[ 0 ] &&
401
+ !( /(fixed|absolute)/ ).test( helper.css( "position" ) ) ) {
402
+ helper.css( "position", "absolute" );
403
+ }
404
+
405
+ return helper;
406
+
407
+ },
408
+
409
+ _setPositionRelative: function() {
410
+ if ( !( /^(?:r|a|f)/ ).test( this.element.css( "position" ) ) ) {
411
+ this.element[ 0 ].style.position = "relative";
412
+ }
413
+ },
414
+
415
+ _adjustOffsetFromHelper: function( obj ) {
416
+ if ( typeof obj === "string" ) {
417
+ obj = obj.split( " " );
418
+ }
419
+ if ( $.isArray( obj ) ) {
420
+ obj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 };
421
+ }
422
+ if ( "left" in obj ) {
423
+ this.offset.click.left = obj.left + this.margins.left;
424
+ }
425
+ if ( "right" in obj ) {
426
+ this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
427
+ }
428
+ if ( "top" in obj ) {
429
+ this.offset.click.top = obj.top + this.margins.top;
430
+ }
431
+ if ( "bottom" in obj ) {
432
+ this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
433
+ }
434
+ },
435
+
436
+ _isRootNode: function( element ) {
437
+ return ( /(html|body)/i ).test( element.tagName ) || element === this.document[ 0 ];
438
+ },
439
+
440
+ _getParentOffset: function() {
441
+
442
+ //Get the offsetParent and cache its position
443
+ var po = this.offsetParent.offset(),
444
+ document = this.document[ 0 ];
445
+
446
+ // This is a special case where we need to modify a offset calculated on start, since the
447
+ // following happened:
448
+ // 1. The position of the helper is absolute, so it's position is calculated based on the
449
+ // next positioned parent
450
+ // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't
451
+ // the document, which means that the scroll is included in the initial calculation of the
452
+ // offset of the parent, and never recalculated upon drag
453
+ if ( this.cssPosition === "absolute" && this.scrollParent[ 0 ] !== document &&
454
+ $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {
455
+ po.left += this.scrollParent.scrollLeft();
456
+ po.top += this.scrollParent.scrollTop();
457
+ }
458
+
459
+ if ( this._isRootNode( this.offsetParent[ 0 ] ) ) {
460
+ po = { top: 0, left: 0 };
461
+ }
462
+
463
+ return {
464
+ top: po.top + ( parseInt( this.offsetParent.css( "borderTopWidth" ), 10 ) || 0 ),
465
+ left: po.left + ( parseInt( this.offsetParent.css( "borderLeftWidth" ), 10 ) || 0 )
466
+ };
467
+
468
+ },
469
+
470
+ _getRelativeOffset: function() {
471
+ if ( this.cssPosition !== "relative" ) {
472
+ return { top: 0, left: 0 };
473
+ }
474
+
475
+ var p = this.element.position(),
476
+ scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
477
+
478
+ return {
479
+ top: p.top - ( parseInt( this.helper.css( "top" ), 10 ) || 0 ) +
480
+ ( !scrollIsRootNode ? this.scrollParent.scrollTop() : 0 ),
481
+ left: p.left - ( parseInt( this.helper.css( "left" ), 10 ) || 0 ) +
482
+ ( !scrollIsRootNode ? this.scrollParent.scrollLeft() : 0 )
483
+ };
484
+
485
+ },
486
+
487
+ _cacheMargins: function() {
488
+ this.margins = {
489
+ left: ( parseInt( this.element.css( "marginLeft" ), 10 ) || 0 ),
490
+ top: ( parseInt( this.element.css( "marginTop" ), 10 ) || 0 ),
491
+ right: ( parseInt( this.element.css( "marginRight" ), 10 ) || 0 ),
492
+ bottom: ( parseInt( this.element.css( "marginBottom" ), 10 ) || 0 )
493
+ };
494
+ },
495
+
496
+ _cacheHelperProportions: function() {
497
+ this.helperProportions = {
498
+ width: this.helper.outerWidth(),
499
+ height: this.helper.outerHeight()
500
+ };
501
+ },
502
+
503
+ _setContainment: function() {
504
+
505
+ var isUserScrollable, c, ce,
506
+ o = this.options,
507
+ document = this.document[ 0 ];
508
+
509
+ this.relativeContainer = null;
510
+
511
+ if ( !o.containment ) {
512
+ this.containment = null;
513
+ return;
514
+ }
515
+
516
+ if ( o.containment === "window" ) {
517
+ this.containment = [
518
+ $( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
519
+ $( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top,
520
+ $( window ).scrollLeft() + $( window ).width() -
521
+ this.helperProportions.width - this.margins.left,
522
+ $( window ).scrollTop() +
523
+ ( $( window ).height() || document.body.parentNode.scrollHeight ) -
524
+ this.helperProportions.height - this.margins.top
525
+ ];
526
+ return;
527
+ }
528
+
529
+ if ( o.containment === "document" ) {
530
+ this.containment = [
531
+ 0,
532
+ 0,
533
+ $( document ).width() - this.helperProportions.width - this.margins.left,
534
+ ( $( document ).height() || document.body.parentNode.scrollHeight ) -
535
+ this.helperProportions.height - this.margins.top
536
+ ];
537
+ return;
538
+ }
539
+
540
+ if ( o.containment.constructor === Array ) {
541
+ this.containment = o.containment;
542
+ return;
543
+ }
544
+
545
+ if ( o.containment === "parent" ) {
546
+ o.containment = this.helper[ 0 ].parentNode;
547
+ }
548
+
549
+ c = $( o.containment );
550
+ ce = c[ 0 ];
551
+
552
+ if ( !ce ) {
553
+ return;
554
+ }
555
+
556
+ isUserScrollable = /(scroll|auto)/.test( c.css( "overflow" ) );
557
+
558
+ this.containment = [
559
+ ( parseInt( c.css( "borderLeftWidth" ), 10 ) || 0 ) +
560
+ ( parseInt( c.css( "paddingLeft" ), 10 ) || 0 ),
561
+ ( parseInt( c.css( "borderTopWidth" ), 10 ) || 0 ) +
562
+ ( parseInt( c.css( "paddingTop" ), 10 ) || 0 ),
563
+ ( isUserScrollable ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -
564
+ ( parseInt( c.css( "borderRightWidth" ), 10 ) || 0 ) -
565
+ ( parseInt( c.css( "paddingRight" ), 10 ) || 0 ) -
566
+ this.helperProportions.width -
567
+ this.margins.left -
568
+ this.margins.right,
569
+ ( isUserScrollable ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -
570
+ ( parseInt( c.css( "borderBottomWidth" ), 10 ) || 0 ) -
571
+ ( parseInt( c.css( "paddingBottom" ), 10 ) || 0 ) -
572
+ this.helperProportions.height -
573
+ this.margins.top -
574
+ this.margins.bottom
575
+ ];
576
+ this.relativeContainer = c;
577
+ },
578
+
579
+ _convertPositionTo: function( d, pos ) {
580
+
581
+ if ( !pos ) {
582
+ pos = this.position;
583
+ }
584
+
585
+ var mod = d === "absolute" ? 1 : -1,
586
+ scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
587
+
588
+ return {
589
+ top: (
590
+
591
+ // The absolute mouse position
592
+ pos.top +
593
+
594
+ // Only for relative positioned nodes: Relative offset from element to offset parent
595
+ this.offset.relative.top * mod +
596
+
597
+ // The offsetParent's offset without borders (offset + border)
598
+ this.offset.parent.top * mod -
599
+ ( ( this.cssPosition === "fixed" ?
600
+ -this.offset.scroll.top :
601
+ ( scrollIsRootNode ? 0 : this.offset.scroll.top ) ) * mod )
602
+ ),
603
+ left: (
604
+
605
+ // The absolute mouse position
606
+ pos.left +
607
+
608
+ // Only for relative positioned nodes: Relative offset from element to offset parent
609
+ this.offset.relative.left * mod +
610
+
611
+ // The offsetParent's offset without borders (offset + border)
612
+ this.offset.parent.left * mod -
613
+ ( ( this.cssPosition === "fixed" ?
614
+ -this.offset.scroll.left :
615
+ ( scrollIsRootNode ? 0 : this.offset.scroll.left ) ) * mod )
616
+ )
617
+ };
618
+
619
+ },
620
+
621
+ _generatePosition: function( event, constrainPosition ) {
622
+
623
+ var containment, co, top, left,
624
+ o = this.options,
625
+ scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ),
626
+ pageX = event.pageX,
627
+ pageY = event.pageY;
628
+
629
+ // Cache the scroll
630
+ if ( !scrollIsRootNode || !this.offset.scroll ) {
631
+ this.offset.scroll = {
632
+ top: this.scrollParent.scrollTop(),
633
+ left: this.scrollParent.scrollLeft()
634
+ };
635
+ }
636
+
637
+ /*
638
+ * - Position constraining -
639
+ * Constrain the position to a mix of grid, containment.
640
+ */
641
+
642
+ // If we are not dragging yet, we won't check for options
643
+ if ( constrainPosition ) {
644
+ if ( this.containment ) {
645
+ if ( this.relativeContainer ) {
646
+ co = this.relativeContainer.offset();
647
+ containment = [
648
+ this.containment[ 0 ] + co.left,
649
+ this.containment[ 1 ] + co.top,
650
+ this.containment[ 2 ] + co.left,
651
+ this.containment[ 3 ] + co.top
652
+ ];
653
+ } else {
654
+ containment = this.containment;
655
+ }
656
+
657
+ if ( event.pageX - this.offset.click.left < containment[ 0 ] ) {
658
+ pageX = containment[ 0 ] + this.offset.click.left;
659
+ }
660
+ if ( event.pageY - this.offset.click.top < containment[ 1 ] ) {
661
+ pageY = containment[ 1 ] + this.offset.click.top;
662
+ }
663
+ if ( event.pageX - this.offset.click.left > containment[ 2 ] ) {
664
+ pageX = containment[ 2 ] + this.offset.click.left;
665
+ }
666
+ if ( event.pageY - this.offset.click.top > containment[ 3 ] ) {
667
+ pageY = containment[ 3 ] + this.offset.click.top;
668
+ }
669
+ }
670
+
671
+ if ( o.grid ) {
672
+
673
+ //Check for grid elements set to 0 to prevent divide by 0 error causing invalid
674
+ // argument errors in IE (see ticket #6950)
675
+ top = o.grid[ 1 ] ? this.originalPageY + Math.round( ( pageY -
676
+ this.originalPageY ) / o.grid[ 1 ] ) * o.grid[ 1 ] : this.originalPageY;
677
+ pageY = containment ? ( ( top - this.offset.click.top >= containment[ 1 ] ||
678
+ top - this.offset.click.top > containment[ 3 ] ) ?
679
+ top :
680
+ ( ( top - this.offset.click.top >= containment[ 1 ] ) ?
681
+ top - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) : top;
682
+
683
+ left = o.grid[ 0 ] ? this.originalPageX +
684
+ Math.round( ( pageX - this.originalPageX ) / o.grid[ 0 ] ) * o.grid[ 0 ] :
685
+ this.originalPageX;
686
+ pageX = containment ? ( ( left - this.offset.click.left >= containment[ 0 ] ||
687
+ left - this.offset.click.left > containment[ 2 ] ) ?
688
+ left :
689
+ ( ( left - this.offset.click.left >= containment[ 0 ] ) ?
690
+ left - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) : left;
691
+ }
692
+
693
+ if ( o.axis === "y" ) {
694
+ pageX = this.originalPageX;
695
+ }
696
+
697
+ if ( o.axis === "x" ) {
698
+ pageY = this.originalPageY;
699
+ }
700
+ }
701
+
702
+ return {
703
+ top: (
704
+
705
+ // The absolute mouse position
706
+ pageY -
707
+
708
+ // Click offset (relative to the element)
709
+ this.offset.click.top -
710
+
711
+ // Only for relative positioned nodes: Relative offset from element to offset parent
712
+ this.offset.relative.top -
713
+
714
+ // The offsetParent's offset without borders (offset + border)
715
+ this.offset.parent.top +
716
+ ( this.cssPosition === "fixed" ?
717
+ -this.offset.scroll.top :
718
+ ( scrollIsRootNode ? 0 : this.offset.scroll.top ) )
719
+ ),
720
+ left: (
721
+
722
+ // The absolute mouse position
723
+ pageX -
724
+
725
+ // Click offset (relative to the element)
726
+ this.offset.click.left -
727
+
728
+ // Only for relative positioned nodes: Relative offset from element to offset parent
729
+ this.offset.relative.left -
730
+
731
+ // The offsetParent's offset without borders (offset + border)
732
+ this.offset.parent.left +
733
+ ( this.cssPosition === "fixed" ?
734
+ -this.offset.scroll.left :
735
+ ( scrollIsRootNode ? 0 : this.offset.scroll.left ) )
736
+ )
737
+ };
738
+
739
+ },
740
+
741
+ _clear: function() {
742
+ this._removeClass( this.helper, "ui-draggable-dragging" );
743
+ if ( this.helper[ 0 ] !== this.element[ 0 ] && !this.cancelHelperRemoval ) {
744
+ this.helper.remove();
745
+ }
746
+ this.helper = null;
747
+ this.cancelHelperRemoval = false;
748
+ if ( this.destroyOnClear ) {
749
+ this.destroy();
750
+ }
751
+ },
752
+
753
+ // From now on bulk stuff - mainly helpers
754
+
755
+ _trigger: function( type, event, ui ) {
756
+ ui = ui || this._uiHash();
757
+ $.ui.plugin.call( this, type, [ event, ui, this ], true );
758
+
759
+ // Absolute position and offset (see #6884 ) have to be recalculated after plugins
760
+ if ( /^(drag|start|stop)/.test( type ) ) {
761
+ this.positionAbs = this._convertPositionTo( "absolute" );
762
+ ui.offset = this.positionAbs;
763
+ }
764
+ return $.Widget.prototype._trigger.call( this, type, event, ui );
765
+ },
766
+
767
+ plugins: {},
768
+
769
+ _uiHash: function() {
770
+ return {
771
+ helper: this.helper,
772
+ position: this.position,
773
+ originalPosition: this.originalPosition,
774
+ offset: this.positionAbs
775
+ };
776
+ }
777
+
778
+ } );
779
+
780
+ $.ui.plugin.add( "draggable", "connectToSortable", {
781
+ start: function( event, ui, draggable ) {
782
+ var uiSortable = $.extend( {}, ui, {
783
+ item: draggable.element
784
+ } );
785
+
786
+ draggable.sortables = [];
787
+ $( draggable.options.connectToSortable ).each( function() {
788
+ var sortable = $( this ).sortable( "instance" );
789
+
790
+ if ( sortable && !sortable.options.disabled ) {
791
+ draggable.sortables.push( sortable );
792
+
793
+ // RefreshPositions is called at drag start to refresh the containerCache
794
+ // which is used in drag. This ensures it's initialized and synchronized
795
+ // with any changes that might have happened on the page since initialization.
796
+ sortable.refreshPositions();
797
+ sortable._trigger( "activate", event, uiSortable );
798
+ }
799
+ } );
800
+ },
801
+ stop: function( event, ui, draggable ) {
802
+ var uiSortable = $.extend( {}, ui, {
803
+ item: draggable.element
804
+ } );
805
+
806
+ draggable.cancelHelperRemoval = false;
807
+
808
+ $.each( draggable.sortables, function() {
809
+ var sortable = this;
810
+
811
+ if ( sortable.isOver ) {
812
+ sortable.isOver = 0;
813
+
814
+ // Allow this sortable to handle removing the helper
815
+ draggable.cancelHelperRemoval = true;
816
+ sortable.cancelHelperRemoval = false;
817
+
818
+ // Use _storedCSS To restore properties in the sortable,
819
+ // as this also handles revert (#9675) since the draggable
820
+ // may have modified them in unexpected ways (#8809)
821
+ sortable._storedCSS = {
822
+ position: sortable.placeholder.css( "position" ),
823
+ top: sortable.placeholder.css( "top" ),
824
+ left: sortable.placeholder.css( "left" )
825
+ };
826
+
827
+ sortable._mouseStop( event );
828
+
829
+ // Once drag has ended, the sortable should return to using
830
+ // its original helper, not the shared helper from draggable
831
+ sortable.options.helper = sortable.options._helper;
832
+ } else {
833
+
834
+ // Prevent this Sortable from removing the helper.
835
+ // However, don't set the draggable to remove the helper
836
+ // either as another connected Sortable may yet handle the removal.
837
+ sortable.cancelHelperRemoval = true;
838
+
839
+ sortable._trigger( "deactivate", event, uiSortable );
840
+ }
841
+ } );
842
+ },
843
+ drag: function( event, ui, draggable ) {
844
+ $.each( draggable.sortables, function() {
845
+ var innermostIntersecting = false,
846
+ sortable = this;
847
+
848
+ // Copy over variables that sortable's _intersectsWith uses
849
+ sortable.positionAbs = draggable.positionAbs;
850
+ sortable.helperProportions = draggable.helperProportions;
851
+ sortable.offset.click = draggable.offset.click;
852
+
853
+ if ( sortable._intersectsWith( sortable.containerCache ) ) {
854
+ innermostIntersecting = true;
855
+
856
+ $.each( draggable.sortables, function() {
857
+
858
+ // Copy over variables that sortable's _intersectsWith uses
859
+ this.positionAbs = draggable.positionAbs;
860
+ this.helperProportions = draggable.helperProportions;
861
+ this.offset.click = draggable.offset.click;
862
+
863
+ if ( this !== sortable &&
864
+ this._intersectsWith( this.containerCache ) &&
865
+ $.contains( sortable.element[ 0 ], this.element[ 0 ] ) ) {
866
+ innermostIntersecting = false;
867
+ }
868
+
869
+ return innermostIntersecting;
870
+ } );
871
+ }
872
+
873
+ if ( innermostIntersecting ) {
874
+
875
+ // If it intersects, we use a little isOver variable and set it once,
876
+ // so that the move-in stuff gets fired only once.
877
+ if ( !sortable.isOver ) {
878
+ sortable.isOver = 1;
879
+
880
+ // Store draggable's parent in case we need to reappend to it later.
881
+ draggable._parent = ui.helper.parent();
882
+
883
+ sortable.currentItem = ui.helper
884
+ .appendTo( sortable.element )
885
+ .data( "ui-sortable-item", true );
886
+
887
+ // Store helper option to later restore it
888
+ sortable.options._helper = sortable.options.helper;
889
+
890
+ sortable.options.helper = function() {
891
+ return ui.helper[ 0 ];
892
+ };
893
+
894
+ // Fire the start events of the sortable with our passed browser event,
895
+ // and our own helper (so it doesn't create a new one)
896
+ event.target = sortable.currentItem[ 0 ];
897
+ sortable._mouseCapture( event, true );
898
+ sortable._mouseStart( event, true, true );
899
+
900
+ // Because the browser event is way off the new appended portlet,
901
+ // modify necessary variables to reflect the changes
902
+ sortable.offset.click.top = draggable.offset.click.top;
903
+ sortable.offset.click.left = draggable.offset.click.left;
904
+ sortable.offset.parent.left -= draggable.offset.parent.left -
905
+ sortable.offset.parent.left;
906
+ sortable.offset.parent.top -= draggable.offset.parent.top -
907
+ sortable.offset.parent.top;
908
+
909
+ draggable._trigger( "toSortable", event );
910
+
911
+ // Inform draggable that the helper is in a valid drop zone,
912
+ // used solely in the revert option to handle "valid/invalid".
913
+ draggable.dropped = sortable.element;
914
+
915
+ // Need to refreshPositions of all sortables in the case that
916
+ // adding to one sortable changes the location of the other sortables (#9675)
917
+ $.each( draggable.sortables, function() {
918
+ this.refreshPositions();
919
+ } );
920
+
921
+ // Hack so receive/update callbacks work (mostly)
922
+ draggable.currentItem = draggable.element;
923
+ sortable.fromOutside = draggable;
924
+ }
925
+
926
+ if ( sortable.currentItem ) {
927
+ sortable._mouseDrag( event );
928
+
929
+ // Copy the sortable's position because the draggable's can potentially reflect
930
+ // a relative position, while sortable is always absolute, which the dragged
931
+ // element has now become. (#8809)
932
+ ui.position = sortable.position;
933
+ }
934
+ } else {
935
+
936
+ // If it doesn't intersect with the sortable, and it intersected before,
937
+ // we fake the drag stop of the sortable, but make sure it doesn't remove
938
+ // the helper by using cancelHelperRemoval.
939
+ if ( sortable.isOver ) {
940
+
941
+ sortable.isOver = 0;
942
+ sortable.cancelHelperRemoval = true;
943
+
944
+ // Calling sortable's mouseStop would trigger a revert,
945
+ // so revert must be temporarily false until after mouseStop is called.
946
+ sortable.options._revert = sortable.options.revert;
947
+ sortable.options.revert = false;
948
+
949
+ sortable._trigger( "out", event, sortable._uiHash( sortable ) );
950
+ sortable._mouseStop( event, true );
951
+
952
+ // Restore sortable behaviors that were modfied
953
+ // when the draggable entered the sortable area (#9481)
954
+ sortable.options.revert = sortable.options._revert;
955
+ sortable.options.helper = sortable.options._helper;
956
+
957
+ if ( sortable.placeholder ) {
958
+ sortable.placeholder.remove();
959
+ }
960
+
961
+ // Restore and recalculate the draggable's offset considering the sortable
962
+ // may have modified them in unexpected ways. (#8809, #10669)
963
+ ui.helper.appendTo( draggable._parent );
964
+ draggable._refreshOffsets( event );
965
+ ui.position = draggable._generatePosition( event, true );
966
+
967
+ draggable._trigger( "fromSortable", event );
968
+
969
+ // Inform draggable that the helper is no longer in a valid drop zone
970
+ draggable.dropped = false;
971
+
972
+ // Need to refreshPositions of all sortables just in case removing
973
+ // from one sortable changes the location of other sortables (#9675)
974
+ $.each( draggable.sortables, function() {
975
+ this.refreshPositions();
976
+ } );
977
+ }
978
+ }
979
+ } );
980
+ }
981
+ } );
982
+
983
+ $.ui.plugin.add( "draggable", "cursor", {
984
+ start: function( event, ui, instance ) {
985
+ var t = $( "body" ),
986
+ o = instance.options;
987
+
988
+ if ( t.css( "cursor" ) ) {
989
+ o._cursor = t.css( "cursor" );
990
+ }
991
+ t.css( "cursor", o.cursor );
992
+ },
993
+ stop: function( event, ui, instance ) {
994
+ var o = instance.options;
995
+ if ( o._cursor ) {
996
+ $( "body" ).css( "cursor", o._cursor );
997
+ }
998
+ }
999
+ } );
1000
+
1001
+ $.ui.plugin.add( "draggable", "opacity", {
1002
+ start: function( event, ui, instance ) {
1003
+ var t = $( ui.helper ),
1004
+ o = instance.options;
1005
+ if ( t.css( "opacity" ) ) {
1006
+ o._opacity = t.css( "opacity" );
1007
+ }
1008
+ t.css( "opacity", o.opacity );
1009
+ },
1010
+ stop: function( event, ui, instance ) {
1011
+ var o = instance.options;
1012
+ if ( o._opacity ) {
1013
+ $( ui.helper ).css( "opacity", o._opacity );
1014
+ }
1015
+ }
1016
+ } );
1017
+
1018
+ $.ui.plugin.add( "draggable", "scroll", {
1019
+ start: function( event, ui, i ) {
1020
+ if ( !i.scrollParentNotHidden ) {
1021
+ i.scrollParentNotHidden = i.helper.scrollParent( false );
1022
+ }
1023
+
1024
+ if ( i.scrollParentNotHidden[ 0 ] !== i.document[ 0 ] &&
1025
+ i.scrollParentNotHidden[ 0 ].tagName !== "HTML" ) {
1026
+ i.overflowOffset = i.scrollParentNotHidden.offset();
1027
+ }
1028
+ },
1029
+ drag: function( event, ui, i ) {
1030
+
1031
+ var o = i.options,
1032
+ scrolled = false,
1033
+ scrollParent = i.scrollParentNotHidden[ 0 ],
1034
+ document = i.document[ 0 ];
1035
+
1036
+ if ( scrollParent !== document && scrollParent.tagName !== "HTML" ) {
1037
+ if ( !o.axis || o.axis !== "x" ) {
1038
+ if ( ( i.overflowOffset.top + scrollParent.offsetHeight ) - event.pageY <
1039
+ o.scrollSensitivity ) {
1040
+ scrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed;
1041
+ } else if ( event.pageY - i.overflowOffset.top < o.scrollSensitivity ) {
1042
+ scrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed;
1043
+ }
1044
+ }
1045
+
1046
+ if ( !o.axis || o.axis !== "y" ) {
1047
+ if ( ( i.overflowOffset.left + scrollParent.offsetWidth ) - event.pageX <
1048
+ o.scrollSensitivity ) {
1049
+ scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed;
1050
+ } else if ( event.pageX - i.overflowOffset.left < o.scrollSensitivity ) {
1051
+ scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed;
1052
+ }
1053
+ }
1054
+
1055
+ } else {
1056
+
1057
+ if ( !o.axis || o.axis !== "x" ) {
1058
+ if ( event.pageY - $( document ).scrollTop() < o.scrollSensitivity ) {
1059
+ scrolled = $( document ).scrollTop( $( document ).scrollTop() - o.scrollSpeed );
1060
+ } else if ( $( window ).height() - ( event.pageY - $( document ).scrollTop() ) <
1061
+ o.scrollSensitivity ) {
1062
+ scrolled = $( document ).scrollTop( $( document ).scrollTop() + o.scrollSpeed );
1063
+ }
1064
+ }
1065
+
1066
+ if ( !o.axis || o.axis !== "y" ) {
1067
+ if ( event.pageX - $( document ).scrollLeft() < o.scrollSensitivity ) {
1068
+ scrolled = $( document ).scrollLeft(
1069
+ $( document ).scrollLeft() - o.scrollSpeed
1070
+ );
1071
+ } else if ( $( window ).width() - ( event.pageX - $( document ).scrollLeft() ) <
1072
+ o.scrollSensitivity ) {
1073
+ scrolled = $( document ).scrollLeft(
1074
+ $( document ).scrollLeft() + o.scrollSpeed
1075
+ );
1076
+ }
1077
+ }
1078
+
1079
+ }
1080
+
1081
+ if ( scrolled !== false && $.ui.ddmanager && !o.dropBehaviour ) {
1082
+ $.ui.ddmanager.prepareOffsets( i, event );
1083
+ }
1084
+
1085
+ }
1086
+ } );
1087
+
1088
+ $.ui.plugin.add( "draggable", "snap", {
1089
+ start: function( event, ui, i ) {
1090
+
1091
+ var o = i.options;
1092
+
1093
+ i.snapElements = [];
1094
+
1095
+ $( o.snap.constructor !== String ? ( o.snap.items || ":data(ui-draggable)" ) : o.snap )
1096
+ .each( function() {
1097
+ var $t = $( this ),
1098
+ $o = $t.offset();
1099
+ if ( this !== i.element[ 0 ] ) {
1100
+ i.snapElements.push( {
1101
+ item: this,
1102
+ width: $t.outerWidth(), height: $t.outerHeight(),
1103
+ top: $o.top, left: $o.left
1104
+ } );
1105
+ }
1106
+ } );
1107
+
1108
+ },
1109
+ drag: function( event, ui, inst ) {
1110
+
1111
+ var ts, bs, ls, rs, l, r, t, b, i, first,
1112
+ o = inst.options,
1113
+ d = o.snapTolerance,
1114
+ x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
1115
+ y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
1116
+
1117
+ for ( i = inst.snapElements.length - 1; i >= 0; i-- ) {
1118
+
1119
+ l = inst.snapElements[ i ].left - inst.margins.left;
1120
+ r = l + inst.snapElements[ i ].width;
1121
+ t = inst.snapElements[ i ].top - inst.margins.top;
1122
+ b = t + inst.snapElements[ i ].height;
1123
+
1124
+ if ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d ||
1125
+ !$.contains( inst.snapElements[ i ].item.ownerDocument,
1126
+ inst.snapElements[ i ].item ) ) {
1127
+ if ( inst.snapElements[ i ].snapping ) {
1128
+ ( inst.options.snap.release &&
1129
+ inst.options.snap.release.call(
1130
+ inst.element,
1131
+ event,
1132
+ $.extend( inst._uiHash(), { snapItem: inst.snapElements[ i ].item } )
1133
+ ) );
1134
+ }
1135
+ inst.snapElements[ i ].snapping = false;
1136
+ continue;
1137
+ }
1138
+
1139
+ if ( o.snapMode !== "inner" ) {
1140
+ ts = Math.abs( t - y2 ) <= d;
1141
+ bs = Math.abs( b - y1 ) <= d;
1142
+ ls = Math.abs( l - x2 ) <= d;
1143
+ rs = Math.abs( r - x1 ) <= d;
1144
+ if ( ts ) {
1145
+ ui.position.top = inst._convertPositionTo( "relative", {
1146
+ top: t - inst.helperProportions.height,
1147
+ left: 0
1148
+ } ).top;
1149
+ }
1150
+ if ( bs ) {
1151
+ ui.position.top = inst._convertPositionTo( "relative", {
1152
+ top: b,
1153
+ left: 0
1154
+ } ).top;
1155
+ }
1156
+ if ( ls ) {
1157
+ ui.position.left = inst._convertPositionTo( "relative", {
1158
+ top: 0,
1159
+ left: l - inst.helperProportions.width
1160
+ } ).left;
1161
+ }
1162
+ if ( rs ) {
1163
+ ui.position.left = inst._convertPositionTo( "relative", {
1164
+ top: 0,
1165
+ left: r
1166
+ } ).left;
1167
+ }
1168
+ }
1169
+
1170
+ first = ( ts || bs || ls || rs );
1171
+
1172
+ if ( o.snapMode !== "outer" ) {
1173
+ ts = Math.abs( t - y1 ) <= d;
1174
+ bs = Math.abs( b - y2 ) <= d;
1175
+ ls = Math.abs( l - x1 ) <= d;
1176
+ rs = Math.abs( r - x2 ) <= d;
1177
+ if ( ts ) {
1178
+ ui.position.top = inst._convertPositionTo( "relative", {
1179
+ top: t,
1180
+ left: 0
1181
+ } ).top;
1182
+ }
1183
+ if ( bs ) {
1184
+ ui.position.top = inst._convertPositionTo( "relative", {
1185
+ top: b - inst.helperProportions.height,
1186
+ left: 0
1187
+ } ).top;
1188
+ }
1189
+ if ( ls ) {
1190
+ ui.position.left = inst._convertPositionTo( "relative", {
1191
+ top: 0,
1192
+ left: l
1193
+ } ).left;
1194
+ }
1195
+ if ( rs ) {
1196
+ ui.position.left = inst._convertPositionTo( "relative", {
1197
+ top: 0,
1198
+ left: r - inst.helperProportions.width
1199
+ } ).left;
1200
+ }
1201
+ }
1202
+
1203
+ if ( !inst.snapElements[ i ].snapping && ( ts || bs || ls || rs || first ) ) {
1204
+ ( inst.options.snap.snap &&
1205
+ inst.options.snap.snap.call(
1206
+ inst.element,
1207
+ event,
1208
+ $.extend( inst._uiHash(), {
1209
+ snapItem: inst.snapElements[ i ].item
1210
+ } ) ) );
1211
+ }
1212
+ inst.snapElements[ i ].snapping = ( ts || bs || ls || rs || first );
1213
+
1214
+ }
1215
+
1216
+ }
1217
+ } );
1218
+
1219
+ $.ui.plugin.add( "draggable", "stack", {
1220
+ start: function( event, ui, instance ) {
1221
+ var min,
1222
+ o = instance.options,
1223
+ group = $.makeArray( $( o.stack ) ).sort( function( a, b ) {
1224
+ return ( parseInt( $( a ).css( "zIndex" ), 10 ) || 0 ) -
1225
+ ( parseInt( $( b ).css( "zIndex" ), 10 ) || 0 );
1226
+ } );
1227
+
1228
+ if ( !group.length ) { return; }
1229
+
1230
+ min = parseInt( $( group[ 0 ] ).css( "zIndex" ), 10 ) || 0;
1231
+ $( group ).each( function( i ) {
1232
+ $( this ).css( "zIndex", min + i );
1233
+ } );
1234
+ this.css( "zIndex", ( min + group.length ) );
1235
+ }
1236
+ } );
1237
+
1238
+ $.ui.plugin.add( "draggable", "zIndex", {
1239
+ start: function( event, ui, instance ) {
1240
+ var t = $( ui.helper ),
1241
+ o = instance.options;
1242
+
1243
+ if ( t.css( "zIndex" ) ) {
1244
+ o._zIndex = t.css( "zIndex" );
1245
+ }
1246
+ t.css( "zIndex", o.zIndex );
1247
+ },
1248
+ stop: function( event, ui, instance ) {
1249
+ var o = instance.options;
1250
+
1251
+ if ( o._zIndex ) {
1252
+ $( ui.helper ).css( "zIndex", o._zIndex );
1253
+ }
1254
+ }
1255
+ } );
1256
+
1257
+ return $.ui.draggable;
1258
+
1259
+ } ) );