var extend = require('raptor-util/extend'); var componentsUtil = require('../components/util'); var destroyComponentForEl = componentsUtil.$__destroyComponentForEl; var destroyElRecursive = componentsUtil.$__destroyElRecursive; function resolveEl(el) { if (typeof el === 'string') { var elId = el; el = document.getElementById(elId); if (!el) { throw Error('Not found: ' + elId); } } return el; } function beforeRemove(referenceEl) { destroyElRecursive(referenceEl); destroyComponentForEl(referenceEl); } module.exports = function(target, getEl, afterInsert) { extend(target, { appendTo: function(referenceEl) { referenceEl = resolveEl(referenceEl); var el = getEl(this, referenceEl); referenceEl.appendChild(el); return afterInsert(this, referenceEl); }, prependTo: function(referenceEl) { referenceEl = resolveEl(referenceEl); var el = getEl(this, referenceEl); referenceEl.insertBefore(el, referenceEl.firstChild || null); return afterInsert(this, referenceEl); }, replace: function(referenceEl) { referenceEl = resolveEl(referenceEl); var el = getEl(this, referenceEl); beforeRemove(referenceEl); referenceEl.parentNode.replaceChild(el, referenceEl); return afterInsert(this, referenceEl); }, replaceChildrenOf: function(referenceEl) { referenceEl = resolveEl(referenceEl); var el = getEl(this, referenceEl); var curChild = referenceEl.firstChild; while(curChild) { var nextSibling = curChild.nextSibling; // Just in case the DOM changes while removing if (curChild.nodeType === 1) { beforeRemove(curChild); } curChild = nextSibling; } referenceEl.innerHTML = ''; referenceEl.appendChild(el); return afterInsert(this, referenceEl); }, insertBefore: function(referenceEl) { referenceEl = resolveEl(referenceEl); var el = getEl(this, referenceEl); referenceEl.parentNode.insertBefore(el, referenceEl); return afterInsert(this, referenceEl); }, insertAfter: function(referenceEl) { referenceEl = resolveEl(referenceEl); var el = getEl(this, referenceEl); el = el; var nextSibling = referenceEl.nextSibling; var parentNode = referenceEl.parentNode; if (nextSibling) { parentNode.insertBefore(el, nextSibling); } else { parentNode.appendChild(el); } return afterInsert(this, referenceEl); } }); };