// 入力フォームの必須チェックを行う
function formMandatoryCheckLoad()
{
  var doc, form, i;
  if ((doc = document) && doc.forms)
  {
    for (i = 0; i < doc.forms.length; ++i)
    {
      if ((form = doc.forms[i]))
        pushEventListener(form, "submit", formMandatoryCheckSubmit, false);
    }
  }
  return;
}

// node または上位にある tagName の要素を探す
function findParentElement(node, tagName)
{
  for (; node; node = node.parentNode)
  {
    if (node.nodeType == 1 &&
        String(node.nodeName).toUpperCase() == tagName)
    {
      return node;
    }
  }
  return null;
}

function getTextContent2(node)
{
  var text, i;
  text = "";
  if (node)
  {
    if (node.nodeType == 1)
    {
      for (i = 0; i < node.childNodes.length; ++i)
        text += getTextContent2(node.childNodes[i]);
    }
    else
    {
      if (node.nodeType == 3)
        text = node.nodeValue;
    }
  }
  return text;
}

// 実際にチェックを行う部分
function formMandatoryCheckSubmit(evt)
{
  var checks, inputs, errors, form, element, i, tr, td0, td1, label, pos, name, value;
  checks = {};
  inputs = [];
  if (evt)
  {
    if ((form = findParentElement(evt.target || evt.srcElement, "FORM")) &&
        form.elements)
    {
      for (i = 0; i < form.elements.length; ++i)
      {
        if ((element = form.elements[i]) && !element.disabled &&
            (name = String(element.name)) &&
            (element.type == "checkbox" || element.type == "password" ||
            element.type == "radio" || element.type == "text" ||
            element.type == "textarea"))
        {
          if ((td1 = findParentElement(element, "TD")) &&
              (tr = td1.parentNode) && tr.cells &&
              (td0 = tr.cells[td1.cellIndex - 1]))
          {
            label = getTextContent2(td0);
            if ((pos = label.lastIndexOf("*")) >= 0)
            {
              label = label.substring(0, pos) + label.substring(pos + 1);
              if (element.type == "checkbox" || element.type == "radio")
              {
                name = name.replace(/\[.*/, "");
                name = name.replace("/[-.]/", "_");
                if (typeof checks[name] != "object")
                {
                  checks[name] = {
                      message: label + "が選択されていません。",
                      checkedCount: 0
                  };
                }
                if (element.checked)
                  checks[name].checkedCount = checks[name].checkedCount + 1;
              }
              else
              {
                value = normalizeInputValue(element.value);
                if (!value.length)
                  inputs.push(label + "が入力されていません。");
                else
                {
                  // メールアドレスと電話番号はその書式をチェックする
                  if (label.indexOf("メールアドレス") >= 0)
                  {
                    if (!checkMailAddress(value))
                      inputs.push(label + "の形式が正しくありません。");
                  }
                  else if (label.indexOf("電話番号") >= 0)
                  {
                    if (!checkTelephone(value))
                      inputs.push(label + "の形式が正しくありません。");
                  }
                }
              }
            }
          }
        }
      }
      for (name in checks)
      {
        if (checks[name].message && !checks[name].checkedCount)
          inputs.push(checks[name].message);
      }
      if (inputs.length)
      {
        alert("未入力の項目があります。入力内容を訂正してください。\n\n・" +
              inputs.join("\n・"));
        if (evt.preventDefault)
          evt.preventDefault();
        else
          evt.returnValue = false;
      }
    }
  }
  return;
}

function normalizeInputValue(str)
{
  var sa, ra, i;
  sa = [/　/g,/！/g,/＃/g,/＄/g,/％/g,/＆/g,/（/g,/）/g,/＊/g,/＋/g,
        /，/g,/−/g,/．/g,/／/g,/０/g,/１/g,/２/g,/３/g,/４/g,/５/g,
        /６/g,/７/g,/８/g,/９/g,/：/g,/；/g,/＜/g,/＝/g,/＞/g,/？/g,
        /＠/g,/Ａ/g,/Ｂ/g,/Ｃ/g,/Ｄ/g,/Ｅ/g,/Ｆ/g,/Ｇ/g,/Ｈ/g,/Ｉ/g,
        /Ｊ/g,/Ｋ/g,/Ｌ/g,/Ｍ/g,/Ｎ/g,/Ｏ/g,/Ｐ/g,/Ｑ/g,/Ｒ/g,/Ｓ/g,
        /Ｔ/g,/Ｕ/g,/Ｖ/g,/Ｗ/g,/Ｘ/g,/Ｙ/g,/Ｚ/g,/［/g,/￥/g,/］/g,
        /＾/g,/＿/g,/｀/g,/ａ/g,/ｂ/g,/ｃ/g,/ｄ/g,/ｅ/g,/ｆ/g,/ｇ/g,
        /ｈ/g,/ｉ/g,/ｊ/g,/ｋ/g,/ｌ/g,/ｍ/g,/ｎ/g,/ｏ/g,/ｐ/g,/ｑ/g,
        /ｒ/g,/ｓ/g,/ｔ/g,/ｕ/g,/ｖ/g,/ｗ/g,/ｘ/g,/ｙ/g,/ｚ/g,/｛/g,
        /｜/g,/｝/g,/｡/g, /｢/g, /｣/g, /､/g, /･/g, /ｰ/g, /ｶﾞ/g,/ｷﾞ/g,
        /ｸﾞ/g,/ｹﾞ/g,/ｺﾞ/g,/ｻﾞ/g,/ｼﾞ/g,/ｽﾞ/g,/ｾﾞ/g,/ｿﾞ/g,/ﾀﾞ/g,/ﾁﾞ/g,
        /ﾂﾞ/g,/ﾃﾞ/g,/ﾄﾞ/g,/ﾊﾞ/g,/ﾊﾟ/g,/ﾋﾞ/g,/ﾋﾟ/g,/ﾌﾞ/g,/ﾌﾟ/g,/ﾍﾞ/g,
        /ﾍﾟ/g,/ﾎﾞ/g,/ﾎﾟ/g,/ｳﾞ/g,/ｧ/g, /ｨ/g, /ｩ/g, /ｪ/g, /ｫ/g, /ｬ/g,
        /ｭ/g, /ｮ/g, /ｯ/g, /ｱ/g, /ｲ/g, /ｳ/g, /ｴ/g, /ｵ/g, /ｶ/g, /ｷ/g,
        /ｸ/g, /ｹ/g, /ｺ/g, /ｻ/g, /ｼ/g, /ｽ/g, /ｾ/g, /ｿ/g, /ﾀ/g, /ﾁ/g,
        /ﾂ/g, /ﾃ/g, /ﾄ/g, /ﾅ/g, /ﾆ/g, /ﾇ/g, /ﾈ/g, /ﾉ/g, /ﾊ/g, /ﾋ/g,
        /ﾌ/g, /ﾍ/g, /ﾎ/g, /ﾏ/g, /ﾐ/g, /ﾑ/g, /ﾒ/g, /ﾓ/g, /ﾔ/g, /ﾕ/g,
        /ﾖ/g, /ﾗ/g, /ﾘ/g, /ﾙ/g, /ﾚ/g, /ﾛ/g, /ﾜ/g, /ｦ/g, /ﾝ/g, /ﾞ/g,
        /ﾟ/g];
  ra = [" ",  "!",  "#",  "$",  "%",  "&",  "(",  ")",  "*",  "+",
        ",",  "-",  ".",  "/",  "0",  "1",  "2",  "3",  "4",  "5",
        "6",  "7",  "8",  "9",  ":",  ";",  "<",  "=",  ">",  "?",
        "@",  "A",  "B",  "C",  "D",  "E",  "F",  "G",  "H",  "I",
        "J",  "K",  "L",  "M",  "N",  "O",  "P",  "Q",  "R",  "S",
        "T",  "U",  "V",  "W",  "X",  "Y",  "Z",  "[",  "\\", "]",
        "^",  "_",  "`",  "a",  "b",  "c",  "d",  "e",  "f",  "g",
        "h",  "i",  "j",  "k",  "l",  "m",  "n",  "o",  "p",  "q",
        "r",  "s",  "t",  "u",  "v",  "w",  "x",  "y",  "z",  "{",
        "|",  "}",  "。", "「", "」", "、", "・", "ー", "ガ", "ギ",
        "グ", "ゲ", "ゴ", "ザ", "ジ", "ズ", "ゼ", "ゾ", "ダ", "ヂ",
        "ヅ", "デ", "ド", "バ", "パ", "ビ", "ピ", "ブ", "プ", "ベ",
        "ペ", "ボ", "ポ", "ヴ", "ァ", "ィ", "ゥ", "ェ", "ォ", "ャ",
        "ュ", "ョ", "ッ", "ア", "イ", "ウ", "エ", "オ", "カ", "キ",
        "ク", "ケ", "コ", "サ", "シ", "ス", "セ", "ソ", "タ", "チ",
        "ツ", "テ", "ト", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "ヒ",
        "フ", "ヘ", "ホ", "マ", "ミ", "ム", "メ", "モ", "ヤ", "ユ",
        "ヨ", "ラ", "リ", "ル", "レ", "ロ", "ワ", "ヲ", "ン", "゛",
        "゜"];
  str = String(str);
  str = str.replace(/[\x00-\x09\x11\x12\x14-\x20\x7F]+/g," ");
  for (i = 0; i < sa.length; ++i)
    str = str.replace(sa[i], ra[i]);
  str = str.replace(/^ /mg,"");
  str = str.replace(/ $/mg,"");
  str = str.replace(/^\s+/, "");
  str = str.replace(/\s+$/, "");
  return str;
}

// メールアドレスの書式チェック
function checkMailAddress(text)
{
  return !text.search(/^ *([!#-'*+\-\/-9=?A-Z^-~]+ *(\. *[!#-'*+\-\/-9=?A-Z^-~]+ *)*|" *(([!#-\[\]-~]|\\.) *)*" *)@ *([!#-'*+\-\/-9=?A-Z^-~]+ *(\. *[!#-'*+\-\/-9=?A-Z^-~]+ *)*|\[ *(([!#-Z^-~]|\\.) *)*\] *)$/);
}

// 電話番号の書式チェック
function checkTelephone(text)
{
  var m, i, d;
  d = text.replace(/[ \(\)\-.\/]+/g, "");
  i = false;

  if (m = d.match(/^\+(.*)/))
    i = m[1];
  else
  {
    if (m = d.match(/^00(1|2[0-9]{2}|[3-8][0-9]|91[0-9]{2})(.*)/))
      d = m[2];
    if (m = d.match(/^010(.*)/))
      i = m[1];
  }
  if (i && (m = i.match(/^810?(.*)/)))
  {
    i = false;
    d = "0" + m[1];
  }
  if (i) // 国際
    return !i.search(/^[1-9][!#*0-9?@A-DPTW]+$/i);
  else
  {
    if (d.match(/^0[2-9]0/)) // 携帯、VoIP等
      return !d.search(/^0[0-9]{10}[!#*0-9?@A-DPTW]*$/i);
    else // 一般
      return !d.search(/^0[0-9]{9}[!#*0-9?@A-DPTW]*$/i);
  }
}

formMandatoryCheckLoad();

