effective_assets 0.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (107) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +1 -1
  3. data/README.md +341 -72
  4. data/app/assets/javascripts/effective/snippets/effective_asset.js.coffee +53 -0
  5. data/app/assets/javascripts/effective_assets.js +4 -0
  6. data/app/assets/javascripts/effective_assets/asset_box.js.coffee +36 -0
  7. data/app/assets/javascripts/effective_assets/asset_box_dialog.js.coffee +49 -0
  8. data/app/assets/javascripts/effective_assets/asset_box_drag_and_drop.js.coffee +2 -0
  9. data/app/assets/javascripts/effective_assets/asset_box_filtering.js.coffee +16 -0
  10. data/app/assets/javascripts/effective_assets/asset_box_sorting.js.coffee +8 -0
  11. data/app/assets/javascripts/effective_assets/jquery_ui_sortable.js +813 -585
  12. data/app/assets/javascripts/effective_assets/s3_uploader.js.coffee +268 -0
  13. data/app/assets/javascripts/effective_assets_iframe.js.coffee +28 -0
  14. data/app/assets/stylesheets/active_admin/effective_assets.css.scss +57 -0
  15. data/app/assets/stylesheets/effective_assets/_asset_box_input.scss +54 -175
  16. data/app/assets/stylesheets/effective_assets/_iframe_bootstrap.scss +1714 -0
  17. data/app/assets/stylesheets/effective_assets/_input_bootstrap.scss +508 -0
  18. data/app/assets/stylesheets/effective_assets_iframe.css.scss +23 -0
  19. data/app/controllers/effective/assets_controller.rb +41 -0
  20. data/app/controllers/effective/s3_uploads_controller.rb +58 -74
  21. data/app/helpers/effective_assets_helper.rb +30 -14
  22. data/app/helpers/effective_assets_s3_helper.rb +69 -0
  23. data/app/models/concerns/acts_as_asset_box.rb +75 -11
  24. data/app/models/effective/access_denied.rb +17 -0
  25. data/app/models/effective/asset.rb +130 -93
  26. data/app/models/effective/attachment.rb +2 -7
  27. data/app/models/effective/delayed_job.rb +33 -78
  28. data/app/models/effective/snippets/effective_asset.rb +19 -0
  29. data/app/models/effective/user_uploads.rb +19 -0
  30. data/app/models/inputs/asset_box.rb +154 -0
  31. data/app/models/inputs/asset_box_form_input.rb +7 -0
  32. data/app/models/inputs/asset_box_formtastic_input.rb +9 -0
  33. data/app/models/inputs/asset_box_input.rb +13 -82
  34. data/app/models/inputs/asset_box_simple_form_input.rb +7 -0
  35. data/app/uploaders/effective_assets_uploader.rb +14 -2
  36. data/app/uploaders/{asset_uploader.rb → test_asset_uploader.rb} +1 -1
  37. data/app/views/active_admin/effective_assets/_edit.html.haml +3 -3
  38. data/app/views/active_admin/effective_assets/_new.html.haml +2 -1
  39. data/app/views/asset_box_input/_attachment_as_list.html.haml +17 -0
  40. data/app/views/asset_box_input/_attachment_as_table.html.haml +32 -0
  41. data/app/views/asset_box_input/_attachment_as_thumbnail.html.haml +20 -0
  42. data/app/views/asset_box_input/_dialog.html.haml +18 -0
  43. data/app/views/asset_box_input/_progress_bar_template.html.haml +8 -0
  44. data/app/views/asset_box_input/_uploader.html.haml +21 -115
  45. data/app/views/effective/assets/iframe.html.haml +17 -0
  46. data/app/views/effective/snippets/_effective_asset.html.haml +8 -0
  47. data/config/routes.rb +8 -2
  48. data/db/migrate/01_create_effective_assets.rb.erb +3 -0
  49. data/lib/effective_assets.rb +34 -3
  50. data/lib/effective_assets/engine.rb +11 -8
  51. data/lib/effective_assets/version.rb +1 -1
  52. data/lib/generators/templates/asset_uploader.rb +35 -0
  53. data/lib/generators/templates/effective_assets.rb +31 -4
  54. data/lib/tasks/effective_assets_tasks.rake +115 -4
  55. data/spec/internal/config/database.yml +3 -0
  56. data/spec/internal/config/initializers/effective_assets.rb +18 -0
  57. data/spec/internal/config/routes.rb +3 -0
  58. data/spec/internal/db/combustion_test.sqlite +0 -0
  59. data/spec/internal/db/schema.rb +52 -0
  60. data/spec/internal/log/test.log +793 -0
  61. data/spec/{dummy → internal}/public/favicon.ico +0 -0
  62. data/spec/internal/public/sprites.png +0 -0
  63. data/spec/models/asset_spec.rb +119 -35
  64. data/spec/spec_helper.rb +9 -3
  65. metadata +95 -234
  66. data/app/assets/images/effective_assets/s3_down_button.gif +0 -0
  67. data/app/assets/images/effective_assets/s3_over_button.gif +0 -0
  68. data/app/assets/images/effective_assets/s3_up_button.gif +0 -0
  69. data/app/assets/images/effective_assets/s3_upload.swf +0 -0
  70. data/app/assets/javascripts/effective_assets/asset_box_input.js.coffee +0 -71
  71. data/app/assets/javascripts/effective_assets/asset_box_uploader.js +0 -122
  72. data/app/assets/javascripts/effective_assets/asset_box_uploader_customization.js +0 -166
  73. data/app/controllers/effective/attachments_controller.rb +0 -14
  74. data/app/views/asset_box_input/_attachment_fields.html.haml +0 -14
  75. data/spec/dummy/README.rdoc +0 -261
  76. data/spec/dummy/Rakefile +0 -7
  77. data/spec/dummy/app/assets/javascripts/application.js +0 -15
  78. data/spec/dummy/app/assets/stylesheets/application.css +0 -13
  79. data/spec/dummy/app/controllers/application_controller.rb +0 -3
  80. data/spec/dummy/app/helpers/application_helper.rb +0 -2
  81. data/spec/dummy/app/views/layouts/application.html.erb +0 -14
  82. data/spec/dummy/config.ru +0 -4
  83. data/spec/dummy/config/application.rb +0 -65
  84. data/spec/dummy/config/boot.rb +0 -10
  85. data/spec/dummy/config/database.yml +0 -25
  86. data/spec/dummy/config/environment.rb +0 -5
  87. data/spec/dummy/config/environments/development.rb +0 -37
  88. data/spec/dummy/config/environments/production.rb +0 -67
  89. data/spec/dummy/config/environments/test.rb +0 -37
  90. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
  91. data/spec/dummy/config/initializers/inflections.rb +0 -15
  92. data/spec/dummy/config/initializers/mime_types.rb +0 -5
  93. data/spec/dummy/config/initializers/secret_token.rb +0 -7
  94. data/spec/dummy/config/initializers/session_store.rb +0 -8
  95. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
  96. data/spec/dummy/config/locales/en.yml +0 -5
  97. data/spec/dummy/config/routes.rb +0 -58
  98. data/spec/dummy/db/development.sqlite3 +0 -0
  99. data/spec/dummy/db/schema.rb +0 -16
  100. data/spec/dummy/db/test.sqlite3 +0 -0
  101. data/spec/dummy/log/development.log +0 -71
  102. data/spec/dummy/log/test.log +0 -33
  103. data/spec/dummy/public/404.html +0 -26
  104. data/spec/dummy/public/422.html +0 -26
  105. data/spec/dummy/public/500.html +0 -25
  106. data/spec/dummy/script/rails +0 -6
  107. data/spec/dummy/spec_link +0 -3
@@ -0,0 +1,53 @@
1
+ CKEDITOR.dialog.add 'effective_asset', (editor) ->
2
+ title: 'Insert File'
3
+ minWidth: 650,
4
+ minHeight: 500,
5
+ contents: [
6
+ {
7
+ id: 'tab1',
8
+ label: 'File',
9
+ title: 'File',
10
+ elements: [
11
+ {
12
+ type: 'html',
13
+ html: "<p>* NOTE: This screen is for non-image files only. Please select 'Image' from the toolbar to work with images."
14
+ },
15
+ {
16
+ id: 'asset_id',
17
+ type: 'text',
18
+ label: 'File',
19
+ setup: (widget) -> this.setValue(widget.data.asset_id)
20
+ commit: (widget) -> widget.setData('asset_id', this.getValue()) if widget
21
+ },
22
+ {
23
+ id: 'html_class',
24
+ type: 'text',
25
+ label: 'HTML Class',
26
+ setup: (widget) -> this.setValue(widget.data.html_class)
27
+ commit: (widget) -> widget.setData('html_class', this.getValue()) if widget
28
+ }
29
+ ] # /tab1 elements
30
+ }, # /tab1
31
+ {
32
+ id: 'tab2',
33
+ label: 'Insert / Upload',
34
+ title: 'Insert / Upload',
35
+ elements: [
36
+ {
37
+ id: 'iframe-insert',
38
+ type: 'html',
39
+ html: "<div><iframe class='effective_assets_iframe' style='width: 100%; height: 100%; min-height: 500px;' src='/effective/assets?only=nonimages'></iframe></div>"
40
+ onLoad: (evt) ->
41
+ dialog = evt.sender # This is the CKEditor.dialog
42
+ iframe = $('#' + dialog.getContentElement('tab2', 'iframe-insert').domId).children('iframe').first()
43
+ iframe.on 'load', ->
44
+ $(this).contents().on 'click', 'a.attachment-insert', (event) ->
45
+ event.preventDefault()
46
+ dialog.setValueOf('tab1', 'asset_id', $(event.currentTarget).data('asset-id'))
47
+ dialog.commitContent()
48
+ dialog.click('ok')
49
+ }
50
+ ] # /tab2 elements
51
+ } # /tab2
52
+ ] # /contents
53
+
@@ -1 +1,5 @@
1
+ //= require jquery-fileupload/basic
2
+ //= require jquery-fileupload/vendor/tmpl
3
+ //= require jquery_ujs
1
4
  //= require_tree ./effective_assets
5
+
@@ -0,0 +1,36 @@
1
+ $(document).on 's3_file_added', (event, file) ->
2
+ obj = $(event.target)
3
+ obj.closest('.error').removeClass('error')
4
+ obj.parent().siblings('.help-inline,.inline-errors').remove()
5
+
6
+ $(document).on 's3_uploads_complete', (_, uploader) ->
7
+ uploader.closest('.asset-box-input').find('.filter-attachments').val('')
8
+
9
+ $(document).on 's3_upload_failed', (_, uploader, content) ->
10
+ uploader.closest('.asset-box-input').find('.filter-attachments').val('')
11
+ alert("An error occurred while uploading #{content.filename}.\n\nThe returned error message is: '#{content.error_thrown}'\n\nPlease try again.")
12
+
13
+ $(document).on 'click', 'a.attachment-remove', (event) ->
14
+ event.preventDefault()
15
+ attachment_div = $(event.target).closest('.attachment')
16
+
17
+ attachment_div.find('input.asset-box-remove').first().val(1)
18
+ attachment_div.hide()
19
+
20
+ # Show the first 'limit' attachments, hide the rest
21
+ asset_box_input = attachment_div.closest('div.asset-box-input')
22
+ limit = asset_box_input.data('limit')
23
+
24
+ asset_box_input.find("input.asset-box-remove").each (index) ->
25
+ if "#{$(this).val()}" == '1' # If we're going to delete it...
26
+ $(this).closest('.attachment').hide()
27
+ limit = limit + 1
28
+ return
29
+
30
+ if index >= limit
31
+ $(this).closest('.attachment').hide()
32
+ else
33
+ $(this).closest('.attachment').show()
34
+
35
+
36
+
@@ -0,0 +1,49 @@
1
+ $(document).on 'click', '.asset-box-dialog', (event) ->
2
+ event.preventDefault()
3
+
4
+ obj = $(event.currentTarget)
5
+ asset_box = obj.closest('.asset-box-input')
6
+ modal = obj.siblings('.asset-box-modal')
7
+
8
+ return false unless modal
9
+
10
+ iframe = modal.find('iframe')
11
+ iframe.attr('height', $(window).height() * 0.75)
12
+
13
+ unless asset_box.data('dialog-initialized')
14
+ iframe.contents().on 'click', '.attachment-insert', (event) ->
15
+ event.preventDefault()
16
+
17
+ $.ajax
18
+ url: "/s3_uploads/#{$(this).data('asset-id')}"
19
+ type: 'PUT'
20
+ data:
21
+ skip_update: true
22
+ attachable_type: asset_box.data('attachable-type')
23
+ attachable_id: asset_box.data('attachable-id')
24
+ attachable_object_name: asset_box.data('attachable-object-name')
25
+ attachment_style: asset_box.data('attachment-style')
26
+ attachment_actions: asset_box.data('attachment-actions')
27
+ aws_acl: asset_box.data('aws-acl')
28
+ box: asset_box.data('box')
29
+ async: true
30
+ success: (data) ->
31
+ asset_box.find('.attachments').prepend($(data))
32
+
33
+ limit = asset_box.data('limit')
34
+
35
+ asset_box.find("input.asset-box-remove").each (index) ->
36
+ if "#{$(this).val()}" == '1' # If we're going to delete it...
37
+ $(this).closest('.attachment').hide()
38
+ limit = limit + 1
39
+ return
40
+
41
+ if index >= limit
42
+ $(this).closest('.attachment').hide()
43
+ else
44
+ $(this).closest('.attachment').show()
45
+
46
+ if asset_box.data('limit') == 1 then modal.modal('hide')
47
+
48
+ asset_box.data('dialog-initialized', true)
49
+ modal.modal()
@@ -0,0 +1,2 @@
1
+ $(document).on 'dragenter dragover', '.asset-box-input', (event) -> $(event.currentTarget).addClass('dragin')
2
+ $(document).on 'dragleave drop', '.asset-box-input', (event) -> $(event.currentTarget).removeClass('dragin')
@@ -0,0 +1,16 @@
1
+ filter = (search, asset_box_input) ->
2
+ term = (search || '').toLowerCase()
3
+
4
+ asset_box_input.find('.attachments').first().find('.attachment').each (index) ->
5
+ attachment = $(this)
6
+
7
+ return if "#{attachment.find("input.asset-box-remove").first().val()}" == '1'
8
+
9
+ if term == '' || attachment.find('.attachment-title').text().toLowerCase().indexOf(term) > -1
10
+ attachment.show()
11
+ else
12
+ attachment.hide()
13
+
14
+ $(document).on 'keyup', '.filter-attachments', (event) ->
15
+ obj = $(event.currentTarget)
16
+ filter(obj.val(), obj.closest('.asset-box-input'))
@@ -0,0 +1,8 @@
1
+ applySortable = ->
2
+ $(".asset-box-input .attachments").sortable
3
+ items: '> .attachment'
4
+ placeholder: 'col-sm-3'
5
+ cursor: 'move'
6
+
7
+ $ -> applySortable()
8
+ $(document).on 'page:change', -> applySortable()
@@ -1,23 +1,36 @@
1
- /*! jQuery UI - v1.9.2 - 2012-11-28
1
+ /*! jQuery UI - v1.11.2 - 2014-10-24
2
2
  * http://jqueryui.com
3
- * Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.sortable.js
4
- * Copyright (c) 2012 jQuery Foundation and other contributors Licensed MIT */
3
+ * Includes: core.js, widget.js, mouse.js, sortable.js
4
+ * Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
5
5
 
