kiteditor 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (229) hide show
  1. data/LICENSE +25 -0
  2. data/app/controllers/mercury/images_controller.rb +5 -0
  3. data/app/controllers/mercury_controller.rb +34 -0
  4. data/app/models/mercury/image.rb +17 -0
  5. data/app/views/layouts/mercury.html.erb +33 -0
  6. data/app/views/layouts/popup.html.haml +9 -0
  7. data/app/views/mercury/images/_list.html.haml +22 -0
  8. data/app/views/mercury/images/index.html.haml +4 -0
  9. data/app/views/mercury/images/index.js.erb +2 -0
  10. data/app/views/mercury/lightviews/about.html +11 -0
  11. data/app/views/mercury/modals/character.html +255 -0
  12. data/app/views/mercury/modals/htmleditor.html +13 -0
  13. data/app/views/mercury/modals/link.html +94 -0
  14. data/app/views/mercury/modals/media.html +1 -0
  15. data/app/views/mercury/modals/table.html +84 -0
  16. data/app/views/mercury/palettes/backcolor.html +73 -0
  17. data/app/views/mercury/palettes/forecolor.html +73 -0
  18. data/app/views/mercury/panels/history.html +3 -0
  19. data/app/views/mercury/panels/notes.html +3 -0
  20. data/app/views/mercury/panels/snippets.html +12 -0
  21. data/app/views/mercury/selects/formatblock.html +11 -0
  22. data/app/views/mercury/selects/style.html +5 -0
  23. data/app/views/mercury/snippets/example/options.html.erb +34 -0
  24. data/app/views/mercury/snippets/example/preview.html.erb +1 -0
  25. data/config/engine.rb +44 -0
  26. data/db/migrate/20110526035601_create_mercury_images.rb +11 -0
  27. data/features/loading/loading.feature +22 -0
  28. data/features/loading/navigating.feature +77 -0
  29. data/features/loading/user_interface.feature +67 -0
  30. data/features/regions/editable/advanced_editing.feature +0 -0
  31. data/features/regions/editable/basic_editing.feature +195 -0
  32. data/features/regions/editable/inserting_links.feature +98 -0
  33. data/features/regions/editable/inserting_media.feature +110 -0
  34. data/features/regions/editable/inserting_snippets.feature +102 -0
  35. data/features/regions/editable/inserting_special_characters.feature +24 -0
  36. data/features/regions/editable/inserting_tables.feature +109 -0
  37. data/features/regions/editable/pasting.feature +0 -0
  38. data/features/regions/editable/uploading_images.feature +0 -0
  39. data/features/regions/markupable/advanced_editing.feature +0 -0
  40. data/features/regions/markupable/basic_editing.feature +0 -0
  41. data/features/regions/markupable/inserting_links.feature +0 -0
  42. data/features/regions/markupable/inserting_media.feature +0 -0
  43. data/features/regions/markupable/inserting_snippets.feature +0 -0
  44. data/features/regions/markupable/inserting_special_characters.feature +0 -0
  45. data/features/regions/markupable/inserting_tables.feature +0 -0
  46. data/features/regions/markupable/uploading_images.feature +0 -0
  47. data/features/regions/snippetable/advanced_editing.feature +0 -0
  48. data/features/regions/snippetable/basic_editing.feature +0 -0
  49. data/features/regions/snippetable/inserting_snippets.feature +0 -0
  50. data/features/saving/saving.feature +33 -0
  51. data/features/step_definitions/debug_steps.rb +14 -0
  52. data/features/step_definitions/mercury_steps.rb +438 -0
  53. data/features/step_definitions/web_steps.rb +211 -0
  54. data/features/support/env.rb +46 -0
  55. data/features/support/mercury_contents.rb +25 -0
  56. data/features/support/mercury_selectors.rb +148 -0
  57. data/features/support/paths.rb +38 -0
  58. data/features/support/selectors.rb +44 -0
  59. data/lib/generators/mercury/install/install_generator.rb +49 -0
  60. data/lib/generators/mercury/install/templates/mongoid_paperclip_image.rb +17 -0
  61. data/lib/mercury/authentication.rb +8 -0
  62. data/lib/mercury-rails.rb +3 -0
  63. data/spec/javascripts/mercury/dialog_spec.js.coffee +281 -0
  64. data/spec/javascripts/mercury/dialogs/backcolor_spec.js.coffee +37 -0
  65. data/spec/javascripts/mercury/dialogs/forecolor_spec.js.coffee +37 -0
  66. data/spec/javascripts/mercury/dialogs/formatblock_spec.js.coffee +25 -0
  67. data/spec/javascripts/mercury/dialogs/snippetpanel_spec.js.coffee +30 -0
  68. data/spec/javascripts/mercury/dialogs/style_spec.js.coffee +25 -0
  69. data/spec/javascripts/mercury/history_buffer_spec.js.coffee +76 -0
  70. data/spec/javascripts/mercury/lightview_spec.js.coffee +497 -0
  71. data/spec/javascripts/mercury/mercury_spec.js.coffee +132 -0
  72. data/spec/javascripts/mercury/modal_spec.js.coffee +504 -0
  73. data/spec/javascripts/mercury/modals/htmleditor_spec.js.coffee +30 -0
  74. data/spec/javascripts/mercury/modals/insertcharacter_spec.js.coffee +29 -0
  75. data/spec/javascripts/mercury/modals/insertlink_spec.js.coffee +220 -0
  76. data/spec/javascripts/mercury/modals/insertmedia_spec.js.coffee +167 -0
  77. data/spec/javascripts/mercury/modals/insertsnippet_spec.js.coffee +52 -0
  78. data/spec/javascripts/mercury/modals/inserttable_spec.js.coffee +160 -0
  79. data/spec/javascripts/mercury/native_extensions_spec.js.coffee +60 -0
  80. data/spec/javascripts/mercury/page_editor_spec.js.coffee +750 -0
  81. data/spec/javascripts/mercury/palette_spec.js.coffee +49 -0
  82. data/spec/javascripts/mercury/panel_spec.js.coffee +185 -0
  83. data/spec/javascripts/mercury/region_spec.js.coffee +298 -0
  84. data/spec/javascripts/mercury/regions/editable_spec.js.coffee +561 -0
  85. data/spec/javascripts/mercury/regions/markupable_spec.js.coffee +367 -0
  86. data/spec/javascripts/mercury/regions/snippetable_spec.js.coffee +370 -0
  87. data/spec/javascripts/mercury/select_spec.js.coffee +49 -0
  88. data/spec/javascripts/mercury/snippet_spec.js.coffee +245 -0
  89. data/spec/javascripts/mercury/snippet_toolbar_spec.js.coffee +184 -0
  90. data/spec/javascripts/mercury/statusbar_spec.js.coffee +150 -0
  91. data/spec/javascripts/mercury/table_editor_spec.js.coffee +194 -0
  92. data/spec/javascripts/mercury/toolbar.button_group_spec.js.coffee +90 -0
  93. data/spec/javascripts/mercury/toolbar.button_spec.js.coffee +360 -0
  94. data/spec/javascripts/mercury/toolbar.expander_spec.js.coffee +118 -0
  95. data/spec/javascripts/mercury/toolbar_spec.js.coffee +222 -0
  96. data/spec/javascripts/mercury/tooltip_spec.js.coffee +186 -0
  97. data/spec/javascripts/mercury/uploader_spec.js.coffee +514 -0
  98. data/spec/javascripts/spec_helper.js +513 -0
  99. data/spec/javascripts/templates/mercury/dialog.html +2 -0
  100. data/spec/javascripts/templates/mercury/dialogs/backcolor.html +5 -0
  101. data/spec/javascripts/templates/mercury/dialogs/forecolor.html +5 -0
  102. data/spec/javascripts/templates/mercury/dialogs/formatblock.html +3 -0
  103. data/spec/javascripts/templates/mercury/dialogs/snippetpanel.html +16 -0
  104. data/spec/javascripts/templates/mercury/dialogs/style.html +3 -0
  105. data/spec/javascripts/templates/mercury/lightview.html +13 -0
  106. data/spec/javascripts/templates/mercury/modal.html +13 -0
  107. data/spec/javascripts/templates/mercury/modals/htmleditor.html +5 -0
  108. data/spec/javascripts/templates/mercury/modals/insertcharacter.html +5 -0
  109. data/spec/javascripts/templates/mercury/modals/insertlink.html +30 -0
  110. data/spec/javascripts/templates/mercury/modals/insertmedia.html +35 -0
  111. data/spec/javascripts/templates/mercury/modals/insertsnippet.html +6 -0
  112. data/spec/javascripts/templates/mercury/modals/inserttable.html +27 -0
  113. data/spec/javascripts/templates/mercury/page_editor.html +35 -0
  114. data/spec/javascripts/templates/mercury/palette.html +16 -0
  115. data/spec/javascripts/templates/mercury/panel.html +16 -0
  116. data/spec/javascripts/templates/mercury/region.html +2 -0
  117. data/spec/javascripts/templates/mercury/regions/editable.html +3 -0
  118. data/spec/javascripts/templates/mercury/regions/snippetable.html +4 -0
  119. data/spec/javascripts/templates/mercury/select.html +16 -0
  120. data/spec/javascripts/templates/mercury/snippet.html +1 -0
  121. data/spec/javascripts/templates/mercury/snippet_toolbar.html +16 -0
  122. data/spec/javascripts/templates/mercury/statusbar.html +8 -0
  123. data/spec/javascripts/templates/mercury/table_editor.html +65 -0
  124. data/spec/javascripts/templates/mercury/toolbar.button.html +64 -0
  125. data/spec/javascripts/templates/mercury/toolbar.button_group.html +9 -0
  126. data/spec/javascripts/templates/mercury/toolbar.expander.html +18 -0
  127. data/spec/javascripts/templates/mercury/toolbar.html +11 -0
  128. data/spec/javascripts/templates/mercury/tooltip.html +12 -0
  129. data/spec/javascripts/templates/mercury/uploader.html +11 -0
  130. data/vendor/assets/images/mercury/button.png +0 -0
  131. data/vendor/assets/images/mercury/close.png +0 -0
  132. data/vendor/assets/images/mercury/default-snippet.png +0 -0
  133. data/vendor/assets/images/mercury/loading-dark.gif +0 -0
  134. data/vendor/assets/images/mercury/loading-light.gif +0 -0
  135. data/vendor/assets/images/mercury/missing-image.png +0 -0
  136. data/vendor/assets/images/mercury/search-icon.png +0 -0
  137. data/vendor/assets/images/mercury/temp-logo.png +0 -0
  138. data/vendor/assets/images/mercury/toolbar/editable/buttons.png +0 -0
  139. data/vendor/assets/images/mercury/toolbar/primary/_expander.png +0 -0
  140. data/vendor/assets/images/mercury/toolbar/primary/_pressed.png +0 -0
  141. data/vendor/assets/images/mercury/toolbar/primary/historypanel.png +0 -0
  142. data/vendor/assets/images/mercury/toolbar/primary/insertcharacter.png +0 -0
  143. data/vendor/assets/images/mercury/toolbar/primary/insertlink.png +0 -0
  144. data/vendor/assets/images/mercury/toolbar/primary/insertmedia.png +0 -0
  145. data/vendor/assets/images/mercury/toolbar/primary/inserttable.png +0 -0
  146. data/vendor/assets/images/mercury/toolbar/primary/inspectorpanel.png +0 -0
  147. data/vendor/assets/images/mercury/toolbar/primary/notespanel.png +0 -0
  148. data/vendor/assets/images/mercury/toolbar/primary/preview.png +0 -0
  149. data/vendor/assets/images/mercury/toolbar/primary/redo.png +0 -0
  150. data/vendor/assets/images/mercury/toolbar/primary/save.png +0 -0
  151. data/vendor/assets/images/mercury/toolbar/primary/snippetpanel.png +0 -0
  152. data/vendor/assets/images/mercury/toolbar/primary/undo.png +0 -0
  153. data/vendor/assets/images/mercury/toolbar/snippetable/buttons.png +0 -0
  154. data/vendor/assets/javascripts/mercury/dependencies/jquery-1.7.js +9300 -0
  155. data/vendor/assets/javascripts/mercury/dependencies/jquery-ui-1.8.13.custom.js +1328 -0
  156. data/vendor/assets/javascripts/mercury/dependencies/jquery-ui-1.8.18.custom.min.js +356 -0
  157. data/vendor/assets/javascripts/mercury/dependencies/jquery-ui.1.8.13.custom.min.js +356 -0
  158. data/vendor/assets/javascripts/mercury/dependencies/jquery.additions.js +206 -0
  159. data/vendor/assets/javascripts/mercury/dependencies/jquery.htmlClean.js +527 -0
  160. data/vendor/assets/javascripts/mercury/dependencies/liquidmetal.js +88 -0
  161. data/vendor/assets/javascripts/mercury/dependencies/showdown.js +1340 -0
  162. data/vendor/assets/javascripts/mercury/dialog.js.coffee +159 -0
  163. data/vendor/assets/javascripts/mercury/dialogs/backcolor.js.coffee +6 -0
  164. data/vendor/assets/javascripts/mercury/dialogs/forecolor.js.coffee +6 -0
  165. data/vendor/assets/javascripts/mercury/dialogs/formatblock.js.coffee +4 -0
  166. data/vendor/assets/javascripts/mercury/dialogs/snippetpanel.js.coffee +10 -0
  167. data/vendor/assets/javascripts/mercury/dialogs/style.js.coffee +4 -0
  168. data/vendor/assets/javascripts/mercury/finalize.js.coffee +3 -0
  169. data/vendor/assets/javascripts/mercury/history_buffer.js.coffee +30 -0
  170. data/vendor/assets/javascripts/mercury/lightview.js.coffee +205 -0
  171. data/vendor/assets/javascripts/mercury/locales/da.locale.js.coffee +0 -0
  172. data/vendor/assets/javascripts/mercury/locales/de.locale.js.coffee +206 -0
  173. data/vendor/assets/javascripts/mercury/locales/es.locale.js.coffee +211 -0
  174. data/vendor/assets/javascripts/mercury/locales/example.local.js.coffee +211 -0
  175. data/vendor/assets/javascripts/mercury/locales/fr.locale.js.coffee +211 -0
  176. data/vendor/assets/javascripts/mercury/locales/it.locale.js.coffee +208 -0
  177. data/vendor/assets/javascripts/mercury/locales/ko.local.js.coffee +206 -0
  178. data/vendor/assets/javascripts/mercury/locales/nl.locale.js.coffee +206 -0
  179. data/vendor/assets/javascripts/mercury/locales/pt.locale.js.coffee +211 -0
  180. data/vendor/assets/javascripts/mercury/locales/sv.local.js.coffee +209 -0
  181. data/vendor/assets/javascripts/mercury/locales/swedish_chef.locale.js.coffee +213 -0
  182. data/vendor/assets/javascripts/mercury/mercury.js.coffee +109 -0
  183. data/vendor/assets/javascripts/mercury/modal.js.coffee +204 -0
  184. data/vendor/assets/javascripts/mercury/modals/htmleditor.js.coffee +11 -0
  185. data/vendor/assets/javascripts/mercury/modals/insertcharacter.js.coffee +4 -0
  186. data/vendor/assets/javascripts/mercury/modals/insertlink.js.coffee +95 -0
  187. data/vendor/assets/javascripts/mercury/modals/insertmedia.js.coffee +107 -0
  188. data/vendor/assets/javascripts/mercury/modals/insertsnippet.js.coffee +12 -0
  189. data/vendor/assets/javascripts/mercury/modals/inserttable.js.coffee +54 -0
  190. data/vendor/assets/javascripts/mercury/native_extensions.js.coffee +55 -0
  191. data/vendor/assets/javascripts/mercury/page_editor.js.coffee +241 -0
  192. data/vendor/assets/javascripts/mercury/palette.js.coffee +29 -0
  193. data/vendor/assets/javascripts/mercury/panel.js.coffee +115 -0
  194. data/vendor/assets/javascripts/mercury/plugins/save_as_xml/mercury/page_editor.js.coffee +28 -0
  195. data/vendor/assets/javascripts/mercury/plugins/save_as_xml/plugin.js +9 -0
  196. data/vendor/assets/javascripts/mercury/region.js.coffee +107 -0
  197. data/vendor/assets/javascripts/mercury/regions/editable.js.coffee +600 -0
  198. data/vendor/assets/javascripts/mercury/regions/markupable.js.coffee +398 -0
  199. data/vendor/assets/javascripts/mercury/regions/simple.js.coffee +339 -0
  200. data/vendor/assets/javascripts/mercury/regions/snippetable.js.coffee +124 -0
  201. data/vendor/assets/javascripts/mercury/select.js.coffee +44 -0
  202. data/vendor/assets/javascripts/mercury/snippet.js.coffee +104 -0
  203. data/vendor/assets/javascripts/mercury/snippet_toolbar.js.coffee +72 -0
  204. data/vendor/assets/javascripts/mercury/statusbar.js.coffee +51 -0
  205. data/vendor/assets/javascripts/mercury/support/history.js +1 -0
  206. data/vendor/assets/javascripts/mercury/table_editor.js.coffee +265 -0
  207. data/vendor/assets/javascripts/mercury/toolbar.button.js.coffee +173 -0
  208. data/vendor/assets/javascripts/mercury/toolbar.button_group.js.coffee +42 -0
  209. data/vendor/assets/javascripts/mercury/toolbar.expander.js.coffee +56 -0
  210. data/vendor/assets/javascripts/mercury/toolbar.js.coffee +86 -0
  211. data/vendor/assets/javascripts/mercury/tooltip.js.coffee +74 -0
  212. data/vendor/assets/javascripts/mercury/uploader.js.coffee +227 -0
  213. data/vendor/assets/javascripts/mercury.js +479 -0
  214. data/vendor/assets/javascripts/mercury_loader.js +193 -0
  215. data/vendor/assets/javascripts/mercury_overrides.js +6 -0
  216. data/vendor/assets/javascripts/popup.js +8 -0
  217. data/vendor/assets/stylesheets/mercury/all_images.css.erb +89 -0
  218. data/vendor/assets/stylesheets/mercury/dialog.css +208 -0
  219. data/vendor/assets/stylesheets/mercury/lightview.css +151 -0
  220. data/vendor/assets/stylesheets/mercury/mercury.css +151 -0
  221. data/vendor/assets/stylesheets/mercury/modal.css +183 -0
  222. data/vendor/assets/stylesheets/mercury/statusbar.css +32 -0
  223. data/vendor/assets/stylesheets/mercury/toolbar.css +304 -0
  224. data/vendor/assets/stylesheets/mercury/tooltip.css +26 -0
  225. data/vendor/assets/stylesheets/mercury/uploader.css +111 -0
  226. data/vendor/assets/stylesheets/mercury.css +28 -0
  227. data/vendor/assets/stylesheets/mercury_overrides.css +17 -0
  228. data/vendor/assets/stylesheets/popup.css.erb +37 -0
  229. metadata +634 -0
