function Navigation() {
  
  var $opened;
  var $selected;
  var $url;
  var closing = false;
  var opening = false;
  var navigate_when_closed = false;
  
  function navigate() {
    if($url && $url != '#') {
      window.location = $url;
    }
  }
  
  function closed_handler() {
    closing = false;
    if(navigate_when_closed) {
      navigate_when_closed = false;
      navigate();
    }
  }
  
  function opened_handler(skip_navigate) {
    opening = false;
    if(skip_navigate !== true) {
      navigate();
    }
  }
  
  function open($li) {
    opening = true;
    var animating_closed = close();
    $opened = $li;
    $opened.addClass('jopen');
    var $ul = $opened.find('ul');
    if($ul.length) {
      $ul.slideDown('fast', opened_handler);
    } else {
      opened_handler(true);
      if(!animating_closed) {
        navigate();
      } else {
        navigate_when_closed = true;
      }
    }
  }
  
  function close() {
    if($opened) {
      closing = true;
      var $ul = $opened.find('ul');
      $opened.removeClass('jopen');
      $opened = null;
      if($ul.length) {
        $ul.slideUp('fast', closed_handler);
        return true;
      } else {
        closed_handler();
        return false;
      }
    }
  }
  
  function deselect() {
    if($selected) {
      $selected.removeClass('selected');
      $selected = null;
    }
  }
  
  function select($a) {
    deselect();
    $selected = $a;
    $selected.addClass('selected');
  }
  
  function is_selected($a) {
    return $selected && $selected.length && $a[0] == $selected[0];
  }
    
  function is_opened($li) {
    return $opened && $opened.length && $li[0] == $opened[0];
  }
  
  function click_handler(event) {
    event.preventDefault();
    if(!closing && !opening) {
      var $a    = $(event.target);
      var $li   = $a.parent();
      var level = $li.parent().hasClass('primary') ? 'primary' : 'secondary';
      if(!is_opened($li) && !is_selected($a)) {
        $url = $a.attr('href');
        switch(level) {
          case 'primary':
          open($li);
          break;
          case 'secondary':
          select($a);
          navigate();
          break;
        }
      }
    }
  }
  
  function add_listeners() {
    $('#navigation a').click(click_handler);
  }
  
  function initialise() {
    $selected = $('#navigation a.selected');
    $opened   = $('#navigation li.open').removeClass('open').addClass('jopen');
    $opened.find('ul').css('display', 'block');
    add_listeners();
  }
  
  initialise();
}



jQuery(function() {
  var navigation = new Navigation();
  $('#maincontent, #maincontentimages').css('visibility','visible').hide().fadeIn();
});