6
- (function( $, undefined ) {
6
+ (function( factory ) {
7
+ if ( typeof define === "function" && define.amd ) {
7
8
 
8
- var uuid = 0,
9
- runiqueId = /^ui-id-\d+$/;
9
+ // AMD. Register as an anonymous module.
10
+ define([ "jquery" ], factory );
11
+ } else {
10
12
 
11
- // prevent duplicate loading
12
- // this is only a problem because we proxy existing functions
13
- // and we don't want to double proxy them
13
+ // Browser globals
14
+ factory( jQuery );
15
+ }
16
+ }(function( $ ) {
17
+ /*!
18
+ * jQuery UI Core 1.11.2
19
+ * http://jqueryui.com
20
+ *
21
+ * Copyright 2014 jQuery Foundation and other contributors
22
+ * Released under the MIT license.
23
+ * http://jquery.org/license
24
+ *
25
+ * http://api.jqueryui.com/category/ui-core/
26
+ */
27
+
28
+
29
+ // $.ui might exist from components with no dependencies, e.g., $.ui.position
14
30
  $.ui = $.ui || {};
15
- if ( $.ui.version ) {
16
- return;
17
- }
18
31
 
19
32
  $.extend( $.ui, {
20
- version: "1.9.2",
33
+ version: "1.11.2",
21
34
 
22
35
  keyCode: {
23
36
  BACKSPACE: 8,
@@ -29,12 +42,6 @@ $.extend( $.ui, {
29
42
  ESCAPE: 27,
30
43
  HOME: 36,
31
44
  LEFT: 37,
32
- NUMPAD_ADD: 107,
33
- NUMPAD_DECIMAL: 110,
34
- NUMPAD_DIVIDE: 111,
35
- NUMPAD_ENTER: 108,
36
- NUMPAD_MULTIPLY: 106,
37
- NUMPAD_SUBTRACT: 109,
38
45
  PAGE_DOWN: 34,
39
46
  PAGE_UP: 33,
40
47
  PERIOD: 190,
@@ -47,76 +54,36 @@ $.extend( $.ui, {
47
54
 
48
55
  // plugins
49
56
  $.fn.extend({
50
- _focus: $.fn.focus,
51
- focus: function( delay, fn ) {
52
- return typeof delay === "number" ?
53
- this.each(function() {
54
- var elem = this;
55
- setTimeout(function() {
56
- $( elem ).focus();
57
- if ( fn ) {
58
- fn.call( elem );
59
- }
60
- }, delay );
61
- }) :
62
- this._focus.apply( this, arguments );
63
- },
64
-
65
- scrollParent: function() {
66
- var scrollParent;
67
- if (($.ui.ie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {
68
- scrollParent = this.parents().filter(function() {
69
- return (/(relative|absolute|fixed)/).test($.css(this,'position')) && (/(auto|scroll)/).test($.css(this,'overflow')+$.css(this,'overflow-y')+$.css(this,'overflow-x'));
70
- }).eq(0);
71
- } else {
72
- scrollParent = this.parents().filter(function() {
73
- return (/(auto|scroll)/).test($.css(this,'overflow')+$.css(this,'overflow-y')+$.css(this,'overflow-x'));
74
- }).eq(0);
75
- }
57
+ scrollParent: function( includeHidden ) {
58
+ var position = this.css( "position" ),
59
+ excludeStaticParent = position === "absolute",
60
+ overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,
61
+ scrollParent = this.parents().filter( function() {
62
+ var parent = $( this );
63
+ if ( excludeStaticParent && parent.css( "position" ) === "static" ) {
64
+ return false;
65
+ }
66
+ return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) + parent.css( "overflow-x" ) );
67
+ }).eq( 0 );
76
68
 
77
- return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent;
69
+ return position === "fixed" || !scrollParent.length ? $( this[ 0 ].ownerDocument || document ) : scrollParent;
78
70
  },
79
71
 
80
- zIndex: function( zIndex ) {
81
- if ( zIndex !== undefined ) {
82
- return this.css( "zIndex", zIndex );
83
- }
72
+ uniqueId: (function() {
73
+ var uuid = 0;
84
74
 
85
- if ( this.length ) {
86
- var elem = $( this[ 0 ] ), position, value;
87
- while ( elem.length && elem[ 0 ] !== document ) {
88
- // Ignore z-index if position is set to a value where z-index is ignored by the browser
89
- // This makes behavior of this function consistent across browsers
90
- // WebKit always returns auto if the element is positioned
91
- position = elem.css( "position" );
92
- if ( position === "absolute" || position === "relative" || position === "fixed" ) {
93
- // IE returns 0 when zIndex is not specified
94
- // other browsers return a string
95
- // we ignore the case of nested elements with an explicit value of 0
96
- // <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
97
- value = parseInt( elem.css( "zIndex" ), 10 );
98
- if ( !isNaN( value ) && value !== 0 ) {
99
- return value;
100
- }
75
+ return function() {
76
+ return this.each(function() {
77
+ if ( !this.id ) {
78
+ this.id = "ui-id-" + ( ++uuid );
101
79
  }
102
- elem = elem.parent();
103
- }
104
- }
105
-
106
- return 0;
107
- },
108
-
109
- uniqueId: function() {
110
- return this.each(function() {
111
- if ( !this.id ) {
112
- this.id = "ui-id-" + (++uuid);
113
- }
114
- });
115
- },
80
+ });
81
+ };
82
+ })(),
116
83
 
117
84
  removeUniqueId: function() {
118
85
  return this.each(function() {
119
- if ( runiqueId.test( this.id ) ) {
86
+ if ( /^ui-id-\d+$/.test( this.id ) ) {
120
87
  $( this ).removeAttr( "id" );
121
88
  }
122
89
  });
@@ -133,7 +100,7 @@ function focusable( element, isTabIndexNotNaN ) {
133
100
  if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
134
101
  return false;
135
102
  }
136
- img = $( "img[usemap=#" + mapName + "]" )[0];
103
+ img = $( "img[usemap='#" + mapName + "']" )[ 0 ];
137
104
  return !!img && visible( img );
138
105
  }
139
106
  return ( /input|select|textarea|button|object/.test( nodeName ) ?
@@ -147,7 +114,7 @@ function focusable( element, isTabIndexNotNaN ) {
147
114
 
148
115
  function visible( element ) {
149
116
  return $.expr.filters.visible( element ) &&
150
- !$( element ).parents().andSelf().filter(function() {
117
+ !$( element ).parents().addBack().filter(function() {
151
118
  return $.css( this, "visibility" ) === "hidden";
152
119
  }).length;
153
120
  }
@@ -175,31 +142,6 @@ $.extend( $.expr[ ":" ], {
175
142
  }
176
143
  });
177
144
 
178
- // support
179
- $(function() {
180
- var body = document.body,
181
- div = body.appendChild( div = document.createElement( "div" ) );
182
-
183
- // access offsetHeight before setting the style to prevent a layout bug
184
- // in IE 9 which causes the element to continue to take up space even
185
- // after it is removed from the DOM (#8026)
186
- div.offsetHeight;
187
-
188
- $.extend( div.style, {
189
- minHeight: "100px",
190
- height: "auto",
191
- padding: 0,
192
- borderWidth: 0
193
- });
194
-
195
- $.support.minHeight = div.offsetHeight === 100;
196
- $.support.selectstart = "onselectstart" in div;
197
-
198
- // set display to none to avoid a layout bug in IE
199
- // http://dev.jquery.com/ticket/4014
200
- body.removeChild( div ).style.display = "none";
201
- });
202
-
203
145
  // support: jQuery <1.8
204
146
  if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
205
147
  $.each( [ "Width", "Height" ], function( i, name ) {
@@ -247,6 +189,15 @@ if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
247
189
  });
248
190
  }
249
191
 
192
+ // support: jQuery <1.8
193
+ if ( !$.fn.addBack ) {
194
+ $.fn.addBack = function( selector ) {
195
+ return this.add( selector == null ?
196
+ this.prevObject : this.prevObject.filter( selector )
197
+ );
198
+ };
199
+ }
200
+
250
201
  // support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)
251
202
  if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) {
252
203
  $.fn.removeData = (function( removeData ) {
@@ -260,112 +211,142 @@ if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) {
260
211
  })( $.fn.removeData );
261
212
  }
262
213
 
263
-
264
-
265
-
266
-
267
214
  // deprecated
268
-
269
- (function() {
270
- var uaMatch = /msie ([\w.]+)/.exec( navigator.userAgent.toLowerCase() ) || [];
271
- $.ui.ie = uaMatch.length ? true : false;
272
- $.ui.ie6 = parseFloat( uaMatch[ 1 ], 10 ) === 6;
273
- })();
215
+ $.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );
274
216
 
275
217
  $.fn.extend({
276
- disableSelection: function() {
277
- return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
278
- ".ui-disableSelection", function( event ) {
218
+ focus: (function( orig ) {
219
+ return function( delay, fn ) {
220
+ return typeof delay === "number" ?
221
+ this.each(function() {
222
+ var elem = this;
223
+ setTimeout(function() {
224
+ $( elem ).focus();
225
+ if ( fn ) {
226
+ fn.call( elem );
227
+ }
228
+ }, delay );
229
+ }) :
230
+ orig.apply( this, arguments );
231
+ };
232
+ })( $.fn.focus ),
233
+
234
+ disableSelection: (function() {
235
+ var eventType = "onselectstart" in document.createElement( "div" ) ?
236
+ "selectstart" :
237
+ "mousedown";
238
+
239
+ return function() {
240
+ return this.bind( eventType + ".ui-disableSelection", function( event ) {
279
241
  event.preventDefault();
280
242
  });
281
- },
243
+ };
244
+ })(),
282
245
 
283
246
  enableSelection: function() {
284
247
  return this.unbind( ".ui-disableSelection" );
285
- }
286
- });
248
+ },
287
249
 
288
- $.extend( $.ui, {
289
- // $.ui.plugin is deprecated. Use the proxy pattern instead.
290
- plugin: {
291
- add: function( module, option, set ) {
292
- var i,
293
- proto = $.ui[ module ].prototype;
294
- for ( i in set ) {
295
- proto.plugins[ i ] = proto.plugins[ i ] || [];
296
- proto.plugins[ i ].push( [ option, set[ i ] ] );
297
- }
298
- },
299
- call: function( instance, name, args ) {
300
- var i,
301
- set = instance.plugins[ name ];
302
- if ( !set || !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) {
303
- return;
304
- }
250
+ zIndex: function( zIndex ) {
251
+ if ( zIndex !== undefined ) {
252
+ return this.css( "zIndex", zIndex );
253
+ }
305
254
 
306
- for ( i = 0; i < set.length; i++ ) {
307
- if ( instance.options[ set[ i ][ 0 ] ] ) {
308
- set[ i ][ 1 ].apply( instance.element, args );
255
+ if ( this.length ) {
256
+ var elem = $( this[ 0 ] ), position, value;
257
+ while ( elem.length && elem[ 0 ] !== document ) {
258
+ // Ignore z-index if position is set to a value where z-index is ignored by the browser
259
+ // This makes behavior of this function consistent across browsers
260
+ // WebKit always returns auto if the element is positioned
261
+ position = elem.css( "position" );
262
+ if ( position === "absolute" || position === "relative" || position === "fixed" ) {
263
+ // IE returns 0 when zIndex is not specified
264
+ // other browsers return a string
265
+ // we ignore the case of nested elements with an explicit value of 0
266
+ // <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
267
+ value = parseInt( elem.css( "zIndex" ), 10 );
268
+ if ( !isNaN( value ) && value !== 0 ) {
269
+ return value;
270
+ }
309
271
  }
272
+ elem = elem.parent();
310
273
  }
311
274
  }
312
- },
313
275
 
314
- contains: $.contains,
276
+ return 0;
277
+ }
278
+ });
315
279
 
316
- // only used by resizable
317
- hasScroll: function( el, a ) {
280
+ // $.ui.plugin is deprecated. Use $.widget() extensions instead.
281
+ $.ui.plugin = {
282
+ add: function( module, option, set ) {
283
+ var i,
284
+ proto = $.ui[ module ].prototype;
285
+ for ( i in set ) {
286
+ proto.plugins[ i ] = proto.plugins[ i ] || [];
287
+ proto.plugins[ i ].push( [ option, set[ i ] ] );
288
+ }
289
+ },
290
+ call: function( instance, name, args, allowDisconnected ) {
291
+ var i,
292
+ set = instance.plugins[ name ];
318
293
 
319
- //If overflow is hidden, the element might have extra content, but the user wants to hide it
320
- if ( $( el ).css( "overflow" ) === "hidden") {
321
- return false;
294
+ if ( !set ) {
295
+ return;
322
296
  }
323
297
 
324
- var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
325
- has = false;
298
+ if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) ) {
299
+ return;
300
+ }
326
301
 
327
- if ( el[ scroll ] > 0 ) {
328
- return true;
302
+ for ( i = 0; i < set.length; i++ ) {
303
+ if ( instance.options[ set[ i ][ 0 ] ] ) {
304
+ set[ i ][ 1 ].apply( instance.element, args );
305
+ }
329
306
  }
307
+ }
308
+ };
330
309
 
331
- // TODO: determine which cases actually cause this to happen
332
- // if the element doesn't have the scroll set, see if it's possible to
333
- // set the scroll
334
- el[ scroll ] = 1;
335
- has = ( el[ scroll ] > 0 );
336
- el[ scroll ] = 0;
337
- return has;
338
- },
339
310
 
340
- // these are odd functions, fix the API or move into individual plugins
341
- isOverAxis: function( x, reference, size ) {
342
- //Determines when x coordinate is over "b" element axis
343
- return ( x > reference ) && ( x < ( reference + size ) );
344
- },
345
- isOver: function( y, x, top, left, height, width ) {
346
- //Determines when x, y coordinates is over "b" element
347
- return $.ui.isOverAxis( y, top, height ) && $.ui.isOverAxis( x, left, width );
348
- }
349
- });
311
+ /*!
312
+ * jQuery UI Widget 1.11.2
313
+ * http://jqueryui.com
314
+ *
315
+ * Copyright 2014 jQuery Foundation and other contributors
316
+ * Released under the MIT license.
317
+ * http://jquery.org/license
318
+ *
319
+ * http://api.jqueryui.com/jQuery.widget/
320
+ */
350
321
 
351
- })( jQuery );
352
- (function( $, undefined ) {
353
-
354
- var uuid = 0,
355
- slice = Array.prototype.slice,
356
- _cleanData = $.cleanData;
357
- $.cleanData = function( elems ) {
358
- for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
359
- try {
360
- $( elem ).triggerHandler( "remove" );
361
- // http://bugs.jquery.com/ticket/8235
362
- } catch( e ) {}
363
- }
364
- _cleanData( elems );
365
- };
322
+
323
+ var widget_uuid = 0,
324
+ widget_slice = Array.prototype.slice;
325
+
326
+ $.cleanData = (function( orig ) {
327
+ return function( elems ) {
328
+ var events, elem, i;
329
+ for ( i = 0; (elem = elems[i]) != null; i++ ) {
330
+ try {
331
+
332
+ // Only trigger remove when necessary to save time
333
+ events = $._data( elem, "events" );
334
+ if ( events && events.remove ) {
335
+ $( elem ).triggerHandler( "remove" );
336
+ }
337
+
338
+ // http://bugs.jquery.com/ticket/8235
339
+ } catch ( e ) {}
340
+ }
341
+ orig( elems );
342
+ };
343
+ })( $.cleanData );
366
344
 
367
345
  $.widget = function( name, base, prototype ) {
368
346
  var fullName, existingConstructor, constructor, basePrototype,
347
+ // proxiedPrototype allows the provided prototype to remain unmodified
348
+ // so that it can be used as a mixin for multiple widgets (#8876)
349
+ proxiedPrototype = {},
369
350
  namespace = name.split( "." )[ 0 ];
370
351
 
371
352
  name = name.split( "." )[ 1 ];
@@ -412,43 +393,43 @@ $.widget = function( name, base, prototype ) {
412
393
  // inheriting from
413
394
  basePrototype.options = $.widget.extend( {}, basePrototype.options );
414
395
  $.each( prototype, function( prop, value ) {
415
- if ( $.isFunction( value ) ) {
416
- prototype[ prop ] = (function() {
417
- var _super = function() {
418
- return base.prototype[ prop ].apply( this, arguments );
419
- },
420
- _superApply = function( args ) {
421
- return base.prototype[ prop ].apply( this, args );
422
- };
423
- return function() {
424
- var __super = this._super,
425
- __superApply = this._superApply,
426
- returnValue;
427
-
428
- this._super = _super;
429
- this._superApply = _superApply;
430
-
431
- returnValue = value.apply( this, arguments );
432
-
433
- this._super = __super;
434
- this._superApply = __superApply;
435
-
436
- return returnValue;
437
- };
438
- })();
396
+ if ( !$.isFunction( value ) ) {
397
+ proxiedPrototype[ prop ] = value;
398
+ return;
439
399
  }
400
+ proxiedPrototype[ prop ] = (function() {
401
+ var _super = function() {
402
+ return base.prototype[ prop ].apply( this, arguments );
403
+ },
404
+ _superApply = function( args ) {
405
+ return base.prototype[ prop ].apply( this, args );
406
+ };
407
+ return function() {
408
+ var __super = this._super,
409
+ __superApply = this._superApply,
410
+ returnValue;
411
+
412
+ this._super = _super;
413
+ this._superApply = _superApply;
414
+
415
+ returnValue = value.apply( this, arguments );
416
+
417
+ this._super = __super;
418
+ this._superApply = __superApply;
419
+
420
+ return returnValue;
421
+ };
422
+ })();
440
423
  });
441
424
  constructor.prototype = $.widget.extend( basePrototype, {
442
425
  // TODO: remove support for widgetEventPrefix
443
426
  // always use the name + a colon as the prefix, e.g., draggable:start
444
427
  // don't prefix for widgets that aren't DOM-based
445
- widgetEventPrefix: existingConstructor ? basePrototype.widgetEventPrefix : name
446
- }, prototype, {
428
+ widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name
429
+ }, proxiedPrototype, {
447
430
  constructor: constructor,
448
431
  namespace: namespace,
449
432
  widgetName: name,
450
- // TODO remove widgetBaseClass, see #8155
451
- widgetBaseClass: fullName,
452
433
  widgetFullName: fullName
453
434
  });
454
435
 
@@ -472,10 +453,12 @@ $.widget = function( name, base, prototype ) {
472
453
  }
473
454
 
474
455
  $.widget.bridge( name, constructor );
456
+
457
+ return constructor;
475
458
  };
476
459
 
477
460
  $.widget.extend = function( target ) {
478
- var input = slice.call( arguments, 1 ),
461
+ var input = widget_slice.call( arguments, 1 ),
479
462
  inputIndex = 0,
480
463
  inputLength = input.length,
481
464
  key,
@@ -504,7 +487,7 @@ $.widget.bridge = function( name, object ) {
504
487
  var fullName = object.prototype.widgetFullName || name;
505
488
  $.fn[ name ] = function( options ) {
506
489
  var isMethodCall = typeof options === "string",
507
- args = slice.call( arguments, 1 ),
490
+ args = widget_slice.call( arguments, 1 ),
508
491
  returnValue = this;
509
492
 
510
493
  // allow multiple hashes to be passed on init
@@ -516,6 +499,10 @@ $.widget.bridge = function( name, object ) {
516
499
  this.each(function() {
517
500
  var methodValue,
518
501
  instance = $.data( this, fullName );
502
+ if ( options === "instance" ) {
503
+ returnValue = instance;
504
+ return false;
505
+ }
519
506
  if ( !instance ) {
520
507
  return $.error( "cannot call methods on " + name + " prior to initialization; " +
521
508
  "attempted to call method '" + options + "'" );
@@ -535,7 +522,10 @@ $.widget.bridge = function( name, object ) {
535
522
  this.each(function() {
536
523
  var instance = $.data( this, fullName );
537
524
  if ( instance ) {
538
- instance.option( options || {} )._init();
525
+ instance.option( options || {} );
526
+ if ( instance._init ) {
527
+ instance._init();
528
+ }
539
529
  } else {
540
530
  $.data( this, fullName, new object( options, this ) );
541
531
  }
@@ -562,21 +552,14 @@ $.Widget.prototype = {
562
552
  _createWidget: function( options, element ) {
563
553
  element = $( element || this.defaultElement || this )[ 0 ];
564
554
  this.element = $( element );
565
- this.uuid = uuid++;
555
+ this.uuid = widget_uuid++;
566
556
  this.eventNamespace = "." + this.widgetName + this.uuid;
567
- this.options = $.widget.extend( {},
568
- this.options,
569
- this._getCreateOptions(),
570
- options );
571
557
 
572
558
  this.bindings = $();
573
559
  this.hoverable = $();
574
560
  this.focusable = $();
575
561
 
576
562
  if ( element !== this ) {
577
- // 1.9 BC for #7810
578
- // TODO remove dual storage
579
- $.data( element, this.widgetName, this );
580
563
  $.data( element, this.widgetFullName, this );
581
564
  this._on( true, this.element, {
582
565
  remove: function( event ) {
@@ -593,6 +576,11 @@ $.Widget.prototype = {
593
576
  this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
594
577
  }
595
578
 
579
+ this.options = $.widget.extend( {},
580
+ this.options,
581
+ this._getCreateOptions(),
582
+ options );
583
+
596
584
  this._create();
597
585
  this._trigger( "create", null, this._getCreateEventData() );
598
586
  this._init();
@@ -608,9 +596,6 @@ $.Widget.prototype = {
608
596
  // all event bindings should go through this._on()
609
597
  this.element
610
598
  .unbind( this.eventNamespace )
611
- // 1.9 BC for #7810
612
- // TODO remove dual storage
613
- .removeData( this.widgetName )
614
599
  .removeData( this.widgetFullName )
615
600
  // support: jquery <1.6.3
616
601
  // http://bugs.jquery.com/ticket/9413
@@ -656,12 +641,12 @@ $.Widget.prototype = {
656
641
  curOption = curOption[ parts[ i ] ];
657
642
  }
658
643
  key = parts.pop();
659
- if ( value === undefined ) {
644
+ if ( arguments.length === 1 ) {
660
645
  return curOption[ key ] === undefined ? null : curOption[ key ];
661
646
  }
662
647
  curOption[ key ] = value;
663
648
  } else {
664
- if ( value === undefined ) {
649
+ if ( arguments.length === 1 ) {
665
650
  return this.options[ key ] === undefined ? null : this.options[ key ];
666
651
  }
667
652
  options[ key ] = value;
@@ -686,20 +671,23 @@ $.Widget.prototype = {
686
671
 
687
672
  if ( key === "disabled" ) {
688
673
  this.widget()
689
- .toggleClass( this.widgetFullName + "-disabled ui-state-disabled", !!value )
690
- .attr( "aria-disabled", value );
691
- this.hoverable.removeClass( "ui-state-hover" );
692
- this.focusable.removeClass( "ui-state-focus" );
674
+ .toggleClass( this.widgetFullName + "-disabled", !!value );
675
+
676
+ // If the widget is becoming disabled, then nothing is interactive
677
+ if ( value ) {
678
+ this.hoverable.removeClass( "ui-state-hover" );
679
+ this.focusable.removeClass( "ui-state-focus" );
680
+ }
693
681
  }
694
682
 
695
683
  return this;
696
684
  },
697
685
 
698
686
  enable: function() {
699
- return this._setOption( "disabled", false );
687
+ return this._setOptions({ disabled: false });
700
688
  },
701
689
  disable: function() {
702
- return this._setOption( "disabled", true );
690
+ return this._setOptions({ disabled: true });
703
691
  },
704
692
 
705
693
  _on: function( suppressDisabledCheck, element, handlers ) {
@@ -719,7 +707,6 @@ $.Widget.prototype = {
719
707
  element = this.element;
720
708
  delegateElement = this.widget();
721
709
  } else {
722
- // accept selectors, DOM elements
723
710
  element = delegateElement = $( element );
724
711
  this.bindings = this.bindings.add( element );
725
712
  }
@@ -744,7 +731,7 @@ $.Widget.prototype = {
744
731
  handler.guid || handlerProxy.guid || $.guid++;
745
732
  }
746
733
 
747
- var match = event.match( /^(\w+)\s*(.*)$/ ),
734
+ var match = event.match( /^([\w:-]*)\s*(.*)$/ ),
748
735
  eventName = match[1] + instance.eventNamespace,
749
736
  selector = match[2];
750
737
  if ( selector ) {
@@ -756,8 +743,14 @@ $.Widget.prototype = {
756
743
  },
757
744
 
758
745
  _off: function( element, eventName ) {
759
- eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace;
746
+ eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) +
747
+ this.eventNamespace;
760
748
  element.unbind( eventName ).undelegate( eventName );
749
+
750
+ // Clear the stack to avoid memory leaks (#10056)
751
+ this.bindings = $( this.bindings.not( element ).get() );
752
+ this.focusable = $( this.focusable.not( element ).get() );
753
+ this.hoverable = $( this.hoverable.not( element ).get() );
761
754
  },
762
755
 
763
756
  _delay: function( handler, delay ) {
@@ -843,7 +836,7 @@ $.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
843
836
  if ( options.delay ) {
844
837
  element.delay( options.delay );
845
838
  }
846
- if ( hasOptions && $.effects && ( $.effects.effect[ effectName ] || $.uiBackCompat !== false && $.effects[ effectName ] ) ) {
839
+ if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
847
840
  element[ method ]( options );
848
841
  } else if ( effectName !== method && element[ effectName ] ) {
849
842
  element[ effectName ]( options.duration, options.easing, callback );
@@ -859,25 +852,30 @@ $.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
859
852
  };
860
853
  });
861
854
 
862
- // DEPRECATED
863
- if ( $.uiBackCompat !== false ) {
864
- $.Widget.prototype._getCreateOptions = function() {
865
- return $.metadata && $.metadata.get( this.element[0] )[ this.widgetName ];
866
- };
867
- }
855
+ var widget = $.widget;
856
+
857
+
858
+ /*!
859
+ * jQuery UI Mouse 1.11.2
860
+ * http://jqueryui.com
861
+ *
862
+ * Copyright 2014 jQuery Foundation and other contributors
863
+ * Released under the MIT license.
864
+ * http://jquery.org/license
865
+ *
866
+ * http://api.jqueryui.com/mouse/
867
+ */
868
868
 
869
- })( jQuery );
870
- (function( $, undefined ) {
871
869
 
872
870
  var mouseHandled = false;
873
- $( document ).mouseup( function( e ) {
871
+ $( document ).mouseup( function() {
874
872
  mouseHandled = false;
875
873
  });
876
874
 
877
- $.widget("ui.mouse", {
878
- version: "1.9.2",
875
+ var mouse = $.widget("ui.mouse", {
876
+ version: "1.11.2",
879
877
  options: {
880
- cancel: 'input,textarea,button,select,option',
878
+ cancel: "input,textarea,button,select,option",
881
879
  distance: 1,
882
880
  delay: 0
883
881
  },
@@ -885,12 +883,12 @@ $.widget("ui.mouse", {
885
883
  var that = this;
886
884
 
887
885
  this.element
888
- .bind('mousedown.'+this.widgetName, function(event) {
886
+ .bind("mousedown." + this.widgetName, function(event) {
889
887
  return that._mouseDown(event);
890
888
  })
891
- .bind('click.'+this.widgetName, function(event) {
892
- if (true === $.data(event.target, that.widgetName + '.preventClickEvent')) {
893
- $.removeData(event.target, that.widgetName + '.preventClickEvent');
889
+ .bind("click." + this.widgetName, function(event) {
890
+ if (true === $.data(event.target, that.widgetName + ".preventClickEvent")) {
891
+ $.removeData(event.target, that.widgetName + ".preventClickEvent");
894
892
  event.stopImmediatePropagation();
895
893
  return false;
896
894
  }
@@ -902,17 +900,21 @@ $.widget("ui.mouse", {
902
900
  // TODO: make sure destroying one instance of mouse doesn't mess with
903
901
  // other instances of mouse
904
902
  _mouseDestroy: function() {
905
- this.element.unbind('.'+this.widgetName);
903
+ this.element.unbind("." + this.widgetName);
906
904
  if ( this._mouseMoveDelegate ) {
907
- $(document)
908
- .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
909
- .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
905
+ this.document
906
+ .unbind("mousemove." + this.widgetName, this._mouseMoveDelegate)
907
+ .unbind("mouseup." + this.widgetName, this._mouseUpDelegate);
910
908
  }
911
909
  },
912
910
 
913
911
  _mouseDown: function(event) {
914
912
  // don't let more than one widget handle mouseStart
915
- if( mouseHandled ) { return; }
913
+ if ( mouseHandled ) {
914
+ return;
915
+ }
916
+
917
+ this._mouseMoved = false;
916
918
 
917
919
  // we may have missed mouseup (out of window)
918
920
  (this._mouseStarted && this._mouseUp(event));
@@ -944,8 +946,8 @@ $.widget("ui.mouse", {
944
946
  }
945
947
 
946
948
  // Click event may never have fired (Gecko & Opera)
947
- if (true === $.data(event.target, this.widgetName + '.preventClickEvent')) {
948
- $.removeData(event.target, this.widgetName + '.preventClickEvent');
949
+ if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) {
950
+ $.removeData(event.target, this.widgetName + ".preventClickEvent");
949
951
  }
950
952
 
951
953
  // these delegates are required to keep context
@@ -955,9 +957,10 @@ $.widget("ui.mouse", {
955
957
  this._mouseUpDelegate = function(event) {
956
958
  return that._mouseUp(event);
957
959
  };
958
- $(document)
959
- .bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
960
- .bind('mouseup.'+this.widgetName, this._mouseUpDelegate);
960
+
961
+ this.document
962
+ .bind( "mousemove." + this.widgetName, this._mouseMoveDelegate )
963
+ .bind( "mouseup." + this.widgetName, this._mouseUpDelegate );
961
964
 
962
965
  event.preventDefault();
963
966
 
@@ -966,9 +969,23 @@ $.widget("ui.mouse", {
966
969
  },
967
970
 
968
971
  _mouseMove: function(event) {
969
- // IE mouseup check - mouseup happened when mouse was out of window
970
- if ($.ui.ie && !(document.documentMode >= 9) && !event.button) {
971
- return this._mouseUp(event);
972
+ // Only check for mouseups outside the document if you've moved inside the document
973
+ // at least once. This prevents the firing of mouseup in the case of IE<9, which will
974
+ // fire a mousemove event if content is placed under the cursor. See #7778
975
+ // Support: IE <9
976
+ if ( this._mouseMoved ) {
977
+ // IE mouseup check - mouseup happened when mouse was out of window
978
+ if ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) {
979
+ return this._mouseUp(event);
980
+
981
+ // Iframe mouseup check - mouseup occurred in another document
982
+ } else if ( !event.which ) {
983
+ return this._mouseUp( event );
984
+ }
985
+ }
986
+
987
+ if ( event.which || event.button ) {
988
+ this._mouseMoved = true;
972
989
  }
973
990
 
974
991
  if (this._mouseStarted) {
@@ -986,20 +1003,21 @@ $.widget("ui.mouse", {
986
1003
  },
987
1004
 
988
1005
  _mouseUp: function(event) {
989
- $(document)
990
- .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
991
- .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
1006
+ this.document
1007
+ .unbind( "mousemove." + this.widgetName, this._mouseMoveDelegate )
1008
+ .unbind( "mouseup." + this.widgetName, this._mouseUpDelegate );
992
1009
 
993
1010
  if (this._mouseStarted) {
994
1011
  this._mouseStarted = false;
995
1012
 
996
1013
  if (event.target === this._mouseDownEvent.target) {
997
- $.data(event.target, this.widgetName + '.preventClickEvent', true);
1014
+ $.data(event.target, this.widgetName + ".preventClickEvent", true);
998
1015
  }
999
1016
 
1000
1017
  this._mouseStop(event);
1001
1018
  }
1002
1019
 
1020
+ mouseHandled = false;
1003
1021
  return false;
1004
1022
  },
1005
1023
 
@@ -1011,22 +1029,32 @@ $.widget("ui.mouse", {
1011
1029
  );
1012
1030
  },
1013
1031
 
1014
- _mouseDelayMet: function(event) {
1032
+ _mouseDelayMet: function(/* event */) {
1015
1033
  return this.mouseDelayMet;
1016
1034
  },
1017
1035
 
1018
1036
  // These are placeholder methods, to be overriden by extending plugin
1019
- _mouseStart: function(event) {},
1020
- _mouseDrag: function(event) {},
1021
- _mouseStop: function(event) {},
1022
- _mouseCapture: function(event) { return true; }
1037
+ _mouseStart: function(/* event */) {},
1038
+ _mouseDrag: function(/* event */) {},
1039
+ _mouseStop: function(/* event */) {},
1040
+ _mouseCapture: function(/* event */) { return true; }
1023
1041
  });
1024
1042
 
1025
- })(jQuery);
1026
- (function( $, undefined ) {
1027
1043
 
1028
- $.widget("ui.sortable", $.ui.mouse, {
1029
- version: "1.9.2",
1044
+ /*!
1045
+ * jQuery UI Sortable 1.11.2
1046
+ * http://jqueryui.com
1047
+ *
1048
+ * Copyright 2014 jQuery Foundation and other contributors
1049
+ * Released under the MIT license.
1050
+ * http://jquery.org/license
1051
+ *
1052
+ * http://api.jqueryui.com/sortable/
1053
+ */
1054
+
1055
+
1056
+ var sortable = $.widget("ui.sortable", $.ui.mouse, {
1057
+ version: "1.11.2",
1030
1058
  widgetEventPrefix: "sort",
1031
1059
  ready: false,
1032
1060
  options: {
@@ -1034,7 +1062,7 @@ $.widget("ui.sortable", $.ui.mouse, {
1034
1062
  axis: false,
1035
1063
  connectWith: false,
1036
1064
  containment: false,
1037
- cursor: 'auto',
1065
+ cursor: "auto",
1038
1066
  cursorAt: false,
1039
1067
  dropOnEmpty: true,
1040
1068
  forcePlaceholderSize: false,
@@ -1042,7 +1070,7 @@ $.widget("ui.sortable", $.ui.mouse, {
1042
1070
  grid: false,
1043
1071
  handle: false,
1044
1072
  helper: "original",
1045
- items: '> *',
1073
+ items: "> *",
1046
1074
  opacity: false,
1047
1075
  placeholder: false,
1048
1076
  revert: false,
@@ -1051,8 +1079,31 @@ $.widget("ui.sortable", $.ui.mouse, {
1051
1079
  scrollSpeed: 20,
1052
1080
  scope: "default",
1053
1081
  tolerance: "intersect",
1054
- zIndex: 1000
1082
+ zIndex: 1000,
1083
+
1084
+ // callbacks
1085
+ activate: null,
1086
+ beforeStop: null,
1087
+ change: null,
1088
+ deactivate: null,
1089
+ out: null,
1090
+ over: null,
1091
+ receive: null,
1092
+ remove: null,
1093
+ sort: null,
1094
+ start: null,
1095
+ stop: null,
1096
+ update: null
1097
+ },
1098
+
1099
+ _isOverAxis: function( x, reference, size ) {
1100
+ return ( x >= reference ) && ( x < ( reference + size ) );
1055
1101
  },
1102
+
1103
+ _isFloating: function( item ) {
1104
+ return (/left|right/).test(item.css("float")) || (/inline|table-cell/).test(item.css("display"));
1105
+ },
1106
+
1056
1107
  _create: function() {
1057
1108
 
1058
1109
  var o = this.options;
@@ -1063,7 +1114,7 @@ $.widget("ui.sortable", $.ui.mouse, {
1063
1114
  this.refresh();
1064
1115
 
1065
1116
  //Let's determine if the items are being displayed horizontally
1066
- this.floating = this.items.length ? o.axis === 'x' || (/left|right/).test(this.items[0].item.css('float')) || (/inline|table-cell/).test(this.items[0].item.css('display')) : false;
1117
+ this.floating = this.items.length ? o.axis === "x" || this._isFloating(this.items[0].item) : false;
1067
1118
 
1068
1119
  //Let's determine the parent's offset
1069
1120
  this.offset = this.element.offset();
@@ -1071,60 +1122,83 @@ $.widget("ui.sortable", $.ui.mouse, {
1071
1122
  //Initialize mouse events for interaction
1072
1123
  this._mouseInit();
1073
1124
 
1125
+ this._setHandleClassName();
1126
+
1074
1127
  //We're ready to go
1075
- this.ready = true
1128
+ this.ready = true;
1129
+
1130
+ },
1131
+
1132
+ _setOption: function( key, value ) {
1133
+ this._super( key, value );
1134
+
1135
+ if ( key === "handle" ) {
1136
+ this._setHandleClassName();
1137
+ }
1138
+ },
1076
1139
 
1140
+ _setHandleClassName: function() {
1141
+ this.element.find( ".ui-sortable-handle" ).removeClass( "ui-sortable-handle" );
1142
+ $.each( this.items, function() {
1143
+ ( this.instance.options.handle ?
1144
+ this.item.find( this.instance.options.handle ) : this.item )
1145
+ .addClass( "ui-sortable-handle" );
1146
+ });
1077
1147
  },
1078
1148
 
1079
1149
  _destroy: function() {
1080
1150
  this.element
1081
- .removeClass("ui-sortable ui-sortable-disabled");
1151
+ .removeClass( "ui-sortable ui-sortable-disabled" )
1152
+ .find( ".ui-sortable-handle" )
1153
+ .removeClass( "ui-sortable-handle" );
1082
1154
  this._mouseDestroy();
1083
1155
 
1084
- for ( var i = this.items.length - 1; i >= 0; i-- )
1156
+ for ( var i = this.items.length - 1; i >= 0; i-- ) {
1085
1157
  this.items[i].item.removeData(this.widgetName + "-item");
1158
+ }
1086
1159
 
1087
1160
  return this;
1088
1161
  },
1089
1162
 
1090
- _setOption: function(key, value){
1091
- if ( key === "disabled" ) {
1092
- this.options[ key ] = value;
1093
-
1094
- this.widget().toggleClass( "ui-sortable-disabled", !!value );
1095
- } else {
1096
- // Don't call widget base _setOption for disable as it adds ui-state-disabled class
1097
- $.Widget.prototype._setOption.apply(this, arguments);
1098
- }
1099
- },
1100
-
1101
1163
  _mouseCapture: function(event, overrideHandle) {
1102
- var that = this;
1164
+ var currentItem = null,
1165
+ validHandle = false,
1166
+ that = this;
1103
1167
 
1104
1168
  if (this.reverting) {
1105
1169
  return false;
1106
1170
  }
1107
1171
 
1108
- if(this.options.disabled || this.options.type == 'static') return false;
1172
+ if(this.options.disabled || this.options.type === "static") {
1173
+ return false;
1174
+ }
1109
1175
 
1110
1176
  //We have to refresh the items data once first
1111
1177
  this._refreshItems(event);
1112
1178
 
1113
1179
  //Find out if the clicked node (or one of its parents) is a actual item in this.items
1114
- var currentItem = null, nodes = $(event.target).parents().each(function() {
1115
- if($.data(this, that.widgetName + '-item') == that) {
1180
+ $(event.target).parents().each(function() {
1181
+ if($.data(this, that.widgetName + "-item") === that) {
1116
1182
  currentItem = $(this);
1117
1183
  return false;
1118
1184
  }
1119
1185
  });
1120
- if($.data(event.target, that.widgetName + '-item') == that) currentItem = $(event.target);
1186
+ if($.data(event.target, that.widgetName + "-item") === that) {
1187
+ currentItem = $(event.target);
1188
+ }
1121
1189
 
1122
- if(!currentItem) return false;
1190
+ if(!currentItem) {
1191
+ return false;
1192
+ }
1123
1193
  if(this.options.handle && !overrideHandle) {
1124
- var validHandle = false;
1125
-
1126
- $(this.options.handle, currentItem).find("*").andSelf().each(function() { if(this == event.target) validHandle = true; });
1127
- if(!validHandle) return false;
1194
+ $(this.options.handle, currentItem).find("*").addBack().each(function() {
1195
+ if(this === event.target) {
1196
+ validHandle = true;
1197
+ }
1198
+ });
1199
+ if(!validHandle) {
1200
+ return false;
1201
+ }
1128
1202
  }
1129
1203
 
1130
1204
  this.currentItem = currentItem;
@@ -1135,7 +1209,9 @@ $.widget("ui.sortable", $.ui.mouse, {
1135
1209
 
1136
1210
  _mouseStart: function(event, overrideHandle, noActivation) {
1137
1211
 
1138
- var o = this.options;
1212
+ var i, body,
1213
+ o = this.options;
1214
+
1139
1215
  this.currentContainer = this;
1140
1216
 
1141
1217
  //We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
@@ -1184,14 +1260,14 @@ $.widget("ui.sortable", $.ui.mouse, {
1184
1260
  this.originalPageX = event.pageX;
1185
1261
  this.originalPageY = event.pageY;
1186
1262
 
1187
- //Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
1263
+ //Adjust the mouse offset relative to the helper if "cursorAt" is supplied
1188
1264
  (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
1189
1265
 
1190
1266
  //Cache the former DOM position
1191
1267
  this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };
1192
1268
 
1193
1269
  //If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way
1194
- if(this.helper[0] != this.currentItem[0]) {
1270
+ if(this.helper[0] !== this.currentItem[0]) {
1195
1271
  this.currentItem.hide();
1196
1272
  }
1197
1273
 
@@ -1199,47 +1275,63 @@ $.widget("ui.sortable", $.ui.mouse, {
1199
1275
  this._createPlaceholder();
1200
1276
 
1201
1277
  //Set a containment if given in the options
1202
- if(o.containment)
1278
+ if(o.containment) {
1203
1279
  this._setContainment();
1280
+ }
1281
+
1282
+ if( o.cursor && o.cursor !== "auto" ) { // cursor option
1283
+ body = this.document.find( "body" );
1284
+
1285
+ // support: IE
1286
+ this.storedCursor = body.css( "cursor" );
1287
+ body.css( "cursor", o.cursor );
1204
1288
 
1205
- if(o.cursor) { // cursor option
1206
- if ($('body').css("cursor")) this._storedCursor = $('body').css("cursor");
1207
- $('body').css("cursor", o.cursor);
1289
+ this.storedStylesheet = $( "<style>*{ cursor: "+o.cursor+" !important; }</style>" ).appendTo( body );
1208
1290
  }
1209
1291
 
1210
1292
  if(o.opacity) { // opacity option
1211
- if (this.helper.css("opacity")) this._storedOpacity = this.helper.css("opacity");
1293
+ if (this.helper.css("opacity")) {
1294
+ this._storedOpacity = this.helper.css("opacity");
1295
+ }
1212
1296
  this.helper.css("opacity", o.opacity);
1213
1297
  }
1214
1298
 
1215
1299
  if(o.zIndex) { // zIndex option
1216
- if (this.helper.css("zIndex")) this._storedZIndex = this.helper.css("zIndex");
1300
+ if (this.helper.css("zIndex")) {
1301
+ this._storedZIndex = this.helper.css("zIndex");
1302
+ }
1217
1303
  this.helper.css("zIndex", o.zIndex);
1218
1304
  }
1219
1305
 
1220
1306
  //Prepare scrolling
1221
- if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML')
1307
+ if(this.scrollParent[0] !== document && this.scrollParent[0].tagName !== "HTML") {
1222
1308
  this.overflowOffset = this.scrollParent.offset();
1309
+ }
1223
1310
 
1224
1311
  //Call callbacks
1225
1312
  this._trigger("start", event, this._uiHash());
1226
1313
 
1227
1314
  //Recache the helper size
1228
- if(!this._preserveHelperProportions)
1315
+ if(!this._preserveHelperProportions) {
1229
1316
  this._cacheHelperProportions();
1317
+ }
1230
1318
 
1231
1319
 
1232
- //Post 'activate' events to possible containers
1233
- if(!noActivation) {
1234
- for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i]._trigger("activate", event, this._uiHash(this)); }
1320
+ //Post "activate" events to possible containers
1321
+ if( !noActivation ) {
1322
+ for ( i = this.containers.length - 1; i >= 0; i-- ) {
1323
+ this.containers[ i ]._trigger( "activate", event, this._uiHash( this ) );
1324
+ }
1235
1325
  }
1236
1326
 
1237
1327
  //Prepare possible droppables
1238
- if($.ui.ddmanager)
1328
+ if($.ui.ddmanager) {
1239
1329
  $.ui.ddmanager.current = this;
1330
+ }
1240
1331
 
1241
- if ($.ui.ddmanager && !o.dropBehaviour)
1332
+ if ($.ui.ddmanager && !o.dropBehaviour) {
1242
1333
  $.ui.ddmanager.prepareOffsets(this, event);
1334
+ }
1243
1335
 
1244
1336
  this.dragging = true;
1245
1337
 
@@ -1250,6 +1342,9 @@ $.widget("ui.sortable", $.ui.mouse, {
1250
1342
  },
1251
1343
 
1252
1344
  _mouseDrag: function(event) {
1345
+ var i, item, itemElement, intersection,
1346
+ o = this.options,
1347
+ scrolled = false;
1253
1348
 
1254
1349
  //Compute the helpers position
1255
1350
  this.position = this._generatePosition(event);
@@ -1261,70 +1356,86 @@ $.widget("ui.sortable", $.ui.mouse, {
1261
1356
 
1262
1357
  //Do scrolling
1263
1358
  if(this.options.scroll) {
1264
- var o = this.options, scrolled = false;
1265
- if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML') {
1359
+ if(this.scrollParent[0] !== document && this.scrollParent[0].tagName !== "HTML") {
1266
1360
 
1267
- if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
1361
+ if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) {
1268
1362
  this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
1269
- else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity)
1363
+ } else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity) {
1270
1364
  this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
1365
+ }
1271
1366
 
1272
- if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
1367
+ if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) {
1273
1368
  this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
1274
- else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity)
1369
+ } else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity) {
1275
1370
  this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
1371
+ }
1276
1372
 
1277
1373
  } else {
1278
1374
 
1279
- if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
1375
+ if(event.pageY - $(document).scrollTop() < o.scrollSensitivity) {
1280
1376
  scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
1281
- else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
1377
+ } else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) {
1282
1378
  scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
1379
+ }
1283
1380
 
1284
- if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
1381
+ if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity) {
1285
1382
  scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
1286
- else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
1383
+ } else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) {
1287
1384
  scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
1385
+ }
1288
1386
 
1289
1387
  }
1290
1388
 
1291
- if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
1389
+ if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {
1292
1390
  $.ui.ddmanager.prepareOffsets(this, event);
1391
+ }
1293
1392
  }
1294
1393
 
1295
1394
  //Regenerate the absolute position used for position checks
1296
1395
  this.positionAbs = this._convertPositionTo("absolute");
1297
1396
 
1298
1397
  //Set the helper position
1299
- if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
1300
- if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
1398
+ if(!this.options.axis || this.options.axis !== "y") {
1399
+ this.helper[0].style.left = this.position.left+"px";
1400
+ }
1401
+ if(!this.options.axis || this.options.axis !== "x") {
1402
+ this.helper[0].style.top = this.position.top+"px";
1403
+ }
1301
1404
 
1302
1405
  //Rearrange
1303
- for (var i = this.items.length - 1; i >= 0; i--) {
1406
+ for (i = this.items.length - 1; i >= 0; i--) {
1304
1407
 
1305
1408
  //Cache variables and intersection, continue if no intersection
1306
- var item = this.items[i], itemElement = item.item[0], intersection = this._intersectsWithPointer(item);
1307
- if (!intersection) continue;
1409
+ item = this.items[i];
1410
+ itemElement = item.item[0];
1411
+ intersection = this._intersectsWithPointer(item);
1412
+ if (!intersection) {
1413
+ continue;
1414
+ }
1308
1415
 
1309
1416
  // Only put the placeholder inside the current Container, skip all
1310
- // items form other containers. This works because when moving
1417
+ // items from other containers. This works because when moving
1311
1418
  // an item from one container to another the
1312
1419
  // currentContainer is switched before the placeholder is moved.
1313
1420
  //
1314
- // Without this moving items in "sub-sortables" can cause the placeholder to jitter
1315
- // beetween the outer and inner container.
1316
- if (item.instance !== this.currentContainer) continue;
1317
-
1318
- if (itemElement != this.currentItem[0] //cannot intersect with itself
1319
- && this.placeholder[intersection == 1 ? "next" : "prev"]()[0] != itemElement //no useless actions that have been done before
1320
- && !$.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked
1321
- && (this.options.type == 'semi-dynamic' ? !$.contains(this.element[0], itemElement) : true)
1322
- //&& itemElement.parentNode == this.placeholder[0].parentNode // only rearrange items within the same container
1421
+ // Without this, moving items in "sub-sortables" can cause
1422
+ // the placeholder to jitter between the outer and inner container.
1423
+ if (item.instance !== this.currentContainer) {
1424
+ continue;
1425
+ }
1426
+
1427
+ // cannot intersect with itself
1428
+ // no useless actions that have been done before
1429
+ // no action if the item moved is the parent of the item checked
1430
+ if (itemElement !== this.currentItem[0] &&
1431
+ this.placeholder[intersection === 1 ? "next" : "prev"]()[0] !== itemElement &&
1432
+ !$.contains(this.placeholder[0], itemElement) &&
1433
+ (this.options.type === "semi-dynamic" ? !$.contains(this.element[0], itemElement) : true)
1323
1434
  ) {
1324
1435
 
1325
- this.direction = intersection == 1 ? "down" : "up";
1436
+ this.direction = intersection === 1 ? "down" : "up";
1326
1437
 
1327
- if (this.options.tolerance == "pointer" || this._intersectsWithSides(item)) {
1438
+ if (this.options.tolerance === "pointer" || this._intersectsWithSides(item)) {
1328
1439
  this._rearrange(event, item);
1329
1440
  } else {
1330
1441
  break;
@@ -1339,10 +1450,12 @@ $.widget("ui.sortable", $.ui.mouse, {
1339
1450
  this._contactContainers(event);
1340
1451
 
1341
1452
  //Interconnect with droppables
1342
- if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
1453
+ if($.ui.ddmanager) {
1454
+ $.ui.ddmanager.drag(this, event);
1455
+ }
1343
1456
 
1344
1457
  //Call callbacks
1345
- this._trigger('sort', event, this._uiHash());
1458
+ this._trigger("sort", event, this._uiHash());
1346
1459
 
1347
1460
  this.lastPositionAbs = this.positionAbs;
1348
1461
  return false;
@@ -1351,22 +1464,29 @@ $.widget("ui.sortable", $.ui.mouse, {
1351
1464
 
1352
1465
  _mouseStop: function(event, noPropagation) {
1353
1466
 
1354
- if(!event) return;
1467
+ if(!event) {
1468
+ return;
1469
+ }
1355
1470
 
1356
1471
  //If we are using droppables, inform the manager about the drop
1357
- if ($.ui.ddmanager && !this.options.dropBehaviour)
1472
+ if ($.ui.ddmanager && !this.options.dropBehaviour) {
1358
1473
  $.ui.ddmanager.drop(this, event);
1474
+ }
1359
1475
 
1360
1476
  if(this.options.revert) {
1361
- var that = this;
1362
- var cur = this.placeholder.offset();
1477
+ var that = this,
1478
+ cur = this.placeholder.offset(),
1479
+ axis = this.options.axis,
1480
+ animation = {};
1363
1481
 
1482
+ if ( !axis || axis === "x" ) {
1483
+ animation.left = cur.left - this.offset.parent.left - this.margins.left + (this.offsetParent[0] === document.body ? 0 : this.offsetParent[0].scrollLeft);
1484
+ }
1485
+ if ( !axis || axis === "y" ) {
1486
+ animation.top = cur.top - this.offset.parent.top - this.margins.top + (this.offsetParent[0] === document.body ? 0 : this.offsetParent[0].scrollTop);
1487
+ }
1364
1488
  this.reverting = true;
1365
-
1366
- $(this.helper).animate({
1367
- left: cur.left - this.offset.parent.left - this.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft),
1368
- top: cur.top - this.offset.parent.top - this.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop)
1369
- }, parseInt(this.options.revert, 10) || 500, function() {
1489
+ $(this.helper).animate( animation, parseInt(this.options.revert, 10) || 500, function() {
1370
1490
  that._clear(event);
1371
1491
  });
1372
1492
  } else {
@@ -1383,10 +1503,11 @@ $.widget("ui.sortable", $.ui.mouse, {
1383
1503
 
1384
1504
  this._mouseUp({ target: null });
1385
1505
 
1386
- if(this.options.helper == "original")
1506
+ if(this.options.helper === "original") {
1387
1507
  this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
1388
- else
1508
+ } else {
1389
1509
  this.currentItem.show();
1510
+ }
1390
1511
 
1391
1512
  //Post deactivating events to containers
1392
1513
  for (var i = this.containers.length - 1; i >= 0; i--){
@@ -1401,8 +1522,12 @@ $.widget("ui.sortable", $.ui.mouse, {
1401
1522
 
1402
1523
  if (this.placeholder) {
1403
1524
  //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
1404
- if(this.placeholder[0].parentNode) this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
1405
- if(this.options.helper != "original" && this.helper && this.helper[0].parentNode) this.helper.remove();
1525
+ if(this.placeholder[0].parentNode) {
1526
+ this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
1527
+ }
1528
+ if(this.options.helper !== "original" && this.helper && this.helper[0].parentNode) {
1529
+ this.helper.remove();
1530
+ }
1406
1531
 
1407
1532
  $.extend(this, {
1408
1533
  helper: null,
@@ -1424,28 +1549,33 @@ $.widget("ui.sortable", $.ui.mouse, {
1424
1549
 
1425
1550
  serialize: function(o) {
1426
1551
 
1427
- var items = this._getItemsAsjQuery(o && o.connected);
1428
- var str = []; o = o || {};
1552
+ var items = this._getItemsAsjQuery(o && o.connected),
1553
+ str = [];
1554
+ o = o || {};
1429
1555
 
1430
1556
  $(items).each(function() {
1431
- var res = ($(o.item || this).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/));
1432
- if(res) str.push((o.key || res[1]+'[]')+'='+(o.key && o.expression ? res[1] : res[2]));
1557
+ var res = ($(o.item || this).attr(o.attribute || "id") || "").match(o.expression || (/(.+)[\-=_](.+)/));
1558
+ if (res) {
1559
+ str.push((o.key || res[1]+"[]")+"="+(o.key && o.expression ? res[1] : res[2]));
1560
+ }
1433
1561
  });
1434
1562
 
1435
1563
  if(!str.length && o.key) {
1436
- str.push(o.key + '=');
1564
+ str.push(o.key + "=");
1437
1565
  }
1438
1566
 
1439
- return str.join('&');
1567
+ return str.join("&");
1440
1568
 
1441
1569
  },
1442
1570
 
1443
1571
  toArray: function(o) {
1444
1572
 
1445
- var items = this._getItemsAsjQuery(o && o.connected);
1446
- var ret = []; o = o || {};
1573
+ var items = this._getItemsAsjQuery(o && o.connected),
1574
+ ret = [];
1447
1575
 
1448
- items.each(function() { ret.push($(o.item || this).attr(o.attribute || 'id') || ''); });
1576
+ o = o || {};
1577
+
1578
+ items.each(function() { ret.push($(o.item || this).attr(o.attribute || "id") || ""); });
1449
1579
  return ret;
1450
1580
 
1451
1581
  },
@@ -1456,113 +1586,114 @@ $.widget("ui.sortable", $.ui.mouse, {
1456
1586
  var x1 = this.positionAbs.left,
1457
1587
  x2 = x1 + this.helperProportions.width,
1458
1588
  y1 = this.positionAbs.top,
1459
- y2 = y1 + this.helperProportions.height;
1460
-
1461
- var l = item.left,
1589
+ y2 = y1 + this.helperProportions.height,
1590
+ l = item.left,
1462
1591
  r = l + item.width,
1463
1592
  t = item.top,
1464
- b = t + item.height;
1465
-
1466
- var dyClick = this.offset.click.top,
1467
- dxClick = this.offset.click.left;
1468
-
1469
- var isOverElement = (y1 + dyClick) > t && (y1 + dyClick) < b && (x1 + dxClick) > l && (x1 + dxClick) < r;
1470
-
1471
- if( this.options.tolerance == "pointer"
1472
- || this.options.forcePointerForContainers
1473
- || (this.options.tolerance != "pointer" && this.helperProportions[this.floating ? 'width' : 'height'] > item[this.floating ? 'width' : 'height'])
1593
+ b = t + item.height,
1594
+ dyClick = this.offset.click.top,
1595
+ dxClick = this.offset.click.left,
1596
+ isOverElementHeight = ( this.options.axis === "x" ) || ( ( y1 + dyClick ) > t && ( y1 + dyClick ) < b ),
1597
+ isOverElementWidth = ( this.options.axis === "y" ) || ( ( x1 + dxClick ) > l && ( x1 + dxClick ) < r ),
1598
+ isOverElement = isOverElementHeight && isOverElementWidth;
1599
+
1600
+ if ( this.options.tolerance === "pointer" ||
1601
+ this.options.forcePointerForContainers ||
1602
+ (this.options.tolerance !== "pointer" && this.helperProportions[this.floating ? "width" : "height"] > item[this.floating ? "width" : "height"])
1474
1603
  ) {
1475
1604
  return isOverElement;
1476
1605
  } else {
1477
1606
 
1478
- return (l < x1 + (this.helperProportions.width / 2) // Right Half
1479
- && x2 - (this.helperProportions.width / 2) < r // Left Half
1480
- && t < y1 + (this.helperProportions.height / 2) // Bottom Half
1481
- && y2 - (this.helperProportions.height / 2) < b ); // Top Half
1607
+ return (l < x1 + (this.helperProportions.width / 2) && // Right Half
1608
+ x2 - (this.helperProportions.width / 2) < r && // Left Half
1609
+ t < y1 + (this.helperProportions.height / 2) && // Bottom Half
1610
+ y2 - (this.helperProportions.height / 2) < b ); // Top Half
1482
1611
 
1483
1612
  }
1484
1613
  },
1485
1614
 
1486
1615
  _intersectsWithPointer: function(item) {
1487
1616
 
1488
- var isOverElementHeight = (this.options.axis === 'x') || $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
1489
- isOverElementWidth = (this.options.axis === 'y') || $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
1617
+ var isOverElementHeight = (this.options.axis === "x") || this._isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
1618
+ isOverElementWidth = (this.options.axis === "y") || this._isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
1490
1619
  isOverElement = isOverElementHeight && isOverElementWidth,
1491
1620
  verticalDirection = this._getDragVerticalDirection(),
1492
1621
  horizontalDirection = this._getDragHorizontalDirection();
1493
1622
 
1494
- if (!isOverElement)
1623
+ if (!isOverElement) {
1495
1624
  return false;
1625
+ }
1496
1626
 
1497
1627
  return this.floating ?
1498
- ( ((horizontalDirection && horizontalDirection == "right") || verticalDirection == "down") ? 2 : 1 )
1499
- : ( verticalDirection && (verticalDirection == "down" ? 2 : 1) );
1628
+ ( ((horizontalDirection && horizontalDirection === "right") || verticalDirection === "down") ? 2 : 1 )
1629
+ : ( verticalDirection && (verticalDirection === "down" ? 2 : 1) );
1500
1630
 
1501
1631
  },
1502
1632
 
1503
1633
  _intersectsWithSides: function(item) {
1504
1634
 
1505
- var isOverBottomHalf = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),
1506
- isOverRightHalf = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
1635
+ var isOverBottomHalf = this._isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),
1636
+ isOverRightHalf = this._isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
1507
1637
  verticalDirection = this._getDragVerticalDirection(),
1508
1638
  horizontalDirection = this._getDragHorizontalDirection();
1509
1639
 
1510
1640
  if (this.floating && horizontalDirection) {
1511
- return ((horizontalDirection == "right" && isOverRightHalf) || (horizontalDirection == "left" && !isOverRightHalf));
1641
+ return ((horizontalDirection === "right" && isOverRightHalf) || (horizontalDirection === "left" && !isOverRightHalf));
1512
1642
  } else {
1513
- return verticalDirection && ((verticalDirection == "down" && isOverBottomHalf) || (verticalDirection == "up" && !isOverBottomHalf));
1643
+ return verticalDirection && ((verticalDirection === "down" && isOverBottomHalf) || (verticalDirection === "up" && !isOverBottomHalf));
1514
1644
  }
1515
1645
 
1516
1646
  },
1517
1647
 
1518
1648
  _getDragVerticalDirection: function() {
1519
1649
  var delta = this.positionAbs.top - this.lastPositionAbs.top;
1520
- return delta != 0 && (delta > 0 ? "down" : "up");
1650
+ return delta !== 0 && (delta > 0 ? "down" : "up");
1521
1651
  },
1522
1652
 
1523
1653
  _getDragHorizontalDirection: function() {
1524
1654
  var delta = this.positionAbs.left - this.lastPositionAbs.left;
1525
- return delta != 0 && (delta > 0 ? "right" : "left");
1655
+ return delta !== 0 && (delta > 0 ? "right" : "left");
1526
1656
  },
1527
1657
 
1528
1658
  refresh: function(event) {
1529
1659
  this._refreshItems(event);
1660
+ this._setHandleClassName();
1530
1661
  this.refreshPositions();
1531
1662
  return this;
1532
1663
  },
1533
1664
 
1534
1665
  _connectWith: function() {
1535
1666
  var options = this.options;
1536
- return options.connectWith.constructor == String
1537
- ? [options.connectWith]
1538
- : options.connectWith;
1667
+ return options.connectWith.constructor === String ? [options.connectWith] : options.connectWith;
1539
1668
  },
1540
1669
 
1541
1670
  _getItemsAsjQuery: function(connected) {
1542
1671
 
1543
- var items = [];
1544
- var queries = [];
1545
- var connectWith = this._connectWith();
1672
+ var i, j, cur, inst,
1673
+ items = [],
1674
+ queries = [],
1675
+ connectWith = this._connectWith();
1546
1676
 
1547
1677
  if(connectWith && connected) {
1548
- for (var i = connectWith.length - 1; i >= 0; i--){
1549
- var cur = $(connectWith[i]);
1550
- for (var j = cur.length - 1; j >= 0; j--){
1551
- var inst = $.data(cur[j], this.widgetName);
1552
- if(inst && inst != this && !inst.options.disabled) {
1553
- queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), inst]);
1678
+ for (i = connectWith.length - 1; i >= 0; i--){
1679
+ cur = $(connectWith[i]);
1680
+ for ( j = cur.length - 1; j >= 0; j--){
1681
+ inst = $.data(cur[j], this.widgetFullName);
1682
+ if(inst && inst !== this && !inst.options.disabled) {
1683
+ queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), inst]);
1554
1684
  }
1555
- };
1556
- };
1685
+ }
1686
+ }
1557
1687
  }
1558
1688
 
1559
- queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), this]);
1689
+ queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), this]);
1560
1690
 
1561
- for (var i = queries.length - 1; i >= 0; i--){
1562
- queries[i][0].each(function() {
1563
- items.push(this);
1564
- });
1565
- };
1691
+ function addItems() {
1692
+ items.push( this );
1693
+ }
1694
+ for (i = queries.length - 1; i >= 0; i--){
1695
+ queries[i][0].each( addItems );
1696
+ }
1566
1697
 
1567
1698
  return $(items);
1568
1699
 
@@ -1574,9 +1705,10 @@ $.widget("ui.sortable", $.ui.mouse, {
1574
1705
 
1575
1706
  this.items = $.grep(this.items, function (item) {
1576
1707
  for (var j=0; j < list.length; j++) {
1577
- if(list[j] == item.item[0])
1708
+ if(list[j] === item.item[0]) {
1578
1709
  return false;
1579
- };
1710
+ }
1711
+ }
1580
1712
  return true;
1581
1713
  });
1582
1714
 
@@ -1586,31 +1718,33 @@ $.widget("ui.sortable", $.ui.mouse, {
1586
1718
 
1587
1719
  this.items = [];
1588
1720
  this.containers = [this];
1589
- var items = this.items;
1590
- var queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]];
1591
- var connectWith = this._connectWith();
1721
+
1722
+ var i, j, cur, inst, targetData, _queries, item, queriesLength,
1723
+ items = this.items,
1724
+ queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]],
1725
+ connectWith = this._connectWith();
1592
1726
 
1593
1727
  if(connectWith && this.ready) { //Shouldn't be run the first time through due to massive slow-down
1594
- for (var i = connectWith.length - 1; i >= 0; i--){
1595
- var cur = $(connectWith[i]);
1596
- for (var j = cur.length - 1; j >= 0; j--){
1597
- var inst = $.data(cur[j], this.widgetName);
1598
- if(inst && inst != this && !inst.options.disabled) {
1728
+ for (i = connectWith.length - 1; i >= 0; i--){
1729
+ cur = $(connectWith[i]);
1730
+ for (j = cur.length - 1; j >= 0; j--){
1731
+ inst = $.data(cur[j], this.widgetFullName);
1732
+ if(inst && inst !== this && !inst.options.disabled) {
1599
1733
  queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);
1600
1734
  this.containers.push(inst);
1601
1735
  }
1602
- };
1603
- };
1736
+ }
1737
+ }
1604
1738
  }
1605
1739
 
1606
- for (var i = queries.length - 1; i >= 0; i--) {
1607
- var targetData = queries[i][1];
1608
- var _queries = queries[i][0];
1740
+ for (i = queries.length - 1; i >= 0; i--) {
1741
+ targetData = queries[i][1];
1742
+ _queries = queries[i][0];
1609
1743
 
1610
- for (var j=0, queriesLength = _queries.length; j < queriesLength; j++) {
1611
- var item = $(_queries[j]);
1744
+ for (j=0, queriesLength = _queries.length; j < queriesLength; j++) {
1745
+ item = $(_queries[j]);
1612
1746
 
1613
- item.data(this.widgetName + '-item', targetData); // Data for target checking (mouse manager)
1747
+ item.data(this.widgetName + "-item", targetData); // Data for target checking (mouse manager)
1614
1748
 
1615
1749
  items.push({
1616
1750
  item: item,
@@ -1618,8 +1752,8 @@ $.widget("ui.sortable", $.ui.mouse, {
1618
1752
  width: 0, height: 0,
1619
1753
  left: 0, top: 0
1620
1754
  });
1621
- };
1622
- };
1755
+ }
1756
+ }
1623
1757
 
1624
1758
  },
1625
1759
 
@@ -1630,35 +1764,38 @@ $.widget("ui.sortable", $.ui.mouse, {
1630
1764
  this.offset.parent = this._getParentOffset();
1631
1765
  }
1632
1766
 
1633
- for (var i = this.items.length - 1; i >= 0; i--){
1634
- var item = this.items[i];
1767
+ var i, item, t, p;
1768
+
1769
+ for (i = this.items.length - 1; i >= 0; i--){
1770
+ item = this.items[i];
1635
1771
 
1636
1772
  //We ignore calculating positions of all connected containers when we're not over them
1637
- if(item.instance != this.currentContainer && this.currentContainer && item.item[0] != this.currentItem[0])
1773
+ if(item.instance !== this.currentContainer && this.currentContainer && item.item[0] !== this.currentItem[0]) {
1638
1774
  continue;
1775
+ }
1639
1776
 
1640
- var t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;
1777
+ t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;
1641
1778
 
1642
1779
  if (!fast) {
1643
1780
  item.width = t.outerWidth();
1644
1781
  item.height = t.outerHeight();
1645
1782
  }
1646
1783
 
1647
- var p = t.offset();
1784
+ p = t.offset();
1648
1785
  item.left = p.left;
1649
1786
  item.top = p.top;
1650
- };
1787
+ }
1651
1788
 
1652
1789
  if(this.options.custom && this.options.custom.refreshContainers) {
1653
1790
  this.options.custom.refreshContainers.call(this);
1654
1791
  } else {
1655
- for (var i = this.containers.length - 1; i >= 0; i--){
1656
- var p = this.containers[i].element.offset();
1792
+ for (i = this.containers.length - 1; i >= 0; i--){
1793
+ p = this.containers[i].element.offset();
1657
1794
  this.containers[i].containerCache.left = p.left;
1658
1795
  this.containers[i].containerCache.top = p.top;
1659
- this.containers[i].containerCache.width = this.containers[i].element.outerWidth();
1796
+ this.containers[i].containerCache.width = this.containers[i].element.outerWidth();
1660
1797
  this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
1661
- };
1798
+ }
1662
1799
  }
1663
1800
 
1664
1801
  return this;
@@ -1666,31 +1803,46 @@ $.widget("ui.sortable", $.ui.mouse, {
1666
1803
 
1667
1804
  _createPlaceholder: function(that) {
1668
1805
  that = that || this;
1669
- var o = that.options;
1806
+ var className,
1807
+ o = that.options;
1670
1808
 
1671
- if(!o.placeholder || o.placeholder.constructor == String) {
1672
- var className = o.placeholder;
1809
+ if(!o.placeholder || o.placeholder.constructor === String) {
1810
+ className = o.placeholder;
1673
1811
  o.placeholder = {
1674
1812
  element: function() {
1675
1813
 
1676
- var el = $(document.createElement(that.currentItem[0].nodeName))
1677
- .addClass(className || that.currentItem[0].className+" ui-sortable-placeholder")
1678
- .removeClass("ui-sortable-helper")[0];
1814
+ var nodeName = that.currentItem[0].nodeName.toLowerCase(),
1815
+ element = $( "<" + nodeName + ">", that.document[0] )
1816
+ .addClass(className || that.currentItem[0].className+" ui-sortable-placeholder")
1817
+ .removeClass("ui-sortable-helper");
1818
+
1819
+ if ( nodeName === "tr" ) {
1820
+ that.currentItem.children().each(function() {
1821
+ $( "<td>&#160;</td>", that.document[0] )
1822
+ .attr( "colspan", $( this ).attr( "colspan" ) || 1 )
1823
+ .appendTo( element );
1824
+ });
1825
+ } else if ( nodeName === "img" ) {
1826
+ element.attr( "src", that.currentItem.attr( "src" ) );
1827
+ }
1679
1828
 
1680
- if(!className)
1681
- el.style.visibility = "hidden";
1829
+ if ( !className ) {
1830
+ element.css( "visibility", "hidden" );
1831
+ }
1682
1832
 
1683
- return el;
1833
+ return element;
1684
1834
  },
1685
1835
  update: function(container, p) {
1686
1836
 
1687
1837
  // 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
1688
1838
  // 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
1689
- if(className && !o.forcePlaceholderSize) return;
1839
+ if(className && !o.forcePlaceholderSize) {
1840
+ return;
1841
+ }
1690
1842
 
1691
1843
  //If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item
1692
- if(!p.height()) { p.height(that.currentItem.innerHeight() - parseInt(that.currentItem.css('paddingTop')||0, 10) - parseInt(that.currentItem.css('paddingBottom')||0, 10)); };
1693
- if(!p.width()) { p.width(that.currentItem.innerWidth() - parseInt(that.currentItem.css('paddingLeft')||0, 10) - parseInt(that.currentItem.css('paddingRight')||0, 10)); };
1844
+ if(!p.height()) { p.height(that.currentItem.innerHeight() - parseInt(that.currentItem.css("paddingTop")||0, 10) - parseInt(that.currentItem.css("paddingBottom")||0, 10)); }
1845
+ if(!p.width()) { p.width(that.currentItem.innerWidth() - parseInt(that.currentItem.css("paddingLeft")||0, 10) - parseInt(that.currentItem.css("paddingRight")||0, 10)); }
1694
1846
  }
1695
1847
  };
1696
1848
  }
@@ -1707,22 +1859,24 @@ $.widget("ui.sortable", $.ui.mouse, {
1707
1859
  },
1708
1860
 
1709
1861
  _contactContainers: function(event) {
1862
+ var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom, floating, axis,
1863
+ innermostContainer = null,
1864
+ innermostIndex = null;
1710
1865
 
1711
1866
  // get innermost container that intersects with item
1712
- var innermostContainer = null, innermostIndex = null;
1713
-
1714
-
1715
- for (var i = this.containers.length - 1; i >= 0; i--){
1867
+ for (i = this.containers.length - 1; i >= 0; i--) {
1716
1868
 
1717
1869
  // never consider a container that's located within the item itself
1718
- if($.contains(this.currentItem[0], this.containers[i].element[0]))
1870
+ if($.contains(this.currentItem[0], this.containers[i].element[0])) {
1719
1871
  continue;
1872
+ }
1720
1873
 
1721
1874
  if(this._intersectsWith(this.containers[i].containerCache)) {
1722
1875
 
1723
1876
  // if we've already found a container and it's more "inner" than this, then continue
1724
- if(innermostContainer && $.contains(this.containers[i].element[0], innermostContainer.element[0]))
1877
+ if(innermostContainer && $.contains(this.containers[i].element[0], innermostContainer.element[0])) {
1725
1878
  continue;
1879
+ }
1726
1880
 
1727
1881
  innermostContainer = this.containers[i];
1728
1882
  innermostIndex = i;
@@ -1738,42 +1892,64 @@ $.widget("ui.sortable", $.ui.mouse, {
1738
1892
  }
1739
1893
 
1740
1894
  // if no intersecting containers found, return
1741
- if(!innermostContainer) return;
1895
+ if(!innermostContainer) {
1896
+ return;
1897
+ }
1742
1898
 
1743
1899
  // move the item into the container if it's not there already
1744
1900
  if(this.containers.length === 1) {
1745
- this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
1746
- this.containers[innermostIndex].containerCache.over = 1;
1901
+ if (!this.containers[innermostIndex].containerCache.over) {
1902
+ this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
1903
+ this.containers[innermostIndex].containerCache.over = 1;
1904
+ }
1747
1905
  } else {
1748
1906
 
1749
1907
  //When entering a new container, we will find the item with the least distance and append our item near it
1750
- var dist = 10000; var itemWithLeastDistance = null;
1751
- var posProperty = this.containers[innermostIndex].floating ? 'left' : 'top';
1752
- var sizeProperty = this.containers[innermostIndex].floating ? 'width' : 'height';
1753
- var base = this.positionAbs[posProperty] + this.offset.click[posProperty];
1754
- for (var j = this.items.length - 1; j >= 0; j--) {
1755
- if(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue;
1756
- if(this.items[j].item[0] == this.currentItem[0]) continue;
1757
- var cur = this.items[j].item.offset()[posProperty];
1758
- var nearBottom = false;
1759
- if(Math.abs(cur - base) > Math.abs(cur + this.items[j][sizeProperty] - base)){
1908
+ dist = 10000;
1909
+ itemWithLeastDistance = null;
1910
+ floating = innermostContainer.floating || this._isFloating(this.currentItem);
1911
+ posProperty = floating ? "left" : "top";
1912
+ sizeProperty = floating ? "width" : "height";
1913
+ axis = floating ? "clientX" : "clientY";
1914
+
1915
+ for (j = this.items.length - 1; j >= 0; j--) {
1916
+ if(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) {
1917
+ continue;
1918
+ }
1919
+ if(this.items[j].item[0] === this.currentItem[0]) {
1920
+ continue;
1921
+ }
1922
+
1923
+ cur = this.items[j].item.offset()[posProperty];
1924
+ nearBottom = false;
1925
+ if ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) {
1760
1926
  nearBottom = true;
1761
- cur += this.items[j][sizeProperty];
1762
1927
  }
1763
1928
 
1764
- if(Math.abs(cur - base) < dist) {
1765
- dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j];
1929
+ if ( Math.abs( event[ axis ] - cur ) < dist ) {
1930
+ dist = Math.abs( event[ axis ] - cur );
1931
+ itemWithLeastDistance = this.items[ j ];
1766
1932
  this.direction = nearBottom ? "up": "down";
1767
1933
  }
1768
1934
  }
1769
1935
 
1770
- if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled
1936
+ //Check if dropOnEmpty is enabled
1937
+ if(!itemWithLeastDistance && !this.options.dropOnEmpty) {
1938
+ return;
1939
+ }
1940
+
1941
+ if(this.currentContainer === this.containers[innermostIndex]) {
1942
+ if ( !this.currentContainer.containerCache.over ) {
1943
+ this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash() );
1944
+ this.currentContainer.containerCache.over = 1;
1945
+ }
1771
1946
  return;
1947
+ }
1772
1948
 
1773
- this.currentContainer = this.containers[innermostIndex];
1774
1949
  itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);
1775
1950
  this._trigger("change", event, this._uiHash());
1776
1951
  this.containers[innermostIndex]._trigger("change", event, this._uiHash(this));
1952
+ this.currentContainer = this.containers[innermostIndex];
1777
1953
 
1778
1954
  //Update the placeholder
1779
1955
  this.options.placeholder.update(this.currentContainer, this.placeholder);
@@ -1787,39 +1963,46 @@ $.widget("ui.sortable", $.ui.mouse, {
1787
1963
 
1788
1964
  _createHelper: function(event) {
1789
1965
 
1790
- var o = this.options;
1791
- var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper == 'clone' ? this.currentItem.clone() : this.currentItem);
1966
+ var o = this.options,
1967
+ helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper === "clone" ? this.currentItem.clone() : this.currentItem);
1792
1968
 
1793
- if(!helper.parents('body').length) //Add the helper to the DOM if that didn't happen already
1794
- $(o.appendTo != 'parent' ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);
1969
+ //Add the helper to the DOM if that didn't happen already
1970
+ if(!helper.parents("body").length) {
1971
+ $(o.appendTo !== "parent" ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);
1972
+ }
1795
1973
 
1796
- if(helper[0] == this.currentItem[0])
1974
+ if(helper[0] === this.currentItem[0]) {
1797
1975
  this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") };
1976
+ }
1798
1977
 
1799
- if(helper[0].style.width == '' || o.forceHelperSize) helper.width(this.currentItem.width());
1800
- if(helper[0].style.height == '' || o.forceHelperSize) helper.height(this.currentItem.height());
1978
+ if(!helper[0].style.width || o.forceHelperSize) {
1979
+ helper.width(this.currentItem.width());
1980
+ }
1981
+ if(!helper[0].style.height || o.forceHelperSize) {
1982
+ helper.height(this.currentItem.height());
1983
+ }
1801
1984
 
1802
1985
  return helper;
1803
1986
 
1804
1987
  },
1805
1988
 
1806
1989
  _adjustOffsetFromHelper: function(obj) {
1807
- if (typeof obj == 'string') {
1808
- obj = obj.split(' ');
1990
+ if (typeof obj === "string") {
1991
+ obj = obj.split(" ");
1809
1992
  }
1810
1993
  if ($.isArray(obj)) {
1811
1994
  obj = {left: +obj[0], top: +obj[1] || 0};
1812
1995
  }
1813
- if ('left' in obj) {
1996
+ if ("left" in obj) {
1814
1997
  this.offset.click.left = obj.left + this.margins.left;
1815
1998
  }
1816
- if ('right' in obj) {
1999
+ if ("right" in obj) {
1817
2000
  this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
1818
2001
  }
1819
- if ('top' in obj) {
2002
+ if ("top" in obj) {
1820
2003
  this.offset.click.top = obj.top + this.margins.top;
1821
2004
  }
1822
- if ('bottom' in obj) {
2005
+ if ("bottom" in obj) {
1823
2006
  this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
1824
2007
  }
1825
2008
  },
@@ -1835,14 +2018,16 @@ $.widget("ui.sortable", $.ui.mouse, {
1835
2018
  // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
1836
2019
  // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
1837
2020
  // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
1838
- if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
2021
+ if(this.cssPosition === "absolute" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
1839
2022
  po.left += this.scrollParent.scrollLeft();
1840
2023
  po.top += this.scrollParent.scrollTop();
1841
2024
  }
1842
2025
 
1843
- if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
1844
- || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.ui.ie)) //Ugly IE fix
2026
+ // This needs to be actually done for all browsers, since pageX/pageY includes this information
2027
+ // with an ugly IE fix
2028
+ if( this.offsetParent[0] === document.body || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() === "html" && $.ui.ie)) {
1845
2029
  po = { top: 0, left: 0 };
2030
+ }
1846
2031
 
1847
2032
  return {
1848
2033
  top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
@@ -1853,7 +2038,7 @@ $.widget("ui.sortable", $.ui.mouse, {
1853
2038
 
1854
2039
  _getRelativeOffset: function() {
1855
2040
 
1856
- if(this.cssPosition == "relative") {
2041
+ if(this.cssPosition === "relative") {
1857
2042
  var p = this.currentItem.position();
1858
2043
  return {
1859
2044
  top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
@@ -1881,19 +2066,24 @@ $.widget("ui.sortable", $.ui.mouse, {
1881
2066
 
1882
2067
  _setContainment: function() {
1883
2068
 
1884
- var o = this.options;
1885
- if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
1886
- if(o.containment == 'document' || o.containment == 'window') this.containment = [
1887
- 0 - this.offset.relative.left - this.offset.parent.left,
1888
- 0 - this.offset.relative.top - this.offset.parent.top,
1889
- $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
1890
- ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
1891
- ];
2069
+ var ce, co, over,
2070
+ o = this.options;
2071
+ if(o.containment === "parent") {
2072
+ o.containment = this.helper[0].parentNode;
2073
+ }
2074
+ if(o.containment === "document" || o.containment === "window") {
2075
+ this.containment = [
2076
+ 0 - this.offset.relative.left - this.offset.parent.left,
2077
+ 0 - this.offset.relative.top - this.offset.parent.top,
2078
+ $(o.containment === "document" ? document : window).width() - this.helperProportions.width - this.margins.left,
2079
+ ($(o.containment === "document" ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
2080
+ ];
2081
+ }
1892
2082
 
1893
2083
  if(!(/^(document|window|parent)$/).test(o.containment)) {
1894
- var ce = $(o.containment)[0];
1895
- var co = $(o.containment).offset();
1896
- var over = ($(ce).css("overflow") != 'hidden');
2084
+ ce = $(o.containment)[0];
2085
+ co = $(o.containment).offset();
2086
+ over = ($(ce).css("overflow") !== "hidden");
1897
2087
 
1898
2088
  this.containment = [
1899
2089
  co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
@@ -1907,22 +2097,25 @@ $.widget("ui.sortable", $.ui.mouse, {
1907
2097
 
1908
2098
  _convertPositionTo: function(d, pos) {
1909
2099
 
1910
- if(!pos) pos = this.position;
1911
- var mod = d == "absolute" ? 1 : -1;
1912
- var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
2100
+ if(!pos) {
2101
+ pos = this.position;
2102
+ }
2103
+ var mod = d === "absolute" ? 1 : -1,
2104
+ scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent,
2105
+ scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
1913
2106
 
1914
2107
  return {
1915
2108
  top: (
1916
- pos.top // The absolute mouse position
1917
- + this.offset.relative.top * mod // Only for relative positioned nodes: Relative offset from element to offset parent
1918
- + this.offset.parent.top * mod // The offsetParent's offset without borders (offset + border)
1919
- - ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
2109
+ pos.top + // The absolute mouse position
2110
+ this.offset.relative.top * mod + // Only for relative positioned nodes: Relative offset from element to offset parent
2111
+ this.offset.parent.top * mod - // The offsetParent's offset without borders (offset + border)
2112
+ ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
1920
2113
  ),
1921
2114
  left: (
1922
- pos.left // The absolute mouse position
1923
- + this.offset.relative.left * mod // Only for relative positioned nodes: Relative offset from element to offset parent
1924
- + this.offset.parent.left * mod // The offsetParent's offset without borders (offset + border)
1925
- - ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
2115
+ pos.left + // The absolute mouse position
2116
+ this.offset.relative.left * mod + // Only for relative positioned nodes: Relative offset from element to offset parent
2117
+ this.offset.parent.left * mod - // The offsetParent's offset without borders (offset + border)
2118
+ ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
1926
2119
  )
1927
2120
  };
1928
2121
 
@@ -1930,19 +2123,20 @@ $.widget("ui.sortable", $.ui.mouse, {
1930
2123
 
1931
2124
  _generatePosition: function(event) {
1932
2125
 
1933
- var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
2126
+ var top, left,
2127
+ o = this.options,
2128
+ pageX = event.pageX,
2129
+ pageY = event.pageY,
2130
+ scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
1934
2131
 
1935
2132
  // This is another very weird special case that only happens for relative elements:
1936
2133
  // 1. If the css position is relative
1937
2134
  // 2. and the scroll parent is the document or similar to the offset parent
1938
2135
  // we have to refresh the relative offset during the scroll so there are no jumps
1939
- if(this.cssPosition == 'relative' && !(this.scrollParent[0] != document && this.scrollParent[0] != this.offsetParent[0])) {
2136
+ if(this.cssPosition === "relative" && !(this.scrollParent[0] !== document && this.scrollParent[0] !== this.offsetParent[0])) {
1940
2137
  this.offset.relative = this._getRelativeOffset();
1941
2138
  }
1942
2139
 
1943
- var pageX = event.pageX;
1944
- var pageY = event.pageY;
1945
-
1946
2140
  /*
1947
2141
  * - Position constraining -
1948
2142
  * Constrain the position to a mix of grid, containment.
@@ -1951,36 +2145,44 @@ $.widget("ui.sortable", $.ui.mouse, {
1951
2145
  if(this.originalPosition) { //If we are not dragging yet, we won't check for options
1952
2146
 
1953
2147
  if(this.containment) {
1954
- if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left;
1955
- if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top;
1956
- if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left;
1957
- if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top;
2148
+ if(event.pageX - this.offset.click.left < this.containment[0]) {
2149
+ pageX = this.containment[0] + this.offset.click.left;
2150
+ }
2151
+ if(event.pageY - this.offset.click.top < this.containment[1]) {
2152
+ pageY = this.containment[1] + this.offset.click.top;
2153
+ }
2154
+ if(event.pageX - this.offset.click.left > this.containment[2]) {
2155
+ pageX = this.containment[2] + this.offset.click.left;
2156
+ }
2157
+ if(event.pageY - this.offset.click.top > this.containment[3]) {
2158
+ pageY = this.containment[3] + this.offset.click.top;
2159
+ }
1958
2160
  }
1959
2161
 
1960
2162
  if(o.grid) {
1961
- var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
1962
- pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
2163
+ top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
2164
+ pageY = this.containment ? ( (top - this.offset.click.top >= this.containment[1] && top - this.offset.click.top <= this.containment[3]) ? top : ((top - this.offset.click.top >= this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
1963
2165
 
1964
- var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
1965
- pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
2166
+ left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
2167
+ pageX = this.containment ? ( (left - this.offset.click.left >= this.containment[0] && left - this.offset.click.left <= this.containment[2]) ? left : ((left - this.offset.click.left >= this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
1966
2168
  }
1967
2169
 
1968
2170
  }
1969
2171
 
1970
2172
  return {
1971
2173
  top: (
1972
- pageY // The absolute mouse position
1973
- - this.offset.click.top // Click offset (relative to the element)
1974
- - this.offset.relative.top // Only for relative positioned nodes: Relative offset from element to offset parent
1975
- - this.offset.parent.top // The offsetParent's offset without borders (offset + border)
1976
- + ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
2174
+ pageY - // The absolute mouse position
2175
+ this.offset.click.top - // Click offset (relative to the element)
2176
+ this.offset.relative.top - // Only for relative positioned nodes: Relative offset from element to offset parent
2177
+ this.offset.parent.top + // The offsetParent's offset without borders (offset + border)
2178
+ ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
1977
2179
  ),
1978
2180
  left: (
1979
- pageX // The absolute mouse position
1980
- - this.offset.click.left // Click offset (relative to the element)
1981
- - this.offset.relative.left // Only for relative positioned nodes: Relative offset from element to offset parent
1982
- - this.offset.parent.left // The offsetParent's offset without borders (offset + border)
1983
- + ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
2181
+ pageX - // The absolute mouse position
2182
+ this.offset.click.left - // Click offset (relative to the element)
2183
+ this.offset.relative.left - // Only for relative positioned nodes: Relative offset from element to offset parent
2184
+ this.offset.parent.left + // The offsetParent's offset without borders (offset + border)
2185
+ ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
1984
2186
  )
1985
2187
  };
1986
2188
 
@@ -1988,7 +2190,7 @@ $.widget("ui.sortable", $.ui.mouse, {
1988
2190
 
1989
2191
  _rearrange: function(event, i, a, hardRefresh) {
1990
2192
 
1991
- a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction == 'down' ? i.item[0] : i.item[0].nextSibling));
2193
+ a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction === "down" ? i.item[0] : i.item[0].nextSibling));
1992
2194
 
1993
2195
  //Various things done here to improve the performance:
1994
2196
  // 1. we create a setTimeout, that calls refreshPositions
@@ -1999,7 +2201,9 @@ $.widget("ui.sortable", $.ui.mouse, {
1999
2201
  var counter = this.counter;
2000
2202
 
2001
2203
  this._delay(function() {
2002
- if(counter == this.counter) this.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
2204
+ if(counter === this.counter) {
2205
+ this.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
2206
+ }
2003
2207
  });
2004
2208
 
2005
2209
  },
@@ -2009,24 +2213,33 @@ $.widget("ui.sortable", $.ui.mouse, {
2009
2213
  this.reverting = false;
2010
2214
  // We delay all events that have to be triggered to after the point where the placeholder has been removed and
2011
2215
  // everything else normalized again
2012
- var delayedTriggers = [];
2216
+ var i,
2217
+ delayedTriggers = [];
2013
2218
 
2014
2219
  // We first have to update the dom position of the actual currentItem
2015
2220
  // Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
2016
- if(!this._noFinalSort && this.currentItem.parent().length) this.placeholder.before(this.currentItem);
2221
+ if(!this._noFinalSort && this.currentItem.parent().length) {
2222
+ this.placeholder.before(this.currentItem);
2223
+ }
2017
2224
  this._noFinalSort = null;
2018
2225
 
2019
- if(this.helper[0] == this.currentItem[0]) {
2020
- for(var i in this._storedCSS) {
2021
- if(this._storedCSS[i] == 'auto' || this._storedCSS[i] == 'static') this._storedCSS[i] = '';
2226
+ if(this.helper[0] === this.currentItem[0]) {
2227
+ for(i in this._storedCSS) {
2228
+ if(this._storedCSS[i] === "auto" || this._storedCSS[i] === "static") {
2229
+ this._storedCSS[i] = "";
2230
+ }
2022
2231
  }
2023
2232
  this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
2024
2233
  } else {
2025
2234
  this.currentItem.show();
2026
2235
  }
2027
2236
 
2028
- if(this.fromOutside && !noPropagation) delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
2029
- if((this.fromOutside || this.domPosition.prev != this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent != this.currentItem.parent()[0]) && !noPropagation) delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
2237
+ if(this.fromOutside && !noPropagation) {
2238
+ delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
2239
+ }
2240
+ if((this.fromOutside || this.domPosition.prev !== this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent !== this.currentItem.parent()[0]) && !noPropagation) {
2241
+ delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
2242
+ }
2030
2243
 
2031
2244
  // Check if the items Container has Changed and trigger appropriate
2032
2245
  // events.
@@ -2040,45 +2253,58 @@ $.widget("ui.sortable", $.ui.mouse, {
2040
2253
 
2041
2254
 
2042
2255
  //Post events to containers
2043
- for (var i = this.containers.length - 1; i >= 0; i--){
2044
- if(!noPropagation) delayedTriggers.push((function(c) { return function(event) { c._trigger("deactivate", event, this._uiHash(this)); }; }).call(this, this.containers[i]));
2256
+ function delayEvent( type, instance, container ) {
2257
+ return function( event ) {
2258
+ container._trigger( type, event, instance._uiHash( instance ) );
2259
+ };
2260
+ }
2261
+ for (i = this.containers.length - 1; i >= 0; i--){
2262
+ if (!noPropagation) {
2263
+ delayedTriggers.push( delayEvent( "deactivate", this, this.containers[ i ] ) );
2264
+ }
2045
2265
  if(this.containers[i].containerCache.over) {
2046
- delayedTriggers.push((function(c) { return function(event) { c._trigger("out", event, this._uiHash(this)); }; }).call(this, this.containers[i]));
2266
+ delayedTriggers.push( delayEvent( "out", this, this.containers[ i ] ) );
2047
2267
  this.containers[i].containerCache.over = 0;
2048
2268
  }
2049
2269
  }
2050
2270
 
2051
2271
  //Do what was originally in plugins
2052
- if(this._storedCursor) $('body').css("cursor", this._storedCursor); //Reset cursor
2053
- if(this._storedOpacity) this.helper.css("opacity", this._storedOpacity); //Reset opacity
2054
- if(this._storedZIndex) this.helper.css("zIndex", this._storedZIndex == 'auto' ? '' : this._storedZIndex); //Reset z-index
2272
+ if ( this.storedCursor ) {
2273
+ this.document.find( "body" ).css( "cursor", this.storedCursor );
2274
+ this.storedStylesheet.remove();
2275
+ }
2276
+ if(this._storedOpacity) {
2277
+ this.helper.css("opacity", this._storedOpacity);
2278
+ }
2279
+ if(this._storedZIndex) {
2280
+ this.helper.css("zIndex", this._storedZIndex === "auto" ? "" : this._storedZIndex);
2281
+ }
2055
2282
 
2056
2283
  this.dragging = false;
2057
- if(this.cancelHelperRemoval) {
2058
- if(!noPropagation) {
2059
- this._trigger("beforeStop", event, this._uiHash());
2060
- for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
2061
- this._trigger("stop", event, this._uiHash());
2062
- }
2063
2284
 
2064
- this.fromOutside = false;
2065
- return false;
2285
+ if(!noPropagation) {
2286
+ this._trigger("beforeStop", event, this._uiHash());
2066
2287
  }
2067
2288
 
2068
- if(!noPropagation) this._trigger("beforeStop", event, this._uiHash());
2069
-
2070
2289
  //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
2071
2290
  this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
2072
2291
 
2073
- if(this.helper[0] != this.currentItem[0]) this.helper.remove(); this.helper = null;
2292
+ if ( !this.cancelHelperRemoval ) {
2293
+ if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {
2294
+ this.helper.remove();
2295
+ }
2296
+ this.helper = null;
2297
+ }
2074
2298
 
2075
2299
  if(!noPropagation) {
2076
- for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
2300
+ for (i=0; i < delayedTriggers.length; i++) {
2301
+ delayedTriggers[i].call(this, event);
2302
+ } //Trigger all delayed events
2077
2303
  this._trigger("stop", event, this._uiHash());
2078
2304
  }
2079
2305
 
2080
2306
  this.fromOutside = false;
2081
- return true;
2307
+ return !this.cancelHelperRemoval;
2082
2308
 
2083
2309
  },
2084
2310
 
@@ -2103,4 +2329,6 @@ $.widget("ui.sortable", $.ui.mouse, {
2103
2329
 
2104
2330
  });
2105
2331
 
2106
- })(jQuery);
2332
+
2333
+
2334
+ }));