var onLoad = function() {

  DOM.removeEventListener(window, 'load', onLoad);
  var main = document.getElementById('main');
  var menu = DropdownMenu.init(document.getElementById('header-dropdown-nav'), {
    showSubmenu: function(submenu) {
      submenu.style.opacity = '1';
    },
    hideSubmenu: function(submenu) {
      submenu.style.opacity = '0';
    }
  });

  var audioElements = document.getElementsByTagName('audio');
  if (audioElements.length > 0) {
    var playlist = new Audio.Playlist(audioElements[0], true, Audio.REPEAT_ALL, true)
      .filterTracks()
    ;
  }

  List.walk(menu.links, function(link) {
    DOM.addEventListener(link, 'click', function(e) {
      var submenu = menu.getLinkSubmenu(link);
      if (submenu !== null) {
        if (e.preventDefault !== undefined) {
          e.preventDefault();
        }
        menu.toggleSubmenu(submenu, link);
        return false;
      }
    });
  });

  if (DOM.hasClass(document.body, 'project')) {
    var loadProject = function(projectObject) {
      projectObject.isLoaded = true;
      DahlenProject.init(projectObject.element);
    };

    var onResizeAndScroll = function(e) {
      List.walk(projects, function(projectObject, index) {
        projects[index].topPosition = projectObject.element.offsetTop;
      });
      loadVisibleProjects();
    };

    var loadVisibleProjects = function() {
      var lowestVisibleLinePosition = DOM.getVerticalScroll() + DOM.getWindowDimensions().height;
      List.walk(List.select(projects, function(projectObject) {
        return projectObject.isLoaded !== true && projectObject.topPosition < lowestVisibleLinePosition;
      }), loadProject);
    };

    var projects = List.map(DOM.getElementsByClassName('project', main), function(project) {
      return {
        element: project,
        topPosition: project.offsetTop,
        isLoaded: false
      };
    });

    window.onscroll = onResizeAndScroll;
    DOM.addEventListener(window, 'resize', onResizeAndScroll);
    loadVisibleProjects();
  }
  else {
    if (window.SlideshowMotion !== undefined) {
      var motionSlideshows = DOM.getElementsByClassName('slideshow-motion', main);
      List.walk(Variable.toArray(motionSlideshows), SlideshowMotion.init);
    }

    if (window.SlideshowStill !== undefined) {
      var stillSlideshows = DOM.getElementsByClassName('slideshow-still', main);
      List.walk(Variable.toArray(stillSlideshows), SlideshowStill.init);
    }
  }

};

DOM.addEventListener(window, 'load', onLoad);

