Я пока что нуб в этом =) вроде бы вот это  var dragManager = new function() {    var dragZone, avatar, dropTarget;   var downX, downY;    var self = this;    function onMouseDown(e){     e = fixEvent(e);      if (e.which != 1 ) { // не левой кнопкой       return false;     }      dragZone = findDragZone(e);      if (!dragZone) { 	    return;     }      // запомним, что элемент нажат на текущих координатах pageX/pageY     downX = e.pageX;     downY = e.pageY;      return false;   }    function onMouseMove(e) {     if (!dragZone) return; // элемент не зажат      e = fixEvent(e);      if ( !avatar ) { // элемент нажат, но пока не начали его двигать       if ( Math.abs(e.pageX-downX) < 3 && Math.abs(e.pageY-downY) < 3 ) {         return;       }       // попробовать захватить элемент       avatar = dragZone.onDragStart(downX, downY, e);        if (!avatar) { // не получилось, значит перенос продолжать нельзя         cleanUp(); // очистить приватные переменные, связанные с переносом         return;       }     }      // отобразить перенос объекта, перевычислить текущий элемент под курсором     avatar.onDragMove(e);      // найти новый dropTarget под курсором: newDropTarget     // текущий dropTarget остался от прошлого mousemove     // *оба значения: и newDropTarget и dropTarget могут быть null     var newDropTarget = findDropTarget(e);      if (newDropTarget != dropTarget) {       // уведомить старую и новую зоны-цели о том, что с них ушли/на них зашли       dropTarget && dropTarget.onDragLeave(newDropTarget, avatar, e);       newDropTarget && newDropTarget.onDragEnter(dropTarget, avatar, e);     }      dropTarget = newDropTarget;      dropTarget && dropTarget.onDragMove(avatar, e);      return false;   }    function onMouseUp(e) {     e = fixEvent(e);      if (e.which != 1 ) { // не левой кнопкой       return false;     }      if (avatar) { // если уже начали передвигать        if (dropTarget) {         // завершить перенос и избавиться от аватара, если это нужно         // эта функция обязана вызвать avatar.onDragEnd/onDragCancel         dropTarget.onDragEnd(avatar, e);       } else {         avatar.onDragCancel();       }      }      cleanUp();   }    function cleanUp() {     // очистить все промежуточные объекты     dragZone = avatar = dropTarget = null;   }    function findDragZone(event) {     var elem = event.target;     while(elem != document && !elem.dragZone) {       elem = elem.parentNode;     }     return elem.dragZone;   }    function findDropTarget(event) {     // получить элемент под аватаром     var elem = avatar.getTargetElem();      while(elem != document && !elem.dropTarget) {       elem = elem.parentNode;     }      if (!elem.dropTarget) {       return null;     }      return elem.dropTarget;   }    document.ondragstart = function() {     return false;   }    document.onmousemove = onMouseMove;   document.onmouseup = onMouseUp;   document.onmousedown = onMouseDown; };  Как я понял вот этот участок кода    // отобразить перенос объекта, перевычислить текущий элемент под курсором     avatar.onDragMove(e);      // найти новый dropTarget под курсором: newDropTarget     // текущий dropTarget остался от прошлого mousemove     // *оба значения: и newDropTarget и dropTarget могут быть null     var newDropTarget = findDropTarget(e);  Но не понимаю как создать новый дроп таргет, сразу несколько дроп таргетов.