編集画面カレンダー
スクリプトはこちらから。Firefoxのgreasemonkeyか、Opera 8 のユーザスクリプトとして使えます。
http://homepage1.nifty.com/inami/hatenadiaryEditDateFromCalendar.user.js
[以下は、よくよく考えたらこの場でなくてもOKなのでした]
// 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 (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; border = '2px solid'; position = 'absolute'; if (xpos == 'undefined') xpos = 50; if (ypos == 'undefined') ypos = 50; 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]; var popButton = document.createElement('input'); popButton.type = 'button'; popButton.value = unescape('[%u30ab%u30ec%u30f3%u30c0%u30fc]'); popButton.onclick = openCalendar; editForm.insertBefore(popButton,editForm.firstChild); })();
*1:じゃなくても良いけど、*.users.jsで