ICAL: add conflict handling
[citadel.git] / webcit / static / ctdldragdrop.js
1 /** 
2  * Because scriptaculous DnD sucks..
3  * Written by Mathew McBride <matt@mcbridematt.dhs.org> / <matt@comalies>
4  * 
5  * Copyright 2009 The Citadel Team
6  * Licensed under the GPL V3
7  */
8 var draggedElement = null;
9 var currentDropTargets = null;
10 var dropTarget = null;
11 var dragAndDropElement = null;
12 var oldSelectHandler = null;
13 function mouseDownHandler(event) {
14   var target = event.target;
15   var actualTarget = target;
16   if (target.nodeName.toLowerCase() == "td") {
17     actualTarget = target.parentNode;
18   }
19   if (!actualTarget.dropEnabled && actualTarget.getAttribute("citadel:dropenabled") == null) {
20     return;
21   }
22   turnOffTextSelect();
23   draggedElement = actualTarget;
24   return false;
25 }
26 function mouseUpHandler(event) {
27   var target = event.target;
28   var dropped = dropTarget;
29   if (dragAndDropElement != null) {
30   if (dropped != null && dropped.dropHandler) {
31     dropped.dropHandler(dropped,draggedElement);
32   }
33   document.body.removeChild(dragAndDropElement);
34   }
35   dragAndDropElement = null;
36   draggedElement = null;
37   dropTarget = null;
38   turnOnTextSelect();
39   return true;
40 }
41 function mouseMoveHandler(event) {
42   if (draggedElement != null) {
43     if (dragAndDropElement == null) {
44       var dragAndDropElementFunction = (draggedElement.ctdlDnDElement) ? draggedElement.ctdlDndElement : eval(draggedElement.getAttribute("citadel:dndelement"));
45       dragAndDropElement = dragAndDropElementFunction.call();
46     dragAndDropElement.className = "draganddrop";
47     document.body.appendChild(dragAndDropElement);
48     }
49     var clientX = event.clientX+5;
50     var clientY = event.clientY+5;
51     dragAndDropElement.style.top = clientY + "px";
52     dragAndDropElement.style.left = clientX + "px";
53   }
54   return false;
55 }
56 function mouseMoveOver(event) {
57   if (event.target.dropTarget) {
58     dropTarget = event.target;
59   }
60 }
61 function mouseMoveOut(event) {
62   if (dropTarget) {
63     dropTarget = null;
64   }
65 }
66 function setupDragDrop() {
67   $(document.body).observe('mousedown', mouseDownHandler);
68     $(document.body).observe('mouseup',mouseUpHandler);
69     $(document.body).observe('mousemove',mouseMoveHandler);
70     $(document.body).observe('mouseover', mouseMoveOver);
71     $(document.body).observe('mouseout', mouseMoveOut); 
72 }
73 function turnOffTextSelect() {
74   document.onmousedown = new Function("return false");
75   document.onmouseup = new Function("return true");
76  oldSelectHandler = document.onselectstart;
77  document.onselectstart = function() { return false; };
78 }
79 function turnOnTextSelect() {
80   document.onmousedown = null;
81   document.onmouseup = null;
82   document.onselectstart = oldSelectHandler;
83 }