// Copyright (C) 2005, d:id:wata_d.
//
// ==UserScript==
// @name Hatena Diary DateEdit
// @namespace http://d.hatena.ne.jp/wata_d
// @include http://d.hatena.ne.jp/*/edit*
// ==/UserScript==
(function()
{
var httpReq = null;
function getTagValue(input, attr)
{
for(var i = 0; i < input.length; ++i)
{
if(input[i].name == attr) { return input[i].value; }
}
}
//! html から textarea要素の中身を取り出す
// ここの処理は割といい加減なので、もう少しスマートな形に書き換える
function getTextareaValue(text)
{
// textの中身は html の 1 ページ
// XML ではないので文字列処理をして抜き出さなければならない...
var startIdx = text.indexOf("<textarea");
var endIdx = text.indexOf("</textarea>");
var ret = text.substring(startIdx, endIdx);
// この段階で ret の中に textarea の開始タグがあるので取り除く
endIdx = ret.indexOf(">") + 1;
ret = ret.substring(endIdx, ret.length);
// < > & " が実体参照になっているので展開する
ret = ret.replace(/</g, "<");
ret = ret.replace(/>/g, ">");
ret = ret.replace(/"/g, "\"");
ret = ret.replace(/&/g, "&");
return ret;
}
//! year年month月day日の記事を読み込む
function doLoadDiary(year, month, day)
{
var idx = location.href.lastIndexOf("?");
if(idx == -1) { idx = location.href.length; }
idx -= 4; // 「edit」を消すため(泥縄)
// http://.../user/edit?date=yyyymmdd を取得する
var uri = "edit?date=" + year + month + day;
uri = encodeURIComponent(uri);
// uri のページからその日の記事を引っ張ってくる
httpReq = new XMLHttpRequest();
httpReq.open("GET", uri, true);
httpReq.send("");
httpReq.onreadystatechange = loadedDiary;
}
//! 過去日記の読み込みを完了したらこのイベントが呼ばれる
function loadedDiary()
{
if(!httpReq) { return; }
if(httpReq.readyState == 4)
{
var targetDayEntry = getTextareaValue(httpReq.responseText);
// textareaに拾ってきた記事を挿入する
var textarea = document.getElementById("textarea-edit");
if(textarea)
{
textarea.value = targetDayEntry;
}
}
}
//! ボタンを作って返す
function createButton()
{
var input = document.createElement("input");
input.type = "button";
input.value = "\u65E5\u4ED8\u5909\u66F4"; // 日付変更
input.onclick = dateSetting;
input.className = "field";
return input;
}
//! 「日付変更」ボタン押下時のイベント
function dateSetting()
{
// 年月日取得
var input_tags = document.getElementsByTagName("input");
var year = getTagValue(input_tags, "year");
var month = getTagValue(input_tags, "month");
var day = getTagValue(input_tags, "day");
doLoadDiary(year, month, day);
}
//! メイン処理(ここが一番最初に呼ばれる)
window.addEventListener("load",
function(e)
{
// 今現在, 日付を設定する input 要素は h3 要素の子になっており,
// また h3 要素はひとつしか存在していない
var h3 = document.getElementsByTagName("h3");
if(h3 && h3.length)
{
var success = false;
var heading = h3[0];
// 子に input 要素がある時のみ有効(プレビュー時にボタンが出てしまうのを防ぐため)
for(var i = 0; i < heading.childNodes.length; ++i)
{
if(heading.childNodes[i].nodeName == "INPUT")
{
success = true; break;
}
}
if(success)
{
heading.appendChild(createButton());
}
}
}
, false);
}
)();