var CKNAMES;
var TITLES;
var isSubmit=false;
var URL="^([a-zA-Z])+:(\/){2}(\\S+)";
var EMAIL="^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z]{2,6})$";
var DOMAIN="^(([a-zA-Z0-9\-])+\.)+([a-zA-Z]{2,6})$";
var HANKAKU="^([a-zA-Z0-9])+$";
var HANKAKU_AND_SPACE="^([a-zA-Z0-9 ])+$";
var KANA = "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォッャュョーガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポヴ";

window.onunload = resetSubmitFlag;

//フォームチェック関数
function checkForm(fmName){
    CKNAMES =names[fmName];
    TITLES =titles[fmName];
    var i;

    if(isSubmit==true) {
        alert('データを送信中です。\n連続して送信することはできません。');
        return false;
    }

    var rtn=true;
    for(i=0;i<CKNAMES.length;i++){
        //パラメータが存在しない場合は無視します。
        if(getObject(fmName,CKNAMES[i])==null)
                continue;
        rtn =checkFormInput(fmName, CKNAMES[i]);
        if(!rtn)
            break;
    }

    if(rtn ==true){
        isSubmit=true;
        document.forms[fmName].submit();
    }
    else
        return false;

}

//isSubmitフラグをリセットする
function resetSubmitFlag(){
  isSubmit = false;
}

//入力値をチェックします。
function checkFormInput(fmName, iName){


    var rtn=false;
    var shortName =iName.split("_");

    rtn =checkType(fmName,iName,shortName[0]);

    if(rtn)
        rtn=checkMin(fmName,iName,shortName[1]);
    if(rtn)
        rtn=checkMax(fmName,iName,shortName[2]);

    return rtn;
}

function setArrayValue(fmName,iName){
    var rtnArray = new Array();

    if (getObject(fmName,iName).type =="select-multiple"){
        point =0;
        for (i = 0; i < getObject(fmName,iName).options.length; i++) {
            if (getObject(fmName,iName).options[i].selected==true){
                rtnArray[point++]=getObject(fmName,iName).options[i].value;
            }
        }
        if (point == 0)
            rtnArray[0] ="";
    }else if (getObject(fmName,iName).type =="checkbox"){
        point =0;
        for (i = 0; i < getObject(fmName,iName).length; i++) {
            if (getObject(fmName,iName)[i].checked == true) {
                rtnArray[point++]=getObject(fmName,iName)[i].value;
            }
        }
        if (point == 0)
            rtnArray[0] ="";
    //ラジオボタン
    }else if (getObject(fmName,iName).length >0 ){

        for(i = 0; i < getObject(fmName,iName).length; i++){
            if(getObject(fmName,iName)[i].type == "radio"){
                if(getObject(fmName,iName)[i].checked) { 
                        rtnArray[0]=getObject(fmName,iName)[i].value;
                        break;
                }
            }
        }
    }else{

        rtnArray[0]=getObject(fmName,iName).value;

    }
    return rtnArray;
}

function checkValidate(fmName,iName){

    var point;
    var shortName =iName.split("_");
    point =0;

        if (getObject(fmName,iName).type =="select-multiple"){

        point =0;
        for (i = 0; i < getObject(fmName,iName).options.length; i++) {
            if (getObject(fmName,iName).options[i].selected==true){
                point++;
            }
        }

        //選択必須項目で何も選択されていない。
        if (point == 0 && shortName[3]*1 > 0){
            alert(getTitle(fmName,iName) +"は選択必須項目です。");
            return false;
        }
    }else if (getObject(fmName,iName).type =="select-one"){

        point =0;
        for (i = 0; i < getObject(fmName,iName).options.length; i++) {
            if (getObject(fmName,iName).options[i].selected==true && getObject(fmName,iName).options[i].value!=""){
                point++;
            }
        }


        //選択必須項目で何も選択されていない。
        if (point == 0 && shortName[3]*1 > 0){
            alert(getTitle(fmName,iName) +"は選択必須項目です。");
            return false;
        }

    }else if (getObject(fmName,iName).type =="checkbox"){

        point =0;
        for (i = 0; i < getObject(fmName,iName).length; i++) {
            if (getObject(fmName,iName)[i].checked == true) {
                point++;
            }
        }

        //選択必須項目で何も選択されていない。
        if (point == 0 && shortName[3]*1 > 0){
            alert(getTitle(fmName,iName) +"は選択必須項目です。");
            return false;
        }
    }else{

        //必須項目で何も選択されていない。

        if (shortName[3]*1 >0 && getObject(fmName,iName).value==""){

            alert(getTitle(fmName,iName) +"の入力が正しくありません。");
            return false;
        }
    }

    return true;
}


