3 //Make nodes selectable by expression
\r
4 $.extend($.expr[':'], { draggable: "(' '+a.className+' ').indexOf(' ui-draggable ')" });
\r
7 //Macros for external methods that support chaining
\r
8 var methods = "destroy,enable,disable".split(",");
\r
9 for(var i=0;i<methods.length;i++) {
\r
10 var cur = methods[i], f;
\r
11 eval('f = function() { var a = arguments; return this.each(function() { if(jQuery(this).is(".ui-draggable")) jQuery.data(this, "ui-draggable")["'+cur+'"](a); }); }');
\r
12 $.fn["draggable"+cur.substr(0,1).toUpperCase()+cur.substr(1)] = f;
\r
15 //get instance method
\r
16 $.fn.draggableInstance = function() {
\r
17 if($(this[0]).is(".ui-draggable")) return $.data(this[0], "ui-draggable");
\r
21 $.fn.draggable = function(o) {
\r
22 return this.each(function() {
\r
23 new $.ui.draggable(this, o);
\r
30 prepareOffsets: function(t, e) {
\r
31 var dropTop = $.ui.ddmanager.dropTop = [];
\r
32 var dropLeft = $.ui.ddmanager.dropLeft;
\r
33 var m = $.ui.ddmanager.droppables;
\r
34 for (var i = 0; i < m.length; i++) {
\r
35 if(m[i].item.disabled) continue;
\r
36 m[i].offset = $(m[i].item.element).offset();
\r
37 if (t && m[i].item.options.accept(t.element)) //Activate the droppable if used directly from draggables
\r
38 m[i].item.activate.call(m[i].item, e);
\r
41 fire: function(oDrag, e) {
\r
43 var oDrops = $.ui.ddmanager.droppables;
\r
44 var oOvers = $.grep(oDrops, function(oDrop) {
\r
46 if (!oDrop.item.disabled && $.ui.intersect(oDrag, oDrop, oDrop.item.options.tolerance))
\r
47 oDrop.item.drop.call(oDrop.item, e);
\r
49 $.each(oDrops, function(i, oDrop) {
\r
50 if (!oDrop.item.disabled && oDrop.item.options.accept(oDrag.element)) {
\r
51 oDrop.out = 1; oDrop.over = 0;
\r
52 oDrop.item.deactivate.call(oDrop.item, e);
\r
56 update: function(oDrag, e) {
\r
58 if(oDrag.options.refreshPositions) $.ui.ddmanager.prepareOffsets();
\r
60 var oDrops = $.ui.ddmanager.droppables;
\r
61 var oOvers = $.grep(oDrops, function(oDrop) {
\r
62 if(oDrop.item.disabled) return false;
\r
63 var isOver = $.ui.intersect(oDrag, oDrop, oDrop.item.options.tolerance)
\r
64 if (!isOver && oDrop.over == 1) {
\r
65 oDrop.out = 1; oDrop.over = 0;
\r
66 oDrop.item.out.call(oDrop.item, e);
\r
70 $.each(oOvers, function(i, oOver) {
\r
71 if (oOver.over == 0) {
\r
72 oOver.out = 0; oOver.over = 1;
\r
73 oOver.item.over.call(oOver.item, e);
\r
79 $.ui.draggable = function(el, o) {
\r
82 $.extend(options, o);
\r
85 _start: function(h, p, c, t, e) {
\r
86 self.start.apply(t, [self, e]); // Trigger the start callback
\r
88 _beforeStop: function(h, p, c, t, e) {
\r
89 self.stop.apply(t, [self, e]); // Trigger the start callback
\r
91 _drag: function(h, p, c, t, e) {
\r
92 self.drag.apply(t, [self, e]); // Trigger the start callback
\r
94 startCondition: function(e) {
\r
95 return !(e.target.className.indexOf("ui-resizable-handle") != -1 || self.disabled);
\r
99 $.data(el, "ui-draggable", this);
\r
101 if (options.ghosting == true) options.helper = 'clone'; //legacy option check
\r
102 $(el).addClass("ui-draggable");
\r
103 this.interaction = new $.ui.mouseInteraction(el, options);
\r
107 $.extend($.ui.draggable.prototype, {
\r
109 currentTarget: null,
\r
111 destroy: function() {
\r
112 $(this.interaction.element).removeClass("ui-draggable").removeClass("ui-draggable-disabled");
\r
113 this.interaction.destroy();
\r
115 enable: function() {
\r
116 $(this.interaction.element).removeClass("ui-draggable-disabled");
\r
117 this.disabled = false;
\r
119 disable: function() {
\r
120 $(this.interaction.element).addClass("ui-draggable-disabled");
\r
121 this.disabled = true;
\r
123 prepareCallbackObj: function(self) {
\r
125 helper: self.helper,
\r
126 position: { left: self.pos[0], top: self.pos[1] },
\r
127 offset: self.options.cursorAt,
\r
129 options: self.options
\r
132 start: function(that, e) {
\r
134 var o = this.options;
\r
135 $.ui.ddmanager.current = this;
\r
137 $.ui.plugin.call(that, 'start', [e, that.prepareCallbackObj(this)]);
\r
138 $(this.element).triggerHandler("dragstart", [e, that.prepareCallbackObj(this)], o.start);
\r
140 if (this.slowMode && $.ui.droppable && !o.dropBehaviour)
\r
141 $.ui.ddmanager.prepareOffsets(this, e);
\r
146 stop: function(that, e) {
\r
148 var o = this.options;
\r
150 $.ui.plugin.call(that, 'stop', [e, that.prepareCallbackObj(this)]);
\r
151 $(this.element).triggerHandler("dragstop", [e, that.prepareCallbackObj(this)], o.stop);
\r
153 if (this.slowMode && $.ui.droppable && !o.dropBehaviour) //If cursorAt is within the helper, we must use our drop manager
\r
154 $.ui.ddmanager.fire(this, e);
\r
156 $.ui.ddmanager.current = null;
\r
157 $.ui.ddmanager.last = this;
\r
162 drag: function(that, e) {
\r
164 var o = this.options;
\r
166 $.ui.ddmanager.update(this, e);
\r
168 this.pos = [this.pos[0]-o.cursorAt.left, this.pos[1]-o.cursorAt.top];
\r
170 $.ui.plugin.call(that, 'drag', [e, that.prepareCallbackObj(this)]);
\r
171 var nv = $(this.element).triggerHandler("drag", [e, that.prepareCallbackObj(this)], o.drag);
\r
173 var nl = (nv && nv.left) ? nv.left : this.pos[0];
\r
174 var nt = (nv && nv.top) ? nv.top : this.pos[1];
\r
176 $(this.helper).css('left', nl+'px').css('top', nt+'px'); // Stick the helper to the cursor
\r