define(["infobox/link", "infobox/node"], function (Link, Node) {
  return function (config, sidebar, router) {
    var self = this
    var el

    function destroy() {
      if (el && el.parentNode) {
        el.parentNode.removeChild(el)
        el = undefined
        sidebar.reveal()
      }
    }

    function create() {
      destroy()
      sidebar.ensureVisible()
      sidebar.hide()

      el = document.createElement("div")
      sidebar.container.insertBefore(el, sidebar.container.firstChild)

      el.scrollIntoView(false)
      el.classList.add("infobox")
      el.destroy = destroy

      var closeButton = document.createElement("button")
      closeButton.classList.add("close")
      closeButton.onclick = router.reset
      el.appendChild(closeButton)
    }

    self.resetView = destroy

    self.gotoNode = function (d) {
      create()
      new Node(config, el, router, d)
    }

    self.gotoLink = function (d) {
      create()
      new Link(config, el, router, d)
    }

    return self
  }
})