ソース

// Copyright (C) 2005, wata_d.
//
// ==UserScript==
// @name		Hatena Diary DateEdit
// @namespace   http://d.hatena.ne.jp/wata_d
// @include	    http://d.hatena.ne.jp/*/edit*
// ==/UserScript==

(function()
{
  function getTag(val)
  {
    return document.evaluate(val, document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0);
  }
  //! ボタンを作って返す
  function createButton()
  {
    var input = document.createElement("input");
    input.type = "button";
    input.value = "\u65E5\u4ED8\u5909\u66F4"; // 日付変更
    input.onclick = dateChange;
    input.className = "field";
    return input;
  }
  //! 「日付変更」ボタン押下時のイベント
  function dateChange()
  {
    // 年月日取得
    var year  = getTag("//input[@name='year']").value;
    var month = getTag("//input[@name='month']").value;
    var day   = getTag("//input[@name='day']").value;

    var uri = document.location.href;
    var idx = uri.lastIndexOf("?");
    if(idx != -1)
    {
      uri = uri.substr(0, idx+1);
      uri += "date=" + year + month + day;
    }
    else
    {
      uri += "?date=" + year + month + day;
    }
    document.location.replace(uri);
  }

  //! メイン処理(ここが一番最初に呼ばれる)
  window.addEventListener("load",
    function(e)
    {
      // 今現在, 日付を設定する input 要素は h3 要素の子になっており,
      // また h3 要素はひとつしか存在していない
      var h3 = getTag("//h3");
      if(h3)
      {
        var success = false;
        // 子に input 要素がある時のみ有効(プレビュー時にボタンが出てしまうのを防ぐため)
        for(var i = 0; i < h3.childNodes.length; ++i)
        {
          if(h3.childNodes[i].nodeName == "INPUT")
          {
            success = true; break;
          }
        }

        if(success)
        {
          h3.appendChild(createButton());
        }
      }
    }
  , false);
}
)();