var buildMobileSideNav = function () {

  var navMenu = document.querySelector('nav ul')
  var mobileMenu = navMenu.cloneNode(true)

  // Clear classList of clone
  if ( mobileMenu.classList.length > 0 ) {
    var classes = new Array(mobileMenu.classList.length)
    for (var i = 0, len = mobileMenu.classList.length; i < len; i++) {
       classes[i] = mobileMenu.classList.item(i)
    }
    mobileMenu.classList.remove(classes)
  }

  mobileMenu.classList.add('side-nav')
  mobileMenu.setAttribute('id', 'mobile-sidebar')

  var nav = document.querySelector('nav')
  nav.appendChild(mobileMenu)

  var sidenavButton = document.createElement('a')
  sidenavButton.setAttribute('href', '#')
  sidenavButton.setAttribute('data-activates', 'mobile-sidebar')
  sidenavButton.classList.add('button-collapse')

  var sidenavIcon = document.createElement('i')
  sidenavIcon.classList.add('material-icons')
  sidenavIcon.textContent = 'menu'

  sidenavButton.appendChild(sidenavIcon)
  nav.appendChild(sidenavButton)

  $(".button-collapse").sideNav();

  nav.parentNode.removeChild(nav)

  var fixedNavbar = document.createElement('div')
  fixedNavbar.classList.add('navbar-fixed')

  fixedNavbar.appendChild(nav)

  var body = document.querySelector('body')
  body.insertBefore(fixedNavbar, body.firstChild)
}

var addBackground = function () {
  var back = document.createElement('img')
  back.classList.add('background')
  back.setAttribute('src', cdn_url + 'img/background_ny_2.jpeg')

  var parallax = document.querySelector('.main-content')

  parallax.insertBefore(back, parallax.firstChild)
}

var wrapAll = function (target, wrapperClass) {
  var commandlines = document.querySelectorAll(target)

  for (var i=0; i<commandlines.length; i++) {
    var cmd = commandlines[i]
    var parent = cmd.parentNode

    var wrapper = document.createElement('div')
    wrapper.classList.add(wrapperClass)

    parent.insertBefore(wrapper, cmd)
    parent.removeChild(cmd)
    wrapper.appendChild(cmd)

  }
}

buildMobileSideNav()
addBackground()
wrapAll('#community h3', 'community-title-wrapper')
wrapAll('.description-images img', 'description-image-wrapper')
wrapAll('.involved-parties-logos a', 'logo-wrapper')
wrapAll('.commandline:not(.li)', 'commandline-wrapper')
wrapAll('.commandline.li', 'commandline-li-wrapper')
wrapAll('.commandline-list', 'commandline-list-wrapper')
wrapAll('.description', 'description-wrapper')
wrapAll('.service', 'service-wrapper')

$('.modal-trigger').leanModal()
