Index: dhtml_menu.admin.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/dhtml_menu/dhtml_menu.admin.inc,v
retrieving revision 1.9
diff -u -p -r1.9 dhtml_menu.admin.inc
--- dhtml_menu.admin.inc	9 Nov 2008 22:32:49 -0000	1.9
+++ dhtml_menu.admin.inc	26 May 2009 16:15:58 -0000
@@ -1,6 +1,7 @@
 <?php
 // $Id: dhtml_menu.admin.inc,v 1.9 2008/11/09 22:32:49 arancaytar Exp $
 
+
 /**
  * @file dhtml_menu.admin.inc
  * Functions that are only called on the admin pages.
@@ -10,29 +11,31 @@
  * Module settings form.
  */
 function dhtml_menu_settings(&$form_state) {
-  $settings = unserialize(DHTML_MENU_DEFAULT_SETTINGS);
+  $settings = variable_get('dhtml_menu_settings');
 
-  $form['dhtml_menu_nav'] = array(
+  $options['nav'] = array(
     '#type' => 'radios',
     '#title' => t('Static navigation'),
     '#options' => array(
-      'pseudo-child' => t('<strong>Fake child item:</strong> At the top of each submenu, an extra link will be generated that leads to the page of the parent item.'),
-      'bullet' => t('<strong>Link remains static:</strong> All menu links will continue to function as static links. To expand a menu, click the bullet icon next to the link.'),
-      'double-click' => t('<strong>Doubleclick:</strong> To expand a menu, click the link once. To navigate to the page, click it twice. <em>This may be difficult to find for your users!</em>'),
-      'none' => t('<strong>None:</strong> Clicking the link will expand the menu. Navigating to the page is not possible. <em>This will make pages with sub-items very difficult to reach!</em>'),
+      'open' => t('<strong>Open menu item:</strong> Menu items cannot be collapsed dynamically. Instead, clicking on an already expanded item will take you to the page.'),
+      'pseudo-child' => t('<strong>Fake child item:</strong> At the top of each menu, an extra link will be generated that leads to the page of the parent item.'),
+      'hover' => t('<strong>Hover:</strong> To expand an item temporarily, hover your cursor over it. To visit the page, click it.'),
+      'bullet' => t('<strong>Link remains static:</strong> All links will continue to function as static links. To expand an item, click the bullet icon next to the link.'),
+      'double-click' => t('<strong>Doubleclick:</strong> To expand an item, click the link once. To navigate to the page, click it twice. <em>This may be difficult to find for your users!</em>'),
+      'none' => t('<strong>None:</strong> Clicking the link will expand the item. Navigating to the page is not possible at all. <em>This will make pages with sub-items very difficult to reach!</em>'),
     ),
-    '#default_value' => variable_get('dhtml_menu_nav', $settings['nav']),
+    '#default_value' => $settings['nav'],
     '#description' => t('Dynamic expansion of menus competes with the static navigation of content. Choose how to resolve this conflict.'),
   );
-  
-  $form['animation'] = array(
+
+  $options['animation'] = array(
     '#type' => 'fieldset',
     '#title' => t('Animation'),
     '#collapsible' => TRUE,
     '#collapsed' => TRUE,
   );
-  
-  $form['animation']['dhtml_menu_animations'] = array(
+
+  $options['animation']['effects'] = array(
     '#type' => 'checkboxes',
     '#title' => t('Effects'),
     '#options' => array(
@@ -41,61 +44,77 @@ function dhtml_menu_settings(&$form_stat
       'opacity' => t('Fade in'),
     ),
     '#description' => t('You may pick any number of animation effects that will accompany the opening and closing of a menu.'),
-    '#default_value' => variable_get('dhtml_menu_animations', $settings['animations']),
+    '#default_value' => $settings['animation']['effects'],
   );
-  
-  $form['animation']['dhtml_menu_speed'] = array(
+
+  $options['animation']['speed'] = array(
     '#type' => 'select',
     '#title' => t('Speed'),
     '#options' => array(100 => 'Very Fast (0.1s)', 500 => 'Fast (0.5s)', 1000 => 'Medium (1s)', 1500 => 'Slow (1.5s)', 2000 => 'Very Slow (2s)'),
-    '#default_value' => variable_get('dhtml_menu_speed', $settings['speed']),
+    '#default_value' => $settings['animation']['speed'],
     '#description' => t('Choose how quickly the menus should expand and collapse.'),
   );
-  
-  $form['effects'] = array(
+
+  $options['effects'] = array(
     '#type' => 'fieldset',
     '#title' => t('Other effects'),
     '#collapsible' => TRUE,
     '#collapsed' => TRUE,
   );
-  
-  $form['effects']['dhtml_menu_siblings'] = array(
+
+  $options['effects']['siblings'] = array(
     '#type' => 'radios',
     '#title' => t('When a menu opens'),
     '#options' => array(
-      'none' => t('Do nothing.'),
+      'none' => t('Keep other menus open.'),
       'close-all' => t('Close all other open menus on the page.'),
-      'close-same-tree' => t('Close other open submenus in the same menu tree.'),
+      'close-same-tree' => t('Close other open menus in the same tree.'),
     ),
-    '#default_value' => variable_get('dhtml_menu_siblings', $settings['siblings']),
+    '#default_value' => $settings['effects']['siblings'],
   );
-  
-  $form['effects']['dhtml_menu_children'] = array(
+
+  $options['effects']['children'] = array(
     '#type' => 'radios',
     '#title' => t('When a menu closes'),
     '#options' => array(
       'none' => t('Remember which sub-items were expanded when it next opens.'),
       'close-children' => t('Close all its sub-items, too.'),
     ),
-    '#default_value' => variable_get('dhtml_menu_children', $settings['children']),
+    '#description' => t('This option only has an effect if menus are set to be closed dynamically.'),
+    '#default_value' => $settings['effects']['children'],
   );
 
+  $options['effects']['remember'] = array(
+    '#type' => 'radios',
+    '#title' => t('When a new page is loaded'),
+    '#options' => array(
+      1 => t('Remember which items were expanded on the last page.'),
+      0 => t('Expand only the currently active path.'),
+    ),
+    '#default_value' => $settings['effects']['remember'],
+  );
+
+  $options['#tree'] = TRUE;
+
+  $form['dhtml_menu_settings'] = $options;
+
   $form['dhtml_menu_disabled'] = array(
     '#type' => 'checkboxes',
     '#title' => t('Menus without DHTML'),
-    '#options' => dhtml_menu_menus(),
+    '#options' => _dhtml_menu_menus(),
     '#default_value' => variable_get('dhtml_menu_disabled', array()),
     '#description' => t('DHTML will be used for all menus by default, but can be switched off for specific menus.'),
   );
 
-  return system_settings_form($form);
+  // Automatic defaults cannot handle nested values (but the submit hook can).
+  return system_settings_form($form, FALSE);
 }
 
 /**
  * Build human-readable menu names for book menus.
  * This fetches the title of the book outline's root node. Titles are cached for performance.
  */
-function dhtml_menu_menus() {
+function _dhtml_menu_menus() {
   $titles = cache_get('dhtml_book_titles');
   $titles = isset($titles->data) ? $titles->data : array();
 
Index: dhtml_menu.css
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/dhtml_menu/dhtml_menu.css,v
retrieving revision 1.3
diff -u -p -r1.3 dhtml_menu.css
--- dhtml_menu.css	6 Nov 2008 17:02:11 -0000	1.3
+++ dhtml_menu.css	26 May 2009 16:15:58 -0000
@@ -1,10 +1,10 @@
-.fake-leaf 
+.fake-leaf
 {
   font-size:8pt;
   font-style:italic;
 }
 
-li.start-collapsed ul 
+li.start-collapsed ul
 {
   display:none;
 }
Index: dhtml_menu.info
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/dhtml_menu/dhtml_menu.info,v
retrieving revision 1.7
diff -u -p -r1.7 dhtml_menu.info
--- dhtml_menu.info	5 Nov 2008 17:50:55 -0000	1.7
+++ dhtml_menu.info	26 May 2009 16:15:58 -0000
@@ -1,16 +1,10 @@
 ; $Id: dhtml_menu.info,v 1.7 2008/11/05 17:50:55 arancaytar Exp $
 name = DHTML Menu
-description = Opens menus dynamically to reduce page refreshes.
+description = Opens menus dynamically to reduce page reloads.
 core = 7.x
 
-; Everyday use
 files[] = dhtml_menu.module
-
-; Installation
-files[] = dhtml_menu.install
-
-; Admin page
 files[] = dhtml_menu.admin.inc
+files[] = dhtml_menu.registry.inc
+files[] = dhtml_menu.theme.inc
 
-; Hooks called when rebuilding the cache
-files[] = dhtml_menu.rebuild.inc
Index: dhtml_menu.install
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/dhtml_menu/dhtml_menu.install,v
retrieving revision 1.10
diff -u -p -r1.10 dhtml_menu.install
--- dhtml_menu.install	4 Apr 2009 07:31:30 -0000	1.10
+++ dhtml_menu.install	26 May 2009 16:15:58 -0000
@@ -1,10 +1,73 @@
 <?php
 // $Id: dhtml_menu.install,v 1.10 2009/04/04 07:31:30 arancaytar Exp $
 
+
 /**
  * @file dhtml_menu.install
- * Update functions for the DHTML Menu module.
+ * Installation and update functions for the DHTML Menu module.
+ */
+
+/**
+ * Default settings storage.
+ */
+function _dhtml_menu_defaults() {
+  return array(
+    'animation' => array(
+      'effects' => array(
+        'height' => 'height',
+        'opacity' => 'opacity',
+      ),
+      'speed' => 500,
+    ),
+    'effects' => array(
+      'siblings' => 'close-same-tree',
+      'children' => 'none',
+      'remember' => 0,
+    ),
+    'nav' => 'open',
+  );
+}
+
+/**
+ * Implementation of hook_enable().
+ */
+function dhtml_menu_enable() {
+  // Register our theme interceptors.
+  // This does not happen on its own because we have no hook_theme().
+  drupal_theme_rebuild();
+  drupal_set_message(t('<em>DHTML Menu</em> offers a wide range of options to customize its behavior. If you wish to change them, please visit the <a href="@url">configuration page</a>.', array('@url' => url('admin/settings/dhtml_menu'))));
+}
+
+/**
+ * Implementation of hook_disable().
+ */
+function dhtml_menu_disable() {
+  // Unregister our theme interceptors.
+  drupal_theme_rebuild();
+}
+
+/**
+ * Implementation of hook_install().
+ * This will create our system variable defaults.
+ * The benefit is that we do not need to pass defaults
+ * to variable_get(), which allows centralization of defaults.
  */
+function dhtml_menu_install() {
+  variable_set('dhtml_menu_settings', _dhtml_menu_defaults());
+  // It seems that hook_enable() is not reliably called on installation.
+  // Clearing the cache twice can't hurt.
+  drupal_theme_rebuild();
+}
+
+/**
+ * Implementation of hook_uninstall().
+ * Only clears our variables, so a fresh installation can repopulate them.
+ */
+function dhtml_menu_uninstall() {
+  variable_del('dhtml_menu_theme');
+  variable_del('dhtml_menu_disabled');
+  variable_del('dhtml_menu_settings');
+}
 
 /**
  * #6000: 6.x-2.x upgrade. Custom blocks are gone, using preprocess instead.
@@ -81,3 +144,31 @@ function dhtml_menu_update_7101() {
   return array();
 }
 
+/**
+ * #7102: Consolidate variables into one settings array.
+ */
+function dhtml_menu_update_7102() {
+  $defaults = _dhtml_menu_defaults();
+
+  // As the settings have moved, read them individually.
+  $settings['nav'] = variable_get('dhtml_menu_nav', $defaults['nav']);
+  $settings['animation'] = array(
+    'effects' => variable_get('dhtml_menu_animations', $defaults['animation']['effects']),
+    'speed' => variable_get('dhtml_menu_speed', $defaults['animation']['speed']),
+  );
+  $settings['effects'] = array(
+    'siblings' => variable_get('dhtml_menu_siblings', $defaults['effects']['siblings']),
+    'children' => variable_get('dhtml_menu_children', $defaults['effects']['children']),
+    // Entirely new setting.
+    'remember' => $defaults['effects']['remember'],
+  );
+
+  // Write the consolidated settings.
+  variable_set("dhtml_menu_settings", $settings);
+
+  // Clear the old settings.
+  foreach (array('nav', 'siblings', 'children', 'animations', 'speed') as $key) {
+    variable_del("dhtml_menu_$key");
+  }
+}
+
Index: dhtml_menu.js
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/dhtml_menu/dhtml_menu.js,v
retrieving revision 1.26
diff -u -p -r1.26 dhtml_menu.js
--- dhtml_menu.js	10 Apr 2009 17:26:18 -0000	1.26
+++ dhtml_menu.js	26 May 2009 16:15:58 -0000
@@ -1,11 +1,11 @@
 // $Id: dhtml_menu.js,v 1.26 2009/04/10 17:26:18 arancaytar Exp $
-(function($) {
 
 /**
  * @file dhtml_menu.js
  * The Javascript code for DHTML Menu
  */
- 
+
+(function($) {
 Drupal.dhtmlMenu = {};
 
 /**
@@ -13,60 +13,121 @@ Drupal.dhtmlMenu = {};
  */
 Drupal.behaviors.dhtmlMenu = {
   attach: function() {
-    // Do not run this function more than once.
-    // Check whether this is redundant with D7.
-    /*if (Drupal.dhtmlMenu.init) {
-      return;
-    }
-    else {
-      Drupal.dhtmlMenu.init = true;
-    }*/
-  
+    var settings = Drupal.settings.dhtmlMenu;
+
     $('.collapsed').removeClass('expanded');
-    var cookie = Drupal.dhtmlMenu.cookieGet();
+
+    // The cookie stores menus dynamically opened on the last page.
+    // It is only read if the settings tell us to remember open menus,
+    // and the dynamic expansion isn't done by hovering (which 
+    // implicitly makes expansion volatile).
+    if (settings.nav != 'hover' && settings.effects.remember) {
+      var cookie = Drupal.dhtmlMenu.cookieGet();
+    }
+
     for (var i in cookie) {
-      // If the cookie was not applied to the HTML code yet, do so now.
+      // In case the cookie was not applied to the HTML code yet, do so now.
+      // switchMenu() has no effect if the menu is in the desired state already.
       var li = $('#dhtml_menu-' + cookie[i]).parents('li:first');
-      if ($(li).hasClass('collapsed')) {
-        Drupal.dhtmlMenu.toggleMenu(li);
-      }
+      Drupal.dhtmlMenu.switchMenu(li, true);
     }
-  
-    var nav = Drupal.settings.dhtmlMenu.nav;
-  
+
+    /* Relevant only when hovering:
+     *
+     * If a context menu is opened (as most users do when opening links in a
+     * new tab), the mouseleave event will be triggered. Although the context
+     * menu still works, having the menu close underneath it is confusing.
+     *
+     * This code will "freeze" the menu's collapse if the body is left
+     * (which happens when a context menu opens), and only release it when the cursor
+     * reenters the menu.
+     *
+     * Note that due to the order in which events are called, 
+     * the hovering collapse must work asynchronously so 
+     * this event is triggered before the collapse.
+     */
+
+    var freeze = false;
+    if (settings.nav == 'hover') {
+      $('ul.menu').mouseenter(function() {freeze = false});
+      $('body').mouseleave(function() {freeze = true});
+    }
+
     /* Add jQuery effects and listeners to all menu items.
-     * The ~ (sibling) selector is unidirectional and selects 
-     * only the latter element, so we must use siblings() to get 
-     * back to the link element. 
+     * The ~ (sibling) selector is unidirectional and selects
+     * only the latter element, so we must use siblings() to get
+     * back to the link element.
      */
+
     $('ul.menu li:not(.leaf,.no-dhtml)').each(function() {
-      if (nav == 'pseudo-child') {
+      // pseudo-child: Clone the menu link and mark it as fake.
+      if (settings.nav == 'pseudo-child') {
         var ul = $(this).find('ul:first');
         if (ul.length) {
           $(this).find('a:first').clone().prependTo(ul).wrap('<li class="leaf fake-leaf"></li>');
         }
       }
-  
-      if (nav == 'doubleclick') {
+      // doubleclick: Add a double-click event that mimics normal link behavior.
+      else if (settings.nav == 'doubleclick') {
         $(this).dblclick(function(e) {
           window.location = $(this).find('a:first').attr('href');
           e.stopPropagation();
         });
       }
-  
-      $(this).click(function(e) {
-        Drupal.dhtmlMenu.toggleMenu(this);
-        e.stopPropagation();
-        return false;
-      });
+
+      // hover: Add mouse-hovering events.
+      if (settings.nav == 'hover') {
+        var li = this;
+        $(this).find('a:first').mouseenter(function(e) {
+            Drupal.dhtmlMenu.switchMenu(li, true);
+        });
+        $(this).mouseleave(function(e) {
+          if ($(this).hasClass('start-collapsed')) {
+            var li = this;
+            /* As explained earlier, this event fires before the body event.
+             * We need to wait to make sure that the user isn't browsing a
+             * context menu right now, in which case the menu isn't collapsed.
+             */
+            setTimeout(function() {
+              if (!freeze) {
+                Drupal.dhtmlMenu.switchMenu(li, false);
+              }
+            }, 10);
+          }
+        });
+      }
+
+      // open: Toggle the menu normally, but do not hinder the link if the menu was open.
+      else if (settings.nav == 'open') {
+        $(this).click(function(e) {
+          // Don't collapse expanded menus.
+          if ($(this).hasClass('expanded')) {
+            return true;
+          }
+          Drupal.dhtmlMenu.toggleMenu(this);
+          e.stopPropagation();
+          return false;
+        });
+      }
+      else {
+        $(this).click(function(e) {
+          Drupal.dhtmlMenu.toggleMenu(this);
+          e.stopPropagation();
+          return false;
+        });
+      }
+
     });
-    
-    if (nav == 'bullet') {
+
+    // If the link should remain static, override the event using the a element.
+    if (settings.nav == 'bullet' || settings.nav == 'hover') {
       $('ul.menu a').click(function(e) {
         e.stopPropagation();
         return true;
       });
-    } else {
+    }
+    // Otherwise, only the leaf menu items get this treatment.
+    else {
       $('ul.menu li.leaf a').click(function(e) {
         e.stopPropagation();
         return true;
@@ -82,23 +143,21 @@ Drupal.behaviors.dhtmlMenu = {
  *   Object. The <li> element that will be expanded or collapsed.
  */
 Drupal.dhtmlMenu.toggleMenu = function(li) {
-  var effects = Drupal.settings.dhtmlMenu;
-
-  // If the menu is expanded, collapse it.
-  if($(li).hasClass('expanded')) {
-    Drupal.dhtmlMenu.animate($(li).find('ul:first'), 'hide');
-   
-    // If children are closed automatically, find and close them now.
-    if (effects.children == 'close-children') {
-      Drupal.dhtmlMenu.animate($(li).find('li.expanded').find('ul:first'), 'hide');
-      $(li).find('li.expanded').removeClass('expanded').addClass('collapsed')
-    }
+  // make it open if closed, close if open.
+  Drupal.dhtmlMenu.switchMenu(li, !$(li).hasClass('expanded'));
+}
 
-    $(li).removeClass('expanded').addClass('collapsed');
+Drupal.dhtmlMenu.switchMenu = function(li, toggle) {
+  // No need for switching.
+  if (toggle == $(li).hasClass('expanded')) {
+    return;
   }
 
-  // Otherwise, expand it.
-  else {
+  var effects = Drupal.settings.dhtmlMenu.effects;
+
+  // Expand it
+  if (toggle)
+  {
     Drupal.dhtmlMenu.animate($(li).find('ul:first'), 'show');
     $(li).removeClass('collapsed').addClass('expanded');
 
@@ -134,25 +193,38 @@ Drupal.dhtmlMenu.toggleMenu = function(l
     }
   }
 
+  // Otherwise, collapse it.
+  else
+  {
+    Drupal.dhtmlMenu.animate($(li).find('ul:first'), 'hide');
+
+    // If children are closed automatically, find and close them now.
+    if (effects.children == 'close-children') {
+      Drupal.dhtmlMenu.animate($(li).find('li.expanded').find('ul:first'), 'hide');
+      $(li).find('li.expanded').removeClass('expanded').addClass('collapsed')
+    }
+
+    $(li).removeClass('expanded').addClass('collapsed');
+  }
+
   // Save the current state of the menus in the cookie.
   Drupal.dhtmlMenu.cookieSet();
 }
 
 Drupal.dhtmlMenu.animate = function(ul, open) {
-  var settings = Drupal.settings.dhtmlMenu;
+  var settings = Drupal.settings.dhtmlMenu.animation;
   var effects = {};
-  
-  for (effect in settings.animations) {
-    if (eval("settings.animations." + effect)) {
+
+  for (effect in settings.effects) {
+    if (eval("settings.effects." + effect)) {
       eval("effects." + effect + " = open");
     }
   }
-  
-  //alert(effects);
+
   if (effects) {
     $(ul).animate(effects, settings.speed * 1);
   }
-  else $(ul).css('display', open == 'show' ? 'block' : 'none'); 
+  else $(ul).css('display', open == 'show' ? 'block' : 'none');
 }
 
 /**
@@ -167,9 +239,13 @@ Drupal.dhtmlMenu.cookieGet = function() 
 }
 
 /**
- * Saves the dhtml_menu cooki.
+ * Saves the dhtml_menu cookie.
  */
 Drupal.dhtmlMenu.cookieSet = function() {
+  // Only save the cookie if settings should actually be remembered.
+  if (Drupal.settings.dhtmlMenu.nav == 'hover' || !Drupal.settings.dhtmlMenu.remember) {
+    return;
+  }
   var expanded = new Array();
   $('li.expanded').each(function() {
     expanded.push($(this).children('a:first').attr('id').substr(5));
@@ -178,3 +254,4 @@ Drupal.dhtmlMenu.cookieSet = function() 
 }
 
 })(jQuery);
+
Index: dhtml_menu.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/dhtml_menu/dhtml_menu.module,v
retrieving revision 1.40
diff -u -p -r1.40 dhtml_menu.module
--- dhtml_menu.module	4 Apr 2009 07:31:30 -0000	1.40
+++ dhtml_menu.module	26 May 2009 16:15:58 -0000
@@ -1,226 +1,36 @@
 <?php
 // $Id: dhtml_menu.module,v 1.40 2009/04/04 07:31:30 arancaytar Exp $
 
-/**
- * @file dhtml_menu.module
- * Adds preprocessors to the menu theming functions
- * that will add dynamic expansion to their menus.
- */
 
 /**
- * A serialized array of default settings. Constants must be strings.
+ * @file dhtml_menu.module
+ * Adds stylesheets and scripts to the page, and provides help texts. All other
+ * functions can be found in the included files.
  */
-define('DHTML_MENU_DEFAULT_SETTINGS', serialize(array(
-  'animations' => array(
-     'height' => 'height',
-     'opacity' => 'opacity'
-   ),
-  'speed' => 500,
-  'siblings' => 'none',
-  'children' => 'none',
-  'nav' => 'pseudo-child',
-)));
 
 /**
  * Implementation of hook_init().
  * Adds CSS, Javascript and settings to the page.
  */
 function dhtml_menu_init() {
-  drupal_add_css(drupal_get_path('module', 'dhtml_menu') .'/dhtml_menu.css');
-  drupal_add_js(drupal_get_path('module', 'dhtml_menu') .'/dhtml_menu.js');
+  drupal_add_css(drupal_get_path('module', 'dhtml_menu') . '/dhtml_menu.css');
+  drupal_add_js(drupal_get_path('module', 'dhtml_menu') . '/dhtml_menu.js');
 
-  $settings = unserialize(DHTML_MENU_DEFAULT_SETTINGS);
-
-  foreach ($settings as $setting => &$value) {
-    $value = variable_get("dhtml_menu_$setting", $value);
-  }
+  // No default value: Installer created our defaults.
+  $settings = variable_get('dhtml_menu_settings');
   drupal_add_js(array('dhtmlMenu' => $settings), 'setting');
 }
 
 /**
- * Preprocessor for menu_item_link.
- * Adds an ID attribute to menu links and helps the module
- * follow the recursion of menu_tree_output().
- */
-function dhtml_menu_theme_menu_item_link($link) {
-  global $theme;
-  static $disabled, $function;
-  if (!isset($disabled)) {
-    $disabled = variable_get('dhtml_menu_disabled', array());
-    $registry = variable_get('dhtml_menu_theme', array());
-    $function = isset($registry[$theme]) && drupal_function_exists($registry[$theme]['menu_item_link']) ? $registry[$theme]['menu_item_link'] : 'theme_menu_item_link';
-  }
-
-  // TODO: Find out why options sometimes are serialized. Fix this workaround before D7 release!
-  if (!isset($link['localized_options']) || !is_array($link['localized_options'])) {
-    $link['localized_options'] = array('attributes' => '');
-  }
-
-  if (!isset($link['menu_name']) || !isset($link['mlid']) || !empty($disabled[$link['menu_name']])) {
-    $link['dhtml_disabled'] = TRUE; 
-    return $function($link);
-  }
-
-  $link['localized_options']['attributes']['id'] = 'dhtml_menu-' . _dhtml_menu_unique_id($link['mlid']);
-
-  // Each link in series is another level of recursion. Add it to the stack.
-  _dhtml_menu_stack($link);
-
-  // Pass the altered variables to the normal menu themer.
-  return $function($link);
-}
-
-/**
- * Preprocessor for menu_item.
- * Checks whether the current item has children that
- * were not rendered, and loads and renders them.
- */
-function dhtml_menu_theme_menu_item($link, $has_children, $menu = '', $in_active_trail = FALSE, $extra_class = NULL) {
-  global $theme;
-  static $cookie, $function;
-  if (!isset($cookie)) {
-    $cookie = explode(',', @$_COOKIE['dhtml_menu']);
-    $registry = variable_get('dhtml_menu_theme', array());
-    $function = isset($registry[$theme]) && drupal_function_exists($registry[$theme]['menu_item']) ? $registry[$theme]['menu_item'] : 'theme_menu_item';
-  }
-
-  /* When theme('menu_item') is called, the menu tree below it has been
-   * rendered already. Since we are done on this recursion level,
-   * one element must be popped off the stack.
-   */
-  $stack = _dhtml_menu_stack();
-
-  // Move to the last element in the stack (the current item).
-  end($stack);
-  
-  // If this item should not have DHTML, then return to the "parent" function.
-  $current = current($stack);
-  if (!empty($current['dhtml_disabled'])) {
-    $extra_class .= ' no-dhtml ';
-  
-    return $function($link, $has_children, $menu, $in_active_trail, $extra_class);
-  }
-  
-  // If there are children, but they were not loaded...
-  if ($has_children && !$menu) {
-    // Load the tree below the current position.
-    $tree = _dhtml_menu_subtree($stack);
-
-    // Render it...
-    $menu = menu_tree_output($tree);
-    if (!$menu) $has_children = FALSE; // Sanitize tree.
-  }
-
-  // If the current item can expand, and is neither saved as open nor in the active trail, close it.
-  if ($menu && !($in_active_trail || in_array(substr(key($stack), 5), $cookie))) {
-    $extra_class .= ' collapsed start-collapsed ';
-  }
-
-  // Cascade up to the original theming function.
-  return $function($link, $has_children, $menu, $in_active_trail, $extra_class);
-}
-
-/**
- * Helper function for storing recursion levels.
- *
- * @param $link
- *   If a menu item link is passed, it will be appended to the stack.
- *   If none is given, the stack will be returned and popped by one.
- *
- * @return
- *   The stack, if no parameter is given.
- */
-function _dhtml_menu_stack($link = FALSE) {
-  static $stack = array();
-  if ($link) {
-    $stack[$link['localized_options']['attributes']['id']] = $link;
-  }
-  else {
-    $copy = $stack;
-    array_pop($stack);
-    return $copy;
-  }
-}
-
-/**
- * Traverses the menu tree and returns the sub-tree of the item
- * indicated by the parameter.
- *
- * @param $stack
- *   An array of menu item links that are nested in each other in the tree.
- *
- * @return
- *   The items below the lowest item in the stack.
- */
-function _dhtml_menu_subtree($stack) {
-  static $index = array();
-  static $indexed = array();
-
-  reset($stack);
-  $start = current($stack);
-
-  // This looks expensive, but menu_tree_all_data uses static caching.
-  $tree = menu_tree_all_data($start['menu_name']);
-
-  if (!isset($indexed[$start['menu_name']])) {
-    $index += _dhtml_menu_index($tree);
-    $indexed[$start['menu_name']] = TRUE;
-  }
-
-  // Traverse the tree.
-  foreach ($stack as $item) {
-    $key = $index[$item['mlid']];
-    if (!isset($tree[$key])) {
-      $tree = $tree[key($tree)]['below'];
-      if (!isset($tree[$key])) return array();
-    }
-    $tree = $tree[$key]['below'];
-  }
-  return $tree;
-}
-
-/**
- * Indexes the menu tree by mlid. This is needed to identify the items
- * without relying on titles. This function is recursive.
- *
- * @param $tree
- *   A tree of menu items such as the return value of menu_tree_all_data()
- *
- * @return
- *   An array associating mlid values with the internal keys of the menu tree.
- */
-function _dhtml_menu_index($tree) {
-  $index = array();
-  foreach ($tree as $key => $item) {
-    $index[$item['link']['mlid']] = $key;
-    if (!empty($item['below'])) {
-      $index += _dhtml_menu_index($item['below']);
-    }
-  }
-  return $index;
-}
-
-/**
  * Implementation of hook_help().
  * @TODO: Move this to dhtml_menu.rebuild.inc once hook_help is no longer called on every page.
  */
 function dhtml_menu_help($path) {
   switch ($path) {
     case 'admin/settings/dhtml_menu':
-      return t('<em>DHTML Menu</em> adds dynamic functionality to the menus of your site. Ordinarily, reaching the child elements below an item requires you to visit its page. With DHTML Menu, clicking on an item with child elements will expand it without leaving the page, saving time. You can reach the actual page of such an item either by double-clicking on it or visiting the small extra link that will be shown right below it when expanded.');
+      $text = '<p>' . t('DHTML Menu adds dynamic functionality to the menus of your site. Ordinarily, reaching the child elements below an item requires you to visit its page. With this module enabled, clicking on an item with child elements will expand it without leaving the page, saving you the time of waiting for the page to load.') . '</p>';
+      $text .= '<p>' . t('<strong>Note:</strong> Links that gain a dynamic Javascript effect naturally stop working as normal links. Since you will occasionally need to visit a page that has sub-items (like the <a href="@url">main administration page</a>), this module provides several different options for static and dynamic navigation to coexist.', array('@url' => url('admin'))) . '</p>';
+      return $text;
   }
 }
 
-/**
- * Keeps track of ID attributes and adds a suffix to make it unique-when necessary.
- */
-function _dhtml_menu_unique_id($id) {
-  static $ids = array();
-  if (!isset($ids[$id])) {
-    $ids[$id] = 1;
-    return $id;
-  }
-  else {
-    return $id . '-' . $ids[$id]++;
-  }
-}
Index: dhtml_menu.rebuild.inc
===================================================================
RCS file: dhtml_menu.rebuild.inc
diff -N dhtml_menu.rebuild.inc
--- dhtml_menu.rebuild.inc	4 Apr 2009 07:31:30 -0000	1.3
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,46 +0,0 @@
-<?php
-// $Id: dhtml_menu.rebuild.inc,v 1.3 2009/04/04 07:31:30 arancaytar Exp $
-
-/**
- * @file dhtml_menu.rebuild.inc
- * Contains functions that will only be called when the cache 
- * is rebuilt, like hook_menu. 
- */
-
-/** 
- * Implementation of hook_theme_registry_alter().
- * Replaces the theme functions for the menu_item functions, and stores the
- * original functions in order to call them when this module is done with preprocessing.
- */
-function dhtml_menu_theme_registry_alter(&$theme_registry) {
-  global $theme;
-
-  // Back up the existing theme functions.
-  $themes = variable_get('dhtml_menu_theme', array());
-  $themes[$theme] = array(
-    'menu_item' => $theme_registry['menu_item']['function'],
-    'menu_item_link' => $theme_registry['menu_item_link']['function'],
-  );
-  variable_set('dhtml_menu_theme', $themes);
-
-  // Replace them with our own. These will "preprocess" and call the real functions.
-  $theme_registry['menu_item']['function'] = 'dhtml_menu_theme_menu_item';
-  $theme_registry['menu_item_link']['function'] = 'dhtml_menu_theme_menu_item_link';
-}
-
-/**
- * Implementation of hook_menu().
- * Adds a settings page.
- */
-function dhtml_menu_menu() {
-  $menu['admin/settings/dhtml_menu'] = array(
-    'title' => 'DHTML Menu',
-    'description' => 'Configure the effects of DHTML Menu',
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('dhtml_menu_settings'),
-    'access arguments' => array('administer site configuration'),
-    'file' => 'dhtml_menu.admin.inc',
-  );
-  return $menu;
-}
-
Index: dhtml_menu.registry.inc
===================================================================
RCS file: dhtml_menu.registry.inc
diff -N dhtml_menu.registry.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ dhtml_menu.registry.inc	26 May 2009 16:15:58 -0000
@@ -0,0 +1,46 @@
+<?php
+// $Id: dhtml_menu.rebuild.inc,v 1.3 2009/04/04 07:31:30 arancaytar Exp $
+
+
+/**
+ * @file dhtml_menu.registry.inc
+ * Contains functions that populate or alter cached registries.
+ */
+
+/**
+ * Implementation of hook_theme_registry_alter().
+ * Replaces the theme functions for the menu_item functions, and stores the
+ * original functions in order to call them when this module is done with preprocessing.
+ */
+function dhtml_menu_theme_registry_alter(&$theme_registry) {
+  global $theme;
+
+  // Back up the existing theme functions.
+  $themes = variable_get('dhtml_menu_theme', array());
+  $themes[$theme] = array(
+    'menu_item' => $theme_registry['menu_item']['function'],
+    'menu_item_link' => $theme_registry['menu_item_link']['function'],
+  );
+  variable_set('dhtml_menu_theme', $themes);
+
+  // Replace them with our own. These will "preprocess" and call the real functions.
+  $theme_registry['menu_item']['function'] = 'dhtml_menu_theme_menu_item';
+  $theme_registry['menu_item_link']['function'] = 'dhtml_menu_theme_menu_item_link';
+}
+
+/**
+ * Implementation of hook_menu().
+ * Adds a settings page.
+ */
+function dhtml_menu_menu() {
+  $menu['admin/settings/dhtml_menu'] = array(
+    'title' => 'DHTML Menu',
+    'description' => 'Configure the effects of DHTML Menu',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('dhtml_menu_settings'),
+    'access arguments' => array('administer site configuration'),
+    'file' => 'dhtml_menu.admin.inc',
+  );
+  return $menu;
+}
+
Index: dhtml_menu.theme.inc
===================================================================
RCS file: dhtml_menu.theme.inc
diff -N dhtml_menu.theme.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ dhtml_menu.theme.inc	26 May 2009 16:15:58 -0000
@@ -0,0 +1,197 @@
+<?php
+// $Id$
+
+/**
+ * @file dhtml_menu.theme.inc
+ * All functions related to generating the menu markup.
+ */
+
+/**
+ * Preprocessor for menu_item_link.
+ * Adds an ID attribute to menu links and helps the module
+ * follow the recursion of menu_tree_output().
+ */
+function dhtml_menu_theme_menu_item_link($link) {
+  global $theme;
+  static $disabled, $function;
+  if (!isset($disabled)) {
+    $disabled = variable_get('dhtml_menu_disabled', array());
+    $registry = variable_get('dhtml_menu_theme', array());
+    $function = isset($registry[$theme]) && drupal_function_exists($registry[$theme]['menu_item_link']) ? $registry[$theme]['menu_item_link'] : 'theme_menu_item_link';
+  }
+
+  // TODO: Find out why options sometimes are serialized. Fix this workaround before D7 release!
+  if (!isset($link['localized_options']) || !is_array($link['localized_options'])) {
+    $link['localized_options'] = array('attributes' => '');
+  }
+
+  if (!isset($link['menu_name']) || !isset($link['mlid']) || !empty($disabled[$link['menu_name']])) {
+    $link['dhtml_disabled'] = TRUE;
+    return $function($link);
+  }
+
+  $link['localized_options']['attributes']['id'] = 'dhtml_menu-' . _dhtml_menu_unique_id($link['mlid']);
+
+  // Each link in series is another level of recursion. Add it to the stack.
+  _dhtml_menu_stack($link);
+
+  // Pass the altered variables to the normal menu themer.
+  return $function($link);
+}
+
+/**
+ * Preprocessor for menu_item.
+ * Checks whether the current item has children that
+ * were not rendered, and loads and renders them.
+ */
+function dhtml_menu_theme_menu_item($link, $has_children, $menu = '', $in_active_trail = FALSE, $extra_class = NULL) {
+  global $theme;
+  $static = &drupal_static(__FUNCTION__, array('cookie' => array(), 'function' => 'theme_menu_item'));
+  $settings = variable_get('dhtml_menu_settings');
+
+  if (empty($static)) {
+    $static['cookie'] = $settings['nav'] != 'hover' ? explode(',', @$_COOKIE['dhtml_menu']) : array();
+
+    $registry = variable_get('dhtml_menu_theme');
+    if (isset($registry[$theme]) && drupal_function_exists($registry[$theme]['menu_item'])) {
+      $static['function'] = $registry[$theme]['menu_item'];
+    }
+  }
+
+  $cookie = &$static['cookie'];
+  $function = &$static['function'];
+
+  // When theme('menu_item') is called, the menu tree below it has been
+  // rendered already. Since we are done on this recursion level,
+  // one element must be popped off the stack.
+  $stack = _dhtml_menu_stack();
+
+  // Move to the last element in the stack (the current item).
+  end($stack);
+
+  // If this item should not have DHTML, then return to the "parent" function.
+  $current = current($stack);
+  if (!empty($current['dhtml_disabled'])) {
+    $extra_class .= ' no-dhtml ';
+
+    return $function($link, $has_children, $menu, $in_active_trail, $extra_class);
+  }
+
+  // If there are children, but they were not loaded...
+  if ($has_children && !$menu) {
+    // Load the tree below the current position.
+    $tree = _dhtml_menu_subtree($stack);
+
+    // Render it...
+    $menu = menu_tree_output($tree);
+    // Sanitize tree.
+    if (!$menu) {
+      $has_children = FALSE;
+    }
+  }
+
+  // If the current item can expand, and is neither saved as open nor in the active trail, close it.
+  if ($menu && !($in_active_trail || in_array(substr(key($stack), 5), $cookie))) {
+    $extra_class .= ' collapsed start-collapsed ';
+  }
+
+  // Cascade up to the original theming function.
+  return $function($link, $has_children, $menu, $in_active_trail, $extra_class);
+}
+
+/**
+ * Helper function for storing recursion levels.
+ *
+ * @param $link
+ *   If a menu item link is passed, it will be appended to the stack.
+ *   If none is given, the stack will be returned and popped by one.
+ *
+ * @return
+ *   The stack, if no parameter is given.
+ */
+function _dhtml_menu_stack($link = FALSE) {
+  static $stack = array();
+  if ($link) {
+    $stack[$link['localized_options']['attributes']['id']] = $link;
+  }
+  else {
+    $copy = $stack;
+    array_pop($stack);
+    return $copy;
+  }
+}
+
+/**
+ * Traverses the menu tree and returns the sub-tree of the item
+ * indicated by the parameter.
+ *
+ * @param $stack
+ *   An array of menu item links that are nested in each other in the tree.
+ *
+ * @return
+ *   The items below the lowest item in the stack.
+ */
+function _dhtml_menu_subtree($stack) {
+  static $index = array();
+  static $indexed = array();
+
+  reset($stack);
+  $start = current($stack);
+
+  // This looks expensive, but menu_tree_all_data uses static caching.
+  $tree = menu_tree_all_data($start['menu_name']);
+
+  if (!isset($indexed[$start['menu_name']])) {
+    $index += _dhtml_menu_index($tree);
+    $indexed[$start['menu_name']] = TRUE;
+  }
+
+  // Traverse the tree.
+  foreach ($stack as $item) {
+    $key = $index[$item['mlid']];
+    if (!isset($tree[$key])) {
+      $tree = $tree[key($tree)]['below'];
+      if (!isset($tree[$key])) {
+        return array();
+      }
+    }
+    $tree = $tree[$key]['below'];
+  }
+  return $tree;
+}
+
+/**
+ * Indexes the menu tree by mlid. This is needed to identify the items
+ * without relying on titles. This function is recursive.
+ *
+ * @param $tree
+ *   A tree of menu items such as the return value of menu_tree_all_data()
+ *
+ * @return
+ *   An array associating mlid values with the internal keys of the menu tree.
+ */
+function _dhtml_menu_index($tree) {
+  $index = array();
+  foreach ($tree as $key => $item) {
+    $index[$item['link']['mlid']] = $key;
+    if (!empty($item['below'])) {
+      $index += _dhtml_menu_index($item['below']);
+    }
+  }
+  return $index;
+}
+
+/**
+ * Keeps track of ID attributes and adds a suffix to make it unique-when necessary.
+ */
+function _dhtml_menu_unique_id($id) {
+  static $ids = array();
+  if (!isset($ids[$id])) {
+    $ids[$id] = 1;
+    return $id;
+  }
+  else {
+    return $id . '-' . $ids[$id]++;
+  }
+}
+
Index: translations/dhtml_menu.pot
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/dhtml_menu/translations/dhtml_menu.pot,v
retrieving revision 1.5
diff -u -p -r1.5 dhtml_menu.pot
--- translations/dhtml_menu.pot	5 Nov 2008 17:50:55 -0000	1.5
+++ translations/dhtml_menu.pot	26 May 2009 16:15:58 -0000
@@ -1,18 +1,18 @@
-# $Id: dhtml_menu.pot,v 1.5 2008/11/05 17:50:55 arancaytar Exp $
+# $Id$
 #
 # LANGUAGE translation of Drupal (dhtml_menu)
 # Copyright YEAR NAME <EMAIL@ADDRESS>
 # Generated from files:
-#  dhtml_menu.admin.inc,v 1.6 2008/11/05 12:14:43 arancaytar
-#  dhtml_menu.rebuild.inc: n/a
-#  dhtml_menu.module,v 1.31 2008/11/05 12:14:43 arancaytar
-#  dhtml_menu.info,v 1.6 2008/07/11 22:15:58 arancaytar
+#  dhtml_menu.admin.inc,v 1.9 2008/11/09 22:32:49 arancaytar
+#  dhtml_menu.module,v 1.40 2009/04/04 07:31:30 arancaytar
+#  dhtml_menu.install,v 1.10 2009/04/04 07:31:30 arancaytar
+#  dhtml_menu.info,v 1.7 2008/11/05 17:50:55 arancaytar
 #
 #, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
-"POT-Creation-Date: 2008-11-05 07:47-0800\n"
+"POT-Creation-Date: 2009-05-26 17:47+0200\n"
 "PO-Revision-Date: YYYY-mm-DD HH:MM+ZZZZ\n"
 "Last-Translator: NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <EMAIL@ADDRESS>\n"
@@ -21,100 +21,140 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
 
-#: dhtml_menu.admin.inc:15
+#: dhtml_menu.admin.inc:18
 msgid "Static navigation"
 msgstr ""
 
-#: dhtml_menu.admin.inc:17
-msgid "<strong>Fake child item:</strong> At the top of each submenu, an extra link will be generated that leads to the page of the parent item."
+#: dhtml_menu.admin.inc:20
+msgid "<strong>Open menu item:</strong> Menu items cannot be collapsed dynamically. Instead, clicking on an already expanded item will take you to the page."
 msgstr ""
 
-#: dhtml_menu.admin.inc:18
-msgid "<strong>Link remains static:</strong> All menu links will continue to function as static links. To expand a menu, click the bullet icon next to the link."
+#: dhtml_menu.admin.inc:21
+msgid "<strong>Fake child item:</strong> At the top of each menu, an extra link will be generated that leads to the page of the parent item."
 msgstr ""
 
-#: dhtml_menu.admin.inc:19
-msgid "<strong>Doubleclick:</strong> To expand a menu, click the link once. To navigate to the page, click it twice. <em>This may be difficult to find for your users!</em>"
+#: dhtml_menu.admin.inc:22
+msgid "<strong>Hover:</strong> To expand an item temporarily, hover your cursor over it. To visit the page, click it."
 msgstr ""
 
-#: dhtml_menu.admin.inc:20
-msgid "<strong>None:</strong> Clicking the link will expand the menu. Navigating to the page is not possible. <em>This will make pages with sub-items very difficult to reach!</em>"
+#: dhtml_menu.admin.inc:23
+msgid "<strong>Link remains static:</strong> All links will continue to function as static links. To expand an item, click the bullet icon next to the link."
 msgstr ""
 
-#: dhtml_menu.admin.inc:23
-msgid "Dynamic expansion of menus competes with the static navigation of content. Choose how to resolve this conflict."
+#: dhtml_menu.admin.inc:24
+msgid "<strong>Doubleclick:</strong> To expand an item, click the link once. To navigate to the page, click it twice. <em>This may be difficult to find for your users!</em>"
+msgstr ""
+
+#: dhtml_menu.admin.inc:25
+msgid "<strong>None:</strong> Clicking the link will expand the item. Navigating to the page is not possible at all. <em>This will make pages with sub-items very difficult to reach!</em>"
 msgstr ""
 
 #: dhtml_menu.admin.inc:28
+msgid "Dynamic expansion of menus competes with the static navigation of content. Choose how to resolve this conflict."
+msgstr ""
+
+#: dhtml_menu.admin.inc:33
 msgid "Animation"
 msgstr ""
 
-#: dhtml_menu.admin.inc:35
+#: dhtml_menu.admin.inc:40
 msgid "Effects"
 msgstr ""
 
-#: dhtml_menu.admin.inc:37
+#: dhtml_menu.admin.inc:42
 msgid "Slide in vertically"
 msgstr ""
 
-#: dhtml_menu.admin.inc:38
+#: dhtml_menu.admin.inc:43
 msgid "Slide in horizontally"
 msgstr ""
 
-#: dhtml_menu.admin.inc:39
+#: dhtml_menu.admin.inc:44
 msgid "Fade in"
 msgstr ""
 
-#: dhtml_menu.admin.inc:41
+#: dhtml_menu.admin.inc:46
 msgid "You may pick any number of animation effects that will accompany the opening and closing of a menu."
 msgstr ""
 
-#: dhtml_menu.admin.inc:47
+#: dhtml_menu.admin.inc:52
 msgid "Speed"
 msgstr ""
 
-#: dhtml_menu.admin.inc:50
+#: dhtml_menu.admin.inc:55
 msgid "Choose how quickly the menus should expand and collapse."
 msgstr ""
 
-#: dhtml_menu.admin.inc:55
+#: dhtml_menu.admin.inc:60
 msgid "Other effects"
 msgstr ""
 
-#: dhtml_menu.admin.inc:62
+#: dhtml_menu.admin.inc:67
 msgid "When a menu opens"
 msgstr ""
 
-#: dhtml_menu.admin.inc:64
-msgid "Do nothing."
+#: dhtml_menu.admin.inc:69
+msgid "Keep other menus open."
 msgstr ""
 
-#: dhtml_menu.admin.inc:65
+#: dhtml_menu.admin.inc:70
 msgid "Close all other open menus on the page."
 msgstr ""
 
-#: dhtml_menu.admin.inc:66
-msgid "Close other open submenus in the same menu tree."
+#: dhtml_menu.admin.inc:71
+msgid "Close other open menus in the same tree."
 msgstr ""
 
-#: dhtml_menu.admin.inc:73
+#: dhtml_menu.admin.inc:78
 msgid "When a menu closes"
 msgstr ""
 
-#: dhtml_menu.admin.inc:75
+#: dhtml_menu.admin.inc:80
 msgid "Remember which sub-items were expanded when it next opens."
 msgstr ""
 
-#: dhtml_menu.admin.inc:76
+#: dhtml_menu.admin.inc:81
 msgid "Close all its sub-items, too."
 msgstr ""
 
-#: dhtml_menu.rebuild.inc:40
-msgid "<em>DHTML Menu</em> adds dynamic functionality to the menus of your site. Ordinarily, reaching the child elements below an item requires you to visit its page. With DHTML Menu, clicking on an item with child elements will expand it without leaving the page, saving time. You can reach the actual page of such an item either by double-clicking on it or visiting the small extra link that will be shown right below it when expanded."
+#: dhtml_menu.admin.inc:83
+msgid "This option only has an effect if menus are set to be closed dynamically."
+msgstr ""
+
+#: dhtml_menu.admin.inc:89
+msgid "When a new page is loaded"
+msgstr ""
+
+#: dhtml_menu.admin.inc:91
+msgid "Remember which items were expanded on the last page."
+msgstr ""
+
+#: dhtml_menu.admin.inc:92
+msgid "Expand only the currently active path."
+msgstr ""
+
+#: dhtml_menu.admin.inc:103
+msgid "Menus without DHTML"
+msgstr ""
+
+#: dhtml_menu.admin.inc:106
+msgid "DHTML will be used for all menus by default, but can be switched off for specific menus."
+msgstr ""
+
+#: dhtml_menu.admin.inc:129
+msgid "Book: %title"
+msgstr ""
+
+#: dhtml_menu.module:31
+msgid "DHTML Menu adds dynamic functionality to the menus of your site. Ordinarily, reaching the child elements below an item requires you to visit its page. With this module enabled, clicking on an item with child elements will expand it without leaving the page, saving you the time of waiting for the page to load."
+msgstr ""
+
+#: dhtml_menu.module:32
+msgid "<strong>Note:</strong> Links that gain a dynamic Javascript effect naturally stop working as normal links. Since you will occasionally need to visit a page that has sub-items (like the <a href=\"@url\">main administration page</a>), this module provides several different options for static and dynamic navigation to coexist."
 msgstr ""
 
-#: dhtml_menu.module:0
-msgid "dhtml_menu"
+#: dhtml_menu.install:38
+msgid "<em>DHTML Menu</em> offers a wide range of options to customize its behavior. If you wish to change them, please visit the <a href=\"@url\">configuration page</a>."
 msgstr ""
 
 #: dhtml_menu.info:0
@@ -122,6 +162,6 @@ msgid "DHTML Menu"
 msgstr ""
 
 #: dhtml_menu.info:0
-msgid "Opens menus dynamically to reduce page refreshes."
+msgid "Opens menus dynamically to reduce page reloads."
 msgstr ""
 
