/[projects]/misc/horsensspejder-web/jquery/jquery-ui-1.10.3/ui/jquery.ui.draggable.js
ViewVC logotype

Contents of /misc/horsensspejder-web/jquery/jquery-ui-1.10.3/ui/jquery.ui.draggable.js

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2125 - (show annotations) (download) (as text)
Wed Mar 12 19:30:05 2014 UTC (10 years, 2 months ago) by torben
File MIME type: application/javascript
File size: 31352 byte(s)
initial import
1 /*!
2 * jQuery UI Draggable 1.10.3
3 * http://jqueryui.com
4 *
5 * Copyright 2013 jQuery Foundation and other contributors
6 * Released under the MIT license.
7 * http://jquery.org/license
8 *
9 * http://api.jqueryui.com/draggable/
10 *
11 * Depends:
12 * jquery.ui.core.js
13 * jquery.ui.mouse.js
14 * jquery.ui.widget.js
15 */
16 (function( $, undefined ) {
17
18 $.widget("ui.draggable", $.ui.mouse, {
19 version: "1.10.3",
20 widgetEventPrefix: "drag",
21 options: {
22 addClasses: true,
23 appendTo: "parent",
24 axis: false,
25 connectToSortable: false,
26 containment: false,
27 cursor: "auto",
28 cursorAt: false,
29 grid: false,
30 handle: false,
31 helper: "original",
32 iframeFix: false,
33 opacity: false,
34 refreshPositions: false,
35 revert: false,
36 revertDuration: 500,
37 scope: "default",
38 scroll: true,
39 scrollSensitivity: 20,
40 scrollSpeed: 20,
41 snap: false,
42 snapMode: "both",
43 snapTolerance: 20,
44 stack: false,
45 zIndex: false,
46
47 // callbacks
48 drag: null,
49 start: null,
50 stop: null
51 },
52 _create: function() {
53
54 if (this.options.helper === "original" && !(/^(?:r|a|f)/).test(this.element.css("position"))) {
55 this.element[0].style.position = "relative";
56 }
57 if (this.options.addClasses){
58 this.element.addClass("ui-draggable");
59 }
60 if (this.options.disabled){
61 this.element.addClass("ui-draggable-disabled");
62 }
63
64 this._mouseInit();
65
66 },
67
68 _destroy: function() {
69 this.element.removeClass( "ui-draggable ui-draggable-dragging ui-draggable-disabled" );
70 this._mouseDestroy();
71 },
72
73 _mouseCapture: function(event) {
74
75 var o = this.options;
76
77 // among others, prevent a drag on a resizable-handle
78 if (this.helper || o.disabled || $(event.target).closest(".ui-resizable-handle").length > 0) {
79 return false;
80 }
81
82 //Quit if we're not on a valid handle
83 this.handle = this._getHandle(event);
84 if (!this.handle) {
85 return false;
86 }
87
88 $(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() {
89 $("<div class='ui-draggable-iframeFix' style='background: #fff;'></div>")
90 .css({
91 width: this.offsetWidth+"px", height: this.offsetHeight+"px",
92 position: "absolute", opacity: "0.001", zIndex: 1000
93 })
94 .css($(this).offset())
95 .appendTo("body");
96 });
97
98 return true;
99
100 },
101
102 _mouseStart: function(event) {
103
104 var o = this.options;
105
106 //Create and append the visible helper
107 this.helper = this._createHelper(event);
108
109 this.helper.addClass("ui-draggable-dragging");
110
111 //Cache the helper size
112 this._cacheHelperProportions();
113
114 //If ddmanager is used for droppables, set the global draggable
115 if($.ui.ddmanager) {
116 $.ui.ddmanager.current = this;
117 }
118
119 /*
120 * - Position generation -
121 * This block generates everything position related - it's the core of draggables.
122 */
123
124 //Cache the margins of the original element
125 this._cacheMargins();
126
127 //Store the helper's css position
128 this.cssPosition = this.helper.css( "position" );
129 this.scrollParent = this.helper.scrollParent();
130 this.offsetParent = this.helper.offsetParent();
131 this.offsetParentCssPosition = this.offsetParent.css( "position" );
132
133 //The element's absolute position on the page minus margins
134 this.offset = this.positionAbs = this.element.offset();
135 this.offset = {
136 top: this.offset.top - this.margins.top,
137 left: this.offset.left - this.margins.left
138 };
139
140 //Reset scroll cache
141 this.offset.scroll = false;
142
143 $.extend(this.offset, {
144 click: { //Where the click happened, relative to the element
145 left: event.pageX - this.offset.left,
146 top: event.pageY - this.offset.top
147 },
148 parent: this._getParentOffset(),
149 relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
150 });
151
152 //Generate the original position
153 this.originalPosition = this.position = this._generatePosition(event);
154 this.originalPageX = event.pageX;
155 this.originalPageY = event.pageY;
156
157 //Adjust the mouse offset relative to the helper if "cursorAt" is supplied
158 (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
159
160 //Set a containment if given in the options
161 this._setContainment();
162
163 //Trigger event + callbacks
164 if(this._trigger("start", event) === false) {
165 this._clear();
166 return false;
167 }
168
169 //Recache the helper size
170 this._cacheHelperProportions();
171
172 //Prepare the droppable offsets
173 if ($.ui.ddmanager && !o.dropBehaviour) {
174 $.ui.ddmanager.prepareOffsets(this, event);
175 }
176
177
178 this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
179
180 //If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003)
181 if ( $.ui.ddmanager ) {
182 $.ui.ddmanager.dragStart(this, event);
183 }
184
185 return true;
186 },
187
188 _mouseDrag: function(event, noPropagation) {
189 // reset any necessary cached properties (see #5009)
190 if ( this.offsetParentCssPosition === "fixed" ) {
191 this.offset.parent = this._getParentOffset();
192 }
193
194 //Compute the helpers position
195 this.position = this._generatePosition(event);
196 this.positionAbs = this._convertPositionTo("absolute");
197
198 //Call plugins and callbacks and use the resulting position if something is returned
199 if (!noPropagation) {
200 var ui = this._uiHash();
201 if(this._trigger("drag", event, ui) === false) {
202 this._mouseUp({});
203 return false;
204 }
205 this.position = ui.position;
206 }
207
208 if(!this.options.axis || this.options.axis !== "y") {
209 this.helper[0].style.left = this.position.left+"px";
210 }
211 if(!this.options.axis || this.options.axis !== "x") {
212 this.helper[0].style.top = this.position.top+"px";
213 }
214 if($.ui.ddmanager) {
215 $.ui.ddmanager.drag(this, event);
216 }
217
218 return false;
219 },
220
221 _mouseStop: function(event) {
222
223 //If we are using droppables, inform the manager about the drop
224 var that = this,
225 dropped = false;
226 if ($.ui.ddmanager && !this.options.dropBehaviour) {
227 dropped = $.ui.ddmanager.drop(this, event);
228 }
229
230 //if a drop comes from outside (a sortable)
231 if(this.dropped) {
232 dropped = this.dropped;
233 this.dropped = false;
234 }
235
236 //if the original element is no longer in the DOM don't bother to continue (see #8269)
237 if ( this.options.helper === "original" && !$.contains( this.element[ 0 ].ownerDocument, this.element[ 0 ] ) ) {
238 return false;
239 }
240
241 if((this.options.revert === "invalid" && !dropped) || (this.options.revert === "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {
242 $(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {
243 if(that._trigger("stop", event) !== false) {
244 that._clear();
245 }
246 });
247 } else {
248 if(this._trigger("stop", event) !== false) {
249 this._clear();
250 }
251 }
252
253 return false;
254 },
255
256 _mouseUp: function(event) {
257 //Remove frame helpers
258 $("div.ui-draggable-iframeFix").each(function() {
259 this.parentNode.removeChild(this);
260 });
261
262 //If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003)
263 if( $.ui.ddmanager ) {
264 $.ui.ddmanager.dragStop(this, event);
265 }
266
267 return $.ui.mouse.prototype._mouseUp.call(this, event);
268 },
269
270 cancel: function() {
271
272 if(this.helper.is(".ui-draggable-dragging")) {
273 this._mouseUp({});
274 } else {
275 this._clear();
276 }
277
278 return this;
279
280 },
281
282 _getHandle: function(event) {
283 return this.options.handle ?
284 !!$( event.target ).closest( this.element.find( this.options.handle ) ).length :
285 true;
286 },
287
288 _createHelper: function(event) {
289
290 var o = this.options,
291 helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper === "clone" ? this.element.clone().removeAttr("id") : this.element);
292
293 if(!helper.parents("body").length) {
294 helper.appendTo((o.appendTo === "parent" ? this.element[0].parentNode : o.appendTo));
295 }
296
297 if(helper[0] !== this.element[0] && !(/(fixed|absolute)/).test(helper.css("position"))) {
298 helper.css("position", "absolute");
299 }
300
301 return helper;
302
303 },
304
305 _adjustOffsetFromHelper: function(obj) {
306 if (typeof obj === "string") {
307 obj = obj.split(" ");
308 }
309 if ($.isArray(obj)) {
310 obj = {left: +obj[0], top: +obj[1] || 0};
311 }
312 if ("left" in obj) {
313 this.offset.click.left = obj.left + this.margins.left;
314 }
315 if ("right" in obj) {
316 this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
317 }
318 if ("top" in obj) {
319 this.offset.click.top = obj.top + this.margins.top;
320 }
321 if ("bottom" in obj) {
322 this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
323 }
324 },
325
326 _getParentOffset: function() {
327
328 //Get the offsetParent and cache its position
329 var po = this.offsetParent.offset();
330
331 // This is a special case where we need to modify a offset calculated on start, since the following happened:
332 // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
333 // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
334 // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
335 if(this.cssPosition === "absolute" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
336 po.left += this.scrollParent.scrollLeft();
337 po.top += this.scrollParent.scrollTop();
338 }
339
340 //This needs to be actually done for all browsers, since pageX/pageY includes this information
341 //Ugly IE fix
342 if((this.offsetParent[0] === document.body) ||
343 (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() === "html" && $.ui.ie)) {
344 po = { top: 0, left: 0 };
345 }
346
347 return {
348 top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
349 left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
350 };
351
352 },
353
354 _getRelativeOffset: function() {
355
356 if(this.cssPosition === "relative") {
357 var p = this.element.position();
358 return {
359 top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
360 left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
361 };
362 } else {
363 return { top: 0, left: 0 };
364 }
365
366 },
367
368 _cacheMargins: function() {
369 this.margins = {
370 left: (parseInt(this.element.css("marginLeft"),10) || 0),
371 top: (parseInt(this.element.css("marginTop"),10) || 0),
372 right: (parseInt(this.element.css("marginRight"),10) || 0),
373 bottom: (parseInt(this.element.css("marginBottom"),10) || 0)
374 };
375 },
376
377 _cacheHelperProportions: function() {
378 this.helperProportions = {
379 width: this.helper.outerWidth(),
380 height: this.helper.outerHeight()
381 };
382 },
383
384 _setContainment: function() {
385
386 var over, c, ce,
387 o = this.options;
388
389 if ( !o.containment ) {
390 this.containment = null;
391 return;
392 }
393
394 if ( o.containment === "window" ) {
395 this.containment = [
396 $( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
397 $( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top,
398 $( window ).scrollLeft() + $( window ).width() - this.helperProportions.width - this.margins.left,
399 $( window ).scrollTop() + ( $( window ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top
400 ];
401 return;
402 }
403
404 if ( o.containment === "document") {
405 this.containment = [
406 0,
407 0,
408 $( document ).width() - this.helperProportions.width - this.margins.left,
409 ( $( document ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top
410 ];
411 return;
412 }
413
414 if ( o.containment.constructor === Array ) {
415 this.containment = o.containment;
416 return;
417 }
418
419 if ( o.containment === "parent" ) {
420 o.containment = this.helper[ 0 ].parentNode;
421 }
422
423 c = $( o.containment );
424 ce = c[ 0 ];
425
426 if( !ce ) {
427 return;
428 }
429
430 over = c.css( "overflow" ) !== "hidden";
431
432 this.containment = [
433 ( parseInt( c.css( "borderLeftWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingLeft" ), 10 ) || 0 ),
434 ( parseInt( c.css( "borderTopWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingTop" ), 10 ) || 0 ) ,
435 ( over ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) - ( parseInt( c.css( "borderRightWidth" ), 10 ) || 0 ) - ( parseInt( c.css( "paddingRight" ), 10 ) || 0 ) - this.helperProportions.width - this.margins.left - this.margins.right,
436 ( over ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) - ( parseInt( c.css( "borderBottomWidth" ), 10 ) || 0 ) - ( parseInt( c.css( "paddingBottom" ), 10 ) || 0 ) - this.helperProportions.height - this.margins.top - this.margins.bottom
437 ];
438 this.relative_container = c;
439 },
440
441 _convertPositionTo: function(d, pos) {
442
443 if(!pos) {
444 pos = this.position;
445 }
446
447 var mod = d === "absolute" ? 1 : -1,
448 scroll = this.cssPosition === "absolute" && !( this.scrollParent[ 0 ] !== document && $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ? this.offsetParent : this.scrollParent;
449
450 //Cache the scroll
451 if (!this.offset.scroll) {
452 this.offset.scroll = {top : scroll.scrollTop(), left : scroll.scrollLeft()};
453 }
454
455 return {
456 top: (
457 pos.top + // The absolute mouse position
458 this.offset.relative.top * mod + // Only for relative positioned nodes: Relative offset from element to offset parent
459 this.offset.parent.top * mod - // The offsetParent's offset without borders (offset + border)
460 ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : this.offset.scroll.top ) * mod )
461 ),
462 left: (
463 pos.left + // The absolute mouse position
464 this.offset.relative.left * mod + // Only for relative positioned nodes: Relative offset from element to offset parent
465 this.offset.parent.left * mod - // The offsetParent's offset without borders (offset + border)
466 ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : this.offset.scroll.left ) * mod )
467 )
468 };
469
470 },
471
472 _generatePosition: function(event) {
473
474 var containment, co, top, left,
475 o = this.options,
476 scroll = this.cssPosition === "absolute" && !( this.scrollParent[ 0 ] !== document && $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ? this.offsetParent : this.scrollParent,
477 pageX = event.pageX,
478 pageY = event.pageY;
479
480 //Cache the scroll
481 if (!this.offset.scroll) {
482 this.offset.scroll = {top : scroll.scrollTop(), left : scroll.scrollLeft()};
483 }
484
485 /*
486 * - Position constraining -
487 * Constrain the position to a mix of grid, containment.
488 */
489
490 // If we are not dragging yet, we won't check for options
491 if ( this.originalPosition ) {
492 if ( this.containment ) {
493 if ( this.relative_container ){
494 co = this.relative_container.offset();
495 containment = [
496 this.containment[ 0 ] + co.left,
497 this.containment[ 1 ] + co.top,
498 this.containment[ 2 ] + co.left,
499 this.containment[ 3 ] + co.top
500 ];
501 }
502 else {
503 containment = this.containment;
504 }
505
506 if(event.pageX - this.offset.click.left < containment[0]) {
507 pageX = containment[0] + this.offset.click.left;
508 }
509 if(event.pageY - this.offset.click.top < containment[1]) {
510 pageY = containment[1] + this.offset.click.top;
511 }
512 if(event.pageX - this.offset.click.left > containment[2]) {
513 pageX = containment[2] + this.offset.click.left;
514 }
515 if(event.pageY - this.offset.click.top > containment[3]) {
516 pageY = containment[3] + this.offset.click.top;
517 }
518 }
519
520 if(o.grid) {
521 //Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950)
522 top = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY;
523 pageY = containment ? ((top - this.offset.click.top >= containment[1] || top - this.offset.click.top > containment[3]) ? top : ((top - this.offset.click.top >= containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
524
525 left = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX;
526 pageX = containment ? ((left - this.offset.click.left >= containment[0] || left - this.offset.click.left > containment[2]) ? left : ((left - this.offset.click.left >= containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
527 }
528
529 }
530
531 return {
532 top: (
533 pageY - // The absolute mouse position
534 this.offset.click.top - // Click offset (relative to the element)
535 this.offset.relative.top - // Only for relative positioned nodes: Relative offset from element to offset parent
536 this.offset.parent.top + // The offsetParent's offset without borders (offset + border)
537 ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : this.offset.scroll.top )
538 ),
539 left: (
540 pageX - // The absolute mouse position
541 this.offset.click.left - // Click offset (relative to the element)
542 this.offset.relative.left - // Only for relative positioned nodes: Relative offset from element to offset parent
543 this.offset.parent.left + // The offsetParent's offset without borders (offset + border)
544 ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : this.offset.scroll.left )
545 )
546 };
547
548 },
549
550 _clear: function() {
551 this.helper.removeClass("ui-draggable-dragging");
552 if(this.helper[0] !== this.element[0] && !this.cancelHelperRemoval) {
553 this.helper.remove();
554 }
555 this.helper = null;
556 this.cancelHelperRemoval = false;
557 },
558
559 // From now on bulk stuff - mainly helpers
560
561 _trigger: function(type, event, ui) {
562 ui = ui || this._uiHash();
563 $.ui.plugin.call(this, type, [event, ui]);
564 //The absolute position has to be recalculated after plugins
565 if(type === "drag") {
566 this.positionAbs = this._convertPositionTo("absolute");
567 }
568 return $.Widget.prototype._trigger.call(this, type, event, ui);
569 },
570
571 plugins: {},
572
573 _uiHash: function() {
574 return {
575 helper: this.helper,
576 position: this.position,
577 originalPosition: this.originalPosition,
578 offset: this.positionAbs
579 };
580 }
581
582 });
583
584 $.ui.plugin.add("draggable", "connectToSortable", {
585 start: function(event, ui) {
586
587 var inst = $(this).data("ui-draggable"), o = inst.options,
588 uiSortable = $.extend({}, ui, { item: inst.element });
589 inst.sortables = [];
590 $(o.connectToSortable).each(function() {
591 var sortable = $.data(this, "ui-sortable");
592 if (sortable && !sortable.options.disabled) {
593 inst.sortables.push({
594 instance: sortable,
595 shouldRevert: sortable.options.revert
596 });
597 sortable.refreshPositions(); // Call the sortable's refreshPositions at drag start to refresh the containerCache since the sortable container cache is used in drag and needs to be up to date (this will ensure it's initialised as well as being kept in step with any changes that might have happened on the page).
598 sortable._trigger("activate", event, uiSortable);
599 }
600 });
601
602 },
603 stop: function(event, ui) {
604
605 //If we are still over the sortable, we fake the stop event of the sortable, but also remove helper
606 var inst = $(this).data("ui-draggable"),
607 uiSortable = $.extend({}, ui, { item: inst.element });
608
609 $.each(inst.sortables, function() {
610 if(this.instance.isOver) {
611
612 this.instance.isOver = 0;
613
614 inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance
615 this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work)
616
617 //The sortable revert is supported, and we have to set a temporary dropped variable on the draggable to support revert: "valid/invalid"
618 if(this.shouldRevert) {
619 this.instance.options.revert = this.shouldRevert;
620 }
621
622 //Trigger the stop of the sortable
623 this.instance._mouseStop(event);
624
625 this.instance.options.helper = this.instance.options._helper;
626
627 //If the helper has been the original item, restore properties in the sortable
628 if(inst.options.helper === "original") {
629 this.instance.currentItem.css({ top: "auto", left: "auto" });
630 }
631
632 } else {
633 this.instance.cancelHelperRemoval = false; //Remove the helper in the sortable instance
634 this.instance._trigger("deactivate", event, uiSortable);
635 }
636
637 });
638
639 },
640 drag: function(event, ui) {
641
642 var inst = $(this).data("ui-draggable"), that = this;
643
644 $.each(inst.sortables, function() {
645
646 var innermostIntersecting = false,
647 thisSortable = this;
648
649 //Copy over some variables to allow calling the sortable's native _intersectsWith
650 this.instance.positionAbs = inst.positionAbs;
651 this.instance.helperProportions = inst.helperProportions;
652 this.instance.offset.click = inst.offset.click;
653
654 if(this.instance._intersectsWith(this.instance.containerCache)) {
655 innermostIntersecting = true;
656 $.each(inst.sortables, function () {
657 this.instance.positionAbs = inst.positionAbs;
658 this.instance.helperProportions = inst.helperProportions;
659 this.instance.offset.click = inst.offset.click;
660 if (this !== thisSortable &&
661 this.instance._intersectsWith(this.instance.containerCache) &&
662 $.contains(thisSortable.instance.element[0], this.instance.element[0])
663 ) {
664 innermostIntersecting = false;
665 }
666 return innermostIntersecting;
667 });
668 }
669
670
671 if(innermostIntersecting) {
672 //If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once
673 if(!this.instance.isOver) {
674
675 this.instance.isOver = 1;
676 //Now we fake the start of dragging for the sortable instance,
677 //by cloning the list group item, appending it to the sortable and using it as inst.currentItem
678 //We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one)
679 this.instance.currentItem = $(that).clone().removeAttr("id").appendTo(this.instance.element).data("ui-sortable-item", true);
680 this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it
681 this.instance.options.helper = function() { return ui.helper[0]; };
682
683 event.target = this.instance.currentItem[0];
684 this.instance._mouseCapture(event, true);
685 this.instance._mouseStart(event, true, true);
686
687 //Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes
688 this.instance.offset.click.top = inst.offset.click.top;
689 this.instance.offset.click.left = inst.offset.click.left;
690 this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left;
691 this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top;
692
693 inst._trigger("toSortable", event);
694 inst.dropped = this.instance.element; //draggable revert needs that
695 //hack so receive/update callbacks work (mostly)
696 inst.currentItem = inst.element;
697 this.instance.fromOutside = inst;
698
699 }
700
701 //Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable
702 if(this.instance.currentItem) {
703 this.instance._mouseDrag(event);
704 }
705
706 } else {
707
708 //If it doesn't intersect with the sortable, and it intersected before,
709 //we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval
710 if(this.instance.isOver) {
711
712 this.instance.isOver = 0;
713 this.instance.cancelHelperRemoval = true;
714
715 //Prevent reverting on this forced stop
716 this.instance.options.revert = false;
717
718 // The out event needs to be triggered independently
719 this.instance._trigger("out", event, this.instance._uiHash(this.instance));
720
721 this.instance._mouseStop(event, true);
722 this.instance.options.helper = this.instance.options._helper;
723
724 //Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size
725 this.instance.currentItem.remove();
726 if(this.instance.placeholder) {
727 this.instance.placeholder.remove();
728 }
729
730 inst._trigger("fromSortable", event);
731 inst.dropped = false; //draggable revert needs that
732 }
733
734 }
735
736 });
737
738 }
739 });
740
741 $.ui.plugin.add("draggable", "cursor", {
742 start: function() {
743 var t = $("body"), o = $(this).data("ui-draggable").options;
744 if (t.css("cursor")) {
745 o._cursor = t.css("cursor");
746 }
747 t.css("cursor", o.cursor);
748 },
749 stop: function() {
750 var o = $(this).data("ui-draggable").options;
751 if (o._cursor) {
752 $("body").css("cursor", o._cursor);
753 }
754 }
755 });
756
757 $.ui.plugin.add("draggable", "opacity", {
758 start: function(event, ui) {
759 var t = $(ui.helper), o = $(this).data("ui-draggable").options;
760 if(t.css("opacity")) {
761 o._opacity = t.css("opacity");
762 }
763 t.css("opacity", o.opacity);
764 },
765 stop: function(event, ui) {
766 var o = $(this).data("ui-draggable").options;
767 if(o._opacity) {
768 $(ui.helper).css("opacity", o._opacity);
769 }
770 }
771 });
772
773 $.ui.plugin.add("draggable", "scroll", {
774 start: function() {
775 var i = $(this).data("ui-draggable");
776 if(i.scrollParent[0] !== document && i.scrollParent[0].tagName !== "HTML") {
777 i.overflowOffset = i.scrollParent.offset();
778 }
779 },
780 drag: function( event ) {
781
782 var i = $(this).data("ui-draggable"), o = i.options, scrolled = false;
783
784 if(i.scrollParent[0] !== document && i.scrollParent[0].tagName !== "HTML") {
785
786 if(!o.axis || o.axis !== "x") {
787 if((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) {
788 i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed;
789 } else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity) {
790 i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed;
791 }
792 }
793
794 if(!o.axis || o.axis !== "y") {
795 if((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) {
796 i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed;
797 } else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity) {
798 i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed;
799 }
800 }
801
802 } else {
803
804 if(!o.axis || o.axis !== "x") {
805 if(event.pageY - $(document).scrollTop() < o.scrollSensitivity) {
806 scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
807 } else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) {
808 scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
809 }
810 }
811
812 if(!o.axis || o.axis !== "y") {
813 if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity) {
814 scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
815 } else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) {
816 scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
817 }
818 }
819
820 }
821
822 if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {
823 $.ui.ddmanager.prepareOffsets(i, event);
824 }
825
826 }
827 });
828
829 $.ui.plugin.add("draggable", "snap", {
830 start: function() {
831
832 var i = $(this).data("ui-draggable"),
833 o = i.options;
834
835 i.snapElements = [];
836
837 $(o.snap.constructor !== String ? ( o.snap.items || ":data(ui-draggable)" ) : o.snap).each(function() {
838 var $t = $(this),
839 $o = $t.offset();
840 if(this !== i.element[0]) {
841 i.snapElements.push({
842 item: this,
843 width: $t.outerWidth(), height: $t.outerHeight(),
844 top: $o.top, left: $o.left
845 });
846 }
847 });
848
849 },
850 drag: function(event, ui) {
851
852 var ts, bs, ls, rs, l, r, t, b, i, first,
853 inst = $(this).data("ui-draggable"),
854 o = inst.options,
855 d = o.snapTolerance,
856 x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
857 y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
858
859 for (i = inst.snapElements.length - 1; i >= 0; i--){
860
861 l = inst.snapElements[i].left;
862 r = l + inst.snapElements[i].width;
863 t = inst.snapElements[i].top;
864 b = t + inst.snapElements[i].height;
865
866 if ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d || !$.contains( inst.snapElements[ i ].item.ownerDocument, inst.snapElements[ i ].item ) ) {
867 if(inst.snapElements[i].snapping) {
868 (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
869 }
870 inst.snapElements[i].snapping = false;
871 continue;
872 }
873
874 if(o.snapMode !== "inner") {
875 ts = Math.abs(t - y2) <= d;
876 bs = Math.abs(b - y1) <= d;
877 ls = Math.abs(l - x2) <= d;
878 rs = Math.abs(r - x1) <= d;
879 if(ts) {
880 ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
881 }
882 if(bs) {
883 ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top - inst.margins.top;
884 }
885 if(ls) {
886 ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left - inst.margins.left;
887 }
888 if(rs) {
889 ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left - inst.margins.left;
890 }
891 }
892
893 first = (ts || bs || ls || rs);
894
895 if(o.snapMode !== "outer") {
896 ts = Math.abs(t - y1) <= d;
897 bs = Math.abs(b - y2) <= d;
898 ls = Math.abs(l - x1) <= d;
899 rs = Math.abs(r - x2) <= d;
900 if(ts) {
901 ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top - inst.margins.top;
902 }
903 if(bs) {
904 ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
905 }
906 if(ls) {
907 ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left - inst.margins.left;
908 }
909 if(rs) {
910 ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left - inst.margins.left;
911 }
912 }
913
914 if(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first)) {
915 (inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
916 }
917 inst.snapElements[i].snapping = (ts || bs || ls || rs || first);
918
919 }
920
921 }
922 });
923
924 $.ui.plugin.add("draggable", "stack", {
925 start: function() {
926 var min,
927 o = this.data("ui-draggable").options,
928 group = $.makeArray($(o.stack)).sort(function(a,b) {
929 return (parseInt($(a).css("zIndex"),10) || 0) - (parseInt($(b).css("zIndex"),10) || 0);
930 });
931
932 if (!group.length) { return; }
933
934 min = parseInt($(group[0]).css("zIndex"), 10) || 0;
935 $(group).each(function(i) {
936 $(this).css("zIndex", min + i);
937 });
938 this.css("zIndex", (min + group.length));
939 }
940 });
941
942 $.ui.plugin.add("draggable", "zIndex", {
943 start: function(event, ui) {
944 var t = $(ui.helper), o = $(this).data("ui-draggable").options;
945 if(t.css("zIndex")) {
946 o._zIndex = t.css("zIndex");
947 }
948 t.css("zIndex", o.zIndex);
949 },
950 stop: function(event, ui) {
951 var o = $(this).data("ui-draggable").options;
952 if(o._zIndex) {
953 $(ui.helper).css("zIndex", o._zIndex);
954 }
955 }
956 });
957
958 })(jQuery);

  ViewVC Help
Powered by ViewVC 1.1.20