﻿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 11:00:44 -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 10:42:33 -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: 5px;
 }
 
 /**
@@ -43,15 +43,6 @@ div#toolbar .collapsed {
   display: none;
 }  
 
-div#toolbar div.shadow {
-  position: absolute;
-  left: 0;
-  right: 0;
-  bottom: -15px;
-  height: 15px;
-  background: url(toolbar.png) 0 -85px repeat-x;
-}
-
 div#toolbar a {
   text-decoration: none;
   color: #fff;
@@ -76,7 +67,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 +75,10 @@ div#toolbar div.toolbar-menu #toolbar-me
   left: 10px;
 }
 
-div#toolbar div.toolbar-menu span.toggle {
+#toolbar-toggle-dock {
   position: absolute;
   right: 10px;
-  cursor: pointer;
-  background: url(toolbar.png) 0 -60px no-repeat;
-  text-indent: -9999px;
-  overflow: hidden;
-  width: 25px;
-  height: 25px;
-}
-
-div#toolbar div.toolbar-menu span.toggle-active {
-  background-position:  -25px -60px;
+  top: 30px;
 }
 
 div#toolbar div.toolbar-menu ul li a {
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 11:08:41 -0000
@@ -6,15 +6,29 @@
  */
 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();
+    
+    $('#toolbar-toggle-dock').once('toggle-dock').click(function(e) {
+      Drupal.admin.toolbar.toggle_dock();
       return false;
     });
+    
+    // Triggering of toolbar visibility.
+    $('#toolbar', context).once('toolbar-toggle').hoverIntent(function(e) {
+      if (e.toolbarTimer) {
+        clearTimeout(e.toolbarTimer);
+        e.toolbarTimer = null;
+      } else {
+        Drupal.admin.toolbar.expand();
+      }
+    },
+    function(e) {
+      if($.cookie('Drupal.admin.toolbar.docked') == 0)
+      e.toolbarTimer = setTimeout(function(e){
+        Drupal.admin.toolbar.collapse();
+      }, 500);
+    });
   }
 };
 
@@ -27,56 +41,76 @@ Drupal.admin.toolbar = Drupal.admin.tool
 /**
  * Retrieve last saved cookie settings and set up the initial toolbar state.
  */
-Drupal.admin.toolbar.init = function() {
+Drupal.admin.toolbar.init = function() { 
   // Retrieve the collapsed status from a stored cookie.
-  var collapsed = $.cookie('Drupal.admin.toolbar.collapsed');
+  var docked = $.cookie('Drupal.admin.toolbar.docked');
 
-  // Expand or collapse the toolbar based on the cookie value.
-  if (collapsed == 1) {
-    Drupal.admin.toolbar.collapse();
+  // Add a toggle element to dock the toolbar.
+  // TODO: A Drupal menu item to toggle the docking state on server side to improve accessibility.
+  if (docked == 1) {
+    $('#toolbar').append('<a id="toolbar-toggle-dock" class="active" href="#">' + Drupal.t('Undock the toolbar') + '</a>');
   }
   else {
+    $('#toolbar').append('<a id="toolbar-toggle-dock" href="#">' + Drupal.t('Dock the toolbar') + '</a>');
+  }
+
+ 
+  // Expand or collapse the toolbar based on the cookie value.
+  if (docked == 1) {
     Drupal.admin.toolbar.expand();
   }
+  else {
+    $('body.toolbar').addClass('toolbar-undocked');
+    $('#toolbar').addClass('collapsed');
+    $('body').removeClass('toolbar-collapsed');
+    $('#toolbar').css('top', '-65px');
+  }
 }
 
 /**
  * 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');
+  $('#toolbar').animate({'top' : '-65px'}, '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');
+  $('#toolbar').animate({'top' : '0px'}, '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 collapsed status from a stored cookie.
+  var docked = $.cookie('Drupal.admin.toolbar.docked');
+
+  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 toolbar'));
   }
   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 toolbar'));
   }
 }
 
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 11:07:53 -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 09:39:17 -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>
@@ -24,6 +23,4 @@
   <div class="toolbar-shortcuts clearfix">
     <?php print render($toolbar['toolbar_shortcuts']); ?>
   </div>
-
-  <div class="shadow"></div>
 </div>
