Index: tableofcontents.js
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/tableofcontents/Attic/tableofcontents.js,v
retrieving revision 1.1.2.4
diff -u -r1.1.2.4 tableofcontents.js
--- tableofcontents.js	21 Jun 2008 18:21:16 -0000	1.1.2.4
+++ tableofcontents.js	10 Dec 2008 16:20:00 -0000
@@ -4,13 +4,24 @@
   $(document).ready( function () {
     $('a.toc-toggle').click(function() {
       $('.toc-list').slideToggle();
-	  var text = $('a.toc-toggle').text();
-	  if (text == 'hide') {
-		  $('a.toc-toggle').html('show');
-      } else {
-		  $('a.toc-toggle').html('hide');
+      var text = $('a.toc-toggle').text();
+      if (text == 'hide') {
+        $('a.toc-toggle').html('show');
       }
-	  return false;
-	});
+      else {
+        $('a.toc-toggle').html('hide');
+      }
+      return false;
+    });
+    
+    for (i = Drupal.settings.tableofcontents.minlevel; i <= Drupal.settings.tableofcontents.maxlevel; i++) {
+      $('.content > h' + i).after("<p class=\"top\"><a href=\"#header\">back to top</a></p>");
+    }
+    
+    // This happens if we are on Drupal 5 with jquery_update or Drupal 6.
+    if ($.localScroll) {
+      $('.toc-list, .top').localScroll( { hash : true } );
+    }
+    
   });
 }
\ No newline at end of file
Index: tableofcontents.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/tableofcontents/tableofcontents.module,v
retrieving revision 1.2.4.2.2.13
diff -u -r1.2.4.2.2.13 tableofcontents.module
--- tableofcontents.module	22 Oct 2008 21:19:56 -0000	1.2.4.2.2.13
+++ tableofcontents.module	10 Dec 2008 16:20:03 -0000
@@ -32,6 +32,15 @@
   if (!$may_cache) {
     drupal_add_js(drupal_get_path('module', 'tableofcontents') . '/tableofcontents.js');
     drupal_add_css(drupal_get_path('module', 'tableofcontents') . '/tableofcontents.css');
+    
+    // We need to know minlevel and maxlevel for "Back to top" from JavaScript
+    drupal_add_js(array('tableofcontents' => array('minlevel' => 1, 'maxlevel' => 3)), 'setting');
+    
+    // To support localscroll "Back to top", we need jquery_update on Drupal 5
+    if (module_exists('jquery_update')) {
+      drupal_add_js(drupal_get_path('module', 'tableofcontents') . '/jquery.scrollTo-min.js');
+      drupal_add_js(drupal_get_path('module', 'tableofcontents') . '/jquery.localscroll-min.js');
+    }
   }
 }
 
@@ -324,6 +333,18 @@
         cache_clear_all($cid, 'cache_filter');
       }
       break;
+    case 'view':
+      // If this node implements this filter, then override the settings.
+      $filters = filter_list_format($node->format);
+      if (isset($filters['tableofcontents/0'])) {
+        $js_vars = array(
+          'tableofcontents' => array(
+            'minlevel' => variable_get('tableofcontents_minlevel_' . $format, 1),
+            'maxlevel' => variable_get('tableofcontents_maxlevel_' . $format, 3),
+          ),
+        );
+        drupal_add_js($js_vars, 'setting');
+      }
   }
 }
 
