function printObjectMember(obj) {
  var member = '';

  for (var j in obj) {
    member += j + ' => ' + obj[j] + "\n";
    if (member.length > 512) {
      alert(member);
      member = '';
    }
  }

  if (member.length > 0) {
    alert(member);
  }
}

/*
function anchorHeadings() {
  var divs = document.getElementsByTagName('div');

  var h2ul = document.createElement('ul');
  h2ul.style.backgroundColor = '#eef';
  h2ul.style.borderLeft = '2em #99f solid';
  h2ul.style.position = 'absolute';
  h2ul.style.top = '11em';
  h2ul.style.left = '0';
  h2ul.style.width = '18em';

  document.body.appendChild(h2ul);

  for (var i = 0; i < divs.length; ++i) {
    if (divs[i].className == 'article') {
      var article = divs[i];

      for (var j = 0; j < article.childNodes.length; ++j) {
        var child = article.childNodes[j];
        var content = document.createTextNode(child.innerText || child.textContent);

        if (child.tagName == 'H2') {
          var anchor = document.createElement('a');
          anchor.href = '#' + article.id;
          var h2li = document.createElement('li');
          h2li.style.marginLeft = '1em';

          anchor.appendChild(content);
          h2li.appendChild(anchor);
          h2ul.appendChild(h2li);
        }
        else if (child.tagName == 'H3') {
          var h3ul;
          if (h2ul.lastChild.tagName == 'UL') {
            h3ul = h2ul.lastChild;
          }
          else {
            h3ul = document.createElement('ul');
            h2ul.appendChild(h3ul);
          }
          var h3li = document.createElement('li');
          h3li.style.marginLeft = '2em';

          h3li.appendChild(content);
          h3ul.appendChild(h3li);
        }
      }
    }
  }
}


function anchorPageTop() {
  var divs = document.getElementsByTagName('div');

  for (var i = 0; i < divs.length; ++i) {
    if (divs[i].className == 'article') {
      var article = divs[i];
      var content = document.createTextNode('to page top');
      var anchor = document.createElement('a');
      anchor.href = document.location;
      anchor.appendChild(content);
      article.appendChild(anchor);
    }
  }
}


function autoAnchor() {
  anchorHeadings();
  anchorPageTop();
}


function captionImage() {
  var imgs = document.getElementsByTagName('img');

  for (var i = 0; i < imgs.length; ++i) {
    if (imgs[i].parentNode.parentNode.className == 'figure') {
      var img = imgs[i];
      var figure = img.parentNode;
      var content = document.createTextNode(img.alt);
      var caption = document.createElement('p');
      caption.style.fontSize = '88.8%';
      caption.style.color = '#66f';
      caption.appendChild(content);
      figure.insertBefore(caption, img.nextSibling);
    }
  }
}


function captionBlockquote() {
  var blockquotes = document.getElementsByTagName('blockquote');

  for (var i = 0; i < blockquotes.length; ++i) {
    var blockquote = blockquotes[i];
    var content = document.createTextNode('(from: ' + (blockquote.cite || '[undefined]') + ')');
    var caption = document.createElement('p');
    caption.style.fontSize = '88.8%';
    caption.style.fontStyle = 'italic';
    caption.style.color = '#66f';
    caption.style.textAlign = 'right';
    caption.appendChild(content);
    blockquote.appendChild(caption);
  }
}


function autoCaption() {
  captionImage();
  captionBlockquote();
}


function titleAnchor() {
  var anchors = document.getElementsByTagName('a');

  for (var i = 0; i < anchors.length; ++i) {
    var anchor = anchors[i];
    anchor.title = 'link: ' + anchor.href;
  }
}


function titleBlockquote() {
  var blockquotes = document.getElementsByTagName('blockquote');

  for (var i = 0; i < blockquotes.length; ++i) {
    var blockquote = blockquotes[i];
    blockquote.title = 'from: ' + (blockquote.cite || '[undefined]');
  }
}


function autoTitle() {
  titleAnchor();
  titleBlockquote();
}


function onLoad() {
  autoAnchor();
  autoTitle();
  autoCaption();
}
*/

function onLoad() {
  main();
}

function main() {
  showDomain();
  showCitation();
  showAltText();
  listHeading();
  entitleAnchor();
  setAccessKey();
  showAccessKey();
}

