//
// ItemName[:ItemName2[: ...]]
//    [,if(TargetName==Value)]
//    [,{ notnull | num | num_cp | word | ascii | kanji | mix |
//        len(min-max) | str(min-max) | range(min-max) | /reg/ }] [, ...]
//
// ItemName[] -> ArrayItem
//
 CheckErrMsg = "";
 CheckErrCnt = 5;
//
// Notice Error Messages
//
 function CheckError()
{
 return CheckErrMsg;
}
//
//
 function CheckItems(inFrameName, inFormName, inCheckDefine)
{
 CheckMsgs = new Array();
 CheckErrMsgMake(CheckMsgs);
 Cmd = CheckCreatTarget(inFrameName, inFormName);
 result = 0;
 CheckErrItem = new Array();
 CheckErrMsg = "";
 for (i in inCheckDefine) {
   pos = 0;
   rc = 0;
   ElmArray = 0;
   ChkStr = inCheckDefine[i].replace(/ /g, "");
   ChkObj = ChkStr.split(",");
   ElmNameWk = ChkObj[0];
   pos++;
   if (ElmNameWk.match(/:/)) {
       ElmNames = ElmNameWk.split(":");
       ElmName = ElmNames[0];
   } else {
       j = ElmNameWk.length - 2;
       if (ElmNameWk.substr(j) == "[]") { 
           ElmArray = 1;
       }
       ElmName = ElmNameWk;
   }
   ElmType = CheckName(Cmd, ElmName, ElmArray);
   if (ElmType == "") { continue; }

   MsgLabel = ChkObj[pos];
   pos++;
   if (ChkObj[pos].match(/^if/)) {
       IfStr = ChkObj[pos];
       pos++;
       if (! CheckCondition(Cmd, IfStr))  {
          if (! s_CheckErrItem(CheckErrItem, ElmName)) {
               eval(Cmd["ColorWhite"]);
          }
          continue;
       }
   }
   msg = "";
   switch (ElmType) {
     case "text":
     case "textarea":
       if (ElmArray == 1) {
           kc = eval(Cmd["ArrayLen"]);
           if (kc == undefined) { ElmArray = 0; }
       }
       if (ElmArray == 1) {
           msg = "";
           for (k = 0 ; k < kc ; k++) {
             eval(Cmd["ArrayWhite"]);
             Val = eval(Cmd["ArrayVal"]);
             msgtmp = CheckText(Val, ChkObj, pos);
             if (msgtmp != "") {
                 eval(Cmd["ArrayRed"]);
                 msg = msgtmp;
                 rc = 2;
             }
           }
       } else {
           if (! s_CheckErrItem(CheckErrItem, ElmName)) {
               eval(Cmd["ColorWhite"]);
           }
           Val = eval(Cmd["Val"]);
           msg = CheckText(Val, ChkObj, pos);
           if (msg != "")  { rc = 1; }
       }
       break;
     case "checkbox":
       wk = 0;
       for (k = 0; k < ElmNames.length ; k++) {
         ElmName = ElmNames[k];
         eval(Cmd["ColorTrans"]);
         wk += eval(Cmd["Checked"]);
       }
       if (wk == 0) { 
          for (k = 0; k < ElmNames.length ; k++) {
            ElmName = ElmNames[k];
            eval(Cmd["ColorRed"]);
          }
          msg = "Msg9";
          rc= 1;
       }
       break;
     case undefined:  // radio button
       rl = eval(Cmd["RadioLen"]);
       for (r = 0; r < rl ; r++) {
         eval(Cmd["RadioWhite"]);
       }
       rc = 2;
       for (r = 0; r < rl ; r++) {
         if (eval(Cmd["Radio"])) {
             rc = 0;
             break;
         }
       }
       if (rc) {
           for (r = 0; r < rl ; r++) {
             eval(Cmd["RadioRed"]);
           }
           msg = "Msg1";
       }
       break;
     case "select-one":
     case "select-multiple":
       eval(Cmd["ColorWhite"]);
       op = eval(Cmd["Selected"]);
       if (op < 0) {
           rc= 1;
           msg = "Msg1";
       } else {
           opval = eval(Cmd["SelectOp"]);
           if (opval.length == 0) {
               rc= 1;
               msg = "Msg1";
           }
       }
       break;
     default:
       break;
   }
   if (rc) {
       if (rc == 1) {
           eval(Cmd["ColorRed"]);
       } else {
           rc = 1;
       }
       result += rc;
       if (result <= CheckErrCnt) {
           CheckErrMsg += MsgLabel + "は、" + CheckMsgs[msg] + "\n";
       }
       epos = CheckErrItem.length + 1;
       CheckErrItem[epos] = ElmName;
   }
 }

 return result;
}

 function CheckErrMsgMake(inMsgArray)
{
 inMsgArray["Msg1"] = "必須入力です。";
 inMsgArray["Msg2"] = "数字です。";
 inMsgArray["Msg3"] = "半角英数字です。";
 inMsgArray["Msg4"] = "半角文字です。";
 inMsgArray["Msg5"] = "全角文字です。";
 inMsgArray["Msg6"] = "禁止文字が入力されています。";
 inMsgArray["Msg7"] = "入力サイズが範囲外です。";
 inMsgArray["Msg8"] = "入力値が範囲外です。";
 inMsgArray["Msg9"] = "必須選択です。";
 inMsgArray["Msg10"] = "入力形式に間違いがあります。";
 inMsgArray["Msg11"] = "数値です。またはカンマ・小数点の位置に間違いがあります。";
 inMsgArray["Msg12"] = "入力文字数が範囲外です。";
}

 function s_CheckErrItem(inArray, inItem)
{
 rcx = 0;
 for(k = 0 ; k < inArray.length ; k++) {
   if (inArray[k] == inItem) {
       rcx = 1;
       break;
   }
 }
 return rcx;
}

 function CheckCreatTarget(inFrameName, inFormName)
{
 TargetCmd = new Array();
 TargetCName = new Array("FormLen", "FormNames", "ArrayVal", "ArrayLen", "FormType", "ArrayWhite", "ArrayRed", "Type", "Val", "Val2", "Selected", "SelectOp", "Checked", "Checked2", "RadioLen", "RadioLen2", "Radio", "Radio2", "RadioVal2", "RadioWhite", "RadioRed", "ColorWhite", "ColorRed", "ColorTrans");
 
 TargetCmd["FormLen"]   = "document.inFormName.length";
 TargetCmd["FormNames"] = "document.inFormName.elements[k].name";
 TargetCmd["FormType"]  = "document.inFormName.elements[k].type";
 TargetCmd["ArrayLen"]   = "document.inFormName.elements[ElmName].length";
 TargetCmd["ArrayVal"]   = "document.inFormName.elements[ElmName][k].value";
 TargetCmd["ArrayWhite"] = "document.inFormName.elements[ElmName][k].style.backgroundColor = '#ffffff'";
 TargetCmd["ArrayRed"]   = "document.inFormName.elements[ElmName][k].style.backgroundColor = '#ff0000'";
 TargetCmd["Type"]      = "document.inFormName.elements[ElmName].type";
 TargetCmd["Val"]       = "document.inFormName.elements[ElmName].value";
 TargetCmd["Val2"]      = "document.inFormName.elements[TElmName].value";
 TargetCmd["Selected"]  = "document.inFormName.elements[ElmName].selectedIndex";
 TargetCmd["SelectOp"]  = "document.inFormName.elements[ElmName].options[op].value";
 TargetCmd["Checked"]   = "document.inFormName.elements[ElmName].checked";
 TargetCmd["Checked2"]  = "document.inFormName.elements[TElmName].checked";
 TargetCmd["RadioLen"]  = "document.inFormName.elements[ElmName].length";
 TargetCmd["RadioLen2"] = "document.inFormName.elements[TElmName].length";
 TargetCmd["Radio"]     = "document.inFormName.elements[ElmName][r].checked";
 TargetCmd["Radio2"]    = "document.inFormName.elements[TElmName][r].checked";
 TargetCmd["RadioVal2"] = "document.inFormName.elements[TElmName][r].value";
 TargetCmd["RadioWhite"] = "document.inFormName.elements[ElmName][r].style.backgroundColor = 'transparent'";
 TargetCmd["RadioRed"]   = "document.inFormName.elements[ElmName][r].style.backgroundColor = '#ff0000'";
 TargetCmd["ColorWhite"] = "document.inFormName.elements[ElmName].style.backgroundColor = '#ffffff'";
 TargetCmd["ColorTrans"] = "document.inFormName.elements[ElmName].style.backgroundColor = 'transparent'";
 TargetCmd["ColorRed"]   = "document.inFormName.elements[ElmName].style.backgroundColor = '#ff0000'";

 for (i = 0 ; i < TargetCName.length ; i++) {
   wk = TargetCName[i];
   TargetCmd[wk] = TargetCmd[wk].replace("inFormName", inFormName);
 }
 if (inFrameName.length) {
     for (i = 0 ; i < TargetCName.length ; i++) {
       wk = TargetCName[i];
       TargetCmd[wk] = TargetCmd[wk].replace("document", "parent." + inFrameName);
     }
 }

 return TargetCmd;
}

