﻿Index: misc/jquery.hoverintent.js
===================================================================
RCS file: misc/jquery.hoverintent.js
diff -N misc/jquery.hoverintent.js
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ misc/jquery.hoverintent.js	16 Sep 2009 15:14:22 -0000
@@ -0,0 +1,9 @@
+﻿/**
+* hoverIntent r5 // 2007.03.27 // jQuery 1.1.2+
+* <http://cherne.net/brian/resources/jquery.hoverIntent.html>
+* 
+* @param  f  onMouseOver function || An object with configuration options
+* @param  g  onMouseOut function  || Nothing (use configuration options object)
+* @author    Brian Cherne <brian@cherne.net>
+*/
+(function($){$.fn.hoverIntent=function(f,g){var cfg={sensitivity:7,interval:100,timeout:0};cfg=$.extend(cfg,g?{over:f,out:g}:f);var cX,cY,pX,pY;var track=function(ev){cX=ev.pageX;cY=ev.pageY;};var compare=function(ev,ob){ob.hoverIntent_t=clearTimeout(ob.hoverIntent_t);if((Math.abs(pX-cX)+Math.abs(pY-cY))<cfg.sensitivity){$(ob).unbind("mousemove",track);ob.hoverIntent_s=1;return cfg.over.apply(ob,[ev]);}else{pX=cX;pY=cY;ob.hoverIntent_t=setTimeout(function(){compare(ev,ob);},cfg.interval);}};var delay=function(ev,ob){ob.hoverIntent_t=clearTimeout(ob.hoverIntent_t);ob.hoverIntent_s=0;return cfg.out.apply(ob,[ev]);};var handleHover=function(e){var p=(e.type=="mouseover"?e.fromElement:e.toElement)||e.relatedTarget;while(p&&p!=this){try{p=p.parentNode;}catch(e){p=this;}}if(p==this){return false;}var ev=jQuery.extend({},e);var ob=this;if(ob.hoverIntent_t){ob.hoverIntent_t=clearTimeout(ob.hoverIntent_t);}if(e.type=="mouseover"){pX=ev.pageX;pY=ev.pageY;$(ob).bind("mousemove",track);if(ob.hoverIntent_s!=1){ob.hoverIntent_t=setTimeout(function(){compare(ev,ob);},cfg.interval);}}else{$(ob).unbind("mousemove",track);if(ob.hoverIntent_s==1){ob.hoverIntent_t=setTimeout(function(){delay(ev,ob);},cfg.timeout);}}};return this.mouseover(handleHover).mouseout(handleHover);};})(jQuery);
\ No newline at end of file
Index: modules/toolbar/toolbar.css
===================================================================
RCS file: /cvs/drupal/drupal/modules/toolbar/toolbar.css,v
retrieving revision 1.4
diff -u -p -r1.4 toolbar.css
--- modules/toolbar/toolbar.css	15 Sep 2009 03:38:06 -0000	1.4
+++ modules/toolbar/toolbar.css	16 Sep 2009 17:23:38 -0000
@@ -1,11 +1,11 @@
 /* $Id: toolbar.css,v 1.4 2009/09/15 03:38:06 webchick Exp $ */
 
 body.toolbar {
-  padding-top: 30px;
+  padding-top: 80px;
 }
 
