/* эта функция вставляет якоря <a name="..."> в заголовки <h1>, ..., обрабатываемый уровень заголовка передается в параметре lvl */
function makeAnchors(lvl) {
  /* получили список заголовков текущего уровня, находящихся внутри нужного <div> */
  if(hlist=document.getElementById('content').getElementsByTagName('h'+lvl))
    /* для каждого из них... */
    for(i=0;i<hlist.length;i++)
      /* ...создаем обертку <a name="...">...</a>. Класс нам понадобится не для CSS, а для того, чтобы различать уровни вложенности при сборке оглавления */
      hlist[i].innerHTML='<a name="toc'+lvl+'_'+i+'" class=toc'+lvl+'>'+hlist[i].innerHTML+'</a>';
}

/* эта функция возвращает оглавление в виде набора элементов списка <li>. В параметрах передается набор обрабатываемых уровней заголовков */
function toc() {
  /* если не задан набор уровней, то берем все 6 */
  var levels=new Array;
  if(!arguments) levels=[1,2,3,4,5,6]
  else
    for(j=0;j<arguments.length;j++)
      levels[j]=arguments[j];
  var alist='';
  /* создаем якоря в заголовках */
  for(j in levels) makeAnchors(levels[j]);
  /* получаем список свежесозданных якорей */
  if(hlist=document.getElementById('content').getElementsByTagName('a'))
  {
    /* для каждого из них... */
    for(j=0;j<hlist.length;j++)
      /* если случайно зацепили ненужный якорь, например, <a href="...">, то отбрасываем его */
      if(hlist[j].name&&hlist[j].name.substring(0,3)=='toc')
        /* собираем список, здесь классы для отдельных элементов <li> нужны уже именно для CSS, чтобы выделить уровни визуально */
        alist+='<li class="'+hlist[j].className+'"><a href="#'+hlist[j].name+'">'+hlist[j].innerHTML+'</a></li>\n';
  }
  return alist;
}