function checkType(fmName,iName,type){

    var valArr =setArrayValue(fmName,iName);
    var i;

    //必須項目チェック
    if(!checkValidate(fmName,iName))
        return false;

    /*数値チェック*/
    if(type.toUpperCase()=="I"){

        for (i=0; i< valArr.length;i++){

            if (valArr[i]==""){
                valArr[i]=0;
            }
            //フォーム値の数値チェック
            if (isNaN(valArr[i])){

                alert(getTitle(fmName,iName) +"は数値を入力してください。");
                return false;
            }
        }
    /*半角英数字チェック*/
    }else if( type.toUpperCase()=="H"){
        for (i=0; i< valArr.length;i++){
            if(valArr[i].length >0){
                if (!patterCheck(HANKAKU,valArr[i])){
                    alert(getTitle(fmName,iName) +"は半角英数字を入力してください。");
                    return false;
                }
            }
        }
    /*半角英数字（スペースも可）チェック*/
    }else if( type.toUpperCase()=="HS"){
        for (i=0; i< valArr.length;i++){
            if(valArr[i].length >0){
                if (!patterCheck(HANKAKU_AND_SPACE,valArr[i])){
                    alert(getTitle(fmName,iName) +"は半角英数字（スペースも可）を入力してください。");
                    return false;
                }
            }
        }
    /*ドメインチェック*/
    }else if( type.toUpperCase()=="D"){
        for (i=0; i< valArr.length;i++){
            if(valArr[i].length >0){
                if (!patterCheck(DOMAIN,valArr[i])){
                    alert(getTitle(fmName,iName) +"の指定が間違っています。");
                    return false;
                }
            }
        }
    /*Mailチェック*/
    }else if( type.toUpperCase()=="M"){
        for (i=0; i< valArr.length;i++){
            if(valArr[i].length >0){
                if (!patterCheck(EMAIL,valArr[i])){
                    alert(getTitle(fmName,iName) +"の指定が間違っています。");
                    return false;
                }
            }
        }
    /*URLチェック*/
    }else if( type.toUpperCase()=="U"){

        for (i=0; i< valArr.length;i++){
            if(valArr[i].length >0){
                if (!patterCheck(URL,valArr[i])){
                    alert(getTitle(fmName,iName) +"の指定が間違っています。");
                    return false;
                }
            }
        }
    /*全角カタカナチェック*/
    }else if( type.toUpperCase()=="KANA"){
        for ( i=0; i< valArr.length;i++){
            for (j=0; j<valArr[i].length; j++){
                if(valArr[i].charAt(j)==" ")
                        continue;
                if(valArr[i].charAt(j)=="　")
                        continue;

                if (KANA.indexOf(valArr[i].charAt(j),0) < 0) {
                    alert(getTitle(fmName,iName) +"は全角カタカナを入力してください。");
                    return false;
                }
            }
        }
    }
    return true;
}

