/* -*- Mode:java-mode;tab-width:2;indent-tabs-mode:nil;coding:utf-8 -*- */
/*---------------------------------------------------------------------
 * URIparser.js
 * author: minato@tubonotubo.jp
 *---------------------------------------------------------------------*/

/**
 * 初期チェック
 * XMLHttpRequestが使えなければエラーを表示する。XMLHttpRequestは、
 * XMLHttpRequest.js を参照。
 * @access public
 */
function init()
{
  if (!new XMLHttpRequest())
    alert("ご利用のブラウザでは、Javascriptの特定の機能が利用できません。\nJavascript機能をオフにして「変換する」ボタンをご利用ください。");
  else {
    var submitNode = document.getElementById("parse-submit");
    if (submitNode) {
      var inputNode = document.createElement("input");
      inputNode.setAttribute("type", "reset");
      inputNode.setAttribute("value", "入力文字を消す");
      submitNode.parentNode.insertBefore(inputNode, submitNode);
      submitNode.parentNode.removeChild(submitNode);
    }
  }
}

/**
 * 文字列をエンコードする
 * @access public
 * @param  node targetNode 対象文字列を含むノード
 */
function mwEncodeURI(targetNode)
{
  var url = "/webapps/uri_parser/uri_parser.cgi";
  url += "?__mode=ajax&target=" + encodeURIComponent(targetNode.value);
  url += "&__function=" + document.getElementById("function").getAttribute("value");

  var xrequest = new XMLHttpRequest();
  xrequest.open("GET", url, true);
  xrequest.onreadystatechange = function () { statusCheckThenExec(xrequest, targetNode, 'encode'); }
  xrequest.send(null);
}

/**
 * 文字列をデコードする
 * @access public
 * @param  node targetNode 対象文字列を含むノード
 */
function mwDecodeURI(targetNode)
{
  var url = "/webapps/uri_parser/uri_parser.cgi";
  url += "?__mode=ajax&target=" + encodeURIComponent(targetNode.value);
  url += "&__function=" + document.getElementById("function").getAttribute("value");

  var xrequest = new XMLHttpRequest();
  xrequest.open("GET", url, true);
  xrequest.onreadystatechange = function () { statusCheckThenExec(xrequest, targetNode, 'decode'); }
  xrequest.send(null);
}

/**
 * ステータスをチェックしてから、エンコード・デコードを実行する
 * @access private
 * @param  object xrequest   XMLHttpRequestのオブジェクト
 *         node   targetNode デコード結果のノードを置き換える対象のノード
 *         string type       エンコードする場合はencode, デコードする場合はdecodeを指定
 */
function statusCheckThenExec(xrequest, targetNode, type)
{
  if (xrequest.readyState == 4 && xrequest.status == 200) {
    if (type == 'encode')
      executeEncode(xrequest, targetNode);
    else if (type == 'decode')
      executeDecode(xrequest, targetNode);
  }
}

/**
 * エンコードを実行する
 * @access private
 * @param  object xrequest   XMLHttpRequestのオブジェクト
 *         node   targetNode エンコード結果のノードを置き換える対象のノード
 */
