| rev | 
   line source | 
| 
jbe@945
 | 
     1 jsProtect(function() {
 | 
| 
bsw@519
 | 
     2   window.addEventListener("load", function(event) {
 | 
| 
jbe@945
 | 
     3     jsProtect(function() {
 | 
| 
jbe@945
 | 
     4       var originalElement;
 | 
| 
jbe@945
 | 
     5       var draggedElement;
 | 
| 
jbe@945
 | 
     6       var mouseX;
 | 
| 
jbe@945
 | 
     7       var mouseY;
 | 
| 
jbe@945
 | 
     8       var mouseOffsetX;
 | 
| 
jbe@945
 | 
     9       var mouseOffsetY;
 | 
| 
jbe@945
 | 
    10       var elementOffsetX;
 | 
| 
jbe@945
 | 
    11       var elementOffsetY;
 | 
| 
jbe@945
 | 
    12       var dropFunc;
 | 
| 
jbe@945
 | 
    13       var dragElement = function(element, func) {
 | 
| 
jbe@945
 | 
    14         //if (typeof(element) == "string") element = document.getElementById(element);
 | 
| 
jbe@945
 | 
    15         originalElement = element;
 | 
| 
jbe@945
 | 
    16         draggedElement = originalElement.cloneNode(true);
 | 
| 
jbe@945
 | 
    17         originalElement.style.visibility = "hidden";
 | 
| 
jbe@945
 | 
    18         draggedElement.style.margin = 0;
 | 
| 
jbe@945
 | 
    19         draggedElement.style.position = "absolute";
 | 
| 
jbe@945
 | 
    20         draggedElement.style.left = elementOffsetX = originalElement.offsetLeft;
 | 
| 
jbe@945
 | 
    21         draggedElement.style.top  = elementOffsetY = originalElement.offsetTop;
 | 
| 
jbe@945
 | 
    22         draggedElement.style.width  = originalElement.clientWidth;
 | 
| 
jbe@945
 | 
    23         draggedElement.style.height = originalElement.clientHeight;
 | 
| 
jbe@945
 | 
    24         draggedElement.style.backgroundColor = "#eee";
 | 
| 
jbe@945
 | 
    25         draggedElement.style.opacity = 0.8;
 | 
| 
jbe@945
 | 
    26         originalElement.offsetParent.appendChild(draggedElement);
 | 
| 
bsw/jbe@1309
 | 
    27         draggedElement.style.width = originalElement.clientWidth + "px";
 | 
| 
bsw/jbe@1309
 | 
    28         draggedElement.style.height = originalElement.clientHeight + "px";
 | 
| 
bsw/jbe@1309
 | 
    29         draggedElement.style.left = originalElement.offsetLeft + "px";
 | 
| 
bsw/jbe@1309
 | 
    30         draggedElement.style.top = originalElement.offsetTop + "px";
 | 
| 
jbe@945
 | 
    31         mouseOffsetX = mouseX;
 | 
| 
jbe@945
 | 
    32         mouseOffsetY = mouseY;
 | 
| 
jbe@945
 | 
    33         dropFunc = func;
 | 
| 
jbe@945
 | 
    34       };
 | 
| 
jbe@945
 | 
    35       window.addEventListener("mousemove", function(event) {
 | 
| 
jbe@945
 | 
    36         jsProtect(function() {
 | 
| 
jbe@945
 | 
    37           mouseX = event.pageX;
 | 
| 
jbe@945
 | 
    38           mouseY = event.pageY;
 | 
| 
jbe@945
 | 
    39           if (draggedElement) {
 | 
| 
bsw/jbe@1309
 | 
    40             draggedElement.style.left = elementOffsetX + mouseX - mouseOffsetX + "px";
 | 
| 
bsw/jbe@1309
 | 
    41             draggedElement.style.top  = elementOffsetY + mouseY - mouseOffsetY + "px";
 | 
| 
jbe@945
 | 
    42           }
 | 
| 
jbe@945
 | 
    43         });
 | 
| 
jbe@945
 | 
    44       }, true);
 | 
| 
jbe@945
 | 
    45       var mouseDrop = function(event) {
 | 
| 
jbe@945
 | 
    46         jsProtect(function() {
 | 
| 
jbe@945
 | 
    47           if (draggedElement) {
 | 
| 
jbe@945
 | 
    48             dropFunc(
 | 
| 
jbe@945
 | 
    49               originalElement,
 | 
| 
jbe@945
 | 
    50               elementOffsetX + mouseX - mouseOffsetX,
 | 
| 
jbe@945
 | 
    51               elementOffsetY + mouseY - mouseOffsetY
 | 
| 
jbe@945
 | 
    52             );
 | 
| 
jbe@945
 | 
    53             originalElement.style.visibility = '';
 | 
| 
jbe@945
 | 
    54             draggedElement.parentNode.removeChild(draggedElement);
 | 
| 
jbe@945
 | 
    55             originalElement = null;
 | 
| 
jbe@945
 | 
    56             draggedElement = null;
 | 
| 
jbe@945
 | 
    57           }
 | 
| 
jbe@945
 | 
    58         });
 | 
| 
jbe@945
 | 
    59       };
 | 
| 
jbe@945
 | 
    60       window.addEventListener("mouseup",   mouseDrop, true);
 | 
| 
jbe@945
 | 
    61       window.addEventListener("mousedown", mouseDrop, true);
 | 
| 
jbe@945
 | 
    62       var elements = document.getElementsByTagName("*");
 | 
| 
jbe@945
 | 
    63       for (var i=0; i<elements.length; i++) {
 | 
| 
jbe@945
 | 
    64         var element = elements[i];
 | 
| 
jbe@945
 | 
    65         if (element.className == "movable") {
 | 
| 
jbe@945
 | 
    66           element.addEventListener("mousedown", function(event) {
 | 
| 
jbe@945
 | 
    67             jsProtect(function() {
 | 
| 
jbe@945
 | 
    68               event.target.style.cursor = "move";
 | 
| 
jbe@945
 | 
    69               dragElement(event.currentTarget, function(element, dropX, dropY) {
 | 
| 
jbe@945
 | 
    70                 event.target.style.cursor = '';
 | 
| 
jbe@945
 | 
    71                 elementDropped(element, dropX, dropY);
 | 
| 
jbe@945
 | 
    72               });
 | 
| 
jbe@945
 | 
    73               event.preventDefault();
 | 
| 
jbe@945
 | 
    74             });
 | 
| 
jbe@945
 | 
    75           }, false);
 | 
| 
bsw/jbe@1309
 | 
    76         } else if (element.classList.contains("clickable")) {
 | 
| 
jbe@945
 | 
    77           element.addEventListener("mousedown", function(event) {
 | 
| 
jbe@945
 | 
    78             jsProtect(function() {
 | 
| 
jbe@945
 | 
    79               event.stopPropagation();
 | 
| 
jbe@945
 | 
    80             });
 | 
| 
jbe@945
 | 
    81           }, false);
 | 
| 
jbe@945
 | 
    82         }
 | 
| 
bsw@519
 | 
    83       }
 | 
| 
jbe@945
 | 
    84     });
 | 
| 
bsw@519
 | 
    85   }, false);
 | 
| 
jbe@945
 | 
    86 });
 |