<div id="source-container" data-role="drag-drop-target">
    <img id="home-snapshot" draggable="true" class="img-responsive" src="img/home.jpg">
</div>

<div id="target-container" data-role="drag-drop-target"></div>
[data-role="drag-drop-target"] {
  float: left;
  width: 500px;
  height: 376px;
  margin: 10px;
  padding: 10px;
  border: 3px solid #ddd;
  border-radius: 4px;
}
.over {
  background-color: #ffc;
}
[draggable="true"] {
  -moz-user-select: none;
  -khtml-user-select: none;
  -webkit-user-select: none;
  user-select: none;
  /* Support old versions of WebKit */
  -khtml-user-drag: element;
  -webkit-user-drag: element;
}
.drag {
  opacity: 0.25;
}
var dragStart = function(e) {
  // IE doesn't support text/plain
  try {
    e.dataTransfer.setData('text/plain', e.target.id);
  } catch (ex) {
    e.dataTransfer.setData('Text', e.target.id);
  }
};

var cancel = function(e) {
  if (e.preventDefault) e.preventDefault();
  if (e.stopPropagation) e.stopPropagation();
  return false;
};

var dropped = function(e) {
  var id;
  cancel(e);

  try {
    id = e.dataTransfer.getData('text/plain');
  } catch (ex) {
    id = e.dataTransfer.getData('Text');
  }

  e.target.appendChild(document.querySelector('#' + id));
};

var img = document.querySelector('#home-snapshot');
img.addEventListener('dragstart', dragStart, false);

var target = document.querySelector('#target-container');
target.addEventListener('drop', dropped, false);
target.addEventListener('dragenter', cancel, false);
target.addEventListener('dragover', cancel, false);
var sourceContainerId;

var dragStart = function(e) {
  try {
    e.dataTransfer.setData('text/plain', e.target.id);
  } catch (ex) {
    e.dataTransfer.setData('Text', e.target.id);
  }
  sourceContainerId = this.parentElement.id;
};

var cancel = function(e) {
  if (e.preventDefault) e.preventDefault();
  if (e.stopPropagation) e.stopPropagation();
  return false;
};

var dropped = function(e) {
  var id;
  if (this.id !== sourceContainerId) {
    cancel(e);
    try {
      id = e.dataTransfer.getData('text/plain');
    } catch (ex) {
      id = e.dataTransfer.getData('Text');
    }
    e.target.appendChild(document.querySelector('#' + id));
  }
};
    
var targets = document.querySelectorAll('[data-role="drag-drop-target"]');
[].forEach.call(targets, function(target) {
  target.addEventListener('drop', dropped, false);
  target.addEventListener('dragenter', cancel, false);
  target.addEventListener('dragover', cancel, false);
});

var sources = document.querySelectorAll('[draggable="true"]');
[].forEach.call(sources, function(source) {
  source.addEventListener('dragstart', dragStart, false);
});
var sourceContainerId;

var dragStart = function(e) {
  console.log('source: dragstart');

  try {
    e.dataTransfer.setData('text/plain', e.target.id);
  } catch (ex) {
    e.dataTransfer.setData('Text', e.target.id);
  }
  e.dataTransfer.effectAllowed = 'move';
  sourceContainerId = this.parentElement.id;
};

var cancel = function(e) {
  if (e.preventDefault) e.preventDefault();
  if (e.stopPropagation) e.stopPropagation();
  return false;
};

var dragEnd = function(e) {
  console.log('source: dragend');
};
    
var drag = function(e) {
  console.log('source: drag');
};

var dropped = function(e) {
  var id;
  
  console.log('target: drop');
  
  if (this.id !== sourceContainerId) {
    cancel(e);
    try {
      id = e.dataTransfer.getData('text/plain');
    } catch (ex) {
      id = e.dataTransfer.getData('Text');
    }
    e.target.appendChild(document.querySelector('#' + id));
  }
};

var dragEnter = function(e) {
  cancel(e);
  console.log('target: dragenter');
};

var dragOver = function(e) {
  cancel(e);
  console.log('target: dragover');
};
    
var dragLeave = function(e) {
  console.log('target: dragleave');
};
    
var targets = document.querySelectorAll('[data-role="drag-drop-target"]');
[].forEach.call(targets, function(target) {
  target.addEventListener('drop', dropped, false);
  target.addEventListener('dragenter', dragEnter, false);
  target.addEventListener('dragover', dragOver, false);
  target.addEventListener('dragleave', dragLeave, false);
});

var sources = document.querySelectorAll('[draggable="true"]');
[].forEach.call(sources, function(source) {
  source.addEventListener('dragstart', dragStart, false);
  source.addEventListener('drag', drag, false);
  source.addEventListener('dragend', dragEnd, false);
});