function executeEncode(xrequest, targetNode)
{
  var xml = xrequest.responseXML;

  var codeNodes = xml.getElementsByTagName("code");
  if (codeNodes.length > 0)
  {
    var tableNode = document.createElement("table");
    tableNode.setAttribute("border", "1");
    tableNode.setAttribute("width", "90%");
    tableNode.setAttribute("summary", "URIエンコードの結果です");

    var captionNode = document.createElement("caption");
    var caption = document.createTextNode("「"+ targetNode.value +"」に対するURIエンコードの結果");
    captionNode.appendChild(caption);
    tableNode.appendChild(captionNode);

    var trNode    = document.createElement("tr");
    var thNode    = document.createElement("th");
    thNode.setAttribute("scope", "col");
    thNode.setAttribute("abbr", "コード");
    var charCode  = document.createTextNode("文字コード");
    thNode.appendChild(charCode);
    trNode.appendChild(thNode);

    thNode        = document.createElement("th");
    thNode.setAttribute("scope", "col");
    thNode.setAttribute("abbr", "コード");
    var result    = document.createTextNode("変換された文字列");
    thNode.appendChild(result);
    trNode.appendChild(thNode);
    tableNode.appendChild(trNode);

    var ua = new UserAgent();
    var uaName = ua.getBrowserName();

    for (var i=0; i<codeNodes.length; i++) {
      var code = codeNodes[i];
      trNode = document.createElement("tr");

      thNode = document.createElement("th");
      thNode.setAttribute("scope", "col");
      thNode.style.backgroundColor = '#eee';
      thNode.style.color = '#555';
      var charset = document.createTextNode(code.getAttribute("type"));
      thNode.appendChild(charset);
      trNode.appendChild(thNode);

      tdNode = document.createElement("td");
      textareaNode = document.createElement("textarea");
      textareaNode.setAttribute("cols", "30");
      textareaNode.setAttribute("rows", "3");
      textareaNode.setAttribute("wrap", "soft");
      textareaNode.style.width = '98%';

      if (uaName == "safari")
        textareaNode.value = code.getAttribute("value");
      else {
        var encoded = document.createTextNode(code.getAttribute("value"));
        textareaNode.appendChild(encoded);
      }

      tdNode.appendChild(textareaNode);
      trNode.appendChild(tdNode);
      tableNode.appendChild(trNode);
    }

    var resultNode = document.getElementById("result");
    if (uaName != "ie")
      resultNode.replaceChild(tableNode, resultNode.firstChild);
    else
      resultNode.innerHTML = tableNode.outerHTML;
  }
  else {
    var resultNode = document.getElementById("result");
    var emptyTextNode = document.createTextNode("文字列を入力してください。");
    resultNode.replaceChild(emptyTextNode, resultNode.firstChild);
  }
}

/**
 * デコードを実行する
 * @access private
 * @param  object xrequest   XMLHttpRequestのオブジェクト
 *         node   targetNode デコード結果のノードを置き換える対象のノード
 */
function executeDecode(xrequest, targetNode)
{
  var xml = xrequest.responseXML;
  var charsetNodes = xml.getElementsByTagName("charset")[0];
  var resultNodes = xml.getElementsByTagName("result")[0];

  if (charsetNodes && resultNodes)
  {
    var resultNode = document.getElementById("result");

    if (charsetNodes.getAttribute("value") == "" ||
        resultNodes.getAttribute("value") == "")
    {
      var invalidTextNode = document.createTextNode("入力された文字列をURIエンコードすることができませんでした。%c6%fc%cb%dc%b8%ec などの形式の文字列を入力してください。");
      resultNode.replaceChild(invalidTextNode, resultNode.firstChild);
    }
    else {
      var divNode = document.createElement("div");
      var hNode = document.createElement("h3");
      var hText = document.createTextNode("デコード結果");
      hNode.appendChild(hText);
      divNode.appendChild(hNode);

      var pNode = document.createElement("p");
      var strongNode = document.createElement("strong");
      var strongText = document.createTextNode("デコードした文字列の推定文字コード");
      strongNode.appendChild(strongText);
      pNode.appendChild(strongNode);

      var brNode = document.createElement("br");
      pNode.appendChild(brNode);

      var charText = document.createTextNode(charsetNodes.getAttribute("value"));
      pNode.appendChild(charText);
      divNode.appendChild(pNode);

      pNode = document.createElement("p");
      strongNode = document.createElement("strong");
      strongText = document.createTextNode("デコードした文字列");
      strongNode.appendChild(strongText);
      pNode.appendChild(strongNode);

      brNode = document.createElement("br");
      pNode.appendChild(brNode);

      var charText = document.createTextNode(resultNodes.getAttribute("value"));
      pNode.appendChild(charText);
      divNode.appendChild(pNode);

      resultNode.replaceChild(divNode, resultNode.firstChild);
    }
  }
  else {
    var resultNode = document.getElementById("result");
    var emptyTextNode = document.createTextNode("文字列を入力してください。");
    resultNode.replaceChild(emptyTextNode, resultNode.firstChild);
  }
}

init();

//-- end of script ----
