/**
 * Script that provides drop down menu items
 * $Id: menu.js 2609 2011-12-07 18:31:31Z pthorp $
 */
$(document).ready(function() {
  var selected = null;
  var selectedChild = null;
  var selectedSubmenu = null;
  
  /**
   * Utility to deactivate current submenu
   */
  jQuery.fn.deactivateTab = function() {
    var args = arguments[0] || {};
    var deactivateSelected = args.selected;
    
    // Close submenu for currently selected submenu
    if (selected == deactivateSelected) {
      selected = null;
      $(this).slideUp(200);
    } else {
      // Close other submenu
      $('#' + deactivateSelected).find('ul:first').slideUp(200);
    }
    
    // Reset values
    $('#' + deactivateSelected).removeClass('selected');
    selectedChild = null;
    selectedSubmenu = null;
  };
  
  /**
   * Utility function to activate & open the submenu for the selected menu item
   */
  jQuery.fn.activateTab = function() {
    var id = $(this).attr('id');

    // Find submenu element & open
    if (selected && !selectedChild && id == selected) {
      var submenu = $(this).find('ul:first');
      if (submenu.length > 0) {
        $('#' + selected).addClass('selected');
        
        selectedSubmenu = submenu.attr('id');
        submenu.slideDown(300);
      }
    }
  };

  /**
   * Utility to close current submenu
   */
  jQuery.fn.closeSubmenu = function() {
    var args = arguments[0] || {};
    var deactivateSelected = args.selected;

    if (selectedChild && !selectedSubmenu) {
      setTimeout(function() {
        if (selectedChild && (!selectedSubmenu || selectedSubmenu != selectedChild)) {
          $('#' + selectedChild).deactivateTab({ selected : deactivateSelected });
        }
      }, 400);
    }
  };
  
  /**
   * Event observer for main menu item hover
   */
  $('div.menu ul li').mouseenter(function() {
    var li = $(this);
    var id = li.attr('id');
    
    // Only main menu items have an id
    if (id) {
      // If changed top menu item, close previous submenu
      if (id != selected && selectedSubmenu) {
        $('#' + selected).removeClass('selected');
        $('#' + selectedSubmenu).deactivateTab();
      }

      // Set current main menu item
      selected = id;
      setTimeout(function() {
        li.activateTab();
      }, 400);
    }
  });

  /**
   * Event observer for submenu item hover
   */
  $('div.menu ul li ul li').mouseenter(function() {
    // Reset the ids when hovering over submenu items
    selected = $(this).parent().parent().attr('id');
    selectedSubmenu = $(this).parent().attr('id');
  });

  /**
   * Event observer for main menu item mouseout
   */
  $('div.menu ul li').mouseleave(function() {
    // Set selected sub menu and attempt to close
    selectedSubmenu = null;
    selectedChild = $(this).find('ul:first').attr('id');
    $(this).closeSubmenu({ selected : selected });
  });

  /**
   * Event observer for submenu item mouseout
   */
  $('div.menu ul li ul').mouseleave(function() {
    // Set selected sub menu and attempt to close
    selectedSubmenu = null;
    selectedChild = $(this).attr('id');
    $(this).closeSubmenu({ selected : selected });
  });
});

