maio
[h2N7SspZmY.git] / lib / scripts / drag.js
blob4726b77de93f1cc264f7802c8de351e120849a23
1 /**
2 * Makes a DOM object draggable
4 * This is currently for movable DOM dialogs only. If needed it could be
5 * extended to execute callbacks on special events...
7 * @link http://nofunc.org/Drag_Drop/
8 */
9 var drag = {
10 obj: null,
11 handle: null,
12 oX: 0, // object X position
13 oY: 0, // object Y position
14 eX: 0, // event X delta
15 eY: 0, // event Y delta
17 /**
18 * Attaches the needed handlers to the given object
20 * This can be called for multiple objects, the right one is later
21 * determined from the event itself. The handle is optional
23 * @param DOMObject obj The object that should be draggable
24 * @param DOMObject handle A handle on which the obj can be dragged
26 attach: function (obj,handle) {
27 if(handle){
28 handle.dragobject = obj;
29 addEvent($(handle),'mousedown',drag.start);
30 }else{
31 addEvent($(obj),'mousedown',drag.start);
35 /**
36 * Starts the dragging operation
38 start: function (e){
39 drag.handle = e.target;
40 if(drag.handle.dragobject){
41 drag.obj = drag.handle.dragobject;
42 }else{
43 drag.obj = drag.handle;
46 drag.handle.className += ' ondrag';
47 drag.obj.className += ' ondrag';
49 drag.oX = parseInt(drag.obj.style.left);
50 drag.oY = parseInt(drag.obj.style.top);
51 drag.eX = drag.evX(e);
52 drag.eY = drag.evY(e);
54 addEvent(document,'mousemove',drag.drag);
55 addEvent(document,'mouseup',drag.stop);
57 e.preventDefault();
58 e.stopPropagation();
59 return false;
62 /**
63 * Ends the dragging operation
65 stop: function(){
66 drag.handle.className = drag.handle.className.replace(/ ?ondrag/,'');
67 drag.obj.className = drag.obj.className.replace(/ ?ondrag/,'');
68 removeEvent(document,'mousemove',drag.drag);
69 removeEvent(document,'mouseup',drag.stop);
70 drag.obj = null;
71 drag.handle = null;
74 /**
75 * Moves the object during the dragging operation
77 drag: function(e) {
78 if(drag.obj) {
79 drag.obj.style.top = (drag.evY(e)+drag.oY-drag.eY+'px');
80 drag.obj.style.left = (drag.evX(e)+drag.oX-drag.eX+'px');
84 /**
85 * Returns the X position of the given event.
87 evX: function(e){
88 return (e.pageX) ? e.pageX : e.clientX + document.body.scrollTop; //fixme shouldn't this be scrollLeft?
91 /**
92 * Returns the Y position of the given event.
94 evY: function(e){
95 return (e.pageY) ? e.pageY : e.clientY + document.body.scrollTop;