/** -*- Mode:c++;tab-width:2;indent-tabs-mode:nil;coding:utf-8 -*- */
/**
 * 数値参照に変換するクラス
 *
 * @id: $Id$
 * @author: norio minato
 */

function CharacterEntity()
{
  var MODE_NUMERIC = 1;
  var MODE_STRING  = 2;
  var MODE_BOTH    = 3;

  var _mode = MODE_NUMERIC;
  var _ua_info = (new UserAgent).getList();

  this.setMode = function (mode)
  {
    _mode = mode;
  }

  this.convert = function (str)
  {
    if (str == '') return;

    if (_mode == MODE_NUMERIC) {
      var dec = '';
      var hex = '';

      for (var i=0; i < str.length; ++i) {
        var c = str.charAt(i);

        if (c == '<' || c == '>' || c == '&' || 0x7f < c.charCodeAt()) {
          dec += "&#" + c.charCodeAt().toString(10) + ";";
          hex += "&#" + c.charCodeAt().toString(16) + ";";
        }
        else if (0x20 <= c.charCodeAt() && c.charCodeAt() <= 0x7f) {
          dec += c;
          hex += c;
        }
      }
      displayNumericEntity(str, dec, hex);
    }
  }

  function displayNumericEntity(str, dec, hex)
  {
    var table_nd = document.createElement("table");
    table_nd.setAttribute("border", "1");
    table_nd.setAttribute("width", "90%");
    table_nd.setAttribute("summary", "URIエンコードの結果です");

    var caption_nd = document.createElement("caption");
    var caption = document.createTextNode("「"+ str +"」の変換結果");
    caption_nd.appendChild(caption);
    table_nd.appendChild(caption_nd);

    var tr_nd = document.createElement("tr");
    var th_nd = document.createElement("th");
    var adic_num   = document.createTextNode("進数");
    th_nd.appendChild(adic_num);
    tr_nd.appendChild(th_nd);

    th_nd = document.createElement("th");
    var result = document.createTextNode("数値参照");
    th_nd.appendChild(result);
    tr_nd.appendChild(th_nd);
    table_nd.appendChild(tr_nd);

    tr_nd = document.createElement("tr");
    th_nd = document.createElement("th");
    var dec_txt = document.createTextNode("10進数の数値参照");
    th_nd.appendChild(dec_txt);
    th_nd.style.whiteSpace = 'nowrap';
    tr_nd.appendChild(th_nd);

    var td_nd  = document.createElement("td");
    var div_nd = document.createElement("div");
    var dec_result = document.createTextNode(dec);
    div_nd.appendChild(dec_result);
    td_nd.appendChild(div_nd);
    tr_nd.appendChild(td_nd);

    table_nd.appendChild(tr_nd);

    tr_nd = document.createElement("tr");
    th_nd = document.createElement("th");
    var hex_txt = document.createTextNode("16進数の数値参照");
    th_nd.appendChild(hex_txt);
    tr_nd.appendChild(th_nd);

    td_nd = document.createElement("td");
    div_nd = document.createElement("div");
    var hex_result = document.createTextNode(hex);
    div_nd.appendChild(hex_result);
    td_nd.appendChild(div_nd);
    tr_nd.appendChild(td_nd);
    table_nd.appendChild(tr_nd);

    var result_nd = document.getElementById('result');

    if (_ua_info.ua_name == "ie")
      result_nd.innerHTML = table_nd.outerHTML;
    else
      result_nd.replaceChild(table_nd, result_nd.firstChild);
  }
}
