Backpack TOC

By Nick Grossman Last update May 28, 2009 — Installed 17 times. Daily Installs: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

There are 1 previous version of this script.

// Backpack TOC user script
// version 0.1 BETA!
// 2009-05-25
// Copyright (c) 2009, Nick Grossman
// Released under the GPL license
// http://www.gnu.org/copyleft/gpl.html
//
// --------------------------------------------------------------------
//
// This is a Greasemonkey user script.  To install it, you need
// Greasemonkey 0.3 or later: http://greasemonkey.mozdev.org/
// Then restart Firefox and revisit this script.
// Under Tools, there will be a new menu item to "Install User Script".
// Accept the default configuration and install.
//
// To uninstall, go to Tools/Manage User Scripts,
// select "Backpack TOC", and click Uninstall.
//
// --------------------------------------------------------------------
//
// ==UserScript==
// @name          Backpack TOC
// @namespace     http://blog.wrkng.net/2009/05/backpack-toc-greasemonkey-script/
// @description   Create an automated table of contents for Backpack pages
// @include       https://*.backpackit.com/*
// @exclude       
// ==/UserScript==


function getElementsByClassName(classname, node) {
  if(!node) node = document.getElementsByTagName("body")[0];
  var a = [];
  var re = new RegExp('\\b' + classname + '\\b');
  var els = node.getElementsByTagName("*");
  for(var i=0,j=els.length; i<j; i++)
  if(re.test(els[i].className))a.push(els[i]);
  return a;
}

/*
 ** Matt Kruse's hasClass, with slight modification
 ** Determine if an object or class string contains a given class.
 ** http://snipplr.com/view/3337/kruses-hasclass/
*/
function hasClass (obj, className) {
  if (typeof obj == 'undefined' || obj==null || !RegExp) { return false; }
  var re = new RegExp("(^|\\s)" + className + "(\\s|$)");
  if (typeof(obj)=="string") {
    return re.test(obj);
  } else if (typeof(obj)=="object" && obj.className) {
    return re.test(obj.className);
  }
  return false;
}

function getWidgets() {
  /* where we'll store all our widgets */
  var widgets = new Array();
  
  var nodes = document.getElementById('widgets').getElementsByClassName('widget');
        
  for (var i = 0; i < nodes.length; i++) {
    if (hasClass(nodes[i],'list_wrapper') || hasClass(nodes[i],'note_wrapper') || hasClass(nodes[i],'writeboard_link_wrapper') || hasClass(nodes[i],'separator_wrapper') || hasClass(nodes[i],'attachment_wrapper') || hasClass(nodes[i],'gallery_wrapper')) {
      var widget = {}
      widget['id'] = nodes[i].getAttribute('id');
      widget['name'] = nodes[i].getElementsByTagName('highlightable')[0].innerHTML;
      widgets.push(widget);
    } 
  }
  
  return widgets;
}

function makeTOC() {
  var widgets = getWidgets();
  var ul = document.createElement('UL');
  
  for (var i = 0; i < widgets.length; i++) {
    var li = document.createElement('LI');
    var a = document.createElement('A');
    a.innerHTML = widgets[i].name;
    a.href = "#" + widgets[i].id;
    li.appendChild(a);
    ul.appendChild(li);
  }
  
  if (widgets.length > 3) document.getElementById('page_title_wrapper').appendChild(ul);
}

/* let 'er rip */
makeTOC();