ui.draggable.ext.js 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. /*
  2. * 'this' -> original element
  3. * 1. argument: browser event
  4. * 2.argument: ui object
  5. */
  6. (function($) {
  7. $.ui.plugin.add("draggable", "stop", "effect", function(e,ui) {
  8. var t = ui.helper;
  9. if(ui.options.effect[1]) {
  10. if(t != this) {
  11. ui.options.beQuietAtEnd = true;
  12. switch(ui.options.effect[1]) {
  13. case 'fade':
  14. $(t).fadeOut(300, function() { $(this).remove(); });
  15. break;
  16. default:
  17. $(t).remove();
  18. break;
  19. }
  20. }
  21. }
  22. });
  23. $.ui.plugin.add("draggable", "start", "effect", function(e,ui) {
  24. if(ui.options.effect[0]) {
  25. switch(ui.options.effect[0]) {
  26. case 'fade':
  27. $(ui.helper).hide().fadeIn(300);
  28. break;
  29. }
  30. }
  31. });
  32. //----------------------------------------------------------------
  33. $.ui.plugin.add("draggable", "start", "cursor", function(e,ui) {
  34. var t = $('body');
  35. if (t.css("cursor")) ui.options.ocursor = t.css("cursor");
  36. t.css("cursor", ui.options.cursor);
  37. });
  38. $.ui.plugin.add("draggable", "stop", "cursor", function(e,ui) {
  39. if (ui.options.ocursor) $('body').css("cursor", ui.options.ocursor);
  40. });
  41. //----------------------------------------------------------------
  42. $.ui.plugin.add("draggable", "start", "zIndex", function(e,ui) {
  43. var t = $(ui.helper);
  44. if(t.css("zIndex")) ui.options.ozIndex = t.css("zIndex");
  45. t.css('zIndex', ui.options.zIndex);
  46. });
  47. $.ui.plugin.add("draggable", "stop", "zIndex", function(e,ui) {
  48. if(ui.options.ozIndex) $(ui.helper).css('zIndex', ui.options.ozIndex);
  49. });
  50. //----------------------------------------------------------------
  51. $.ui.plugin.add("draggable", "start", "opacity", function(e,ui) {
  52. var t = $(ui.helper);
  53. if(t.css("opacity")) ui.options.oopacity = t.css("opacity");
  54. t.css('opacity', ui.options.opacity);
  55. });
  56. $.ui.plugin.add("draggable", "stop", "opacity", function(e,ui) {
  57. if(ui.options.oopacity) $(ui.helper).css('opacity', ui.options.oopacity);
  58. });
  59. //----------------------------------------------------------------
  60. $.ui.plugin.add("draggable", "stop", "revert", function(e,ui) {
  61. var o = ui.options;
  62. var rpos = { left: 0, top: 0 };
  63. o.beQuietAtEnd = true;
  64. if(ui.helper != this) {
  65. rpos = $(ui.draggable.sorthelper || this).offset({ border: false });
  66. var nl = rpos.left-o.po.left-o.margins.left;
  67. var nt = rpos.top-o.po.top-o.margins.top;
  68. } else {
  69. var nl = o.co.left - (o.po ? o.po.left : 0);
  70. var nt = o.co.top - (o.po ? o.po.top : 0);
  71. }
  72. var self = ui.draggable;
  73. $(ui.helper).animate({
  74. left: nl,
  75. top: nt
  76. }, 500, function() {
  77. if(o.wasPositioned) $(self.element).css('position', o.wasPositioned);
  78. if(o.stop) o.stop.apply(self.element, [self.helper, self.pos, [o.co.left - o.po.left,o.co.top - o.po.top],self]);
  79. if(self.helper != self.element) window.setTimeout(function() { $(self.helper).remove(); }, 0); //Using setTimeout because of strange flickering in Firefox
  80. });
  81. });
  82. //----------------------------------------------------------------
  83. $.ui.plugin.add("draggable", "start", "iframeFix", function(e,ui) {
  84. var o = ui.options;
  85. if(!ui.draggable.slowMode) { // Make clones on top of iframes (only if we are not in slowMode)
  86. if(o.iframeFix.constructor == Array) {
  87. for(var i=0;i<o.iframeFix.length;i++) {
  88. var co = $(o.iframeFix[i]).offset({ border: false });
  89. $("<div class='DragDropIframeFix' style='background: #fff;'></div>").css("width", $(o.iframeFix[i])[0].offsetWidth+"px").css("height", $(o.iframeFix[i])[0].offsetHeight+"px").css("position", "absolute").css("opacity", "0.001").css("z-index", "1000").css("top", co.top+"px").css("left", co.left+"px").appendTo("body");
  90. }
  91. } else {
  92. $("iframe").each(function() {
  93. var co = $(this).offset({ border: false });
  94. $("<div class='DragDropIframeFix' style='background: #fff;'></div>").css("width", this.offsetWidth+"px").css("height", this.offsetHeight+"px").css("position", "absolute").css("opacity", "0.001").css("z-index", "1000").css("top", co.top+"px").css("left", co.left+"px").appendTo("body");
  95. });
  96. }
  97. }
  98. });
  99. $.ui.plugin.add("draggable","stop", "iframeFix", function(e,ui) {
  100. if(ui.options.iframeFix) $("div.DragDropIframeFix").each(function() { this.parentNode.removeChild(this); }); //Remove frame helpers
  101. });
  102. //----------------------------------------------------------------
  103. $.ui.plugin.add("draggable", "start", "containment", function(e,ui) {
  104. var o = ui.options;
  105. if(!o.cursorAtIgnore || o.containment.left != undefined || o.containment.constructor == Array) return;
  106. if(o.containment == 'parent') o.containment = this.parentNode;
  107. if(o.containment == 'document') {
  108. o.containment = [
  109. 0-o.margins.left,
  110. 0-o.margins.top,
  111. $(document).width()-o.margins.right,
  112. ($(document).height() || document.body.parentNode.scrollHeight)-o.margins.bottom
  113. ];
  114. } else { //I'm a node, so compute top/left/right/bottom
  115. var ce = $(o.containment)[0];
  116. var co = $(o.containment).offset({ border: false });
  117. o.containment = [
  118. co.left-o.margins.left,
  119. co.top-o.margins.top,
  120. co.left+(ce.offsetWidth || ce.scrollWidth)-o.margins.right,
  121. co.top+(ce.offsetHeight || ce.scrollHeight)-o.margins.bottom
  122. ];
  123. }
  124. });
  125. $.ui.plugin.add("draggable", "drag", "containment", function(e,ui) {
  126. var o = ui.options;
  127. if(!o.cursorAtIgnore) return;
  128. var h = $(ui.helper);
  129. var c = o.containment;
  130. if(c.constructor == Array) {
  131. if((ui.draggable.pos[0] < c[0]-o.po.left)) ui.draggable.pos[0] = c[0]-o.po.left;
  132. if((ui.draggable.pos[1] < c[1]-o.po.top)) ui.draggable.pos[1] = c[1]-o.po.top;
  133. if(ui.draggable.pos[0]+h[0].offsetWidth > c[2]-o.po.left) ui.draggable.pos[0] = c[2]-o.po.left-h[0].offsetWidth;
  134. if(ui.draggable.pos[1]+h[0].offsetHeight > c[3]-o.po.top) ui.draggable.pos[1] = c[3]-o.po.top-h[0].offsetHeight;
  135. } else {
  136. if(c.left && (ui.draggable.pos[0] < c.left)) ui.draggable.pos[0] = c.left;
  137. if(c.top && (ui.draggable.pos[1] < c.top)) ui.draggable.pos[1] = c.top;
  138. var p = $(o.pp);
  139. if(c.right && ui.draggable.pos[0]+h[0].offsetWidth > p[0].offsetWidth-c.right) ui.draggable.pos[0] = (p[0].offsetWidth-c.right)-h[0].offsetWidth;
  140. if(c.bottom && ui.draggable.pos[1]+h[0].offsetHeight > p[0].offsetHeight-c.bottom) ui.draggable.pos[1] = (p[0].offsetHeight-c.bottom)-h[0].offsetHeight;
  141. }
  142. });
  143. //----------------------------------------------------------------
  144. $.ui.plugin.add("draggable", "drag", "grid", function(e,ui) {
  145. var o = ui.options;
  146. if(!o.cursorAtIgnore) return;
  147. ui.draggable.pos[0] = o.co.left + o.margins.left - o.po.left + Math.round((ui.draggable.pos[0] - o.co.left - o.margins.left + o.po.left) / o.grid[0]) * o.grid[0];
  148. ui.draggable.pos[1] = o.co.top + o.margins.top - o.po.top + Math.round((ui.draggable.pos[1] - o.co.top - o.margins.top + o.po.top) / o.grid[1]) * o.grid[1];
  149. });
  150. //----------------------------------------------------------------
  151. $.ui.plugin.add("draggable", "drag", "axis", function(e,ui) {
  152. var o = ui.options;
  153. if(!o.cursorAtIgnore) return;
  154. if(o.constraint) o.axis = o.constraint; //Legacy check
  155. o.axis ? ( o.axis == 'x' ? ui.draggable.pos[1] = o.co.top - o.margins.top - o.po.top : ui.draggable.pos[0] = o.co.left - o.margins.left - o.po.left ) : null;
  156. });
  157. //----------------------------------------------------------------
  158. $.ui.plugin.add("draggable", "drag", "scroll", function(e,ui) {
  159. var o = ui.options;
  160. o.scrollSensitivity = o.scrollSensitivity || 20;
  161. o.scrollSpeed = o.scrollSpeed || 20;
  162. if(o.pp && o.ppOverflow) { // If we have a positioned parent, we only scroll in this one
  163. // TODO: Extremely strange issues are waiting here..handle with care
  164. } else {
  165. if((ui.draggable.rpos[1] - $(window).height()) - $(document).scrollTop() > -o.scrollSensitivity) window.scrollBy(0,o.scrollSpeed);
  166. if(ui.draggable.rpos[1] - $(document).scrollTop() < o.scrollSensitivity) window.scrollBy(0,-o.scrollSpeed);
  167. if((ui.draggable.rpos[0] - $(window).width()) - $(document).scrollLeft() > -o.scrollSensitivity) window.scrollBy(o.scrollSpeed,0);
  168. if(ui.draggable.rpos[0] - $(document).scrollLeft() < o.scrollSensitivity) window.scrollBy(-o.scrollSpeed,0);
  169. }
  170. });
  171. //----------------------------------------------------------------
  172. $.ui.plugin.add("draggable", "drag", "wrapHelper", function(e,ui) {
  173. var o = ui.options;
  174. if(o.cursorAtIgnore) return;
  175. var t = ui.helper;
  176. if(!o.pp || !o.ppOverflow) {
  177. var wx = $(window).width() - ($.browser.mozilla ? 20 : 0);
  178. var sx = $(document).scrollLeft();
  179. var wy = $(window).height();
  180. var sy = $(document).scrollTop();
  181. } else {
  182. var wx = o.pp.offsetWidth + o.po.left - 20;
  183. var sx = o.pp.scrollLeft;
  184. var wy = o.pp.offsetHeight + o.po.top - 20;
  185. var sy = o.pp.scrollTop;
  186. }
  187. ui.draggable.pos[0] -= ((ui.draggable.rpos[0]-o.cursorAt.left - wx + t.offsetWidth+o.margins.right) - sx > 0 || (ui.draggable.rpos[0]-o.cursorAt.left+o.margins.left) - sx < 0) ? (t.offsetWidth+o.margins.left+o.margins.right - o.cursorAt.left * 2) : 0;
  188. ui.draggable.pos[1] -= ((ui.draggable.rpos[1]-o.cursorAt.top - wy + t.offsetHeight+o.margins.bottom) - sy > 0 || (ui.draggable.rpos[1]-o.cursorAt.top+o.margins.top) - sy < 0) ? (t.offsetHeight+o.margins.top+o.margins.bottom - o.cursorAt.top * 2) : 0;
  189. });
  190. })(jQuery);