// ==UserScript==
// @name          FR+?B
// @namespace     http://libelabo.jp/
// @description   show ?B count in Fresh Reader
// @include       http://example.com/feedshow*
// @version       0.2
// ==/UserScript==

(function() {
  
  var timerID = null;
  
  function setBookmarkCount(link, count) {
    var a = document.createElement("a");
    a.setAttribute("href", "http://b.hatena.ne.jp/entry/"+escape(link.href));
    a.setAttribute("target", "_blank");
    a.appendChild(document.createTextNode(""+count+" user"+(count>1?"s":"")));
    with (a.style) {
      fontSize = "0.9em";
      textDecoration = "none";
      color = "#fcc";
      if (count >= 5) {
        fontWeight = "bold";
        backgroundColor = "#fff0f0";
        color = "#f66";
      }
      if (count >= 10) {
        backgroundColor = "#ffcccc";
        color = "red";
      }
    }
    link.parentNode.insertBefore(a, link.nextSibling);
    link.parentNode.insertBefore(document.createTextNode(" "), link.nextSibling);
  }
  
  function callXmlrpc(requestbody, url2link) {
    const endpoint = "http://b.hatena.ne.jp/xmlrpc";
    function onload(response) {
      var pattern = /<name>([^<]+)<\/name>\s*<value><int>(\d+)/g;
      var m;
      while (m = pattern.exec(response.responseText)) {
        var link = url2link[m[1]];
        if (link && m[2] > 0) setBookmarkCount(link, m[2]);
      }
    }
    GM_xmlhttpRequest({method: "POST", url: endpoint, data: requestbody, onload: onload});
  }
  
  var times = 0;
  
  function timerHandler(){
    var startNum = times*50;
    var lastNum = Math.min(links.snapshotLength,startNum+50)
    String.prototype.htmlescape = function() {
        return this.replace(/&/g, "&amp;").replace(/</g, "&lt;");
    }
    
    var request = '<?xml version="1.0"?>\n<methodCall>\n<methodName>bookmark.getCount</methodName>\n<params>\n';
    if(links.snapshotLength < startNum){
        clearInterval(timerID);
        return;
    } else {
        var url2link = new Array();
        for (var i = startNum; i < lastNum; ++i) {
            var link = links.snapshotItem(i);
            request += "<param><value><string>"+link.href.htmlescape()+"</string></value></param>\n";
            url2link[link.href] = link;
        }
        request += "</params>\n</methodCall>\n";
        callXmlrpc(request, url2link);
    }
    times++;
  }
  
  var links = document.evaluate('//div[@class="content"]/div[@class="itemtitle"]/a', document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  if(!links.snapshotLength) return;
  
  timerID = setInterval(timerHandler, 3000);
})();