discover tako3

By koyachi Last update Sep 17, 2007 — Installed 277 times.

Add Syntax Highlighting (this will take a few seconds, probably freezing your browser while it works)

// ==UserScript==
// @name           discover tako3
// @namespace      http://d.hatena.ne.jp/koyachi/
// @description    visit/subscribe relative urls when bookmarked(by del.icio.us, Hatena Bookmark).
// @include        http://del.icio.us/*
// @include        http://b.hatena.ne.jp/*
// @include        http://clip.livedoor.com/*
// ==/UserScript==
//
// 2007-09-14 t.koyachi
//   replace tako3.com api to 'likely'
//
// 2007-09-07 t.koyachi
//   add LivedoorClip
//
// 2007-09-05 t.koyachi
//   add HatenaBookmark
//
// 2007-09-04 t.koyachi
//

(function() {
  var subscribeButton = 'data:image/x-icon;base64,'+
    'AAABAAIAEBAAAAEACABoBQAAJgAAACAgAAABAAgAqAgAAI4FAAAoAAAAEAAAACAAAAABAAgAAAAA'+
    'AEABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD/RxMA/0oUAP9NFQBAFQUA/1IVAP9WFwD/WhgA'+
    'QBYGAEAYBgD/XhkA/2IaAEAZBwD/ZhsA/2ocAEAaBwD/bh0A/3IfAEAdCAD/dx8A/3ogAP99IQD/'+
    'gCIA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'+
    'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'+
    'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'+
    'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'+
    'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'+
    'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'+
    'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'+
    'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'+
    'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'+
    'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'+
    'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'+
    'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'+
    'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'+
    'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'+
    'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'+
    'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'+
    'AAAAAAAAAAAAAAAAAAAAAAAAAAACAgICAgICAgICAgICAgADAwMDAwMDAwMDAwMDAwMDBAQEBAQE'+
    'BAQEBAQEBAQEBAYGBgYFBQUFBgYFBQUGBgYHBwcHAQEBAQcJAQEBBwcHCAgICAgBAQgIAQEICAgI'+
    'CAsLCwsLAQELCgEBCwsLCwsMDAwMDAEBDQEBDAwMDAwMDg4ODg4BAQEBARAODg4ODg8PDw8PAQEP'+
    'DwEBDw8PDw8REREREQEBEREBAREREREREhISEhMBARMTAQESEhISEhQUFBQBAQEBAQEUFBQUFBQV'+
    'FRUVFRUVFRUVFRUVFRUVFhYWFhYWFhYWFhYWFhYWFgAXFxcXFxcXFxcXFxcXFwCAAQAAAAAAAAAA'+
    'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAAKAAA'+
    'ACAAAABAAAAAAQAIAAAAAACABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A/wAAAP8CAQDXAgEA'+
    '/y8vAF9cXAD08/MA8fDwAP8FAQD/BgIA/QYCAP8NBQD/DgYA/2VgAP8LAAD/FAUA/yATAP0cCAD/'+
    'GwEA/xsEANcaBwD/HQAA/x8AAMMYAAD/IQEA/yUEAP9MMQD/ZlEA9ubkAPwlBAD/KwkA2icKAP8w'+
    'DwD/Mw8A/TMPAHUZCAD/PxwA5jgdAP9GJgD/UzcA/1k7AP9eQgD/ZUoA6mZRANgxEAD/OhMAyTER'+
    'AP8+FgD9PBYA1jMTAJ4mDgD/Xj0A/2JDAPSvoQD89/YARRQIAP9JHgD9SR4A7UQcANY9GgD/aUMA'+
    'HRUTAP9IGQDWRx4A/1UnAP9WKAD9VigA/VUoAG05KgBRQz8A/1okAP9kMgD8YzIAKhMMAFAyKQD/'+
    'VhwA+2MwAP9nMwD+cTwA/3RFAPTe1gD/cjwA/2YiAP1lIgD1YiEA/2kjANZZIAD/aScA/24sAP5w'+
    'MgD/dTgA/4BGAP+CSAD/hUwAAwEAAP+ESQD/hUoA/4pNAPeJVADTvbIA//38AP9wJQDbZSEA/3Un'+
    'AP92JwD9dCcA+XImAP91KQD/ey8A/340AP+GQQD/h0cA/4xPAOF8RgD/j1AA/5JTAP+RUwD/l1sA'+
    '/51lAP+RUQDMekYA/5lYAOWQXgDllWMA+q5+AP3PtAD+9O4A7+rnAP99KQD/mVEA/5VRAP+fXQDz'+
    'ml0A5ZpmAPyDKwD7gysA/4QsAPN/KgDacyYA7H0rAMNpJwD/jDkA/5JAAP+XSAD/mlAA/5tTAP+d'+
    'VQD/nlkA/6FeAP+mYgDNh1QAvX9QAOWfagDNpIYAaFxTAPXl2QD/iy4A/5U+AP+gVQD/rGYA86Rh'+
    'AOWkbQCxg14A872QAPzp2gD/kTAA2XspAMJxJQD/lDQA/6ZWAP+sZQDUm2YAw3IlAMFxJQD/mDIA'+
    'yoA6AMR9OgD/q1YA/6xZAP+zawDzq2YAimE6AP+4dQArIhkA/Pv6AP+fNADZhy0A/7pwAP+lNwD/'+
    'pj8A/7RbAOGgVgD/wHQA/8mIAP/hvgD/qjgA/609AP/FeAD/u10A/8NwAP/LfQD/sToA2ZcyAP+6'+
    'SAD/ynYA/8t7AP/04wD/tz0A/7k+AP+3PgD/xGEA/9GBAP+9PgDepjsA/8JJAP/OagD/wkAA/8NC'+
    'AP/JWADtxGsA/9eFAP/HQgD/yUcA/8tRAP/NVAD/0F0A/9RvAP/ciQD/3Y0A/+GXAP/02QD/+OcA'+
    '/9+JAP/figD/4YwA/+COAP/lnwD/6rAA//rrAP/bYgD/77kA/+2kAK+vrgD8/PwA9vb2APPz8wDe'+
    '3t4Az8/PAMjIyACMjIwAdXV1AG9vbwA8PDwADAwMAAAAAAAAAKywraioqKioqKioqKioqKioqKio'+
    'qKioqKiusawAAACMjIiJiYmJiYmJiY6PkJKTlZWVlZWUkZCOiYeKi40Ad2toaGhoaGhsbm9zdXV1'+
    'dXV1dXV1dXV1dXVzb2xqZ5dcVFNTU1NYW1xdXV1dXV1dXV1dXV1dXV1dXV1dXFpVV1BMTExHTlJS'+
    'UlJSUlJSUlJSUlJSUlJSUlJSUlJST01APT8/QkhISEhISEhISEhISEhISEhISEhISEhISEhISUA0'+
    'JUFCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkNEQDU5OTk5OTk/OTk5OTk5OTk5OTk6OzMkOEo8'+
    'OTk5Ojo8NTAwMDAwMCZfAAAAAAAAAC8wLjM+BvrzUTQwMDAwMTIpIiIiIiIiJ2UBAQEBAQEBKh8z'+
    '/PYBATcrIiIiIiIjICgfHx8fHx8fHygHAQEBLCEfIAYBAQFlDgwMDQ0NEBIVGxoaGhoUGhoaGggB'+
    'AQEmGhlLCAEBATYDCgoKCgoKCwQbEAkDAwMTGRkZCAEBASYWJPkBAQEdEQMDAwMDAwMDBAUCAgIC'+
    'Ag8XFxcIAQEBJhj6AQEBARwXFgICAgICAgIENC4uLi4uJUJCQggBAQFFRvQBAQF+REJCQiUuLi4u'+
    'Li1eVlZWVlZZYWFhCAEBAWSAAQEBgGNhYWFhYFlWVlZWV2JmZmZmZmxxcXEIAQEBNn5/AfTzSnJx'+
    'cXFxcGZmZmZXc2lpaWlpaXh0dAgBAQF7dHZRAQH3S3R0dHR0bWlpaWeDgYGBgYGBg3p6CAEBAXx6'+
    'en0BAQH5eXp6enqOgYGBZ5KJiYmJiYmChIQIAQEBhoSEhQEBAQGjhISEhI+JiYmLn52dnZ2dnZ+W'+
    'lggBAQGZlpaYAQEBAZqWlpaWnp2dnYuqpqampqamqqCgCAEBAaKgoZsBAQEBpKCgoKuppqamp7Ov'+
    'r6+vr6+ztZcIAQEBo7a4+AEBAbm3tLS0sq+vr6+nv7q6urq6usD+/fUBAQEG+/cBAQEBfry8vLy+'+
    'urq6uru/vb29vb29xgEBAQEBAQEBAc/Pw8LBwcHBx729vb29u8fExMTExMTIxsbGxsbGxsbGxsbG'+
    'xsbGxsjFxMTExMTLx8rKysrKys3JycnJycnJycnJycnJycnOzMrKysrKysvT0tDQ0NDR1NTU1NTU'+
    '1NTU1NTU1NTU1NvQ0NDQ0NDQy9jX1dXV1dfd3d3d3d3d3d3d3d3d3d3i1dXV1dXV1dXW5tjZ2dnZ'+
    '4eTk5OTk5OTk5OTk5OTk8NnZ2dnZ2dnZ2twA5ePg397w6+vr6+vr6+vr6+vr6vDe3t7e3t7e3+Hh'+
    'AAAA7ubq6fLx8fHx8fHx8fHx8fHy6enp6enp6ens7QAAwAAAA4AAAAEAAAAAAAAAAAAAAAAAAAAA'+
    'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'+
    'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAcAAAAM=';

  var GLOBAL = unsafeWindow;
  GLOBAL._JSONP = {
      count: 0,
      callbacks: []
  };

  function JSONP(url, callback, fixedCallbackName) {
    var jsonp = GLOBAL._JSONP;
    if (!fixedCallbackName) {
      jsonp.callbacks[jsonp.count] = callback;
      url += '&callback=' + '_JSONP.callbacks[' + jsonp.count + ']';
      jsonp.count++;
    }
    else {
      // for tako3
      GLOBAL[fixedCallbackName] = callback;
    }
    var scriptObj = document.createElement('script');
    var soid = 'subscribe_relative_feed_whe_bookmark__jsonp__' + (new Date()).getTime();
    updateNodeAttributes(scriptObj, {
      'type': 'text/javascript',
      'charset': 'utf-8',
      'src': url,
      'id': soid
    });
    setTimeout(partial(function(soid) {
      var scriptObj = document.getElementById(soid);
      scriptObj.parentNode.removeChild(scriptObj);
    }, soid), 1000);
    setTimeout(function() {
      document.getElementsByTagName('head')[0].appendChild(scriptObj);
    }, 0);
  }

  function createElmLeadToTako3(url, msg) {
    var elmLink = document.createElement('a');
    updateNodeAttributes(elmLink, {
      'href': 'http://tako3.com/' + url,
      'target': '_blank',
      'title': msg
    });
    elmLink.appendChild(document.createTextNode(
      'Related site not found. Add this site to tako3?'));
    return elmLink;
  }

  var SBM = {
    Delicious: {
      pattern: /^http\:\/\/del\.icio\.us\/.+?\?url\=.*/
      ,
      getBookmarkUrl: function() {
        return document.getElementById('url').value;
      }
      ,
      insertDom: function(urls) {
        if (urls.length > 0) {
          var elmTako3 = this.createElmTako3Wrapper();
          var elmUrls = document.createElement('ul');
          urls.forEach(function(url){
            var elmSubscribeButton = new Image();
            updateNodeAttributes(elmSubscribeButton, {
              'src': subscribeButton,
              'border': '0px'
            });
            var elmSubscribe = document.createElement('a');
            updateNodeAttributes(elmSubscribe, {
              'href': 'http://reader.livedoor.com/subscribe/' + url,
              'target': '_blank'
            });
            elmSubscribe.appendChild(elmSubscribeButton);

            var elmLink = document.createElement('a');
            updateNodeAttributes(elmLink, {
              'href': url,
              'target': '_blank'
            });
            elmLink.appendChild(document.createTextNode(url));

            var elmList = document.createElement('li');
            updateNodeAttributes(elmList, {
              'style': {
                'marginLeft': '0px',
                'marginBottom': '0px'
              }
            });
            elmList.appendChild(elmSubscribe);
            elmList.appendChild(elmLink);

            elmUrls.appendChild(elmList);
          });
          elmTako3.appendChild(elmUrls);
          var recNode = document.getElementById('rec');
          recNode.parentNode.insertBefore(elmTako3, recNode.nextSibling);
        }
        else {
          this.insertElmLeadToTako3('@insertDom');
        }
      }
      ,
      insertElmLeadToTako3: function(msg) {
        //log('insertElmLeadToTako3: ' + msg);
        var elmTako3 = this.createElmTako3Wrapper();
        var elmPseudoUL = document.createElement('ul');
        var elmPseudoLI = document.createElement('li');
        updateNodeAttributes(elmPseudoLI, {
          'style': {
            'marginLeft': '0px',
            'margiBottom': '0px'
          }
        });
        var elmLeadToTako3 = createElmLeadToTako3(this.getBookmarkUrl(), msg);
        elmPseudoLI.appendChild(elmLeadToTako3);
        elmPseudoUL.appendChild(elmPseudoLI);
        elmTako3.appendChild(elmPseudoUL);
        var recNode = document.getElementById('rec');
        recNode.parentNode.insertBefore(elmTako3, recNode.nextSibling);
      }
      ,
      createElmTako3Wrapper: function() {
        var elmTako3 = document.createElement('li');
        updateNodeAttributes(elmTako3,{
          'class': 'bundle fold',
          'style': {
            'display': 'block'
          }
        });
        var elmCursor = document.createElement('div');
        updateNodeAttributes(elmCursor, {
          'class': 'label arrow',
          'style': {
            'cursor': 'pointer'
          }
        });
        var elmLabel = document.createElement('span');
        elmLabel.appendChild(document.createTextNode('tako3'));
        var elmCursorImage= new Image();
        updateNodeAttributes(elmCursorImage, {
          'src': '/static/img/arrow.d.gif',
          'width': '8px',
          'height': '8px'
        });

        elmCursor.appendChild(elmCursorImage);
        elmCursor.appendChild(elmLabel);
        elmTako3.appendChild(elmCursor);

        return elmTako3;
      }
    }
    ,
    HatenaBookmark: {
      pattern: /^http\:\/\/b\.hatena\.ne\.jp\/add\?mode\=confirm.+?\&url\=.*/
      ,
      getBookmarkUrl: function() {
        return unsafeWindow.document.add.url.value;
      }
      ,
      insertDom: function(urls) {
        if (urls.length > 0) {
          var elmTako3 = this.createElmTako3Wrapper();
          var elmUrls = document.createElement('ul');
          updateNodeAttributes(elmUrls, {
            'style': {
              'marginTop': '0px',
              'paddingLeft': '0px'
            }
          });
          urls.forEach(function(url){
            var elmSubscribeButton = new Image();
            updateNodeAttributes(elmSubscribeButton, {
              'src': subscribeButton,
              'border': '0px'
            });
            var elmSubscribe = document.createElement('a');
            updateNodeAttributes(elmSubscribe, {
              'href': 'http://reader.livedoor.com/subscribe/' + url,
              'target': '_blank'
            });
            elmSubscribe.appendChild(elmSubscribeButton);

            var elmLink = document.createElement('a');
            updateNodeAttributes(elmLink, {
              'href': url,
              'target': '_blank'
            });
            elmLink.appendChild(document.createTextNode(url));

            var elmList = document.createElement('li');
            updateNodeAttributes(elmList, {
              'style': {
                  'listStyleType': 'none'
              }
            });
            elmList.appendChild(elmSubscribe);
            elmList.appendChild(elmLink);

            elmUrls.appendChild(elmList);
          });
          elmTako3.appendChild(elmUrls);
          var recNode = document.getElementById('othertags_list');
          recNode.parentNode.insertBefore(elmTako3, recNode.nextSibling);
        }
        else {
          this.insertElmLeadToTako3('@insertDom');
        }
      }
      ,
      insertElmLeadToTako3: function(msg) {
        var elmTako3 = this.createElmTako3Wrapper();
        var elmPseudoUL = document.createElement('ul');
        updateNodeAttributes(elmPseudoUL, {
          'style': {
              'paddingLeft': '0px'
          }
        });
        var elmPseudoLI = document.createElement('li');
        updateNodeAttributes(elmPseudoUL, {
          'style': {
              'listStyleType': 'none'
          }
        });
        var elmLeadToTako3 = createElmLeadToTako3(this.getBookmarkUrl(), msg);
        elmPseudoLI.appendChild(elmLeadToTako3);
        elmPseudoUL.appendChild(elmPseudoLI);
        elmTako3.appendChild(elmPseudoUL);
        var recNode = document.getElementById('othertags_list');
        recNode.parentNode.insertBefore(elmTako3, recNode.nextSibling);
      }
      ,
      createElmTako3Wrapper: function() {
        var elmTako3 = document.createElement('div');
        updateNodeAttributes(elmTako3, {
          'style': {
            'width': '100%',
            'lineHeight': '140%',
            'marginTop': '10px'
          }
        });

        var elmLabel = document.createElement('div');
        updateNodeAttributes(elmLabel, {
          'style': {
            'fontSize': '10pt',
            'fontWeight': 'bold'
          }
        });
        elmLabel.appendChild(document.createTextNode('tako3'));
        elmTako3.appendChild(elmLabel);

        return elmTako3;
      }
    }
    ,
    LivedoorClip: {
      pattern: /^http\:\/\/clip\.livedoor\.com\/clip\/add\?link\=.*/
      ,
      getBookmarkUrl: function() {
        return unsafeWindow.document.clip.link.value;
      }
      ,
      insertDom: function(urls) {
        if (urls.length > 0) {
          var elmTako3 = this.createElmTako3Wrapper();
          var elmUrls = document.createElement('ul');
          updateNodeAttributes(elmUrls, {
            'style': {
              'marginTop': '0px',
              'padding': '10px'
            }
          });
          urls.forEach(function(url){
            var elmSubscribeButton = new Image();
            updateNodeAttributes(elmSubscribeButton, {
              'src': subscribeButton,
              'border': '0px'
            });
            var elmSubscribe = document.createElement('a');
            updateNodeAttributes(elmSubscribe, {
              'href': 'http://reader.livedoor.com/subscribe/' + url,
              'target': '_blank'
            });
            elmSubscribe.appendChild(elmSubscribeButton);

            var elmLink = document.createElement('a');
            updateNodeAttributes(elmLink, {
              'href': url,
              'target': '_blank'
            });
            elmLink.appendChild(document.createTextNode(url));

            var elmList = document.createElement('li');
            updateNodeAttributes(elmList, {
              'style': {
                'listStyleType': 'none',
                'textAlign': 'left'
              }
            });
            elmList.appendChild(elmSubscribe);
            elmList.appendChild(elmLink);
            elmUrls.appendChild(elmList);
          });
          elmTako3.appendChild(elmUrls);
          var recNode = document.getElementById('addclipcloudbox');
          recNode.parentNode.insertBefore(elmTako3, recNode);
        }
        else {
          this.insertElmLeadToTako3('@insertDom');
        }
      }
      ,
      insertElmLeadToTako3: function(msg) {
        var elmTako3 = this.createElmTako3Wrapper();
        var elmPseudoUL = document.createElement('ul');
        updateNodeAttributes(elmPseudoUL, {
          'style': {
            'marginTop': '0px',
            'padding': '10px'
          }
        });
        var elmPseudoLI = document.createElement('li');
        updateNodeAttributes(elmPseudoLI, {
          'style': {
            'listStyleType': 'none',
            'textAlign': 'left'
          }
        });
        var elmLeadToTako3 = createElmLeadToTako3(this.getBookmarkUrl(), msg);
        elmPseudoLI.appendChild(elmLeadToTako3);
        elmPseudoUL.appendChild(elmPseudoLI);
        elmTako3.appendChild(elmPseudoUL);
        var recNode = document.getElementById('addclipcloudbox');
        recNode.parentNode.insertBefore(elmTako3, recNode);
      }
      ,
      createElmTako3Wrapper: function() {
        var elmTako3 = document.createElement('div');
        updateNodeAttributes(elmTako3, {
          'style': {
            'marginTop': '20px',
            'marginLeft': '90px',
            'marginRight': '90px',
            'marginBottom': '30px'
          }
        });

        var elmLabel = document.createElement('h4');
        updateNodeAttributes(elmLabel, {
          'class': 'pxlarge'
        })
        elmLabel.appendChild(document.createTextNode('tako3'));
        elmTako3.appendChild(elmLabel);

        return elmTako3;
      }
    }
  };

  function guessFeedUrl(feedUrls, siteUrl) {
    var pathLevels = siteUrl.split('\/');
    level = 2;
    var path = 'http:\/\/' + pathLevels[level];
    var matched = [];
    function guess() {
      for (var i = 0; i < feedUrls.length; i++) {
        var url = feedUrls[i];
        if (url.match(path)) {
          matched.push(url);
        }
      }
    }
    var last;
    var count = 0;
    while (1) {
      guess();
      if (matched.length == 1) {
        return matched[0];
      }
      else if (matched.length > 1) {
        last = matched[0];
        matched = [];
        path += '\/' + pathLevels[++level];
      }
      else if (count == 5){
        // akirameta
        return last;
      }
      count++;
    }
  }

  var discoverAPI = 'http://rpc.reader.livedoor.com/feed/discover'
                  + '?format=json';

  function discoverTako3(sbm, discoverUrl, bookmarkUrl, endFlag) {
    JSONP(discoverUrl, function(feedInfos){
      feedInfos.sort(function(a, b) {
        return (b.subscribers_count - a.subscribers_count);
      });
      var urls = feedInfos.map(function(fi){return fi.link});
      var feedUrl = guessFeedUrl(urls, sbm.getBookmarkUrl());
      if (feedUrl) {
        if (feedUrl[feedUrl.length - 1] != '/') feedUrl += '/';
        var tako3url = 'http://tako3.com/json/likely/' + feedUrl;
        JSONP(tako3url, function(urls){
          if (urls.length > 0) {
            sbm.insertDom(urls);
          }
          else {
            sbm.insertElmLeadToTako3('@jsonp_tako3 not found');
          }
        }, 'tako3');
      }
      else {
        if (!endFlag) {
          discoverUrl = discoverAPI + '&url=' + bookmarkUrl;
          discoverTako3(sbm, discoverUrl, bookmarkUrl, 1);
        }
        else {
          sbm.insertElmLeadToTako3('@jsonp_ldr feed not found');
        }
      }
    });
  }

  var url = document.location.href;
  for (var k in SBM) {
    var sbm = SBM[k];
    if (url.match(sbm.pattern)) {
      var bookmarkUrl = encodeURIComponent(sbm.getBookmarkUrl());
      var discoverUrl = discoverAPI + '&links=' + bookmarkUrl;
      discoverTako3(sbm, discoverUrl, bookmarkUrl);
      break;
    }
  }

  // utils -----------------------------------------------------------

  // via Mochikit.Base
  function updatetree(self, obj/*, ...*/) {
    if (self === null) {
      self = {};
    }
    for (var i = 1; i < arguments.length; i++) {
      var o = arguments[i];
      if (typeof(o) != 'undefined' && o !== null) {
        for (var k in o) {
          var v = o[k];
          if (typeof(self[k]) == 'object' && typeof(v) == 'object') {
            arguments.callee(self[k], v);
          } else {
            self[k] = v;
          }
        }
      }
    }
    return self;
  }

  function updateNodeAttributes(node, attrs) {
    for (var k in attrs) {
      var v = attrs[k];
      if (typeof(v) == 'object' && typeof(node[k]) == 'object') {
        updatetree(node[k], v);
      } else if (k.substring(0, 2) == "on") {
        if (typeof(v) == "string") {
          v = new Function(v);
        }
        node[k] = v;
      } else {
        node.setAttribute(k, v);
      }
    }
  }

  function bind(obj, func) {
    func = (func instanceof Function)? func : obj[func];
    return function() {
      return func.apply(obj, arguments);
    }
  }

  function partial(func/*, arg1, arg2,..*/) {
    var preargs = Array.prototype.slice.apply(arguments, [1]);
    return function(){
      var args = Array.prototype.unshift.apply(arguments, preargs);
      return func.apply(this, arguments);
    }
  }

  function log(msg) {
    if (unsafeWindow && unsafeWindow.console) {
      unsafeWindow.console.log(msg);
    }
  }

  function inspect(msg) {
    if (unsafeWindow && unsafeWindow.console) {
      unsafeWindow.console.dir(msg);
    }
  }
})();