//
//
//
 function CheckName(Cmd, ElmName, inArraySel)
{
 kc = eval(Cmd["FormLen"]);
 WkType = "";
 for (k = 0 ; k < kc ; k++) {
   wknm = eval(Cmd["FormNames"]);
   if (wknm == ElmName) {
      WkType = (inArraySel)?  eval(Cmd["FormType"]): eval(Cmd["Type"]);
      break;
   }
 }

 return WkType;
}

//
//
//
 function CheckCondition(Cmd, IfStr)
{
 IfStr.match(/^if\(([0-9a-zA-Z_]+)==([0-9a-zA-Z_]+)\)$/);
 TElmName = RegExp.$1;
 TChkVal  = RegExp.$2;
 TType = CheckName(Cmd, TElmName);
 if (TType == "") { return(0); }
 if (TType == undefined) {
     rl = eval(Cmd["RadioLen2"]);
     for (r = 0; r < rl ; r++) {
       if (eval(Cmd["Radio2"])) {
           TStrVal = eval(Cmd["RadioVal2"]);
           break;
       }
     }
 } else {
     TStrVal  = eval(Cmd["Val2"]);
 }
 tchk = 0;
 switch (TChkVal) {
   case "_True":
     if (TType == "checkbox") {
         if (eval(Cmd["Checked2"])) { tchk = 1; }
     } else {
         if (TStrVal.length > 0) { tchk = 1; }
     }
     break;
   case "_False":
     if (TStrVal.length == 0) { tchk = 1; }
     break;
   default:
     if (TStrVal == TChkVal) { tchk = 1; }
     break;
 }

 return (tchk);
}

