// ==UserScript==
// @name           shortcut tags for hatena bookmark
// @namespace      http://fg-180.katamayu.net/userscripts
// @include        http://b.hatena.ne.jp/add?*
// @include        http://b.hatena.ne.jp/*/edit?*
// ==/UserScript==

var shortcutTags;
var $ = unsafeWindow.$;
Array.prototype = unsafeWindow.Array.prototype;

function saveShortcutLinks(str) {
  GM_setValue('shortcutTags', encodeURIComponent(str));
}

function loadShortcutLinks() {
  shortcutTags = unsafeWindow.$A(decodeURIComponent(GM_getValue('shortcutTags', '')).match(/\[.+?\]/g))
                  .map(function (tag) { return tag.slice(1, -1); }).sort();
}

function redrawTagList() {
  for (var i = 0; i < shortcutTags.length; i++) {
    if (unsafeWindow.isAdded(shortcutTags[i])) {
      unsafeWindow.selectTag($("shortcutTag" + i));
    } else {
      unsafeWindow.unselectTag($("shortcutTag" + i));
    }
  }
}

function shortcutTagsToString() {
  return shortcutTags.map(function (tag) { return '[' + tag + ']'; }).join('');
}

var oldUpdateAllTagsLists = unsafeWindow.updateAllTagsLists;
unsafeWindow.updateAllTagsLists = function () {
  oldUpdateAllTagsLists();
  redrawTagList();
}

function createShortcutTagsDiv() {
  var div = document.createElement('div');
  for (var i = 0; i < shortcutTags.length; i++) {
    div.appendChild(unsafeWindow.createTagSpan(shortcutTags[i], "shortcutTag" + i));
    div.appendChild(document.createTextNode(" "));
  }
  return div;
}

function appendShortcutTagsList() {
  var listDiv = document.createElement('div');
  with(listDiv.style) {
    width = "100%";
    lineHeight = "140%";
    marginTop = "10";
  }

  var titleDiv = document.createElement("div");
  titleDiv.style.fontSize = "10pt";
  titleDiv.style.fontWeight = "bold";
  titleDiv.appendChild(document.createTextNode("ショートカットタグ"));

  var changeShortcutTagLink = document.createElement('a');
  changeShortcutTagLink.innerHTML = 'edit';
  changeShortcutTagLink.href = '#';
  changeShortcutTagLink.wrappedJSObject.onclick = function () {
    var str = prompt('input shortcut tags', shortcutTagsToString());
    if (str != null) {
      saveShortcutLinks(str);
      loadShortcutLinks();
      listDiv.removeChild(listDiv.lastChild);
      listDiv.appendChild(createShortcutTagsDiv());
      unsafeWindow.updateAllTagsLists();
    }
  };

  titleDiv.appendChild(document.createTextNode(" "));
  titleDiv.appendChild(changeShortcutTagLink);
  listDiv.appendChild(titleDiv);
  listDiv.appendChild(createShortcutTagsDiv());

  $('tags_completion').insertBefore(listDiv, $('othertags_list'));

  redrawTagList();
}

//-----

loadShortcutLinks();
appendShortcutTagsList();

