Index: navigation.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/navigation/navigation.module,v
retrieving revision 1.24
diff -u -r1.24 navigation.module
--- navigation.module	30 May 2004 22:00:21 -0000	1.24
+++ navigation.module	30 May 2004 22:34:12 -0000
@@ -6,13 +6,17 @@
 */
 
 // API:
-function navigation_display_tabs($mid) {
+function navigation_display_tabs($mid, $fulltabs = 0) {
   $output = "";
   if(navigation_menu_allowed($mid) && ($menu = navigation_load_menu($mid))) {
-   $output = "<div class=\"tabs\" id=\"tabs-$mid\">\n";
     $selected = navigation_load_selected_items($mid);
-    $output .= navigation_build_tabs($menu, 0, 0, $selected);
-    $output .= "</div>\n";
+    if ($fulltabs)
+    {
+      $output .= navigation_build_fulltabs($menu, 0, 0, $selected);
+    }
+    else {
+      $output .= navigation_build_tabs($menu, 0, 0, $selected);
+    }
   }
   return $output;
 }
@@ -76,6 +80,51 @@
   }
 }
 
+/**
+ * navigation_build_tabs: Builds collapsed menu structure - ideal for use with
+ * DHTML/CSS for dropdown menus.
+ */
+function navigation_build_fulltabs($menu, $row, $active_parent, $selected) {
+
+  // Pretty-print mini-macro
+  for ($i = 0; $i < $row; $i++)
+  {
+    $spaces .= "  ";
+  }
+
+  if($menu[$row]) {
+    unset($tabrow);
+    unset($children);
+    foreach ($menu[$row] as $item) {
+      unset($rowOutput);
+      if (navigation_item_allowed($menu[mid], $item->iid) && (in_array($active_parent, $item->parents) || !$active_parent)) {
+        $children = $item->iid;
+
+        // Output the item.
+        if ($selected[$item->iid]) {
+          $menuOutput .= "\n$spaces  <li id=\"item-$item->iid\">". navigation_l($item->name, $item->url, array("title" => $item->description, "class" => "active-tab"));
+        }
+        else {
+          $menuOutput .= "\n$spaces  <li id=\"item-$item->iid\">". navigation_l($item->name, $item->url, array("title" => $item->description));
+        }
+
+        // Check: item has children
+        $rowOutput = navigation_build_fulltabs($menu, $row + 1, $children, $selected);
+        if ($rowOutput) {
+          // Output submenu
+          $menuOutput .= "\n$rowOutput\n$spaces  </li>";
+        }
+      }
+		}
+    if ($menuOutput) {
+      $output = "$spaces<ul class=\"tab-row" . $row . "\">\n$menuOutput\n$spaces</ul>\n";
+    }
+	}
+
+  return $output;
+}
+
+/* Original Algorithm - build selected row only. */
 function navigation_build_tabs($menu, $row, $active_parent, $selected) {
   // only try and build the next row if it exists
   if($menu[$row]) {
@@ -92,17 +141,16 @@
           $tabrow .= "  <li id=\"item-$item->iid\">". navigation_l($item->name, $item->url, array("title" => $item->description)) ."</li>\n";
         }
       }
-    }
-    if($tabrow) {
-      $output .= "\n<ul class=\"tab-row$row\">\n$tabrow</ul>\n";
-    }
-    if ($children) {
-      foreach($children as $child) {
-        $output .= navigation_build_tabs($menu, $row + 1, $child, $selected);
+      if($tabrow) {
+        $output .= "\n<ul class=\"tab-row$row\">\n$tabrow</ul>\n";
+      }
+      if ($children) {
+        foreach($children as $child) {
+          $output .= navigation_build_tabs($menu, $row + 1, $child, $selected);
+        }
       }
     }
   }
-
   return $output;
 }
 
@@ -116,7 +164,7 @@
         if ($selected[$item->iid]) {
           if(navigation_get_tree($menu[mid], $item->iid)) {
             // this item has children, display expanded icon
-            $output .= "<li class=\"expanded\" id=\"item-$item->iid\">". navigation_l($item->name, $item->url, array("title" => $item->description)) ."\n";
+            $output .= "<li class=\"expanded\" id=\"item-$item->iid\">". navigation_l($item->name, $item->name, $item->url, array("title" => $item->description)) ."\n";
             // display children of active items
             $output .= navigation_build_menu($menu, $row + 1, $item->iid, $selected);
             $output .= "</li>\n";