//
//
//
 function CheckText(ChkStrs, ChkObjs, inPos)
{

 rcmsg = "";

// 前後空白削除
 wstr = ChkStrs.replace(/^\s+|\s+$/g, "");
 ChkStrs = wstr;

 for (j = inPos ; j < ChkObjs.length ; j++) {
   if (ChkObjs[j] == "notnull") {
       if (ChkStrs.length == 0) { return "Msg1"; }
   }
   if (ChkStrs.length == 0) { return rcmsg; }
   switch (ChkObjs[j]) {
     case "num":
       if ((ChkStrs.length > 0) && (! ChkStrs.match(/^\d+$/))) {
          rcmsg = "Msg2";
       }
       break;
     case "num_cp":
       if (ChkStrs.length > 0) {
           if(ChkStrs.match(/^[\d\,\.]+$/)) {
               rcmsg = NumcpChk(ChkStrs);
           } else {
               rcmsg = "Msg11";
           }
       }
       break;
     case "word":
       if ((ChkStrs.length > 0) && (ChkStrs.match(/^\W+$/))) {
          rcmsg = "Msg3";
       }
       break;
     case "ascii":
       if ((ChkStrs.length > 0) && (! ChkStrs.match(/^[A-Za-z0-9\_\,\.\-\=]+$/))) {
          rcmsg = "Msg4";
       }
       break;
     case "kanji":
       if ((ChkStrs.length > 0) && (ChkStrs.match(/^[A-Za-z0-9\_\,\.\-\=]+$/))) {
          rcmsg = "Msg5";
       }
       break;
     case "mix":
       break;
     case "email":
       if (! ChkStrs.match(/^[A-Za-z0-9\-\.\_]+@[A-Za-z0-9\-\.\_]+$/)) {
           rcmsg = "Msg10";
       }
       break;
     case "post":
       if (! ChkStrs.match(/^\d{3}-\d{4}$/)) {
           rcmsg = "Msg10";
       }
       break;
     case "tel":
       if (! ChkStrs.match(/^\d{2,5}-\d{1,5}-\d{4}$/)) {
           rcmsg = "Msg10";
       }
       break;
     default:
       if (ChkStrs.length > 0) {
           if (ChkObjs[j].match(/^len\(([0-9]+)-([0-9]+)\)$/)) {
              minlen = RegExp.$1;
              maxlen = RegExp.$2;
              tlen = StrLen(ChkStrs);
              if ((tlen < minlen) || (tlen > maxlen)) {
                  rcmsg = "Msg7";
              }
              break;
           }
           if (ChkObjs[j].match(/^str\(([0-9]+)-([0-9]+)\)$/)) {
              minlen = RegExp.$1;
              maxlen = RegExp.$2;
              tlen = ChkStrs.length;
              if ((tlen < minlen) || (tlen > maxlen)) {
                  rcmsg = "Msg12";
              }
              break;
           }
           if (ChkObjs[j].match(/^range\(([0-9\.]+)-([0-9\.]+)\)$/)) {
               minval = RegExp.$1;
               maxval = RegExp.$2;
               ChkStrs2 = ChkStrs.replace(",", "");
               if ((parseFloat(ChkStrs2) < parseFloat(minval)) ||
                   (parseFloat(ChkStrs2) > parseFloat(maxval))) {
                   rcmsg = "Msg8";
              }
              break;
           }
           if (ChkObjs[j].match(/^\/(.+)\/$/)) {
               regstr = RegExp.$1;
               re = new RegExp(regstr);
               if (! ChkStrs.match(re)) {
                   rcmsg = "Msg10";
               } 
           }
       }
       break;
   }
   if (rcmsg.length > 0) { break; }
 }

 return rcmsg;
}

 function NumcpChk(inStr)
{
 p = 0;
 c = 0;
 cf = 0;
 for (kp = inStr.length - 1 ; kp >= 0 ; kp--) {
   if (inStr.charAt(kp) == ".") {
       if (p == 1 || cf == 1) { return("Msg11"); }
       p = 1;
       c = 0;
       continue;
   }
   if (inStr.charAt(kp) == ",") {
       if (c != 3) { return("Msg11"); }
       cf = 1;
       c = 0;
       continue;
   }
   c++;
 }

 return("");
}

 function StrLen(str)
{
    var ct;
    var size = 0;

    for(ct = 0; ct < str.length; ct++) {
        var c = str.charCodeAt(ct);
        if(c >= 128){
            size++;
        }
        size++;
    }
    return size;
}
