編集画面カレンダー

d:id:toinami:20050828:p2

スクリプトはこちらから。Firefoxgreasemonkeyか、Opera 8 のユーザスクリプトとして使えます。
http://homepage1.nifty.com/inami/hatenadiaryEditDateFromCalendar.user.js

[以下は、よくよく考えたらこの場でなくてもOKなのでした]


  • 「hatenadiaryeditdatefromcalendar.user.js」と言うファイル名*1で以下を保存。
  • Firefoxで開く
  • install user scriptで。
// 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 ='&lt;&lt;';
    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 ='&gt;&gt;';
    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で