function checkMin(fmName,iName,min){
    var valArr =setArrayValue(fmName,iName);
    var i;
    var returnValue=true;

    for ( i=0; i< valArr.length;i++){
        // 数値の最小値チェック
        if (getIntType(iName)){
            if (valArr[i]==""){
                valArr[i]=0;
            }



            //フォーム値の最小値チェック
            if(valArr[i]*1 < min*1){
                alert(getTitle(fmName,iName) +"の数値が小さすぎます。最小値は" +min + "です。");
                returnValue= false;
                break;

            }
            // 文字列の最小文字数チェック
        }else{
            //フォーム値の最小値チェック
            if (valArr[i].length < min){
                alert(getTitle(fmName,iName) +"の文字数が足りません。最小文字数は" +min + "です。");
                returnValue= false;
                break;
            }
        }
    }
    return returnValue;
}

function checkMax(fmName,iName,max){
    var valArr =setArrayValue(fmName,iName);
    var i;
    var returnValue=true;
    if (max ==0 )
        return returnValue;
    for ( i=0; i< valArr.length;i++){

        // 数値の最大値チェック
        if (getIntType(iName)){
            if (valArr[i]=="")
                valArr[i]=0;

            //フォーム値の最大値チェック
            if(valArr[i]*1 > max*1){
                alert(getTitle(fmName,iName) +"の数値が大きすぎます。最大値は" +max + "です。");
                returnValue= false;
                break;
            }

        // 文字列の最大文字数チェック
        }else{
            //フォーム値の最大値チェック
            if (valArr[i].length > max*1){
                alert(getTitle(fmName,iName) +"の最大文字数を超えました。最大文字数は" +max + "です。");
                returnValue= false;
                break;

            }
        }
    }
    return returnValue;
}

function getObject(fmName,iName){
    var i;

    var rtnValue="";
    for(i=0;i<CKNAMES.length;i++){
        if (CKNAMES[i] ==iName){
            rtnValue= CKNAMES[i];
            break;
        }

    }

    if(rtnValue=="")
        return null;
    
    if(document.forms[fmName].elements[rtnValue])
        return document.forms[fmName].elements[rtnValue];
   
}

function patterCheck(reg,matchValue){
    if(!matchValue.match(reg))
        return false;
    return true;
}

function getIntType(iName){

    var token=iName.split("_");
    if(token[0].toUpperCase()=="I")
        return true;
    return false;
}



function getTitle(fmName,iName){
    var i;
    var rtnValue;
    for(i=0;i<CKNAMES.length;i++){
        if (CKNAMES[i] ==iName){
            rtnValue= TITLES[i];
            break;
        }

    }
    return rtnValue;
}


function encodeServletURL(str){

  var s0, i, s, u;
  s0 = "";
  for (i = 0; i < str.length; i++){
    s = str.charAt(i);
    u = str.charCodeAt(i);
    if (s == " "){s0 += "+";}
    else {
      if ( u == 0x2a || u == 0x2d || u == 0x2e || u == 0x5f || ((u >= 0x30) && (u <= 0x39)) || ((u >= 0x41) && (u <= 0x5a)) || ((u >= 0x61) && (u <= 0x7a))){       // check for escape
          s0 = s0 + s;
      }
      else {
        if ((u >= 0x0) && (u <= 0x7f)){
            s = "0"+u.toString(16);
            s0 += "%"+ s.substr(s.length-2);
        }
        else if (u > 0x1fffff){
            s0 += "%" + (oxf0 + ((u & 0x1c0000) >> 18)).toString(16);
            s0 += "%" + (0x80 + ((u & 0x3f000) >> 12)).toString(16);
            s0 += "%" + (0x80 + ((u & 0xfc0) >> 6)).toString(16);
            s0 += "%" + (0x80 + (u & 0x3f)).toString(16);
        }
        else if (u > 0x7ff){
            s0 += "%" + (0xe0 + ((u & 0xf000) >> 12)).toString(16);
            s0 += "%" + (0x80 + ((u & 0xfc0) >> 6)).toString(16);
            s0 += "%" + (0x80 + (u & 0x3f)).toString(16);
        }
        else {
            s0 += "%" + (0xc0 + ((u & 0x7c0) >> 6)).toString(16);
            s0 += "%" + (0x80 + (u & 0x3f)).toString(16);
        }
      }
    }
  }
  return s0;
}