@@ -0,0 +1,1328 @@
1
+ /*!
2
+ * jQuery UI 1.8.13
3
+ *
4
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
5
+ * Dual licensed under the MIT or GPL Version 2 licenses.
6
+ * http://jquery.org/license
7
+ *
8
+ * http://docs.jquery.com/UI
9
+ */
10
+ (function(c,j){function k(a,b){var d=a.nodeName.toLowerCase();if("area"===d){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&l(a)}return(/input|select|textarea|button|object/.test(d)?!a.disabled:"a"==d?a.href||b:b)&&l(a)}function l(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.13",
11
+ keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();
12
+ b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,
13
+ "overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",
14
+ function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,m,n){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(m)g-=parseFloat(c.curCSS(f,"border"+this+"Width",true))||0;if(n)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,outerWidth:c.fn.outerWidth,
15
+ outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c(this).css(h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c(this).css(h,d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){return k(a,!isNaN(c.attr(a,"tabindex")))},tabbable:function(a){var b=c.attr(a,"tabindex"),d=isNaN(b);
16
+ return(d||b>=0)&&k(a,!d)}});c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=
17
+ 0;e<b.length;e++)a.options[b[e][0]]&&b[e][1].apply(a.element,d)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")==="hidden")return false;b=b&&b==="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,h,i){return c.ui.isOverAxis(a,d,h)&&c.ui.isOverAxis(b,e,i)}})}})(jQuery);
18
+ ;/*!
19
+ * jQuery UI Widget 1.8.13
20
+ *
21
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
22
+ * Dual licensed under the MIT or GPL Version 2 licenses.
23
+ * http://jquery.org/license
24
+ *
25
+ * http://docs.jquery.com/UI/Widget
26
+ */
27
+ (function(b,j){if(b.cleanData){var k=b.cleanData;b.cleanData=function(a){for(var c=0,d;(d=a[c])!=null;c++)b(d).triggerHandler("remove");k(a)}}else{var l=b.fn.remove;b.fn.remove=function(a,c){return this.each(function(){if(!c)if(!a||b.filter(a,[this]).length)b("*",this).add([this]).each(function(){b(this).triggerHandler("remove")});return l.call(b(this),a,c)})}}b.widget=function(a,c,d){var e=a.split(".")[0],f;a=a.split(".")[1];f=e+"-"+a;if(!d){d=c;c=b.Widget}b.expr[":"][f]=function(h){return!!b.data(h,
28
+ a)};b[e]=b[e]||{};b[e][a]=function(h,g){arguments.length&&this._createWidget(h,g)};c=new c;c.options=b.extend(true,{},c.options);b[e][a].prototype=b.extend(true,c,{namespace:e,widgetName:a,widgetEventPrefix:b[e][a].prototype.widgetEventPrefix||a,widgetBaseClass:f},d);b.widget.bridge(a,b[e][a])};b.widget.bridge=function(a,c){b.fn[a]=function(d){var e=typeof d==="string",f=Array.prototype.slice.call(arguments,1),h=this;d=!e&&f.length?b.extend.apply(null,[true,d].concat(f)):d;if(e&&d.charAt(0)==="_")return h;
29
+ e?this.each(function(){var g=b.data(this,a),i=g&&b.isFunction(g[d])?g[d].apply(g,f):g;if(i!==g&&i!==j){h=i;return false}}):this.each(function(){var g=b.data(this,a);g?g.option(d||{})._init():b.data(this,a,new c(d,this))});return h}};b.Widget=function(a,c){arguments.length&&this._createWidget(a,c)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(a,c){b.data(c,this.widgetName,this);this.element=b(c);this.options=b.extend(true,{},this.options,
30
+ this._getCreateOptions(),a);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},
31
+ widget:function(){return this.element},option:function(a,c){var d=a;if(arguments.length===0)return b.extend({},this.options);if(typeof a==="string"){if(c===j)return this.options[a];d={};d[a]=c}this._setOptions(d);return this},_setOptions:function(a){var c=this;b.each(a,function(d,e){c._setOption(d,e)});return this},_setOption:function(a,c){this.options[a]=c;if(a==="disabled")this.widget()[c?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",c);return this},
32
+ enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(a,c,d){var e=this.options[a];c=b.Event(c);c.type=(a===this.widgetEventPrefix?a:this.widgetEventPrefix+a).toLowerCase();d=d||{};if(c.originalEvent){a=b.event.props.length;for(var f;a;){f=b.event.props[--a];c[f]=c.originalEvent[f]}}this.element.trigger(c,d);return!(b.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery);
33
+ ;
34
+
35
+ /*!
36
+ * jQuery UI Mouse 1.8.13
37
+ *
38
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
39
+ * Dual licensed under the MIT or GPL Version 2 licenses.
40
+ * http://jquery.org/license
41
+ *
42
+ * http://docs.jquery.com/UI/Mouse
43
+ *
44
+ * Depends:
45
+ * jquery.ui.widget.js
46
+ */
47
+ (function( $, undefined ) {
48
+
49
+ var mouseHandled = false;
50
+ $(document).mousedown(function(e) {
51
+ mouseHandled = false;
52
+ });
53
+
54
+ $.widget("ui.mouse", {
55
+ options: {
56
+ cancel: ':input,option',
57
+ distance: 1,
58
+ delay: 0
59
+ },
60
+ _mouseInit: function() {
61
+ var self = this;
62
+
63
+ this.element
64
+ .bind('mousedown.'+this.widgetName, function(event) {
65
+ return self._mouseDown(event);
66
+ })
67
+ .bind('click.'+this.widgetName, function(event) {
68
+ if (true === $.data(event.target, self.widgetName + '.preventClickEvent')) {
69
+ $.removeData(event.target, self.widgetName + '.preventClickEvent');
70
+ event.stopImmediatePropagation();
71
+ return false;
72
+ }
73
+ });
74
+
75
+ this.started = false;
76
+ },
77
+
78
+ // TODO: make sure destroying one instance of mouse doesn't mess with
79
+ // other instances of mouse
80
+ _mouseDestroy: function() {
81
+ this.element.unbind('.'+this.widgetName);
82
+ },
83
+
84
+ _mouseDown: function(event) {
85
+ // don't let more than one widget handle mouseStart
86
+ $(this.document || document).mousedown(function(e) {
87
+ mouseHandled = false;
88
+ });
89
+ if(mouseHandled) {return};
90
+
91
+ // we may have missed mouseup (out of window)
92
+ (this._mouseStarted && this._mouseUp(event));
93
+
94
+ this._mouseDownEvent = event;
95
+
96
+ var self = this,
97
+ btnIsLeft = (event.which == 1),
98
+ elIsCancel = (typeof this.options.cancel == "string" ? $(event.target).parents().add(event.target).filter(this.options.cancel).length : false);
99
+ if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
100
+ return true;
101
+ }
102
+
103
+ this.mouseDelayMet = !this.options.delay;
104
+ if (!this.mouseDelayMet) {
105
+ this._mouseDelayTimer = setTimeout(function() {
106
+ self.mouseDelayMet = true;
107
+ }, this.options.delay);
108
+ }
109
+
110
+ if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
111
+ this._mouseStarted = (this._mouseStart(event) !== false);
112
+ if (!this._mouseStarted) {
113
+ event.preventDefault();
114
+ return true;
115
+ }
116
+ }
117
+
118
+ // Click event may never have fired (Gecko & Opera)
119
+ if (true === $.data(event.target, this.widgetName + '.preventClickEvent')) {
120
+ $.removeData(event.target, this.widgetName + '.preventClickEvent');
121
+ }
122
+
123
+ // these delegates are required to keep context
124
+ this._mouseMoveDelegate = function(event) {
125
+ return self._mouseMove(event);
126
+ };
127
+ this._mouseUpDelegate = function(event) {
128
+ return self._mouseUp(event);
129
+ };
130
+ $(this.document || document)
131
+ .bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
132
+ .bind('mouseup.'+this.widgetName, this._mouseUpDelegate);
133
+
134
+ event.preventDefault();
135
+
136
+ mouseHandled = true;
137
+ return true;
138
+ },
139
+
140
+ _mouseMove: function(event) {
141
+ // IE mouseup check - mouseup happened when mouse was out of window
142
+ if ($.browser.msie && !((this.document || document).documentMode >= 9) && !event.button) {
143
+ return this._mouseUp(event);
144
+ }
145
+
146
+ if (this._mouseStarted) {
147
+ this._mouseDrag(event);
148
+ return event.preventDefault();
149
+ }
150
+
151
+ if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
152
+ this._mouseStarted =
153
+ (this._mouseStart(this._mouseDownEvent, event) !== false);
154
+ (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
155
+ }
156
+
157
+ return !this._mouseStarted;
158
+ },
159
+
160
+ _mouseUp: function(event) {
161
+ $(this.document || document)
162
+ .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
163
+ .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
164
+
165
+ if (this._mouseStarted) {
166
+ this._mouseStarted = false;
167
+
168
+ if (event.target == this._mouseDownEvent.target) {
169
+ $.data(event.target, this.widgetName + '.preventClickEvent', true);
170
+ }
171
+
172
+ this._mouseStop(event);
173
+ }
174
+
175
+ return false;
176
+ },
177
+
178
+ _mouseDistanceMet: function(event) {
179
+ return (Math.max(
180
+ Math.abs(this._mouseDownEvent.pageX - event.pageX),
181
+ Math.abs(this._mouseDownEvent.pageY - event.pageY)
182
+ ) >= this.options.distance
183
+ );
184
+ },
185
+
186
+ _mouseDelayMet: function(event) {
187
+ return this.mouseDelayMet;
188
+ },
189
+
190
+ // These are placeholder methods, to be overriden by extending plugin
191
+ _mouseStart: function(event) {},
192
+ _mouseDrag: function(event) {},
193
+ _mouseStop: function(event) {},
194
+ _mouseCapture: function(event) { return true; }
195
+ });
196
+
197
+ })(jQuery);
198
+
199
+ /*
200
+ * jQuery UI Draggable 1.8.13
201
+ *
202
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
203
+ * Dual licensed under the MIT or GPL Version 2 licenses.
204
+ * http://jquery.org/license
205
+ *
206
+ * http://docs.jquery.com/UI/Draggables
207
+ *
208
+ * Depends:
209
+ * jquery.ui.core.js
210
+ * jquery.ui.mouse.js
211
+ * jquery.ui.widget.js
212
+ */
213
+ (function(d){d.widget("ui.draggable",d.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function(){if(this.options.helper==
214
+ "original"&&!/^(?:r|a|f)/.test(this.element.css("position")))this.element[0].style.position="relative";this.options.addClasses&&this.element.addClass("ui-draggable");this.options.disabled&&this.element.addClass("ui-draggable-disabled");this._mouseInit()},destroy:function(){if(this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this}},_mouseCapture:function(a){var b=
215
+ this.options;if(this.helper||b.disabled||d(a.target).is(".ui-resizable-handle"))return false;this.handle=this._getHandle(a);if(!this.handle)return false;d(b.iframeFix===true?"iframe":b.iframeFix).each(function(){d('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(d(this).offset()).appendTo("body")});return true},_mouseStart:function(a){var b=this.options;this.helper=
216
+ this._createHelper(a);this._cacheHelperProportions();if(d.ui.ddmanager)d.ui.ddmanager.current=this;this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});
217
+ this.originalPosition=this.position=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);b.containment&&this._setContainment();if(this._trigger("start",a)===false){this._clear();return false}this._cacheHelperProportions();d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(a,true);return true},_mouseDrag:function(a,b){this.position=this._generatePosition(a);
218
+ this.positionAbs=this._convertPositionTo("absolute");if(!b){b=this._uiHash();if(this._trigger("drag",a,b)===false){this._mouseUp({});return false}this.position=b.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);return false},_mouseStop:function(a){var b=false;if(d.ui.ddmanager&&!this.options.dropBehaviour)b=
219
+ d.ui.ddmanager.drop(this,a);if(this.dropped){b=this.dropped;this.dropped=false}if((!this.element[0]||!this.element[0].parentNode)&&this.options.helper=="original")return false;if(this.options.revert=="invalid"&&!b||this.options.revert=="valid"&&b||this.options.revert===true||d.isFunction(this.options.revert)&&this.options.revert.call(this.element,b)){var c=this;d(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){c._trigger("stop",a)!==false&&c._clear()})}else this._trigger("stop",
220
+ a)!==false&&this._clear();return false},_mouseUp:function(a){this.options.iframeFix===true&&d("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)});return d.ui.mouse.prototype._mouseUp.call(this,a)},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(a){var b=!this.options.handle||!d(this.options.handle,this.element).length?true:false;d(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==
221
+ a.target)b=true});return b},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a])):b.helper=="clone"?this.element.clone().removeAttr("id"):this.element;a.parents("body").length||a.appendTo(b.appendTo=="parent"?this.element[0].parentNode:b.appendTo);a[0]!=this.element[0]&&!/(fixed|absolute)/.test(a.css("position"))&&a.css("position","absolute");return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a=
222
+ {left:+a[0],top:+a[1]||0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&
223
+ d.ui.contains(this.scrollParent[0],this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=
224
+ this.element.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions=
225
+ {width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment=="parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[(a.containment=="document"?0:d(window).scrollLeft())-this.offset.relative.left-this.offset.parent.left,(a.containment=="document"?0:d(window).scrollTop())-this.offset.relative.top-this.offset.parent.top,(a.containment=="document"?0:d(window).scrollLeft())+
226
+ d(a.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a.containment=="document"?0:d(window).scrollTop())+(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)&&a.containment.constructor!=Array){a=d(a.containment);var b=a[0];if(b){a.offset();var c=d(b).css("overflow")!="hidden";this.containment=[(parseInt(d(b).css("borderLeftWidth"),
227
+ 10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0),(parseInt(d(b).css("borderTopWidth"),10)||0)+(parseInt(d(b).css("paddingTop"),10)||0),(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-
228
+ this.margins.top-this.margins.bottom];this.relative_container=a}}else if(a.containment.constructor==Array)this.containment=a.containment},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName);return{top:b.top+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&
229
+ d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],
230
+ this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName),e=a.pageX,h=a.pageY;if(this.originalPosition){var g;if(this.containment){if(this.relative_container){g=this.relative_container.offset();g=[this.containment[0]+g.left,this.containment[1]+g.top,this.containment[2]+g.left,this.containment[3]+g.top]}else g=this.containment;if(a.pageX-this.offset.click.left<g[0])e=g[0]+this.offset.click.left;if(a.pageY-this.offset.click.top<g[1])h=g[1]+this.offset.click.top;
231
+ if(a.pageX-this.offset.click.left>g[2])e=g[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>g[3])h=g[3]+this.offset.click.top}if(b.grid){h=this.originalPageY+Math.round((h-this.originalPageY)/b.grid[1])*b.grid[1];h=g?!(h-this.offset.click.top<g[1]||h-this.offset.click.top>g[3])?h:!(h-this.offset.click.top<g[1])?h-b.grid[1]:h+b.grid[1]:h;e=this.originalPageX+Math.round((e-this.originalPageX)/b.grid[0])*b.grid[0];e=g?!(e-this.offset.click.left<g[0]||e-this.offset.click.left>g[2])?e:!(e-this.offset.click.left<
232
+ g[0])?e-b.grid[0]:e+b.grid[0]:e}}return{top:h-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop()),left:e-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())}},_clear:function(){this.helper.removeClass("ui-draggable-dragging");
233
+ this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove();this.helper=null;this.cancelHelperRemoval=false},_trigger:function(a,b,c){c=c||this._uiHash();d.ui.plugin.call(this,a,[b,c]);if(a=="drag")this.positionAbs=this._convertPositionTo("absolute");return d.Widget.prototype._trigger.call(this,a,b,c)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}});d.extend(d.ui.draggable,{version:"1.8.13"});
234
+ d.ui.plugin.add("draggable","connectToSortable",{start:function(a,b){var c=d(this).data("draggable"),f=c.options,e=d.extend({},b,{item:c.element});c.sortables=[];d(f.connectToSortable).each(function(){var h=d.data(this,"sortable");if(h&&!h.options.disabled){c.sortables.push({instance:h,shouldRevert:h.options.revert});h.refreshPositions();h._trigger("activate",a,e)}})},stop:function(a,b){var c=d(this).data("draggable"),f=d.extend({},b,{item:c.element});d.each(c.sortables,function(){if(this.instance.isOver){this.instance.isOver=
235
+ 0;c.cancelHelperRemoval=true;this.instance.cancelHelperRemoval=false;if(this.shouldRevert)this.instance.options.revert=true;this.instance._mouseStop(a);this.instance.options.helper=this.instance.options._helper;c.options.helper=="original"&&this.instance.currentItem.css({top:"auto",left:"auto"})}else{this.instance.cancelHelperRemoval=false;this.instance._trigger("deactivate",a,f)}})},drag:function(a,b){var c=d(this).data("draggable"),f=this;d.each(c.sortables,function(){this.instance.positionAbs=
236
+ c.positionAbs;this.instance.helperProportions=c.helperProportions;this.instance.offset.click=c.offset.click;if(this.instance._intersectsWith(this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver=1;this.instance.currentItem=d(f).clone().removeAttr("id").appendTo(this.instance.element).data("sortable-item",true);this.instance.options._helper=this.instance.options.helper;this.instance.options.helper=function(){return b.helper[0]};a.target=this.instance.currentItem[0];this.instance._mouseCapture(a,
237
+ true);this.instance._mouseStart(a,true,true);this.instance.offset.click.top=c.offset.click.top;this.instance.offset.click.left=c.offset.click.left;this.instance.offset.parent.left-=c.offset.parent.left-this.instance.offset.parent.left;this.instance.offset.parent.top-=c.offset.parent.top-this.instance.offset.parent.top;c._trigger("toSortable",a);c.dropped=this.instance.element;c.currentItem=c.element;this.instance.fromOutside=c}this.instance.currentItem&&this.instance._mouseDrag(a)}else if(this.instance.isOver){this.instance.isOver=
238
+ 0;this.instance.cancelHelperRemoval=true;this.instance.options.revert=false;this.instance._trigger("out",a,this.instance._uiHash(this.instance));this.instance._mouseStop(a,true);this.instance.options.helper=this.instance.options._helper;this.instance.currentItem.remove();this.instance.placeholder&&this.instance.placeholder.remove();c._trigger("fromSortable",a);c.dropped=false}})}});d.ui.plugin.add("draggable","cursor",{start:function(){var a=d("body"),b=d(this).data("draggable").options;if(a.css("cursor"))b._cursor=
239
+ a.css("cursor");a.css("cursor",b.cursor)},stop:function(){var a=d(this).data("draggable").options;a._cursor&&d("body").css("cursor",a._cursor)}});d.ui.plugin.add("draggable","opacity",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options;if(a.css("opacity"))b._opacity=a.css("opacity");a.css("opacity",b.opacity)},stop:function(a,b){a=d(this).data("draggable").options;a._opacity&&d(b.helper).css("opacity",a._opacity)}});d.ui.plugin.add("draggable","scroll",{start:function(){var a=d(this).data("draggable");
240
+ if(a.scrollParent[0]!=document&&a.scrollParent[0].tagName!="HTML")a.overflowOffset=a.scrollParent.offset()},drag:function(a){var b=d(this).data("draggable"),c=b.options,f=false;if(b.scrollParent[0]!=document&&b.scrollParent[0].tagName!="HTML"){if(!c.axis||c.axis!="x")if(b.overflowOffset.top+b.scrollParent[0].offsetHeight-a.pageY<c.scrollSensitivity)b.scrollParent[0].scrollTop=f=b.scrollParent[0].scrollTop+c.scrollSpeed;else if(a.pageY-b.overflowOffset.top<c.scrollSensitivity)b.scrollParent[0].scrollTop=
241
+ f=b.scrollParent[0].scrollTop-c.scrollSpeed;if(!c.axis||c.axis!="y")if(b.overflowOffset.left+b.scrollParent[0].offsetWidth-a.pageX<c.scrollSensitivity)b.scrollParent[0].scrollLeft=f=b.scrollParent[0].scrollLeft+c.scrollSpeed;else if(a.pageX-b.overflowOffset.left<c.scrollSensitivity)b.scrollParent[0].scrollLeft=f=b.scrollParent[0].scrollLeft-c.scrollSpeed}else{if(!c.axis||c.axis!="x")if(a.pageY-d(document).scrollTop()<c.scrollSensitivity)f=d(document).scrollTop(d(document).scrollTop()-c.scrollSpeed);
242
+ else if(d(window).height()-(a.pageY-d(document).scrollTop())<c.scrollSensitivity)f=d(document).scrollTop(d(document).scrollTop()+c.scrollSpeed);if(!c.axis||c.axis!="y")if(a.pageX-d(document).scrollLeft()<c.scrollSensitivity)f=d(document).scrollLeft(d(document).scrollLeft()-c.scrollSpeed);else if(d(window).width()-(a.pageX-d(document).scrollLeft())<c.scrollSensitivity)f=d(document).scrollLeft(d(document).scrollLeft()+c.scrollSpeed)}f!==false&&d.ui.ddmanager&&!c.dropBehaviour&&d.ui.ddmanager.prepareOffsets(b,
243
+ a)}});d.ui.plugin.add("draggable","snap",{start:function(){var a=d(this).data("draggable"),b=a.options;a.snapElements=[];d(b.snap.constructor!=String?b.snap.items||":data(draggable)":b.snap).each(function(){var c=d(this),f=c.offset();this!=a.element[0]&&a.snapElements.push({item:this,width:c.outerWidth(),height:c.outerHeight(),top:f.top,left:f.left})})},drag:function(a,b){for(var c=d(this).data("draggable"),f=c.options,e=f.snapTolerance,h=b.offset.left,g=h+c.helperProportions.width,n=b.offset.top,
244
+ o=n+c.helperProportions.height,i=c.snapElements.length-1;i>=0;i--){var j=c.snapElements[i].left,l=j+c.snapElements[i].width,k=c.snapElements[i].top,m=k+c.snapElements[i].height;if(j-e<h&&h<l+e&&k-e<n&&n<m+e||j-e<h&&h<l+e&&k-e<o&&o<m+e||j-e<g&&g<l+e&&k-e<n&&n<m+e||j-e<g&&g<l+e&&k-e<o&&o<m+e){if(f.snapMode!="inner"){var p=Math.abs(k-o)<=e,q=Math.abs(m-n)<=e,r=Math.abs(j-g)<=e,s=Math.abs(l-h)<=e;if(p)b.position.top=c._convertPositionTo("relative",{top:k-c.helperProportions.height,left:0}).top-c.margins.top;
245
+ if(q)b.position.top=c._convertPositionTo("relative",{top:m,left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",{top:0,left:j-c.helperProportions.width}).left-c.margins.left;if(s)b.position.left=c._convertPositionTo("relative",{top:0,left:l}).left-c.margins.left}var t=p||q||r||s;if(f.snapMode!="outer"){p=Math.abs(k-n)<=e;q=Math.abs(m-o)<=e;r=Math.abs(j-h)<=e;s=Math.abs(l-g)<=e;if(p)b.position.top=c._convertPositionTo("relative",{top:k,left:0}).top-c.margins.top;if(q)b.position.top=
246
+ c._convertPositionTo("relative",{top:m-c.helperProportions.height,left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",{top:0,left:j}).left-c.margins.left;if(s)b.position.left=c._convertPositionTo("relative",{top:0,left:l-c.helperProportions.width}).left-c.margins.left}if(!c.snapElements[i].snapping&&(p||q||r||s||t))c.options.snap.snap&&c.options.snap.snap.call(c.element,a,d.extend(c._uiHash(),{snapItem:c.snapElements[i].item}));c.snapElements[i].snapping=p||q||r||s||t}else{c.snapElements[i].snapping&&
247
+ c.options.snap.release&&c.options.snap.release.call(c.element,a,d.extend(c._uiHash(),{snapItem:c.snapElements[i].item}));c.snapElements[i].snapping=false}}}});d.ui.plugin.add("draggable","stack",{start:function(){var a=d(this).data("draggable").options;a=d.makeArray(d(a.stack)).sort(function(c,f){return(parseInt(d(c).css("zIndex"),10)||0)-(parseInt(d(f).css("zIndex"),10)||0)});if(a.length){var b=parseInt(a[0].style.zIndex)||0;d(a).each(function(c){this.style.zIndex=b+c});this[0].style.zIndex=b+a.length}}});
248
+ d.ui.plugin.add("draggable","zIndex",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options;if(a.css("zIndex"))b._zIndex=a.css("zIndex");a.css("zIndex",b.zIndex)},stop:function(a,b){a=d(this).data("draggable").options;a._zIndex&&d(b.helper).css("zIndex",a._zIndex)}})})(jQuery);
249
+ ;
250
+
251
+ /*
252
+ * jQuery UI Sortable 1.8.13
253
+ *
254
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
255
+ * Dual licensed under the MIT or GPL Version 2 licenses.
256
+ * http://jquery.org/license
257
+ *
258
+ * http://docs.jquery.com/UI/Sortables
259
+ *
260
+ * Depends:
261
+ * jquery.ui.core.js
262
+ * jquery.ui.mouse.js
263
+ * jquery.ui.widget.js
264
+ */
265
+ (function( $, undefined ) {
266
+
267
+ $.widget("ui.sortable", $.ui.mouse, {
268
+ widgetEventPrefix: "sort",
269
+ options: {
270
+ appendTo: "parent",
271
+ axis: false,
272
+ connectWith: false,
273
+ containment: false,
274
+ cursor: 'auto',
275
+ cursorAt: false,
276
+ dropOnEmpty: true,
277
+ forcePlaceholderSize: false,
278
+ forceHelperSize: false,
279
+ grid: false,
280
+ handle: false,
281
+ helper: "original",
282
+ items: '> *',
283
+ opacity: false,
284
+ placeholder: false,
285
+ revert: false,
286
+ scroll: true,
287
+ scrollSensitivity: 20,
288
+ scrollSpeed: 20,
289
+ scope: "default",
290
+ tolerance: "intersect",
291
+ zIndex: 1000
292
+ },
293
+ _create: function() {
294
+
295
+ var o = this.options;
296
+ this.document = o.document;
297
+
298
+ this.containerCache = {};
299
+ this.element.addClass("ui-sortable");
300
+
301
+ //Get the items
302
+ this.refresh();
303
+
304
+ //Let's determine if the items are being displayed horizontally
305
+ 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;
306
+
307
+ //Let's determine the parent's offset
308
+ this.offset = this.element.offset();
309
+
310
+ //Initialize mouse events for interaction
311
+ this._mouseInit();
312
+
313
+ },
314
+
315
+ destroy: function() {
316
+ this.element
317
+ .removeClass("ui-sortable ui-sortable-disabled")
318
+ .removeData("sortable")
319
+ .unbind(".sortable");
320
+ this._mouseDestroy();
321
+
322
+ for ( var i = this.items.length - 1; i >= 0; i-- )
323
+ this.items[i].item.removeData("sortable-item");
324
+
325
+ return this;
326
+ },
327
+
328
+ _setOption: function(key, value){
329
+ if ( key === "disabled" ) {
330
+ this.options[ key ] = value;
331
+
332
+ this.widget()
333
+ [ value ? "addClass" : "removeClass"]( "ui-sortable-disabled" );
334
+ } else {
335
+ // Don't call widget base _setOption for disable as it adds ui-state-disabled class
336
+ $.Widget.prototype._setOption.apply(this, arguments);
337
+ }
338
+ },
339
+
340
+ _mouseCapture: function(event, overrideHandle) {
341
+
342
+ if (this.reverting) {
343
+ return false;
344
+ }
345
+
346
+ if(this.options.disabled || this.options.type == 'static') return false;
347
+
348
+ //We have to refresh the items data once first
349
+ this._refreshItems(event);
350
+
351
+ //Find out if the clicked node (or one of its parents) is a actual item in this.items
352
+ var currentItem = null, self = this, nodes = $(event.target).parents().each(function() {
353
+ if($.data(this, 'sortable-item') == self) {
354
+ currentItem = $(this);
355
+ return false;
356
+ }
357
+ });
358
+ if($.data(event.target, 'sortable-item') == self) currentItem = $(event.target);
359
+
360
+ if(!currentItem) return false;
361
+ if(this.options.handle && !overrideHandle) {
362
+ var validHandle = false;
363
+
364
+ $(this.options.handle, currentItem).find("*").andSelf().each(function() { if(this == event.target) validHandle = true; });
365
+ if(!validHandle) return false;
366
+ }
367
+
368
+ this.currentItem = currentItem;
369
+ this._removeCurrentsFromItems();
370
+ return true;
371
+
372
+ },
373
+
374
+ _mouseStart: function(event, overrideHandle, noActivation) {
375
+ var o = this.options, self = this;
376
+ this.currentContainer = this;
377
+
378
+ //We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
379
+ this.refreshPositions();
380
+
381
+ //Create and append the visible helper
382
+ this.helper = this._createHelper(event);
383
+
384
+ //Cache the helper size
385
+ this._cacheHelperProportions();
386
+
387
+ /*
388
+ * - Position generation -
389
+ * This block generates everything position related - it's the core of draggables.
390
+ */
391
+
392
+ //Cache the margins of the original element
393
+ this._cacheMargins();
394
+
395
+ //Get the next scrolling parent
396
+ this.scrollParent = this.helper.scrollParent();
397
+
398
+ //The element's absolute position on the page minus margins
399
+ this.offset = this.currentItem.offset();
400
+ this.offset = {
401
+ top: this.offset.top - this.margins.top,
402
+ left: this.offset.left - this.margins.left
403
+ };
404
+
405
+ // Only after we got the offset, we can change the helper's position to absolute
406
+ // TODO: Still need to figure out a way to make relative sorting possible
407
+ this.helper.css("position", "absolute");
408
+ this.cssPosition = this.helper.css("position");
409
+
410
+ $.extend(this.offset, {
411
+ click: { //Where the click happened, relative to the element
412
+ left: event.pageX - this.offset.left,
413
+ top: event.pageY - this.offset.top
414
+ },
415
+ parent: this._getParentOffset(),
416
+ relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
417
+ });
418
+
419
+ //Generate the original position
420
+ this.originalPosition = this._generatePosition(event);
421
+ this.originalPageX = event.pageX;
422
+ this.originalPageY = event.pageY;
423
+
424
+ //Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
425
+ (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
426
+
427
+ //Cache the former DOM position
428
+ this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };
429
+
430
+ //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
431
+ if(this.helper[0] != this.currentItem[0]) {
432
+ this.currentItem.hide();
433
+ }
434
+
435
+ //Create the placeholder
436
+ this._createPlaceholder();
437
+
438
+ //Set a containment if given in the options
439
+ if(o.containment)
440
+ this._setContainment();
441
+
442
+ if(o.cursor) { // cursor option
443
+ if ($('body').css("cursor")) this._storedCursor = $('body').css("cursor");
444
+ $('body').css("cursor", o.cursor);
445
+ }
446
+
447
+ if(o.opacity) { // opacity option
448
+ if (this.helper.css("opacity")) this._storedOpacity = this.helper.css("opacity");
449
+ this.helper.css("opacity", o.opacity);
450
+ }
451
+
452
+ if(o.zIndex) { // zIndex option
453
+ if (this.helper.css("zIndex")) this._storedZIndex = this.helper.css("zIndex");
454
+ this.helper.css("zIndex", o.zIndex);
455
+ }
456
+
457
+ //Prepare scrolling
458
+ if(this.scrollParent[0] != (this.document || document) && this.scrollParent[0].tagName != 'HTML')
459
+ this.overflowOffset = this.scrollParent.offset();
460
+
461
+ //Call callbacks
462
+ this._trigger("start", event, this._uiHash());
463
+
464
+ //Recache the helper size
465
+ if(!this._preserveHelperProportions)
466
+ this._cacheHelperProportions();
467
+
468
+
469
+ //Post 'activate' events to possible containers
470
+ if(!noActivation) {
471
+ for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i]._trigger("activate", event, self._uiHash(this)); }
472
+ }
473
+
474
+ //Prepare possible droppables
475
+ if($.ui.ddmanager)
476
+ $.ui.ddmanager.current = this;
477
+
478
+ if ($.ui.ddmanager && !o.dropBehaviour)
479
+ $.ui.ddmanager.prepareOffsets(this, event);
480
+
481
+ this.dragging = true;
482
+
483
+ this.helper.addClass("ui-sortable-helper");
484
+ this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position
485
+ return true;
486
+
487
+ },
488
+
489
+ _mouseDrag: function(event) {
490
+
491
+ //Compute the helpers position
492
+ this.position = this._generatePosition(event);
493
+ this.positionAbs = this._convertPositionTo("absolute");
494
+
495
+ if (!this.lastPositionAbs) {
496
+ this.lastPositionAbs = this.positionAbs;
497
+ }
498
+
499
+ //Do scrolling
500
+ if(this.options.scroll) {
501
+ var o = this.options, scrolled = false;
502
+ if(this.scrollParent[0] != (this.document || document) && this.scrollParent[0].tagName != 'HTML') {
503
+
504
+ if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
505
+ this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
506
+ else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity)
507
+ this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
508
+
509
+ if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
510
+ this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
511
+ else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity)
512
+ this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
513
+
514
+ } else {
515
+
516
+ if(event.pageY - $((this.document || document)).scrollTop() < o.scrollSensitivity)
517
+ scrolled = $((this.document || document)).scrollTop($((this.document || document)).scrollTop() - o.scrollSpeed);
518
+ else if($(window).height() - (event.pageY - $((this.document || document)).scrollTop()) < o.scrollSensitivity)
519
+ scrolled = $((this.document || document)).scrollTop($((this.document || document)).scrollTop() + o.scrollSpeed);
520
+
521
+ if(event.pageX - $((this.document || document)).scrollLeft() < o.scrollSensitivity)
522
+ scrolled = $((this.document || document)).scrollLeft($((this.document || document)).scrollLeft() - o.scrollSpeed);
523
+ else if($(window).width() - (event.pageX - $((this.document || document)).scrollLeft()) < o.scrollSensitivity)
524
+ scrolled = $((this.document || document)).scrollLeft($((this.document || document)).scrollLeft() + o.scrollSpeed);
525
+
526
+ }
527
+
528
+ if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
529
+ $.ui.ddmanager.prepareOffsets(this, event);
530
+ }
531
+
532
+ //Regenerate the absolute position used for position checks
533
+ this.positionAbs = this._convertPositionTo("absolute");
534
+
535
+ //Set the helper position
536
+ if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
537
+ if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
538
+
539
+ //Rearrange
540
+ for (var i = this.items.length - 1; i >= 0; i--) {
541
+
542
+ //Cache variables and intersection, continue if no intersection
543
+ var item = this.items[i], itemElement = item.item[0], intersection = this._intersectsWithPointer(item);
544
+ if (!intersection) continue;
545
+
546
+ if(itemElement != this.currentItem[0] //cannot intersect with itself
547
+ && this.placeholder[intersection == 1 ? "next" : "prev"]()[0] != itemElement //no useless actions that have been done before
548
+ && !$.ui.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked
549
+ && (this.options.type == 'semi-dynamic' ? !$.ui.contains(this.element[0], itemElement) : true)
550
+ //&& itemElement.parentNode == this.placeholder[0].parentNode // only rearrange items within the same container
551
+ ) {
552
+
553
+ this.direction = intersection == 1 ? "down" : "up";
554
+
555
+ if (this.options.tolerance == "pointer" || this._intersectsWithSides(item)) {
556
+ this._rearrange(event, item);
557
+ } else {
558
+ break;
559
+ }
560
+
561
+ this._trigger("change", event, this._uiHash());
562
+ break;
563
+ }
564
+ }
565
+
566
+ //Post events to containers
567
+ this._contactContainers(event);
568
+
569
+ //Interconnect with droppables
570
+ if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
571
+
572
+ //Call callbacks
573
+ this._trigger('sort', event, this._uiHash());
574
+
575
+ this.lastPositionAbs = this.positionAbs;
576
+ return false;
577
+
578
+ },
579
+
580
+ _mouseStop: function(event, noPropagation) {
581
+
582
+ if(!event) return;
583
+
584
+ //If we are using droppables, inform the manager about the drop
585
+ if ($.ui.ddmanager && !this.options.dropBehaviour)
586
+ $.ui.ddmanager.drop(this, event);
587
+
588
+ if(this.options.revert) {
589
+ var self = this;
590
+ var cur = self.placeholder.offset();
591
+
592
+ self.reverting = true;
593
+
594
+ $(this.helper).animate({
595
+ left: cur.left - this.offset.parent.left - self.margins.left + (this.offsetParent[0] == (this.document || document).body ? 0 : this.offsetParent[0].scrollLeft),
596
+ top: cur.top - this.offset.parent.top - self.margins.top + (this.offsetParent[0] == (this.document || document).body ? 0 : this.offsetParent[0].scrollTop)
597
+ }, parseInt(this.options.revert, 10) || 500, function() {
598
+ self._clear(event);
599
+ });
600
+ } else {
601
+ this._clear(event, noPropagation);
602
+ }
603
+
604
+ return false;
605
+
606
+ },
607
+
608
+ cancel: function() {
609
+
610
+ var self = this;
611
+
612
+ if(this.dragging) {
613
+
614
+ this._mouseUp({ target: null });
615
+
616
+ if(this.options.helper == "original")
617
+ this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
618
+ else
619
+ this.currentItem.show();
620
+
621
+ //Post deactivating events to containers
622
+ for (var i = this.containers.length - 1; i >= 0; i--){
623
+ this.containers[i]._trigger("deactivate", null, self._uiHash(this));
624
+ if(this.containers[i].containerCache.over) {
625
+ this.containers[i]._trigger("out", null, self._uiHash(this));
626
+ this.containers[i].containerCache.over = 0;
627
+ }
628
+ }
629
+
630
+ }
631
+
632
+ if (this.placeholder) {
633
+ //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
634
+ if(this.placeholder[0].parentNode) this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
635
+ if(this.options.helper != "original" && this.helper && this.helper[0].parentNode) this.helper.remove();
636
+
637
+ $.extend(this, {
638
+ helper: null,
639
+ dragging: false,
640
+ reverting: false,
641
+ _noFinalSort: null
642
+ });
643
+
644
+ if(this.domPosition.prev) {
645
+ $(this.domPosition.prev).after(this.currentItem);
646
+ } else {
647
+ $(this.domPosition.parent).prepend(this.currentItem);
648
+ }
649
+ }
650
+
651
+ return this;
652
+
653
+ },
654
+
655
+ serialize: function(o) {
656
+
657
+ var items = this._getItemsAsjQuery(o && o.connected);
658
+ var str = []; o = o || {};
659
+
660
+ $(items).each(function() {
661
+ var res = ($(o.item || this).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/));
662
+ if(res) str.push((o.key || res[1]+'[]')+'='+(o.key && o.expression ? res[1] : res[2]));
663
+ });
664
+
665
+ if(!str.length && o.key) {
666
+ str.push(o.key + '=');
667
+ }
668
+
669
+ return str.join('&');
670
+
671
+ },
672
+
673
+ toArray: function(o) {
674
+
675
+ var items = this._getItemsAsjQuery(o && o.connected);
676
+ var ret = []; o = o || {};
677
+
678
+ items.each(function() { ret.push($(o.item || this).attr(o.attribute || 'id') || ''); });
679
+ return ret;
680
+
681
+ },
682
+
683
+ /* Be careful with the following core functions */
684
+ _intersectsWith: function(item) {
685
+
686
+ var x1 = this.positionAbs.left,
687
+ x2 = x1 + this.helperProportions.width,
688
+ y1 = this.positionAbs.top,
689
+ y2 = y1 + this.helperProportions.height;
690
+
691
+ var l = item.left,
692
+ r = l + item.width,
693
+ t = item.top,
694
+ b = t + item.height;
695
+
696
+ var dyClick = this.offset.click.top,
697
+ dxClick = this.offset.click.left;
698
+
699
+ var isOverElement = (y1 + dyClick) > t && (y1 + dyClick) < b && (x1 + dxClick) > l && (x1 + dxClick) < r;
700
+
701
+ if( this.options.tolerance == "pointer"
702
+ || this.options.forcePointerForContainers
703
+ || (this.options.tolerance != "pointer" && this.helperProportions[this.floating ? 'width' : 'height'] > item[this.floating ? 'width' : 'height'])
704
+ ) {
705
+ return isOverElement;
706
+ } else {
707
+
708
+ return (l < x1 + (this.helperProportions.width / 2) // Right Half
709
+ && x2 - (this.helperProportions.width / 2) < r // Left Half
710
+ && t < y1 + (this.helperProportions.height / 2) // Bottom Half
711
+ && y2 - (this.helperProportions.height / 2) < b ); // Top Half
712
+
713
+ }
714
+ },
715
+
716
+ _intersectsWithPointer: function(item) {
717
+
718
+ var isOverElementHeight = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
719
+ isOverElementWidth = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
720
+ isOverElement = isOverElementHeight && isOverElementWidth,
721
+ verticalDirection = this._getDragVerticalDirection(),
722
+ horizontalDirection = this._getDragHorizontalDirection();
723
+
724
+ if (!isOverElement)
725
+ return false;
726
+
727
+ return this.floating ?
728
+ ( ((horizontalDirection && horizontalDirection == "right") || verticalDirection == "down") ? 2 : 1 )
729
+ : ( verticalDirection && (verticalDirection == "down" ? 2 : 1) );
730
+
731
+ },
732
+
733
+ _intersectsWithSides: function(item) {
734
+
735
+ var isOverBottomHalf = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),
736
+ isOverRightHalf = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
737
+ verticalDirection = this._getDragVerticalDirection(),
738
+ horizontalDirection = this._getDragHorizontalDirection();
739
+
740
+ if (this.floating && horizontalDirection) {
741
+ return ((horizontalDirection == "right" && isOverRightHalf) || (horizontalDirection == "left" && !isOverRightHalf));
742
+ } else {
743
+ return verticalDirection && ((verticalDirection == "down" && isOverBottomHalf) || (verticalDirection == "up" && !isOverBottomHalf));
744
+ }
745
+
746
+ },
747
+
748
+ _getDragVerticalDirection: function() {
749
+ var delta = this.positionAbs.top - this.lastPositionAbs.top;
750
+ return delta != 0 && (delta > 0 ? "down" : "up");
751
+ },
752
+
753
+ _getDragHorizontalDirection: function() {
754
+ var delta = this.positionAbs.left - this.lastPositionAbs.left;
755
+ return delta != 0 && (delta > 0 ? "right" : "left");
756
+ },
757
+
758
+ refresh: function(event) {
759
+ this._refreshItems(event);
760
+ this.refreshPositions();
761
+ return this;
762
+ },
763
+
764
+ _connectWith: function() {
765
+ var options = this.options;
766
+ return options.connectWith.constructor == String
767
+ ? [options.connectWith]
768
+ : options.connectWith;
769
+ },
770
+
771
+ _getItemsAsjQuery: function(connected) {
772
+
773
+ var self = this;
774
+ var items = [];
775
+ var queries = [];
776
+ var connectWith = this._connectWith();
777
+
778
+ if(connectWith && connected) {
779
+ for (var i = connectWith.length - 1; i >= 0; i--){
780
+ var cur = $(connectWith[i]);
781
+ for (var j = cur.length - 1; j >= 0; j--){
782
+ var inst = $.data(cur[j], 'sortable');
783
+ if(inst && inst != this && !inst.options.disabled) {
784
+ 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]);
785
+ }
786
+ };
787
+ };
788
+ }
789
+
790
+ 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]);
791
+
792
+ for (var i = queries.length - 1; i >= 0; i--){
793
+ queries[i][0].each(function() {
794
+ items.push(this);
795
+ });
796
+ };
797
+
798
+ return $(items);
799
+
800
+ },
801
+
802
+ _removeCurrentsFromItems: function() {
803
+
804
+ var list = this.currentItem.find(":data(sortable-item)");
805
+
806
+ for (var i=0; i < this.items.length; i++) {
807
+
808
+ for (var j=0; j < list.length; j++) {
809
+ if(list[j] == this.items[i].item[0])
810
+ this.items.splice(i,1);
811
+ };
812
+
813
+ };
814
+
815
+ },
816
+
817
+ _refreshItems: function(event) {
818
+
819
+ this.items = [];
820
+ this.containers = [this];
821
+ var items = this.items;
822
+ var self = this;
823
+ var queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]];
824
+ var connectWith = this._connectWith();
825
+
826
+ if(connectWith) {
827
+ for (var i = connectWith.length - 1; i >= 0; i--){
828
+ var cur = $(connectWith[i]);
829
+ for (var j = cur.length - 1; j >= 0; j--){
830
+ var inst = $.data(cur[j], 'sortable');
831
+ if(inst && inst != this && !inst.options.disabled) {
832
+ queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);
833
+ this.containers.push(inst);
834
+ }
835
+ };
836
+ };
837
+ }
838
+
839
+ for (var i = queries.length - 1; i >= 0; i--) {
840
+ var targetData = queries[i][1];
841
+ var _queries = queries[i][0];
842
+
843
+ for (var j=0, queriesLength = _queries.length; j < queriesLength; j++) {
844
+ var item = $(_queries[j]);
845
+
846
+ item.data('sortable-item', targetData); // Data for target checking (mouse manager)
847
+
848
+ items.push({
849
+ item: item,
850
+ instance: targetData,
851
+ width: 0, height: 0,
852
+ left: 0, top: 0
853
+ });
854
+ };
855
+ };
856
+
857
+ },
858
+
859
+ refreshPositions: function(fast) {
860
+
861
+ //This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
862
+ if(this.offsetParent && this.helper) {
863
+ this.offset.parent = this._getParentOffset();
864
+ }
865
+
866
+ for (var i = this.items.length - 1; i >= 0; i--){
867
+ var item = this.items[i];
868
+
869
+ //We ignore calculating positions of all connected containers when we're not over them
870
+ if(item.instance != this.currentContainer && this.currentContainer && item.item[0] != this.currentItem[0])
871
+ continue;
872
+
873
+ var t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;
874
+
875
+ if (!fast) {
876
+ item.width = t.outerWidth();
877
+ item.height = t.outerHeight();
878
+ }
879
+
880
+ var p = t.offset();
881
+ item.left = p.left;
882
+ item.top = p.top;
883
+ };
884
+
885
+ if(this.options.custom && this.options.custom.refreshContainers) {
886
+ this.options.custom.refreshContainers.call(this);
887
+ } else {
888
+ for (var i = this.containers.length - 1; i >= 0; i--){
889
+ var p = this.containers[i].element.offset();
890
+ this.containers[i].containerCache.left = p.left;
891
+ this.containers[i].containerCache.top = p.top;
892
+ this.containers[i].containerCache.width = this.containers[i].element.outerWidth();
893
+ this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
894
+ };
895
+ }
896
+
897
+ return this;
898
+ },
899
+
900
+ _createPlaceholder: function(that) {
901
+
902
+ var self = that || this, o = self.options;
903
+
904
+ if(!o.placeholder || o.placeholder.constructor == String) {
905
+ var className = o.placeholder;
906
+ o.placeholder = {
907
+ element: function() {
908
+
909
+ var el = $((this.document || document).createElement(self.currentItem[0].nodeName))
910
+ .addClass(className || self.currentItem[0].className+" ui-sortable-placeholder")
911
+ .removeClass("ui-sortable-helper")[0];
912
+
913
+ if(!className)
914
+ el.style.visibility = "hidden";
915
+
916
+ return el;
917
+ },
918
+ update: function(container, p) {
919
+
920
+ // 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
921
+ // 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
922
+ if(className && !o.forcePlaceholderSize) return;
923
+
924
+ //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
925
+ if(!p.height()) { p.height(self.currentItem.innerHeight() - parseInt(self.currentItem.css('paddingTop')||0, 10) - parseInt(self.currentItem.css('paddingBottom')||0, 10)); };
926
+ if(!p.width()) { p.width(self.currentItem.innerWidth() - parseInt(self.currentItem.css('paddingLeft')||0, 10) - parseInt(self.currentItem.css('paddingRight')||0, 10)); };
927
+ }
928
+ };
929
+ }
930
+
931
+ //Create the placeholder
932
+ self.placeholder = $(o.placeholder.element.call(self.element, self.currentItem));
933
+
934
+ //Append it after the actual current item
935
+ self.currentItem.after(self.placeholder);
936
+
937
+ //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
938
+ o.placeholder.update(self, self.placeholder);
939
+
940
+ },
941
+
942
+ _contactContainers: function(event) {
943
+
944
+ // get innermost container that intersects with item
945
+ var innermostContainer = null, innermostIndex = null;
946
+
947
+
948
+ for (var i = this.containers.length - 1; i >= 0; i--){
949
+
950
+ // never consider a container that's located within the item itself
951
+ if($.ui.contains(this.currentItem[0], this.containers[i].element[0]))
952
+ continue;
953
+
954
+ if(this._intersectsWith(this.containers[i].containerCache)) {
955
+
956
+ // if we've already found a container and it's more "inner" than this, then continue
957
+ if(innermostContainer && $.ui.contains(this.containers[i].element[0], innermostContainer.element[0]))
958
+ continue;
959
+
960
+ innermostContainer = this.containers[i];
961
+ innermostIndex = i;
962
+
963
+ } else {
964
+ // container doesn't intersect. trigger "out" event if necessary
965
+ if(this.containers[i].containerCache.over) {
966
+ this.containers[i]._trigger("out", event, this._uiHash(this));
967
+ this.containers[i].containerCache.over = 0;
968
+ }
969
+ }
970
+
971
+ }
972
+
973
+ // if no intersecting containers found, return
974
+ if(!innermostContainer) return;
975
+
976
+ // move the item into the container if it's not there already
977
+ if(this.containers.length === 1) {
978
+ this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
979
+ this.containers[innermostIndex].containerCache.over = 1;
980
+ } else if(this.currentContainer != this.containers[innermostIndex]) {
981
+
982
+ //When entering a new container, we will find the item with the least distance and append our item near it
983
+ var dist = 10000; var itemWithLeastDistance = null; var base = this.positionAbs[this.containers[innermostIndex].floating ? 'left' : 'top'];
984
+ for (var j = this.items.length - 1; j >= 0; j--) {
985
+ if(!$.ui.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue;
986
+ var cur = this.items[j][this.containers[innermostIndex].floating ? 'left' : 'top'];
987
+ if(Math.abs(cur - base) < dist) {
988
+ dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j];
989
+ }
990
+ }
991
+
992
+ if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled
993
+ return;
994
+
995
+ this.currentContainer = this.containers[innermostIndex];
996
+ itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);
997
+ this._trigger("change", event, this._uiHash());
998
+ this.containers[innermostIndex]._trigger("change", event, this._uiHash(this));
999
+
1000
+ //Update the placeholder
1001
+ this.options.placeholder.update(this.currentContainer, this.placeholder);
1002
+
1003
+ this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
1004
+ this.containers[innermostIndex].containerCache.over = 1;
1005
+ }
1006
+
1007
+
1008
+ },
1009
+
1010
+ _createHelper: function(event) {
1011
+
1012
+ var o = this.options;
1013
+ var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper == 'clone' ? this.currentItem.clone() : this.currentItem);
1014
+
1015
+ if(!helper.parents('body').length) //Add the helper to the DOM if that didn't happen already
1016
+ $(o.appendTo != 'parent' ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);
1017
+
1018
+ if(helper[0] == this.currentItem[0])
1019
+ 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") };
1020
+
1021
+ if(helper[0].style.width == '' || o.forceHelperSize) helper.width(this.currentItem.width());
1022
+ if(helper[0].style.height == '' || o.forceHelperSize) helper.height(this.currentItem.height());
1023
+
1024
+ return helper;
1025
+
1026
+ },
1027
+
1028
+ _adjustOffsetFromHelper: function(obj) {
1029
+ if (typeof obj == 'string') {
1030
+ obj = obj.split(' ');
1031
+ }
1032
+ if ($.isArray(obj)) {
1033
+ obj = {left: +obj[0], top: +obj[1] || 0};
1034
+ }
1035
+ if ('left' in obj) {
1036
+ this.offset.click.left = obj.left + this.margins.left;
1037
+ }
1038
+ if ('right' in obj) {
1039
+ this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
1040
+ }
1041
+ if ('top' in obj) {
1042
+ this.offset.click.top = obj.top + this.margins.top;
1043
+ }
1044
+ if ('bottom' in obj) {
1045
+ this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
1046
+ }
1047
+ },
1048
+
1049
+ _getParentOffset: function() {
1050
+
1051
+
1052
+ //Get the offsetParent and cache its position
1053
+ this.offsetParent = this.helper.offsetParent();
1054
+ var po = this.offsetParent.offset();
1055
+
1056
+ // This is a special case where we need to modify a offset calculated on start, since the following happened:
1057
+ // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
1058
+ // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
1059
+ // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
1060
+ if(this.cssPosition == 'absolute' && this.scrollParent[0] != (this.document || document) && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {
1061
+ po.left += this.scrollParent.scrollLeft();
1062
+ po.top += this.scrollParent.scrollTop();
1063
+ }
1064
+
1065
+ if((this.offsetParent[0] == (this.document || document).body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
1066
+ || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix
1067
+ po = { top: 0, left: 0 };
1068
+
1069
+ return {
1070
+ top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
1071
+ left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
1072
+ };
1073
+
1074
+ },
1075
+
1076
+ _getRelativeOffset: function() {
1077
+
1078
+ if(this.cssPosition == "relative") {
1079
+ var p = this.currentItem.position();
1080
+ return {
1081
+ top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
1082
+ left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
1083
+ };
1084
+ } else {
1085
+ return { top: 0, left: 0 };
1086
+ }
1087
+
1088
+ },
1089
+
1090
+ _cacheMargins: function() {
1091
+ this.margins = {
1092
+ left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
1093
+ top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
1094
+ };
1095
+ },
1096
+
1097
+ _cacheHelperProportions: function() {
1098
+ this.helperProportions = {
1099
+ width: this.helper.outerWidth(),
1100
+ height: this.helper.outerHeight()
1101
+ };
1102
+ },
1103
+
1104
+ _setContainment: function() {
1105
+
1106
+ var o = this.options;
1107
+ if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
1108
+ if(o.containment == 'document' || o.containment == 'window') this.containment = [
1109
+ 0 - this.offset.relative.left - this.offset.parent.left,
1110
+ 0 - this.offset.relative.top - this.offset.parent.top,
1111
+ $(o.containment == 'document' ? (this.document || document) : window).width() - this.helperProportions.width - this.margins.left,
1112
+ ($(o.containment == 'document' ? (this.document || document) : window).height() || (this.document || document).body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
1113
+ ];
1114
+
1115
+ if(!(/^(document|window|parent)$/).test(o.containment)) {
1116
+ var ce = $(o.containment)[0];
1117
+ var co = $(o.containment).offset();
1118
+ var over = ($(ce).css("overflow") != 'hidden');
1119
+
1120
+ this.containment = [
1121
+ co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
1122
+ co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
1123
+ co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
1124
+ co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
1125
+ ];
1126
+ }
1127
+
1128
+ },
1129
+
1130
+ _convertPositionTo: function(d, pos) {
1131
+
1132
+ if(!pos) pos = this.position;
1133
+ var mod = d == "absolute" ? 1 : -1;
1134
+ var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != (this.document || document) && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
1135
+
1136
+ return {
1137
+ top: (
1138
+ pos.top // The absolute mouse position
1139
+ + this.offset.relative.top * mod // Only for relative positioned nodes: Relative offset from element to offset parent
1140
+ + this.offset.parent.top * mod // The offsetParent's offset without borders (offset + border)
1141
+ - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
1142
+ ),
1143
+ left: (
1144
+ pos.left // The absolute mouse position
1145
+ + this.offset.relative.left * mod // Only for relative positioned nodes: Relative offset from element to offset parent
1146
+ + this.offset.parent.left * mod // The offsetParent's offset without borders (offset + border)
1147
+ - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
1148
+ )
1149
+ };
1150
+
1151
+ },
1152
+
1153
+ _generatePosition: function(event) {
1154
+
1155
+ var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != (this.document || document) && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
1156
+
1157
+ // This is another very weird special case that only happens for relative elements:
1158
+ // 1. If the css position is relative
1159
+ // 2. and the scroll parent is the document or similar to the offset parent
1160
+ // we have to refresh the relative offset during the scroll so there are no jumps
1161
+ if(this.cssPosition == 'relative' && !(this.scrollParent[0] != (this.document || document) && this.scrollParent[0] != this.offsetParent[0])) {
1162
+ this.offset.relative = this._getRelativeOffset();
1163
+ }
1164
+
1165
+ var pageX = event.pageX;
1166
+ var pageY = event.pageY;
1167
+
1168
+ /*
1169
+ * - Position constraining -
1170
+ * Constrain the position to a mix of grid, containment.
1171
+ */
1172
+
1173
+ if(this.originalPosition) { //If we are not dragging yet, we won't check for options
1174
+
1175
+ if(this.containment) {
1176
+ if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left;
1177
+ if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top;
1178
+ if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left;
1179
+ if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top;
1180
+ }
1181
+
1182
+ if(o.grid) {
1183
+ var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
1184
+ 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;
1185
+
1186
+ var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
1187
+ 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;
1188
+ }
1189
+
1190
+ }
1191
+
1192
+ return {
1193
+ top: (
1194
+ pageY // The absolute mouse position
1195
+ - this.offset.click.top // Click offset (relative to the element)
1196
+ - this.offset.relative.top // Only for relative positioned nodes: Relative offset from element to offset parent
1197
+ - this.offset.parent.top // The offsetParent's offset without borders (offset + border)
1198
+ + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
1199
+ ),
1200
+ left: (
1201
+ pageX // The absolute mouse position
1202
+ - this.offset.click.left // Click offset (relative to the element)
1203
+ - this.offset.relative.left // Only for relative positioned nodes: Relative offset from element to offset parent
1204
+ - this.offset.parent.left // The offsetParent's offset without borders (offset + border)
1205
+ + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
1206
+ )
1207
+ };
1208
+
1209
+ },
1210
+
1211
+ _rearrange: function(event, i, a, hardRefresh) {
1212
+
1213
+ 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));
1214
+
1215
+ //Various things done here to improve the performance:
1216
+ // 1. we create a setTimeout, that calls refreshPositions
1217
+ // 2. on the instance, we have a counter variable, that get's higher after every append
1218
+ // 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
1219
+ // 4. this lets only the last addition to the timeout stack through
1220
+ this.counter = this.counter ? ++this.counter : 1;
1221
+ var self = this, counter = this.counter;
1222
+
1223
+ window.setTimeout(function() {
1224
+ if(counter == self.counter) self.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
1225
+ },0);
1226
+
1227
+ },
1228
+
1229
+ _clear: function(event, noPropagation) {
1230
+
1231
+ this.reverting = false;
1232
+ // We delay all events that have to be triggered to after the point where the placeholder has been removed and
1233
+ // everything else normalized again
1234
+ var delayedTriggers = [], self = this;
1235
+
1236
+ // We first have to update the dom position of the actual currentItem
1237
+ // Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
1238
+ if(!this._noFinalSort && this.currentItem[0].parentNode) this.placeholder.before(this.currentItem);
1239
+ this._noFinalSort = null;
1240
+
1241
+ if(this.helper[0] == this.currentItem[0]) {
1242
+ for(var i in this._storedCSS) {
1243
+ if(this._storedCSS[i] == 'auto' || this._storedCSS[i] == 'static') this._storedCSS[i] = '';
1244
+ }
1245
+ this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
1246
+ } else {
1247
+ this.currentItem.show();
1248
+ }
1249
+
1250
+ if(this.fromOutside && !noPropagation) delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
1251
+ 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
1252
+ if(!$.ui.contains(this.element[0], this.currentItem[0])) { //Node was moved out of the current element
1253
+ if(!noPropagation) delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
1254
+ for (var i = this.containers.length - 1; i >= 0; i--){
1255
+ if($.ui.contains(this.containers[i].element[0], this.currentItem[0]) && !noPropagation) {
1256
+ delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); }; }).call(this, this.containers[i]));
1257
+ delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this)); }; }).call(this, this.containers[i]));
1258
+ }
1259
+ };
1260
+ };
1261
+
1262
+ //Post events to containers
1263
+ for (var i = this.containers.length - 1; i >= 0; i--){
1264
+ if(!noPropagation) delayedTriggers.push((function(c) { return function(event) { c._trigger("deactivate", event, this._uiHash(this)); }; }).call(this, this.containers[i]));
1265
+ if(this.containers[i].containerCache.over) {
1266
+ delayedTriggers.push((function(c) { return function(event) { c._trigger("out", event, this._uiHash(this)); }; }).call(this, this.containers[i]));
1267
+ this.containers[i].containerCache.over = 0;
1268
+ }
1269
+ }
1270
+
1271
+ //Do what was originally in plugins
1272
+ if(this._storedCursor) $('body').css("cursor", this._storedCursor); //Reset cursor
1273
+ if(this._storedOpacity) this.helper.css("opacity", this._storedOpacity); //Reset opacity
1274
+ if(this._storedZIndex) this.helper.css("zIndex", this._storedZIndex == 'auto' ? '' : this._storedZIndex); //Reset z-index
1275
+
1276
+ this.dragging = false;
1277
+ if(this.cancelHelperRemoval) {
1278
+ if(!noPropagation) {
1279
+ this._trigger("beforeStop", event, this._uiHash());
1280
+ for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
1281
+ this._trigger("stop", event, this._uiHash());
1282
+ }
1283
+ return false;
1284
+ }
1285
+
1286
+ if(!noPropagation) this._trigger("beforeStop", event, this._uiHash());
1287
+
1288
+ //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
1289
+ this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
1290
+
1291
+ if(this.helper[0] != this.currentItem[0]) this.helper.remove(); this.helper = null;
1292
+
1293
+ if(!noPropagation) {
1294
+ for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
1295
+ this._trigger("stop", event, this._uiHash());
1296
+ }
1297
+
1298
+ this.fromOutside = false;
1299
+ return true;
1300
+
1301
+ },
1302
+
1303
+ _trigger: function() {
1304
+ if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
1305
+ this.cancel();
1306
+ }
1307
+ },
1308
+
1309
+ _uiHash: function(inst) {
1310
+ var self = inst || this;
1311
+ return {
1312
+ helper: self.helper,
1313
+ placeholder: self.placeholder || $([]),
1314
+ position: self.position,
1315
+ originalPosition: self.originalPosition,
1316
+ offset: self.positionAbs,
1317
+ item: self.currentItem,
1318
+ sender: inst ? inst.element : null
1319
+ };
1320
+ }
1321
+
1322
+ });
1323
+
1324
+ $.extend($.ui.sortable, {
1325
+ version: "1.8.13"
1326
+ });
1327
+
1328
+ })(jQuery);