function listHeading() {
  var divs = document.getElementsByTagName('div');
  var articles = [];

  // <div class="article"> を抜き出す
  for (var i = 0; i < divs.length; ++i) {
    if (divs[i].className == 'article') {
      articles[articles.length] = divs[i];
    }
  }

  var ul = document.createElement('ul');
  ul.id = 'heading-list';

  // <div class="article"> の子ノードに対し,
  // h2, h3 要素を探してリストを作る
  for (var i = 0; i < articles.length; ++i) {
    var article = articles[i];

    for (var j = 0; j < article.childNodes.length; ++j) {
      var child = article.childNodes[j];

      // h2 要素の場合
      // 各 h2 へのアンカーを作成
      if (child.tagName == 'H2') {
        var a = document.createElement('a');
        a.innerHTML = child.innerHTML;
        a.href = '#' + article.id;
        var li = document.createElement('li');
        li.appendChild(a);
        ul.appendChild(li);
      }
      // h3 の場合
      // サブリストを作成して h3 要素の内容を列挙
      else if (child.tagName == 'H3') {
        if (ul.lastChild.tagName != 'UL') {
          var ulul = document.createElement('ul');
          ul.appendChild(ulul);
        }
        var lili = document.createElement('li');
        lili.innerHTML = child.innerHTML;
        var li = document.createElement('li');
        li.appendChild(lili);
        ul.lastChild.appendChild(li);
      }
    }
  }

  var body = document.body;
  body.appendChild(ul);
}

function showCitation() {
  var quotes = document.getElementsByTagName('blockquote');

  for (var i = 0; i < quotes.length; ++i) {
    var quote = quotes[i];
    var url = quote.cite;
    var a = document.createElement('a');
    a.href = url;
    a.innerHTML = url;
    var citation = document.createElement('p');
    citation.className = 'quote-citation';
    citation.appendChild(a);
    quote.appendChild(citation);
  }
}

function showAltText() {
  var imgs = document.getElementsByTagName('img');

  for (var i = 0; i < imgs.length; ++i) {
    var img = imgs[i];

    if (img.parentNode.parentNode.className == 'figure') {
      var figure = img.parentNode.parentNode;
      var caption = document.createElement('p');
      caption.className = 'fig-caption';
      caption.innerHTML = img.alt;
      figure.appendChild(caption);
    }
  }
}

function entitleAnchor() {
  var anchors = document.getElementsByTagName('a');

  for (var i = 0; i < anchors.length; ++i) {
    var a = anchors[i];
    a.title = a.href;
  }
}

function showDomain() {
  var anchors = document.getElementsByTagName('a');

  for (var i = 0; i < anchors.length; ++i) {
    var parentNode = anchors[i].parentNode;

    if (parentNode.className != 'figure' && parentNode.parentNode.id != 'navigation') {
      anchors[i].href.match(/^([^\/]+):/);

      if (RegExp.$1 != 'mailto') {
        anchors[i].href.match(/\/\/([^\/]+)/);

        var domain = document.createElement('span');
        domain.className = 'domain';
        domain.innerHTML = '[' + RegExp.$1 + ']';
        parentNode.insertBefore(domain, anchors[i].nextSibling);
      }
    }
  }
}

function setAccessKey() {
  // メニューへのアクセスキー
  var navi = document.getElementById('navigation');
  var naviItems = navi.childNodes;

  for (var i = 0; i < naviItems.length; ++i) {
    var naviItem = naviItems[i];
    var naviAnchor = naviItem.firstChild;
    naviAnchor.accessKey = naviAnchor.innerHTML.charAt(0);
  }

  // 見出しリストへのアクセスキー
  var hlist = document.getElementById('heading-list');
  var hlistItems = hlist.childNodes;
  var accessKeyIndex = 0;

  for (var i = 0; i < hlistItems.length && accessKeyIndex < 10; ++i) {
    var hlistItem = hlistItems[i];

    if (hlistItem.tagName == 'LI') {
      var hlistAnchor = hlistItem.firstChild;
      hlistAnchor.accessKey = accessKeyIndex++;
    }
  }
}

function showAccessKey() {
  // メニューのアクセスキーを表示
  var navi = document.getElementById('navigation');
  var naviItems = navi.childNodes;

  for (var i = 0; i < naviItems.length; ++i) {
    var naviItem = naviItems[i];
    var naviAnchor = naviItem.firstChild;
    var accessKey = document.createElement('span');
    accessKey.className = 'accesskey';
    accessKey.innerHTML = '(Alt+' + naviAnchor.accessKey + ')';
    naviItem.appendChild(accessKey);
  }

  // 見出しリストのアクセスキーを表示
  var hlist = document.getElementById('heading-list');
  var hlistItems = hlist.childNodes;

  for (var i = 0; i < hlistItems.length; ++i) {
    var hlistItem = hlistItems[i];

    if (hlistItem.tagName == 'LI') {
      var hlistAnchor = hlistItem.firstChild;
      var accessKey = document.createElement('span');
      accessKey.className = 'accesskey';
      accessKey.innerHTML = '(Alt+' + hlistAnchor.accessKey + ')';
      hlistItem.appendChild(accessKey);
    }
  }
}


