コンテンツにスキップ

利用者:Jkr2255/DeleteSummaryCounter.js

お知らせ: 保存した後、ブラウザのキャッシュをクリアしてページを再読み込みする必要があります。

多くの WindowsLinux のブラウザ

  • Ctrl を押しながら F5 を押す。

Mac における Safari

  • Shift を押しながら、更新ボタン をクリックする。

Mac における ChromeFirefox

  • Cmd Shift を押しながら R を押す。

詳細についてはWikipedia:キャッシュを消すをご覧ください。

/* 
 * 削除理由のバイト数を取得し、255バイトまでの数値をボックスの後ろに表示する。
 */
$(function() {
  var BYTE_LIMIT = 255;
  var remained;
  
  /* 
   * 文字列を UTF-8 にした場合のバイト数を取得する。
   */
  function numberOfUTF8Bytes(string) {
    var len = 0;
    if (!string) return len;
    var code, surrogate = false;
    for (var i = 0; ; ++i) {
      code = string.charCodeAt(i);
      if (isNaN(code)) break;
      if (code < 0) {
        throw new Error('Illegal number: ' + code);
      } else if (code <= 0x007F) {
        len += 1;
      } else if (code <= 0x07FF) {
        len += 2;
      } else if (code <= 0xD7FF) {
        len += 3;
      } else if (code <= 0xDBFF) {
        surrogate = true;
      } else if (code <= 0xDFFF) {
        len += 4;
        surrogate = false;
      } else if (code <= 0xFFFF) {
        len += 3;
      } else {
        throw new Error('Illegal number: ' + code);
      }
    }
    return len;
  }
  
  /* データ更新用アダプタ */
  function updateCounter(src, drop, tar) {
    if (!src || !drop || !tar) return;
    var val = src.value;
    if (typeof val != 'undefined' && val != null) {
      var val2 = drop.value;
      if (typeof val2 != 'undefined' && val2 != null) {
        if (val2 != 'other') {
          val = val2 + ': ' + val;
        }
        remained = BYTE_LIMIT - numberOfUTF8Bytes(val);
        updateDeleteButton(remained);
        tar.innerHTML = remained;
      }
    }
  }

  /* 削除ボタンの挙動 */
  if(typeof dsbForceLimit =='undefined') dsbForceLimit=false;
  var deleteButton = document.getElementById("wpConfirmB");
  if(deleteButton==null) {
    /* ファイルページの場合 */
    deleteButton = document.getElementById("mw-filedelete-submit");
  }
  function updateDeleteButton(remained) {
    if (deleteButton == null || !dsbForceLimit) return;
    var status = deleteButton.disabled;
    if (!status && remained < 0) {
      deleteButton.disabled = true;
    } else if (status && 0 <= remained) {
      deleteButton.disabled = false;
    }
  }


  var delBtnHook= function(event){
    if(remained>=0)return;
    if(confirm("理由欄が途中で切れますが、このまま削除しますか?"))return;
    event.preventDefault()
  };


  /* 削除画面かどうかをドロップダウンの有無で判断する。 */
  var reasonDrop = document.getElementById('wpDeleteReasonList');
  if (reasonDrop == null) return;

  var summaryField = document.getElementById('wpReason');
 
  var summaryCell = summaryField.parentNode;
  
  /* カウンターの用意と設置 */
  var cbCounter = document.createElement('span');
  cbCounter.setAttribute('id', 'field-char-byte-counter');
  cbCounter.setAttribute('style',
    'display: inline-block; width:2em; font-weight: bold; text-align: center;');
  cbCounter.appendChild(document.createTextNode(BYTE_LIMIT));
  summaryCell.appendChild(cbCounter);
  updateCounter(summaryField, reasonDrop, cbCounter);

  /* 「理由を消去」ボタンを追加 */
  var delbtnCell = deleteButton.parentNode;
  var reasonDelBtn = document.createElement('input');
  reasonDelBtn.setAttribute('id','reason-delete');
  reasonDelBtn.setAttribute('type', 'button');
  reasonDelBtn.setAttribute('value', '理由を消去');
  delbtnCell.appendChild(reasonDelBtn);
 
  var counterHandler = function (e) {
    updateCounter(summaryField, reasonDrop, cbCounter);
  };

  var reasonDelHandler= function(e) {
    summaryField.value='';
    updateCounter(summaryField, reasonDrop, cbCounter);
  };

 $(summaryField).keyup(counterHandler);
 $(summaryField).focus(counterHandler);
 $(summaryField).blur(counterHandler);
 $(summaryField).change(counterHandler);
 $(reasonDrop).change(counterHandler);
 $(reasonDelBtn).click(reasonDelHandler);
 $(deleteButton).click(delBtnHook);
});