-body.toolbar-shortcuts {
-  padding-top: 80px;
+body.toolbar-undocked {
+  padding-top: 30px;
 }
 
 /**
@@ -76,7 +76,7 @@ div#toolbar div.toolbar-menu {
 
 div#toolbar div.toolbar-menu #toolbar-user {
   position: absolute;
-  right: 35px;
+  right: 10px;
 }
 
 div#toolbar div.toolbar-menu #toolbar-menu {
@@ -84,19 +84,23 @@ div#toolbar div.toolbar-menu #toolbar-me
   left: 10px;
 }
 
-div#toolbar div.toolbar-menu span.toggle {
-  position: absolute;
-  right: 10px;
-  cursor: pointer;
-  background: url(toolbar.png) 0 -60px no-repeat;
+#toolbar-toggle-dock {
+  left:0;
+  position:absolute;
+  top:0;
+  width:24px;
+  height:50px;
   text-indent: -9999px;
   overflow: hidden;
-  width: 25px;
-  height: 25px;
+  background: #999 url(toolbar-dock.png) 4px center no-repeat;
+}
+
+body.toolbar-undocked #toolbar-toggle-dock {
+  background-color: transparent;
 }
 
-div#toolbar div.toolbar-menu span.toggle-active {
-  background-position:  -25px -60px;
+a#toolbar-toggle-dock:hover {
+  background-color: #aaa;
 }
 
 div#toolbar div.toolbar-menu ul li a {
@@ -125,6 +129,10 @@ div#toolbar div.toolbar-shortcuts {
   padding: 0 10px;
 }
 
+div#toolbar.toolbar-processed div.toolbar-shortcuts {
+  padding: 0 10px 0 35px;
+}
+
 div#toolbar div.toolbar-shortcuts ul {
   padding: 5px 0;
   height: 40px;
Index: modules/toolbar/toolbar.js
===================================================================
RCS file: /cvs/drupal/drupal/modules/toolbar/toolbar.js,v
retrieving revision 1.6
diff -u -p -r1.6 toolbar.js
--- modules/toolbar/toolbar.js	15 Sep 2009 20:50:48 -0000	1.6
+++ modules/toolbar/toolbar.js	16 Sep 2009 17:32:38 -0000
@@ -6,15 +6,26 @@
  */
 Drupal.behaviors.admin = {
   attach: function(context) {
-
     // Set the intial state of the toolbar.
     $('#toolbar', context).once('toolbar', Drupal.admin.toolbar.init);
-
-    // Toggling of admin shortcuts visibility.
-    $('#toolbar span.toggle', context).once('toolbar-toggle').click(function() {
-      Drupal.admin.toolbar.toggle();
+    
+    // Create an event to dock/undock the toolbar shortcuts.
+    $('#toolbar-toggle-dock', context).once('toggle-dock').click(function(e) {
+      Drupal.admin.toolbar.toggle_dock();
       return false;
     });
+    
+    // Create an event to show/hide the toolbar shortcuts.
+    $('#toolbar', context).once('toolbar-toggle').hoverIntent(function(e) {
+        Drupal.admin.toolbar.expand();
+    },
+    function(e) {
+      // Retrieve the docked status from a stored cookie.
+      var docked = $.cookie('Drupal.admin.toolbar.docked') || 1;
+      if(docked != 1) {
+        Drupal.admin.toolbar.collapse();
+      }
+    });
   }
 };
 
@@ -27,56 +38,78 @@ Drupal.admin.toolbar = Drupal.admin.tool
 /**
  * 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 = $.cookie('Drupal.admin.toolbar.collapsed');
-
-  // Expand or collapse the toolbar based on the cookie value.
-  if (collapsed == 1) {
-    Drupal.admin.toolbar.collapse();
+Drupal.admin.toolbar.init = function() { 
+  // Retrieve the docked status from a stored cookie.
+  var docked = $.cookie('Drupal.admin.toolbar.docked') || 1;
+
+  // Add a toggle element to dock the toolbar shortcuts.
+  // TODO: A Drupal path to toggle the docking state on server side to
+  //       improve accessibility.
+  if (docked == 1) {
+    $('div.toolbar-shortcuts').prepend('<a id="toolbar-toggle-dock" href="#">' + Drupal.t('Undock the toolbar') + '</a>');
   }
   else {
+    $('div.toolbar-shortcuts').prepend('<a id="toolbar-toggle-dock" href="#">' + Drupal.t('Dock the toolbar') + '</a>');
+  }
+ 
+  // Expand or collapse the toolbar shortcuts based on the cookie value.
+  if (docked == 1) {
     Drupal.admin.toolbar.expand();
   }
+  else {
+    // We do not hide it with the .collapse() because the animation would
+    // be annoying on initialization.
+    $('body.toolbar').addClass('toolbar-undocked');
+    $('#toolbar').addClass('collapsed');
+    $('body').removeClass('toolbar-collapsed');
+    $('div.toolbar-shortcuts').hide();
+  }
 }
 
 /**
  * Collapse the admin toolbar.
  */
 Drupal.admin.toolbar.collapse = function() {
-  $('#toolbar div.toolbar-shortcuts').addClass('collapsed');
-  $('#toolbar span.toggle').removeClass('toggle-active');
-  $('body').removeClass('toolbar-shortcuts');
-  $.cookie(
-    'Drupal.admin.toolbar.collapsed', 
-    1, 
-    {path: Drupal.settings.basePath}
-  );
+  $('#toolbar').addClass('collapsed');
+  $('body').removeClass('toolbar-collapsed');
+  $('div.toolbar-shortcuts').slideUp('normal');
 }
 
 /**
  * Expand the admin toolbar.
  */
 Drupal.admin.toolbar.expand = function() {
-  $('#toolbar div.toolbar-shortcuts').removeClass('collapsed');
-  $('#toolbar span.toggle').addClass('toggle-active');
-  $('body').addClass('toolbar-shortcuts');
-  $.cookie(
-    'Drupal.admin.toolbar.collapsed', 
-    0, 
-    {path: Drupal.settings.basePath}
-  );
+  $('#toolbar').removeClass('collapsed');
+  $('body').addClass('toolbar-collapsed');
+  $('div.toolbar-shortcuts').slideDown('normal');
 }
 
 /**
- * Toggle the admin toolbar.
+ * Toggle the docking state.
  */
-Drupal.admin.toolbar.toggle = function() {
-  if ($('#toolbar div.toolbar-shortcuts').is('.collapsed')) {
-    Drupal.admin.toolbar.expand();
+Drupal.admin.toolbar.toggle_dock = function() {
+  // Retrieve the docked status from a stored cookie.
+  var docked = $.cookie('Drupal.admin.toolbar.docked') || 1;
+
+  if (docked == 1) {
+    // Undock the toolbar
+    $.cookie(
+      'Drupal.admin.toolbar.docked', 
+      0,
+      {path: Drupal.settings.basePath}
+    );
+    $('body.toolbar').addClass('toolbar-undocked');
+    $('#toolbar-toggle-dock').removeClass('active').html(Drupal.t('Dock the shortcuts'));
   }
   else {
-    Drupal.admin.toolbar.collapse();
+    // Dock the toolbar
+    $.cookie(
+      'Drupal.admin.toolbar.docked', 
+      1,
+      {path: Drupal.settings.basePath}
+    );
+    $('body.toolbar').removeClass('toolbar-undocked');
+    $('#toolbar-toggle-dock').addClass('active').html(Drupal.t('Undock the shortcuts'));
   }
 }
 
Index: modules/toolbar/toolbar.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/toolbar/toolbar.module,v
retrieving revision 1.13
diff -u -p -r1.13 toolbar.module
--- modules/toolbar/toolbar.module	15 Sep 2009 20:50:48 -0000	1.13
+++ modules/toolbar/toolbar.module	16 Sep 2009 15:14:22 -0000
@@ -65,6 +65,7 @@ function toolbar_build() {
       'js' => array(
         $module_path . '/toolbar.js',
         array('data' => 'misc/jquery.cookie.js', 'weight' => JS_LIBRARY + 2),
+        array('data' => 'misc/jquery.hoverintent.js', 'weight' => JS_LIBRARY + 3),
         array(
           'data' => array('tableHeaderOffset' => 'Drupal.admin.toolbar.height'),
           'type' => 'setting'
Index: modules/toolbar/toolbar.tpl.php
===================================================================
RCS file: /cvs/drupal/drupal/modules/toolbar/toolbar.tpl.php,v
retrieving revision 1.4
diff -u -p -r1.4 toolbar.tpl.php
--- modules/toolbar/toolbar.tpl.php	15 Sep 2009 03:38:06 -0000	1.4
+++ modules/toolbar/toolbar.tpl.php	16 Sep 2009 16:31:26 -0000
@@ -16,7 +16,6 @@
 ?>
 <div id="toolbar" class="clearfix">
   <div class="toolbar-menu clearfix">
-    <span class="toggle toggle-active"><?php print t('Show shortcuts'); ?></span>
     <?php print render($toolbar['toolbar_menu']); ?>
     <?php print render($toolbar['toolbar_user']); ?>
   </div>
