<script>
  (function () {

    var findLineItem = function (path) {
      return document.querySelector(`[href="${path}"]`);
    };

    var highlighLineItem = function (element) {
      element.classList.add('highlight');
    };

    var checkHasClass = function (element, className) {
      return element.className.split(' ').find(function (item) { return item === className || '' })
    }

    var findAllCollapseParents = function (element) {
      var collapseMenus = [];
      var elementPointer = element;
      while (elementPointer !== document.body) {
        if (checkHasClass(elementPointer, 'collapse')) {
          collapseMenus.push(elementPointer);
        }
        elementPointer = elementPointer.parentElement
      }
      return collapseMenus
    };

    var findMatchingCollapseMenu = function (collapseItem) {
      return document.querySelector(`[href="#${collapseItem.id}"]`);
    };

    var findAllParentMenus = function (element) {
      var parentMenus = []
      var elementPointer = element;
      while (elementPointer !== document.body) {
        if (elementPointer.className.split(' ').indexOf('menu') > -1) {
          parentMenus.push(elementPointer);
        }
        elementPointer = elementPointer.parentElement;
      }
      return parentMenus;
    }

    var openMenuItem = function (element) {
      element.click();
    };

    var openAllFromList = function (elementList) {
      elementList.forEach(function (element) {
        console.log(element)
        openMenuItem(findMatchingCollapseMenu(element))
      });
    };

    var highlightAndOpenMenu = function () {
      var currentLineItem = findLineItem(document.location.pathname);
      highlighLineItem(currentLineItem)
      openAllFromList(findAllCollapseParents(currentLineItem));
    };

    $(highlightAndOpenMenu);

  }());
</script>