Index: jquery.scrollTo-min.js
===================================================================
RCS file: jquery.scrollTo-min.js
diff -N jquery.scrollTo-min.js
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ jquery.scrollTo-min.js	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,11 @@
+/**
+ * jQuery.ScrollTo - Easy element scrolling using jQuery.
+ * Copyright (c) 2007-2008 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
+ * Dual licensed under MIT and GPL.
+ * Date: 2/19/2008
+ * @author Ariel Flesler
+ * @version 1.3.3
+ *
+ * http://flesler.blogspot.com/2007/10/jqueryscrollto.html
+ */
+;(function($){var o=$.scrollTo=function(a,b,c){o.window().scrollTo(a,b,c)};o.defaults={axis:'y',duration:1};o.window=function(){return $($.browser.safari?'body':'html')};$.fn.scrollTo=function(l,m,n){if(typeof m=='object'){n=m;m=0}n=$.extend({},o.defaults,n);m=m||n.speed||n.duration;n.queue=n.queue&&n.axis.length>1;if(n.queue)m/=2;n.offset=j(n.offset);n.over=j(n.over);return this.each(function(){var a=this,b=$(a),t=l,c,d={},w=b.is('html,body');switch(typeof t){case'number':case'string':if(/^([+-]=)?\d+(px)?$/.test(t)){t=j(t);break}t=$(t,this);case'object':if(t.is||t.style)c=(t=$(t)).offset()}$.each(n.axis.split(''),function(i,f){var P=f=='x'?'Left':'Top',p=P.toLowerCase(),k='scroll'+P,e=a[k],D=f=='x'?'Width':'Height';if(c){d[k]=c[p]+(w?0:e-b.offset()[p]);if(n.margin){d[k]-=parseInt(t.css('margin'+P))||0;d[k]-=parseInt(t.css('border'+P+'Width'))||0}d[k]+=n.offset[p]||0;if(n.over[p])d[k]+=t[D.toLowerCase()]()*n.over[p]}else d[k]=t[p];if(/^\d+$/.test(d[k]))d[k]=d[k]<=0?0:Math.min(d[k],h(D));if(!i&&n.queue){if(e!=d[k])g(n.onAfterFirst);delete d[k]}});g(n.onAfter);function g(a){b.animate(d,m,n.easing,a&&function(){a.call(this,l)})};function h(D){var b=w?$.browser.opera?document.body:document.documentElement:a;return b['scroll'+D]-b['client'+D]}})};function j(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery);
Index: jquery.localscroll-min.js
===================================================================
RCS file: jquery.localscroll-min.js
diff -N jquery.localscroll-min.js
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ jquery.localscroll-min.js	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,9 @@
+/**
+ * jQuery.LocalScroll - Animated scrolling navigation, using anchors.
+ * Copyright (c) 2007-2008 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
+ * Dual licensed under MIT and GPL.
+ * Date: 6/3/2008
+ * @author Ariel Flesler
+ * @version 1.2.6
+ **/
+;(function($){var g=location.href.replace(/#.*/,''),h=$.localScroll=function(a){$('body').localScroll(a)};h.defaults={duration:1e3,axis:'y',event:'click',stop:1};h.hash=function(a){a=$.extend({},h.defaults,a);a.hash=0;if(location.hash)setTimeout(function(){i(0,location,a)},0)};$.fn.localScroll=function(b){b=$.extend({},h.defaults,b);return(b.persistent||b.lazy)?this.bind(b.event,function(e){var a=$([e.target,e.target.parentNode]).filter(c)[0];a&&i(e,a,b)}):this.find('a,area').filter(c).bind(b.event,function(e){i(e,this,b)}).end().end();function c(){var a=this;return!!a.href&&!!a.hash&&a.href.replace(a.hash,'')==g&&(!b.filter||$(a).is(b.filter))}};function i(e,a,b){var c=a.hash.slice(1),d=document.getElementById(c)||document.getElementsByName(c)[0],f;if(d){e&&e.preventDefault();f=$(b.target||$.scrollTo.window());if(b.lock&&f.is(':animated')||b.onBefore&&b.onBefore.call(a,e,d,f)===!1)return;if(b.stop)f.queue('fx',[]).stop();f.scrollTo(d,b).trigger('notify.serialScroll',[d]);if(b.hash)f.queue(function(){location=a.hash;$(this).dequeue()})}}})(jQuery);
