// Copyright (C) 2005, toinami.
//
// ==UserScript==
// @name HatenaDiary edit date from Calendar
// @namespace http://d.hatena.ne.jp/toinami/
// @include http://d.hatena.ne.jp/*/edit*
// @include http://*.g.hatena.ne.jp/*/edit*
// ==/UserScript==
// 20050828 v0.01
// 20050915 v0.02
(function () {
// カレンダー元日付
var date = new Date();
var year = date.getFullYear();
var month = date.getMonth();
var xpos;
var ypos;
// 日付をURLからセット
function editDateFromURL() {
var urldate;
location.href.match(/.*edit\?date=(\d{8}$)/);
if (RegExp.$1) {
urldate = RegExp.$1;
} else {
return; //日付が8桁じゃないとか数字じゃないとか
}
urldate.match(/^(\d{4})(\d{2})(\d{2})$/);
var y = RegExp.$1;
var m = RegExp.$2;
var d = RegExp.$3;
year =y;
date.setFullYear(year);
if(m>0 && m<=12) {
month =m- 1;
date.setMonth(month);
} else {
month = date.getMonth();
}
var inputTags = document.getElementsByTagName('input');
for (var i=0; i<inputTags.length; i++) {
var inputTag = inputTags[i];
switch(inputTag.getAttribute('name')) {
case 'year':
if (inputTag.value==y) continue;
inputTag.value=y;
break;
case 'month':
if (inputTag.value==m) continue;
inputTag.value=m;
break;
case 'day':
if (inputTag.value==d) continue;
inputTag.value=d;
break;
default:
}
}
}
// カレンダーのセルクリア
function clearCells() {
var r,c;
for(r=1;r<=6;r++) {
for(c=1;c<=7;c++) {
var cellid='r' +r + 'c' + c;
var cell = document.getElementById(cellid);
cell.innerHTML='';
}
}
}
// 翌月
function nextMonth() {
date.setDate(1);
date.setMonth(month);
date.setFullYear(year);
date.setMonth(month+1);
month = date.getMonth();
year = date.getFullYear();
if(year>9999) prevMonth();
setCalendar();
}
// 前月
function prevMonth() {
date.setDate(1);
date.setMonth(month);
date.setFullYear(year);
date.setMonth(month-1);
month = date.getMonth();
year = date.getFullYear();
if(year<0) nextMonth();
setCalendar();
}
// カレンダー非表示
function hideCalendar() {
var popup = document.getElementById('popup');
popup.style.visibility = 'hidden';
}
// カレンダーに月表示
function setCalendar() {
clearCells();
date.setDate(1);
var ym = document.getElementById('ym');
var y = date.getFullYear()+'';
//alert(y.length);
if(y.length < 4) {
y = ('0000'+y).substr(y.length,4);
//alert(y);
}
var m = date.getMonth() + 1 + '';
if(m.length ==1) m = '0' + m;
ym.innerHTML = y + '/' + m;
var r = 1;
var c = 0;
while(true) {
var weekday = date.getDay() +1;
var cellid = 'r' + r + 'c' + weekday;
var cell = document.getElementById(cellid);
var d = date.getDate() + '';
if(d.length ==1) d = '0' + d;
var aTag =document.createElement('a');
aTag.href = 'edit?date=' + y + m +d;
aTag.innerHTML = date.getDate();
cell.appendChild(aTag);
if (weekday==7) r++;
// +1日
var d = date.getDate() +1;
date.setDate(d);
// 一日後が当月以外なら終了
if(date.getMonth() != month) {
date.setDate(date.getDate() -1);
break;
}
}
}
//カレンダー表示
var popup=null;
function openCalendar() {
if(! popup) {
popup = createPopup();
document.body.appendChild(popup);
}
setCalendar();
with(popup.style) {
visibility = 'visible';
left = xpos+20;
top = ypos+20;
}
}
// カレンダー作成
function createPopup(e) {
var pop = document.createElement('div');
with(pop.style) {
visibility = 'hidden';
fontSize = '10pt';
lineHeight = '110%';
paddingLeft = '5px';
paddingRight = '5px';
backgroundColor = document.bgColor;
if(!backgroundColor) backgroundColor = '#FFFFFF'; // opera用多少改善
border = '2px solid';
position = 'absolute';
if (!xpos || xpos == 'undefined') xpos = 200;
if (!ypos || ypos== 'undefined') ypos = 100;
left = xpos;
top = ypos+25;
width = '200';
}
pop.id = 'popup';
//カレンダー閉じるボタン
var hide = document.createElement('input');
hide.type='button';
hide.value = 'close';
hide.onclick = hideCalendar;
pop.appendChild(hide);
//警告文
var warningText = document.createElement('p');
warningText.innerHTML = unescape('%u65E5%u4ED8%u3092%u30AF%u30EA%u30C3%u30AF%u3059%u308B%u3068%u8A72%u5F53%u65E5%u4ED8%u306E%u7DE8%u96C6%u753B%u9762%u306B%u79FB%u52D5%u3057%u307E%u3059%u3002%u66F8%u304D%u304B%u3051%u306E%u30C6%u30AD%u30B9%u30C8%u306F%u4FDD%u5B58%u3055%u308C%u306A%u3044%u305F%u3081%u6CE8%u610F%u3057%u3066%u304F%u3060%u3055%u3044%u3002');
pop.appendChild(warningText);
//カレンダー本体
var table1 = document.createElement('table');
//ヘッダ(<< 年月 >>)
var tr1 = document.createElement('tr');
var td1= document.createElement('td');
//td1.colspan=2;
var a1 = document.createElement('a');
a1.onclick= prevMonth;
a1.innerHTML ='<<';
td1.appendChild(a1);
tr1.appendChild(td1);
var td2= document.createElement('td');
//td2.colspan=3;
var a2= document.createElement('a');
a2.id ='ym';
td2.appendChild(a2);
tr1.appendChild(td2);
var td3= document.createElement('td');
//td3.colspan=2;
var a3 = document.createElement('a');
a3.onclick= nextMonth;
a3.innerHTML ='>>';
td3.appendChild(a3);
tr1.appendChild(td3);
table1.appendChild(tr1);
pop.appendChild(table1);
var table2 = document.createElement('table');
table2.border=1;
var tr2 = document.createElement('tr');
var tdW1 = document.createElement('td');
tdW1.innerHTML = 'S';
tr2.appendChild(tdW1);
var tdW2 = document.createElement('td');
tdW2.innerHTML = 'M';
tr2.appendChild(tdW2);
var tdW3 = document.createElement('td');
tdW3.innerHTML = 'T';
tr2.appendChild(tdW3);
var tdW4 = document.createElement('td');
tdW4.innerHTML = 'W';
tr2.appendChild(tdW4);
var tdW5 = document.createElement('td');
tdW5.innerHTML = 'T';
tr2.appendChild(tdW5);
var tdW6 = document.createElement('td');
tdW6.innerHTML = 'F';
tr2.appendChild(tdW6);
var tdW7 = document.createElement('td');
tdW7.innerHTML = 'S';
tr2.appendChild(tdW7);
table2.appendChild(tr2);
//日付セル作成
for (var r=1; r<=6; r++) {
var tr3 = document.createElement('tr');
for(var c=1; c<=7; c++) {
var tdDay = document.createElement('td');
tdDay.id = 'r' + r + 'c' + c;
tr3.appendChild(tdDay);
}
table2.appendChild(tr3);
}
pop.appendChild(table2);
return pop;
}
function setpos(e) {
xpos = e.pageX;
ypos = e.pageY;
}
//画面ロード時
document.captureEvents(Event.MOUSEMOVE);
document.captureEvents(Event.CLICK);
document.onmousemove = setpos;
editDateFromURL();
var editForm = document.getElementsByName('edit')[0];
if(editForm.nodeName.toLowerCase() == 'form') { //プレビュー画面に追加されないように
var popButton = document.createElement('input');
popButton.type = 'button';
popButton.value = unescape('[%u30ab%u30ec%u30f3%u30c0%u30fc]');
popButton.onclick = openCalendar;
editForm.insertBefore(popButton,editForm.firstChild);
}
})();