// 漢字→かな変換
function convertKanaActionURI()
{
  return "/convert-kana.php";
}

function convertKanaLoad(evt)
{
  var doc, inputs, input, i, kana;
  if ((doc = document) &&
      (inputs = snapElementsByTagName(doc, "INPUT", "kanji")))
  {
    for (i = 0; i < inputs.length; ++i)
    {
      if ((input = inputs[i]) && (kana = findKanaInput(input)))
      {
        input.m_kana = kana;
        input.m_previousValue = input.value;
        pushEventListener(input, "focus", convertKanaFocus);
        pushEventListener(input, "blur", convertKanaBlur);
      }
    }
  }
  return;
}

// フォーカスを受け取った時に元の値を保存する
function convertKanaFocus(evt)
{
  var input;
  if ((evt || (evt = window.event)) &&
      (input = getAncestorElement(evt.target || evt.srcElement, "INPUT")))
    input.m_previousValue = input.value;
  return;
}

function convertKanaBlur(evt)
{
  var input, kana, params, q, url;
  if ((evt || (evt = window.event)) &&
      (input = getAncestorElement(evt.target || evt.srcElement, "INPUT")) &&
      input.value != input.m_previousValue && (kana = input.m_kana) &&
      (kana.value == kana.defaultValue || kana.value == kana.m_lastValue))
  {
    q = String(input.value);
    if (q.length)
    {
      url = convertKanaActionURI() + "?q=" + encodeURIComponent(q);
      params = { kanji: input, kana: kana, value: q };
      sendHttpGetRequest(url, converKanaXmlLoad, params);
    }
    else
      kana.m_lastValue = kana.value = "";
  }
  return;
}

// 読み仮名を受け取った
function converKanaXmlLoad(req, params)
{
  var xml, value, kana;
  if (req && req.responseXML && (xml = req.responseXML.documentElement))
  {
    value = getContentText(xml);
    if (value && params && (kana = params.kana))
      kana.m_lastValue = kana.value = value;
  }
  return;
}

// 漢字フィールドの対となるカナフィールドを探す
function findKanaInput(kanji)
{
  var kana, form, inputs, input, i;
  kana = null;
  if (kanji && kanji.name && (form = kanji.form) && form.elements &&
      form.elements.item)
  {
    for (i = 0; i < form.elements.length; ++i)
      if ((input = form.elements.item(i)) && input.name &&
          input.name == kanji.name + "2")
      {
        kana = input;
        break;
      }
  }
  return kana;
}

pushEventListener(this, "load", convertKanaLoad);

