Nico Add Mylist Link

マイリストへのリンクを追加する

// ==UserScript==
// @name           Nico Add Mylist Link
// @namespace      http://efcl.info/
// @description    マイリストへのリンクを追加する
// @include        http://www.nicovideo.jp/*
// @version 0.0.1.20140518104303
// ==/UserScript==
// ++ Script for oneself ++: ニコニコ動画のメニューバーに、mylistへのリンクを追加するGreasemonkeyスクリプト
// http://script41self.seesaa.net/article/106627828.html
(function(_doc){
    
var mylistVal = GM_getValue("mylists") || null;
// I/F 
var Mylists = {
    getList : getMylists,
    insert : insertTag,
    makeTag : makeHTMLList
}

if(mylistVal){
   var listTag = Mylists.makeTag(mylistVal);
   Mylists.insert(listTag);
}else{
   Mylists.getList(); 
}

// 取得-保存-挿入
function getMylists(update){
    var req = new XMLHttpRequest();
    req.open('GET', 'http://www.nicovideo.jp/api/mylistgroup/list', false); 
    req.onload = function(){
        var res = req.responseText;
        GM_setValue("mylists", res);
        var listTag = makeHTMLList(res);
        if(update){
            var inpos = _doc.getElementById("AML_list");
            inpos.parentNode.removeChild(inpos);
        }
        Mylists.insert(listTag);
    }
    req.send(null);
}

function insertTag(listTag){
    // 挿入位置探し
    var inpos = _doc.getElementById("menu-ranking");
    inpos.parentNode.appendChild(listTag)
}
function makeHTMLList(res){
  var obj = JSON.parse(res);
  var inp = _doc.createElement("span");
      inp.id = "AML_list"
  var slct = _doc.createElement("select");
      slct.setAttribute("class", "TXT12");
      slct.style.width = "80px";
      slct.setAttribute("onChange", "var idx = this.selectedIndex;if(idx != 0) {location.href = '/mylist/' + this.options[idx].value;}");
      slct.id = "AML_slct";
  var opt = _doc.createElement("option");
      opt.value = "";
      opt.innerHTML = "--myslit--";
      slct.appendChild(opt);
  for (var i=0,l= obj.mylistgroup.length;i < l; i++) {
      opt = _doc.createElement("option");
      opt.value = obj.mylistgroup[i].id;
      opt.innerHTML = obj.mylistgroup[i].name;
      slct.appendChild(opt);
  };
  var refresh = _doc.createElement("a");
      refresh.innerHTML = "更新";
      refresh.setAttribute("style","cursor:default");
      refresh.addEventListener("click", function(){
          // update
          Mylists.getList(true);
      }, false);
  inp.appendChild(slct)
  inp.appendChild(refresh);
  
  return inp;
}
})(document);