はてな匿名ダイアリーのトラックバックリストの内容をすべて開く/閉じる

  1. エントリページの「トラックバック - http://anond.hatelabo.jp/〜」と書いてあるところの後ろに「すべて開く/閉じる」ボタンをつける
  2. ボタンを押すとトラックバックの内容をすべて開く(開いていたらすべて閉じる)
// ==UserScript==
// @include http://anond.hatelabo.jp/*
// ==/UserScript==

(function(){
  var refererlist = xe()("descendant::div["+className('refererlist')+"]", 0);
  if (!refererlist) return;

  var rlXEval = xe(refererlist);
  var open = false;
  var basesrc = "http://anond.hatelabo.jp/images/common/";
  var src = [basesrc+"open.gif", basesrc+"close.gif"];
  var onclick = function(e){
    rlXEval("descendant::li/a[@href='#']", click);
    open = !open;
    e.currentTarget.childNodes[1].src = src[Number(open)];
  }
  var style = "cursor: pointer";
  rlXEval("div["+className('caption')+"]", 0).appendChild(
    ce("span", {style: style, onclick: onclick}, [
      " ",
      ce("img", {src: src[0]}),
      "\u3059\u3079\u3066\u958b\u304f/\u9589\u3058\u308b",
    ])
  );

  function click(element){
      var e = document.createEvent("MouseEvents");
      e.initEvent("click", true, true);
      element.dispatchEvent(e);
  }
  function ce(name, attrs, contents){
    //[[Active Document]].__createElement + HTML Event
    var element = document.createElement(name);
    if (attrs) for (a in attrs) {
      if (a.indexOf("on") == 0 && attrs[a] != "string") {
        element.addEventListener(a.slice(2), attrs[a], false);
      } else element.setAttribute(a, attrs[a]);
    }
    if (contents) {
      if (typeof contents.length != "number" || typeof contents == "string") {
        contents = [contents];
      }
      for (var i = 0, len = contents.length, c; i < len; i++) {
        c = contents[i];
        if (typeof c.nodeType != "number") c = document.createTextNode(String(c));
        element.appendChild(c);
      }
    }
    return element;
  }
  function className(name){
    return "contains("+
      "concat(' ',normalize-space(@class),' '), concat(' ','"+name+"',' ')"+
    ")";
  }
  function xe(c, r){ //__XPathEvaluator
    c = c || document;
    var d = (c.nodeType == 9) ? c : c.ownerDocument;
    return function evaluate(expr, fn){
      var result = d.createExpression(expr, r).evaluate(c, 7, null);
      if (typeof fn == "number") {
        return result.snapshotItem(fn < 0 ? fn+result.snapshotLength : fn);
      } else {
        for (var i = 0, len = result.snapshotLength; i < len; i++) {
          if (fn(result.snapshotItem(i), i) === false) break;
        }
      }
    }
  }
})();