if (typeof(WREST_JS) == 'undefined') // 一度だけ実行
{
    if (typeof g4_path == 'undefined')
        alert('g4_path 変数が宣言されなかったです. js/wrest.js');

    var WREST_JS = true;

    var wrestMsg = '';
    var wrestFld = null;
    //var wrestFldDefaultColor = '#FFFFFF';
    var wrestFldDefaultColor = '';
    var wrestFldBackColor = '#FFE4E1';
    var arrAttr  = new Array ('required', 'trim', 'minlength', 'email', 'hangul', 'hangul2',
                              'memberid', 'nospace', 'numeric', 'alpha', 'alphanumeric',
                              'jumin', 'saupja', 'alphanumericunderline', 'telnumber', 'hangulalphanumeric');

    // subject 速成値を得て return, なければ tagの nameを越し
    function wrestItemname(fld)
    {
        var itemname = fld.getAttribute("itemname");
        if (itemname != null && itemname != "")
            return itemname;
        else
            return fld.name;
    }

    // 両方空白無くす
    function wrestTrim(fld)
    {
        var pattern = /(^\s*)|(\s*$)/g; // \s 空白文字
        fld.value = fld.value.replace(pattern, "");
        return fld.value;
    }

    // 必須入力検事
    function wrestRequired(fld)
    {
        if (wrestTrim(fld) == "")
        {
            if (wrestFld == null)
            {
                // 3.30
                // セレクトボックスの場合にも必須選択検査します.
                wrestMsg = wrestItemname(fld) + " : it must be "+(fld.type=="select-one"?"selected.":"entered.");
                wrestFld = fld;
            }
        }
    }

    // 最小永遠に検事
    function wrestMinlength(fld)
    {
        var len = fld.getAttribute("minlength");
        if (fld.value.length < len)
        {
            if (wrestFld == null)
            {
                wrestMsg = wrestItemname(fld) + " :  最小 " + len + "字以上入力してください.\n";
                wrestFld = fld;
            }
        }
    }

    // 金善用 2006.3 - 電話番号(携帯電話) 形式検事 : 123-123(4)-5678
	function wrestTelnumber(fld){

		if (!wrestTrim(fld)) return;

		var pattern = /^[0-9]{2,3}-[0-9]{3,4}-[0-9]{4}$/;
		if(!pattern.test(fld.value)){
            if(wrestFld == null){
				wrestMsg = wrestItemname(fld)+" : 電話番号形式が正しくないです.\n\nハイフン(-)を含んで入力してください.\n";
                wrestFld = fld;
				fld.select();
            }
		}
	}

    // 電子メール与えなさい形式検事
    function wrestEmail(fld)
    {
        if (!wrestTrim(fld)) return;

        //var pattern = /(\S+)@(\S+)\.(\S+)/; 電子メール住所にハングル使用の時
        var pattern = /([0-9a-zA-Z_-]+)@([0-9a-zA-Z_-]+)\.([0-9a-zA-Z_-]+)/;
        if (!pattern.test(fld.value))
        {
            if (wrestFld == null)
            {
                wrestMsg = wrestItemname(fld) + " : Email error.\n";
                wrestFld = fld;
            }
        }
    }

    // 会員アイディー検事
    function wrestMemberId(fld)
    {
        if (!wrestTrim(fld)) return;

        var pattern = /(^([a-z0-9]+)([a-z0-9_]+$))/;
        if (!pattern.test(fld.value))
        {
            if (wrestFld == null)
            {
                wrestMsg = wrestItemname(fld) + " : 会員アイディー形式ではないです.\n\n領所文字, 数字, _ 万可能.\n\n最初字は領所文字, 数字だけ可能\n";
                wrestFld = fld;
            }
        }
    }

    // ハングルなのか検事 (子音, 集めだけあるハングルは不可)
    function wrestHangul(fld)
    {
        if (!wrestTrim(fld)) return;

        var pattern = /([^가-힣\x20])/i;

        if (pattern.test(fld.value))
        {
            if (wrestFld == null)
            {
                wrestMsg = wrestItemname(fld) + ' : ハングルではないです. (子音, 集めることだけあるハングルは処理しないです.)\n';
                wrestFld = fld;
            }
        }
    }

    // ハングルなのか検事2 (子音, 集めだけあるハングルも可能)
    function wrestHangul2(fld)
    {
        if (!wrestTrim(fld)) return;

        var pattern = /([^가-힣ㄱ-ㅎㅏ-ㅣ\x20])/i;

        if (pattern.test(fld.value))
        {
            if (wrestFld == null)
            {
                wrestMsg = wrestItemname(fld) + ' : ハングルではないです.\n';
                wrestFld = fld;
            }
        }
    }

    // ハングル,英文,数字なのか検事3
    function wrestHangulAlphaNumeric(fld)
    {
        if (!wrestTrim(fld)) return;

        var pattern = /([^가-힣\x20^a-z^A-Z^0-9])/i;

        if (pattern.test(fld.value))
        {
            if (wrestFld == null)
            {
                wrestMsg = wrestItemname(fld) + ' : ハングル, 英文, 数字ではないです.\n';
                wrestFld = fld;
            }
        }
    }

    // 数字認知検事
    // ベブルンクルクルイニム追加 (http://dasir.com) 2003-06-24
    function wrestNumeric(fld)
    {
        if (fld.value.length > 0)
        {
            for (i = 0; i < fld.value.length; i++)
            {
                if (fld.value.charAt(i) < '0' || fld.value.charAt(i) > '9')
                {
                    wrestMsg = wrestItemname(fld) + " : 数字ではないです.\n";
                    wrestFld = fld;
                }
            }
        }
    }

    // 英文字検事
    // ベブルンクルクルイニム追加 (http://dasir.com) 2003-06-24
    function wrestAlpha(fld)
    {
        if (!wrestTrim(fld)) return;

        var pattern = /(^[a-zA-Z]+$)/;
        if (!pattern.test(fld.value))
        {
            if (wrestFld == null)
            {
                wrestMsg = wrestItemname(fld) + " : 英文ではないです.\n";
                wrestFld = fld;
            }
        }
    }

    // 英文字と数字検事
    // ベブルンクルクルイニム追加 (http://dasir.com) 2003-07-07
    function wrestAlphaNumeric(fld)
    {
       if (!wrestTrim(fld)) return;
       var pattern = /(^[a-zA-Z0-9]+$)/;
       if (!pattern.test(fld.value))
       {
           if (wrestFld == null)
           {
               wrestMsg = wrestItemname(fld) + " : 英文または数字ではないです.\n";
               wrestFld = fld;
           }
       }
    }

    // 英文字と数字そして _ 検事
    function wrestAlphaNumericUnderLine(fld)
    {
       if (!wrestTrim(fld))
           return;

       var pattern = /(^[a-zA-Z0-9\_]+$)/;
       if (!pattern.test(fld.value))
       {
           if (wrestFld == null)
           {
               wrestMsg = wrestItemname(fld) + " : 英文, 数字, _ ではないです.\n";
               wrestFld = fld;
           }
       }
    }

    // 住民登録番号検事
    function wrestJumin(fld)
    {
       if (!wrestTrim(fld)) return;
       var pattern = /(^[0-9]{13}$)/;
       if (!pattern.test(fld.value))
       {
           if (wrestFld == null)
           {
               wrestMsg = wrestItemname(fld) + " : 住民登録番号を 13桁数字で入力してください.\n";
               wrestFld = fld;
           }
       }
       else
       {
            var sum_1 = 0;
            var sum_2 = 0;
            var at=0;
            var juminno= fld.value;
            sum_1 = (juminno.charAt(0)*2)+
                    (juminno.charAt(1)*3)+
                    (juminno.charAt(2)*4)+
                    (juminno.charAt(3)*5)+
                    (juminno.charAt(4)*6)+
                    (juminno.charAt(5)*7)+
                    (juminno.charAt(6)*8)+
                    (juminno.charAt(7)*9)+
                    (juminno.charAt(8)*2)+
                    (juminno.charAt(9)*3)+
                    (juminno.charAt(10)*4)+
                    (juminno.charAt(11)*5);
            sum_2=sum_1 % 11;

            if (sum_2 == 0)
                at = 10;
            else
            {
                if (sum_2 == 1)
                    at = 11;
                else
                    at = sum_2;
            }
            att = 11 - at;
            // 1800 年代に生まれた方々は男, 女の仕分けが 9, 0 という
            // 話を聞いたことがあるのにそれなら下の構文は間違いだ.
            // しかし... 100サルノムは方々が住民登録番号を果して入力して見ようか?
            if (juminno.charAt(12) != att ||
                juminno.substr(2,2) < '01' ||
                juminno.substr(2,2) > '12' ||
                juminno.substr(4,2) < '01' ||
                juminno.substr(4,2) > '31' ||
                juminno.charAt(6) > 4)
            {
               wrestMsg = wrestItemname(fld) + " : 正しい住民登録番号ではないです.\n";
               wrestFld = fld;
            }

        }
    }

    // 事業者登録番号検事
    function wrestSaupja(fld)
    {
       if (!wrestTrim(fld)) return;
       var pattern = /(^[0-9]{10}$)/;
       if (!pattern.test(fld.value))
       {
           if (wrestFld == null)
           {
               wrestMsg = wrestItemname(fld) + " : 事業者登録番号を 10桁数字で入力してください.\n";
               wrestFld = fld;
           }
       }
       else
       {
            var sum = 0;
            var at = 0;
            var att = 0;
            var saupjano= fld.value;
            sum = (saupjano.charAt(0)*1)+
                  (saupjano.charAt(1)*3)+
                  (saupjano.charAt(2)*7)+
                  (saupjano.charAt(3)*1)+
                  (saupjano.charAt(4)*3)+
                  (saupjano.charAt(5)*7)+
                  (saupjano.charAt(6)*1)+
                  (saupjano.charAt(7)*3)+
                  (saupjano.charAt(8)*5);
            sum += parseInt((saupjano.charAt(8)*5)/10);
            at = sum % 10;
            if (at != 0)
                att = 10 - at;

            if (saupjano.charAt(9) != att)
            {
               wrestMsg = wrestItemname(fld) + " : 正しい事業者登録番号ではないです.\n";
               wrestFld = fld;
            }

        }
    }

    // 空白検事の後空白を "" に変換
    function wrestNospace(fld)
    {
        var pattern = /(\s)/g; // \s 空白文字
        if (pattern.test(fld.value))
        {
            if (wrestFld == null)
            {
                wrestMsg = wrestItemname(fld) + " : 空白があってはいけないです.\n";
                wrestFld = fld;
            }
        }
    }

    // submit する時速成を検査する.
    function wrestSubmit()
    {
        wrestMsg = "";
        wrestFld = null;

        var attr = null;

        // ヘダングポムに対する要素の数位回しなさい
        for (var i = 0; i < this.elements.length; i++)
        {
            // Input tag の type この text, file, password おこる時だけ
            // 3.30
            // セレクトボックスな時も必須選択検査します. select-one
            if (this.elements[i].type == "text" ||
                this.elements[i].type == "file" ||
                this.elements[i].type == "password" ||
                this.elements[i].type == "select-one" ||
                this.elements[i].type == "textarea")
            {
                // 配列の長さ位回しなさい
                for (var j = 0; j < arrAttr.length; j++)
                {
                    // 配列に定義した速成科比べて速成があるとか値打ちがあったら
                    if (this.elements[i].getAttribute(arrAttr[j]) != null)
                    {
                        /*
                        // 基本色相で回しておいて
                        if (this.elements[i].getAttribute("required") != null) {
                            this.elements[i].style.backgroundColor = wrestFldDefaultColor;
                        }
                        */
                        switch (arrAttr[j])
                        {
                            case "required"     : wrestRequired(this.elements[i]); break;
                            case "trim"         : wrestTrim(this.elements[i]); break;
                            case "minlength"    : wrestMinlength(this.elements[i]); break;
                            case "email"        : wrestEmail(this.elements[i]); break;
                            case "hangul"       : wrestHangul(this.elements[i]); break;
                            case "hangul2"      : wrestHangul2(this.elements[i]); break;
                            case "hangulalphanumeric"
                                                : wrestHangulAlphaNumeric(this.elements[i]); break;
                            case "memberid"     : wrestMemberId(this.elements[i]); break;
                            case "nospace"      : wrestNospace(this.elements[i]); break;
                            case "numeric"      : wrestNumeric(this.elements[i]); break;
                            case "alpha"        : wrestAlpha(this.elements[i]); break;
                            case "alphanumeric" : wrestAlphaNumeric(this.elements[i]); break;
                            case "alphanumericunderline" :
                                                  wrestAlphaNumericUnderLine(this.elements[i]); break;
                            case "jumin"        : wrestJumin(this.elements[i]); break;
                            case "saupja"       : wrestSaupja(this.elements[i]); break;

							// 金善用 2006.3 - 電話番号形式検事
							case "telnumber"	: wrestTelnumber(this.elements[i]); break;
                            default : break;
                        }
                    }
                }
            }
        }

        // フィールドが null このないなら間違いメッセだ出力の後フォーカスを該当の間違いフィールドで移す
        // 間違いフィールドは背景色相を変える.
        if (wrestFld != null)
        {
            alert(wrestMsg);
            if (wrestFld.style.display != 'none')
            {
                wrestFld.style.backgroundColor = wrestFldBackColor;
                wrestFld.focus();
            }
            return false;
        }

        if (this.oldsubmit && this.oldsubmit() == false)
            return false;

        return true;
    }

    // 初期に onsubmitを横取りするようにする.
    function wrestInitialized()
    {
        for (var i = 0; i < document.forms.length; i++)
        {
            // onsubmit イベントがあったら保存しておく.
            if (document.forms[i].onsubmit) document.forms[i].oldsubmit = document.forms[i].onsubmit;
            document.forms[i].onsubmit = wrestSubmit;
            for (var j = 0; j < document.forms[i].elements.length; j++)
            {
                // 必須入力日場合は * 背景イメージを与える.
                if (document.forms[i].elements[j].getAttribute("required") != null)
                {
                    //document.forms[i].elements[j].style.backgroundColor = wrestFldDefaultColor;
                    //document.forms[i].elements[j].className = "wrest_required";
                    document.forms[i].elements[j].style.backgroundImage = "url("+g4_path+"/js/wrest.gif)";
                    document.forms[i].elements[j].style.backgroundPosition = "top right";
                    document.forms[i].elements[j].style.backgroundRepeat = "no-repeat";
                }
            }
        }
    }

    wrestInitialized();
}
