Index: modules/admin/admin-toolbar.tpl.php
===================================================================
RCS file: modules/admin/admin-toolbar.tpl.php
diff -N modules/admin/admin-toolbar.tpl.php
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/admin/admin-toolbar.tpl.php	14 Jun 2009 20:43:39 -0000
@@ -0,0 +1,30 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Default template for header admin toolbar.
+ *
+ * Available variables:
+ * - $collapsed: Boolean for whether the admin links should be collapsed.
+ * - $user_menu: User account / logout links.
+ * - $admin_menu: Management menu links.
+ * - $admin_links: Convenience links from the "Admin" menu.
+ *
+ * @see template_preprocess()
+ * @see template_preprocess_admin_toolbar()
+ */
+?>
+<div id='admin-toolbar' class='clearfix'>
+  <div class='admin-menu clearfix'>
+    <span class='toggle <?php if (!$collapsed) print 'toggle-active' ?>'><?php print t('Admin links') ?></span>
+    <?php print $user_menu ?>
+    <?php print $admin_menu ?>
+  </div>
+
+  <div class='admin-links clearfix <?php if ($collapsed) print 'collapsed' ?>'>
+    <?php print $admin_links; ?>
+  </div>
+
+  <div class='shadow'></div>
+</div>
Index: modules/admin/admin.info
===================================================================
RCS file: modules/admin/admin.info
diff -N modules/admin/admin.info
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/admin/admin.info	14 Jun 2009 20:43:39 -0000
@@ -0,0 +1,9 @@
+; $Id$
+name = "Admin"
+description = "Drupal administration UI helpers. Includes: admin menu, contextual administration links, admin theme."
+package = "Administration"
+core = "7.x"
+version = "7.0-dev"
+files[] = "admin.install"
+files[] = "admin.module"
+dependencies[] = "menu"
\ No newline at end of file
Index: modules/admin/admin.install
===================================================================
RCS file: modules/admin/admin.install
diff -N modules/admin/admin.install
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/admin/admin.install	14 Jun 2009 20:43:39 -0000
@@ -0,0 +1,52 @@
+<?php
+// $Id$
+
+/**
+ * Implement hook_install().
+ */
+function admin_install() {
+  $t = get_t();
+  $query = db_insert('menu_custom')->fields(array('menu_name', 'title', 'description'));
+  $query->values(array('menu_name' => 'admin', 'title' => $t('Admin'), 'description' => $t('The <em>Admin</em> menu contains commonly used links for administrative tasks.')))->execute();
+}
+
+/**
+ * Implement hook_enable().
+ *
+ * Add starter convenience links to the admin menu.
+ */
+function admin_enable() {
+  menu_rebuild();
+  $items = array(
+    'node/add' => 'Add',
+    'admin/content/node/edit' => 'Edit',
+    'admin/content/node' => 'Find content',
+    'admin' => 'Dashboard',
+  );
+  $weight = -20;
+  foreach ($items as $path => $title) {
+    $link = array(
+      'mlid' => 0,
+      'link_title' => $title,
+      'link_path' => $path,
+      'router_path' => $path,
+      'menu_name' => 'admin',
+      'module' => 'menu',
+      'weight' => $weight,
+    );
+
+    // Check for an existing menu item before attempting to create a new one.
+    $menu_link = db_query("SELECT mlid FROM {menu_links} WHERE link_path = :path AND menu_name = :menu_name", array(
+      ':path' => $link['link_path'],
+      ':menu_name' => $link['menu_name']
+    ))
+    ->fetchField();
+    if (!$menu_link) {
+      menu_link_save($link);
+    }
+
+    // Increment weight so items can be displayed in desired order.
+    $weight++;
+  }
+  menu_cache_clear_all();
+}
Index: modules/admin/admin.module
===================================================================
RCS file: modules/admin/admin.module
diff -N modules/admin/admin.module
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/admin/admin.module	14 Jun 2009 20:43:39 -0000
@@ -0,0 +1,174 @@
+<?php
+// $Id$
+
+/**
+ * Implementation of hook_init().
+ */
+function admin_init() {
+  if (admin_is_enabled('admin toolbar') || admin_is_enabled('admin inline') || arg(0) == 'admin') {
+    $path = drupal_get_path('module', 'admin');
+    drupal_add_js($path .'/admin_toolbar.js');
+    drupal_add_css($path .'/admin_toolbar.css');
+  }
+}
+
+/**
+ * Implementation of hook_perm().
+ */
+function admin_perm() {
+  return array(
+    'admin toolbar' => array(
+      'title' => t('Use admin toolbar'),
+      'description' => t('Access the persistent administration toolbar at the top of each page.'),
+    ),
+  );
+}
+
+/**
+ * Implementation of hook_theme().
+ */
+function admin_theme($cache, $type, $theme, $path) {
+  $items = array();
+  $items['admin_toolbar'] = array(
+    'arguments' => array('admin_toolbar' => array()),
+    'template' => 'admin-toolbar',
+    'path' => drupal_get_path('module', 'admin'),
+    'file' => 'admin.theme.inc',
+  );
+  return $items;
+}
+
+/**
+ * Wrapper to check whether various admin features are accessible to the
+ * current user and compatible with the current theme.
+ */
+function admin_is_enabled($op = 'admin toolbar') {
+  if (user_access($op)) {
+    global $theme_info;
+    // If the theme does not specify some flag for this feature, assume it is compatible.
+    if (!isset($theme_info->info['admin'][$op]) || (isset($theme_info->info['admin'][$op]) && !empty($theme_info->info['admin'][$op]))) {
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+
+/**
+ * Implementation of hook_page_alter().
+ */
+function admin_page_alter(&$page) {
+  if (admin_is_enabled('admin toolbar')) {
+    $page['page_top']['admin_toolbar'] = admin_toolbar();
+  }
+}
+
+/**
+ * Implementation of hook_preprocess_page().
+ */
+function admin_preprocess_page(&$vars) {
+  if (admin_is_enabled('admin toolbar')) {
+    $vars['classes_array'][] = 'admin-toolbar';
+    if (empty($vars['page']['admin']['admin_toolbar']['collapsed'])) {
+      $vars['classes_array'][] = 'admin-toolbar-links';
+    }
+  }
+}
+
+/**
+ * Helper for returning a selectively flattened version of the admin menu.
+ */
+function admin_get_menu_tree($method = 'all', $reset = FALSE) {
+  $tree = ($method == 'all') ? menu_tree_all_data('management') : menu_tree_page_data('management');
+  foreach ($tree as $k => $item) {
+    if ($item['link']['link_path'] == 'admin' && !empty($item['below'])) {
+      unset($tree[$k]);
+      $tree = array_merge($tree, $item['below']);
+    }
+  }
+  return $tree;
+}
+
+/**
+ * Build the admin menu as a structured array ready for drupal_render().
+ */
+function admin_toolbar() {
+  $output = array('#theme' => 'admin_toolbar');
+
+  // Retrieve the admin menu from the database.
+  $tree = admin_get_menu_tree();
+  $links = admin_menu_navigation_links($tree);
+  $output['admin_menu'] = $links;
+
+  // Add logout & user account links
+  global $user;
+  $user_menu = array(
+    'account' => array(
+      'title' => t('Hello <strong>!username</strong>', array('!username' => check_plain($user->name))),
+      'href' => 'user',
+      'html' => TRUE,
+      'attributes' => array('class' => 'popups'),
+    ),
+    'logout' => array(
+      'title' => t('Logout'),
+      'href' => 'user/logout',
+    ),
+  );
+  $output['user_menu'] = $user_menu;
+
+  // Add convenience admin links
+  $admin_links = menu_tree_all_data('admin');
+  $admin_links = admin_menu_navigation_links($admin_links);
+  $output['admin_links'] = $admin_links;
+
+  // Set the default toolbar state to expanded.
+  $output['collapsed'] = FALSE;
+  return $output;
+}
+
+/**
+ * Generate a links array from a menu tree array.
+ */
+function admin_menu_navigation_links($tree) {
+  $links = array();
+  foreach ($tree as $item) {
+    if (!$item['link']['hidden']) {
+      $class = '';
+      $id = str_replace('/', '-', $item['link']['href']);
+
+      $l = $item['link']['localized_options'];
+      $l['href'] = $item['link']['href'];
+      $l['title'] = "<span class='icon'></span>". $item['link']['title'];
+      $l['attributes'] = array('id' => 'admin-link-'. $id, 'class' => 'popups');
+      $l['html'] = TRUE;
+
+      $class = ' path-'. $id;
+      if (admin_in_active_trail($item['link']['href'])) {
+        $class .= ' active-trail';
+      }
+      // Keyed with the unique mlid to generate classes in theme_links().
+      $links['menu-'. $item['link']['mlid'] . $class] = $l;
+    }
+  }
+  return $links;
+}
+
+/**
+ * Checks whether an item is in the active trail. Useful when using
+ * a menu generated by menu_tree_all_data() which does not set the
+ * 'in_active_trail' flag on items.
+ */
+function admin_in_active_trail($path) {
+  $active_paths = &drupal_static(__FUNCTION__);
+
+  // Gather active paths
+  if (!isset($active_paths)) {
+    $active_paths = array();
+    $trail = menu_get_active_trail();
+    foreach ($trail as $item) {
+      if (!empty($item['href'])) {
+        $active_paths[] = $item['href'];
+      }
+    }
+  }
+  return in_array($path, $active_paths);
+}
Index: modules/admin/admin.theme.inc
===================================================================
RCS file: modules/admin/admin.theme.inc
diff -N modules/admin/admin.theme.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/admin/admin.theme.inc	14 Jun 2009 20:43:39 -0000
@@ -0,0 +1,12 @@
+<?php
+// $Id$
+
+/**
+ * Preprocessor for theme('admin_toolbar').
+ */
+function template_preprocess_admin_toolbar(&$vars) {
+  $vars['user_menu'] = theme('links', $vars['admin_toolbar']['user_menu'], array('id' => 'admin-toolbar-user'));
+  $vars['admin_menu'] = theme('links', $vars['admin_toolbar']['admin_menu'], array('id' => 'admin-toolbar-menu'));
+  $vars['admin_links'] = theme('links', $vars['admin_toolbar']['admin_links'], array('id' => 'admin-toolbar-links'));
+  $vars['collapsed'] = $vars['admin_toolbar']['collapsed'];
+}
Index: modules/admin/admin_toolbar.css
===================================================================
RCS file: modules/admin/admin_toolbar.css
diff -N modules/admin/admin_toolbar.css
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/admin/admin_toolbar.css	14 Jun 2009 20:43:39 -0000
@@ -0,0 +1,169 @@
+/* $Id$ */
+
+body.admin-toolbar { padding-top:30px; }
+body.admin-toolbar-links { padding-top:80px; }
+
+/**
+ * Aggressive resets so we can achieve a consistent look in
+ * hostile CSS environments.
+ */
+div#admin-toolbar,
+div#admin-toolbar * {
+  margin:0px;
+  padding:0px;
+  border:0px;
+  outline:0px;
+  font-size:100%;
+  vertical-align:baseline;
+  line-height:inherit;
+  text-align:left;
+  list-style:none;
+  }
+
+/**
+ * Base styles
+ */
+div#admin-toolbar {
+  font:normal 11px/20px "Lucida Grande",Verdana,sans-serif;
+  background:#666;
+  color:#ccc;
+
+  position:fixed;
+  left:0px;
+  right:0px;
+  top:0px;
+
+  z-index:100;
+  }
+
+div#admin-toolbar .collapsed { display:none; }  
+
+div#admin-toolbar div.shadow {
+  position:absolute;
+  left:0px;
+  right:0px;
+  bottom:-15px;
+
+  height:15px;
+  background:url(sprite.png) 0px -85px repeat-x;
+  }
+
+div#admin-toolbar a {
+  text-decoration:none;
+  color:#fff;
+  }
+
+div#admin-toolbar ul li,
+div#admin-toolbar ul li a { float:left; }
+
+/**
+ * First level menus
+ */
+div#admin-toolbar div.admin-menu {
+  background:url(sprite.png) 0px -20px repeat-x;
+  height:25px;
+  line-height:20px;
+  padding:5px 10px 0px;
+
+  overflow:hidden;
+  position:relative;
+  }
+
+div#admin-toolbar div.admin-menu #admin-toolbar-user {
+  position:absolute;
+  right:35px;
+  }
+
+div#admin-toolbar div.admin-menu #admin-toolbar-menu {
+  position:absolute;
+  left:10px;
+  }
+
+div#admin-toolbar div.admin-menu span.toggle {
+  position:absolute;
+  right:10px;
+  cursor:pointer;
+
+  background:url(sprite.png) 0px -60px no-repeat;
+  text-indent:-9999px;
+  overflow:hidden;
+
+  width:25px;
+  height:25px;
+  }
+
+div#admin-toolbar div.admin-menu span.toggle-active { background-position: -25px -60px; }
+
+div#admin-toolbar div.admin-menu ul li a {
+  -moz-border-radius:10px;
+  -webkit-border-radius:10px;
+  padding:0px 10px;
+  }
+
+div#admin-toolbar div.admin-menu ul li a:hover {
+  background:#444;
+  }
+
+div#admin-toolbar div.admin-menu ul li a.active:hover,
+div#admin-toolbar div.admin-menu ul li a.active {
+  text-shadow:#333 0px 1px 0px;
+  background:url(sprite.png) 0px 0px repeat-x;
+  }
+
+/**
+ * Second level menus
+ */
+div#admin-toolbar div.admin-links {
+  position:relative;
+  padding:0px 10px;
+  }
+
+div#admin-toolbar div.admin-links ul {
+  padding:5px 0px;
+  height:40px;
+  line-height:30px;
+  overflow:hidden;
+  float:left;
+  }
+
+div#admin-toolbar div.admin-links ul li a {
+  -moz-border-radius:5px;
+  -webkit-border-radius:5px;
+  padding:5px 10px 5px 5px;
+  margin-right:5px;
+  }
+
+div#admin-toolbar div.admin-links ul li a:hover {
+  background:#555;
+  }
+
+div#admin-toolbar div.admin-links ul li a.active:hover,
+div#admin-toolbar div.admin-links ul li a.active {
+  background:url(sprite.png) 0px -20px repeat-x;
+  }
+
+div#admin-toolbar div.admin-links span.icon {
+  float:left;
+
+  background:#444;
+  width:30px;
+  height:30px;
+  margin-right:5px;
+
+  -moz-border-radius:5px;
+  -webkit-border-radius:5px;
+  }
+
+/**
+ * IE 6 Fixes.
+ *
+ * Since IE 6 has severe problems interpreting fixed positioning,
+ * we downgrade the behavior of the admin toolbar entirely to static
+ * positioning.
+ */
+* html body.admin-toolbar,
+* html body.admin-toolbar-links { padding-top:0px; }
+
+* html div#admin-toolbar { position:static; }
+
+* html div#admin-toolbar div.shadow { display:none; }
Index: modules/admin/admin_toolbar.js
===================================================================
RCS file: modules/admin/admin_toolbar.js
diff -N modules/admin/admin_toolbar.js
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/admin/admin_toolbar.js	14 Jun 2009 20:43:40 -0000
@@ -0,0 +1,94 @@
+// $Id$
+(function ($) {
+
+/**
+ * Implementation of Drupal.behaviors for admin.
+ */
+Drupal.behaviors.admin = {
+  attach: function() {
+    // Set the intial state of the toolbar
+    $('#admin-toolbar:not(.processed)').each(function() {
+      Drupal.admin.toolbar.init();
+      $(this).addClass('processed');
+    });
+    // Toggling of admin link visibility.
+    $('#admin-toolbar span.toggle:not(.processed)').each(function() {
+      $(this).click(function() {
+        Drupal.admin.toolbar.toggle();
+        return false;
+      });
+      $(this).addClass('processed');
+    });
+  }
+};
+
+/**
+ * Initialize the admin object cautiously to avoid collisions with other
+ * modules (admin_menu).
+ */
+Drupal.admin = Drupal.admin || {};
+Drupal.admin.toolbar = Drupal.admin.toolbar || {};
+
+/**
+ * Retrieve last saved cookie settings and set up the initial toolbar state.
+ */
+Drupal.admin.toolbar.init = function() {
+  // Retrieve the collapsed status from a stored cookie.
+  var collapsed = null;
+  var name = 'Drupal.admin.toolbar.collapsed';
+  if (document.cookie && document.cookie != '') {
+    var cookies = document.cookie.split(';');
+    for (var i = 0; i < cookies.length; i++) {
+      var cookie = jQuery.trim(cookies[i]);
+      // Does this cookie string begin with the name we want?
+      if (cookie.substring(0, name.length + 1) == (name + '=')) {
+        collapsed = decodeURIComponent(cookie.substring(name.length + 1));
+        break;
+      }
+    }
+  }
+
+  // Expand or collapse the toolbar based on the cookie value.
+  if (collapsed == 1) {
+    Drupal.admin.toolbar.collapse();
+  }
+  else {
+    Drupal.admin.toolbar.expand();
+  }
+}
+
+/**
+ * Collapse the admin toolbar.
+ */
+Drupal.admin.toolbar.collapse = function() {
+  $('#admin-toolbar div.admin-links').addClass('collapsed');
+  $('#admin-toolbar span.toggle').removeClass('toggle-active');
+  $('body').removeClass('admin-toolbar-links');
+
+  document.cookie = ['Drupal.admin.toolbar.collapsed', '=', encodeURIComponent(1), '; expires=-1', '; path='+ Drupal.settings.basePath].join('');
+}
+
+/**
+ * Expand the admin toolbar.
+ */
+Drupal.admin.toolbar.expand = function() {
+  $('#admin-toolbar div.admin-links').removeClass('collapsed');
+  $('#admin-toolbar span.toggle').addClass('toggle-active');
+  $('body').addClass('admin-toolbar-links');
+
+  document.cookie = ['Drupal.admin.toolbar.collapsed', '=', encodeURIComponent(0), '; expires=-1', '; path='+ Drupal.settings.basePath].join('');
+}
+
+/**
+ * Toggle the admin toolbar.
+ */
+Drupal.admin.toolbar.toggle = function() {
+  if ($('#admin-toolbar div.admin-links').is('.collapsed')) {
+    Drupal.admin.toolbar.expand();
+  }
+  else {
+    Drupal.admin.toolbar.collapse();
+  }
+}
+
+})(jQuery);
Index: modules/admin/sprite.png
===================================================================
RCS file: modules/admin/sprite.png
diff -N modules/admin/sprite.png
Binary files /dev/null and sprite.png differ
