/*
 * This file is part of the pettiwork package.
 * (c) 2007-2008 Exbridge,inc. <info@exbridge.jp>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

//===================================================================================================
//require library
// http://www.json.org/json2.js
// http://www.mts.net/~tfriesen/dhtml/ie_methods.js (for firefox)
//===================================================================================================

/**
 * Project: pettiwork: the PHP lightweight web framework
 * File:    xbpwContext.php
 *
 * @link http://exbridge.jp/
 * @author S.Tajima <tajima@exbridge.jp>
 * @version svn:$Id:$
 * @copyright 2007-2008 Exbridge,Inc.
 */

// <input type="text"
//        id="user_nm"
//        name="user_nm"
//        validate="len,0,255;iif{type:'not-null',target:['user_cd','user_**'],check:['null','number']};"
//        column="ユーザー名">

//===================================================================================================
//
//===================================================================================================
var ERROR_RETURN = true;
//ALERT : JavaScriptのアラートを表示　DISP : エラー箇所にタグ表示　NONE : 非表示
var ERROR_DISPLAY_TYPE = 'ALERT';

//===================================================================================================
// 使用不可の文字・外字
//===================================================================================================
var EXTERNAL_FONTS = /[<>\\'"①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡㍻〝〟№㏍℡㊤㊥㊦㊧㊨㈱㈲㈹㍾㍽㍼≒≡∫∮∑√⊥∠∟⊿∵∩∪]/;

//===================================================================================================
//エラーメッセージ
//===================================================================================================
var VALIDATE_ERR_01='必須項目です。入力してください[%s]';
var VALIDATE_ERR_02='半角整数で入力してください[%s]';
var VALIDATE_ERR_03='半角英数字で入力してください[%s]';
var VALIDATE_ERR_04='半角文字で入力してください[%s]';
var VALIDATE_ERR_05='全角文字で入力してください[%s]';
var VALIDATE_ERR_06='半角数字[0-9]または小数点[.]で入力してください[%s]';
var VALIDATE_ERR_07='半角文字%s文字以内または全角文字%s文字以内で入力してください[%s]';
var VALIDATE_ERR_08='%s文字以内で入力してください[%s]';
var VALIDATE_ERR_09='%s文字以上%s文字以内で入力してください[%s]';
var VALIDATE_ERR_10='半角英数字(記号「-+"\!*/,.;:@&$%#`^~_(){}?=| 」を含む)で入力してください[%s]';
var VALIDATE_ERR_11='使用できない文字が含まれています[%s]';
var VALIDATE_ERR_14='日付形式ではありません[%s]';
var VALIDATE_ERR_16='整数部%s桁、小数部%s桁以内で入力してください[%s]';
var VALIDATE_ERR_18='%s～%sの範囲で入力してください[%s]';
var VALIDATE_ERR_19='入力内容が正しくありません[%s]';
var VALIDATE_ERR_20='ひらがなで入力してください[%s]';
var VALIDATE_ERR_21='カタカナで入力してください[%s]';
var VALIDATE_ERR_22='URL形式で入力してください[%s]';

//===================================================================================================
//Check type
//===================================================================================================
//'sql'
//'null'
//'external'
//'range'
//'len'
//'len-return'
//'byte'
//'decimal'
//'number'
//'number-sign'
//'han'
//'han_eisu'
//'han_eisukigo'
//'zen'
//'zen-rtn'
//'date'
//'mail'
//'tel'
//'hiragana'
//'katakana'
//'url'

/**
 * エラーメッセージ保持用配列
 */
var _error_list=[];
var _error_id_list = [];
/**
 * 検証
 */
function validate(target_form_id)
{
    _error_list=[];
    _error_id_list = [];
    
    auto_check_flg = true;
    user_check_flg = true;

    _clsChecker.init(target_form_id);

    //一般的なチェック
    auto_check_flg = _clsChecker.check();

    //ユーザー拡張チェック
    try {
        if (ERROR_DISPLAY_TYPE=='DISP' || auto_check_flg) {
            user_check_flg = user_validate();
        }
    }
    catch(e) {
    }

    //エラー判定
    if (auto_check_flg==false || user_check_flg==false) {
        print_stack_error();
        return false;
    }
    return true;
}

/**
 * エラースタック
 */
function push_error(message,obj)
{
    _error_list[_error_list.length] = message;
    _error_id_list[_error_id_list.length] = obj.name;
}

/**
 * エラー表示
 */
function print_stack_error()
{
    var errmessage = "";
    var errcount = _error_list.length;
    for(var i = 0; i < errcount; i++){
        errmessage += _error_list[i] + "\n";
    }
    if (errcount > 0) {
        if (ERROR_DISPLAY_TYPE=='ALERT') {
            alert(errmessage)
        }
    }
}

/**
 * SQLチェック
 */
function check_sql(v)
{
    if (v.match(/[<>&'%_"\\]/g)) {
        return false;
    }
    return true;
}

/**
 * NULLチェック (空白・スペース・TAB文字 不可)
 */
function check_null(v)
{
    if ((v == '') || (v == null) || (v == undefined) || (v.length == 0) || v.match(/^[　\s]+$/)) {
        return false;
    }
    return true;
}

/**
 * 特殊文字（外字）チェック
 */
function check_external(v)
{
    if (v.match(EXTERNAL_FONTS)) {
        return false;
    }
    return true;
}

/**
 * 数字(小数)チェック
 * @param allLen  桁数制限値(整数部＋小数部) 0の時、桁数チェックなし
 * @param decLen  桁数制限値(小数部)
 */
function check_decimal(v, allLen, decLen) {
    if (isNULL(v)) {
        return true;
    }
    if (v === 0 || v === "0") {
        return true;
    }
    if (isNaN(v) || !v.match(/^[0-9.]+$/)) {
        return false;
    }

    if (allLen > 0) {
        intLen = allLen - decLen;
        var r = /^([-+]?[0-9]+)\.?([0-9]*)$/;
        var a = r.exec(v);
        if (a[1].length > intLen || a[2].length > decLen) {
            return false;
        }
    }
    return true;
}

/**
 * 数字チェック１
 */
function check_number(v)
{
    if (isNULL(v)) {
        return true;
    }
    if (v === 0 || v === "0") {
        return true;
    }
    v = v.replace(/^0+/,"");
    if (!v.match(/^[1-9]+[0-9]*$/)) {
        return false;
    }
    return true;
}

/**
 * 数字チェック２ (マイナス「-」、小数点「.」許可)
 */
function check_number_with_sign(v)
{
    if (isNULL(v)) {
        return true;
    }
    if (v === 0 || v === "0") {
        return true;
    }
    v = v.replace(/^0+/,"");
    if (!v.match(/^[-.]?[1-9]+[0-9.]*$/)) {
        return false;
    }
    return true;
}

/**
 * 半角チェック
 */
function check_hankaku(v)
{
    if (isNULL(v)) {
        return true;
    }
    if (!v.match(/^[-+"\\\[\]0-9a-zA-Zｱ-ﾝﾞﾟｦｧ-ｯｰ!*/,.;:@&$%#`^~_(){}?=| ]+$/g)){
        return false;
    }
    return true;
}

/**
 * 半角英数字チェック
 */
function check_hankaku_eisu(v)
{
    if (isNULL(v)) {
        return true;
    }
    if (!v.match(/^[a-zA-Z0-9_]+$/)) {
        return false;
    }
    return true;
}

/**
 * 半角英数字記号チェック
 */
function check_hankaku_eisukigo(v)
{
    if (isNULL(v)) {
        return true;
    }
    if (!v.match(/^[-+"\\\[\]0-9a-zA-Z!*/,.;:@&$%#`^~_(){}?=| ]+$/)) {
        return false;
    }
    return true;
}

/**
 * 全角チェック
 */
function check_zenkaku(v)
{
    return _check_zenkaku(v, 0);
}

/**
 * 改行を含む全角チェック
 */
function check_zenkaku_return(v)
{
    return _check_zenkaku(v, 1);
}

/**
 * 全角チェック（メイン）
 */
function _check_zenkaku(v, flg)
{
    for (var i = 0; i < v.length; ++i) {
        var cc = v.charCodeAt(i);
        if (flg == 1) {
            if (cc == 0x0d || cc == 0x0a) {
                continue;
            }
        }
        if (cc < 256 || (cc >= 0xff61 && cc <= 0xff9f)) {
            return false;
        }
    }
    return true;
}

/**
 * 値の範囲チェック
 */
function check_range(v, lmin, lmax)
{
    if(v < lmin || v > lmax){
        return false;
    }
    return true;
}

/**
 * lengthチェック
 */
function check_length(v, lmin, lmax)
{
    var l;
    if (isNULL(v)) {
        l=0;
    }else{
        l = v.length;
    }
    if (l < lmin || l > lmax) {
        return false;
    }
    return true;
}

/**
 * テキストエリアバイト数チェック(改行を含む全角)
 */
function check_length_return(v, lmax)
{
    if (isNULL(v)) {
        return true;
    }
    var len = v.length;

    var count = 0;
    for (i=0; i<len; i++) {
        var cc = v.charAt(i);
        if (cc == '\n') {
        }
        else {
            count++;
        }
    }
    if (lmax < count) {
        return false;
    }
    return true;
}

/**
 * バイト数チェック
 */
function check_byte(v, byteLen)
{
    var count_byteCheck=0;
    for (i_byteCheck=0; i_byteCheck<v.length; i_byteCheck++) {
        char = escape(v.charAt(i_byteCheck));
        //改行コードCR(%0D)またはLF(%0A)の場合、CRLF(%0D%0A)と判断する
        if (char == '%0D' || char == '%0A') {
            char = '%0D%0A';
        }
        (escape(char).length< 4)?count_byteCheck++:count_byteCheck+=2;
    }
    if (count_byteCheck > byteLen) {
        return false;
    }
    return true;
}

/**
 * 日付チェック
 */
function check_date(v)
{
    return _check_date_exist(v);
}

/**
 * 日付存在チェック(yyyymmdd)
 */
function _check_date_exist(v)
{
    v = '' + v;
    if (!v.match(/^\d{4}\/\d{2}\/\d{2}$/) && !v.match(/^\d{8}$/)) {
        return false;
    }
    v = v.replace(/\//g, '');

    var year  = parseInt(v.substr(0, 4), 10);
    var month = parseInt(v.substr(4, 2), 10);
    var day   = parseInt(v.substr(6, 2), 10);
    var ret   = true;

    if (year < 1900) {
        // 1900年より過去は簡易版チェック
        if (month < 1 || month > 12 || day < 1 || day > 31) {
            return false;
        }
    }
    else {
        var dates = new Date(year, month-1, day);
        if (dates.getYear() < 1900) {
            if (year != dates.getYear()+1900) {
                ret = false;
            }
        }
        else {
            if (year != dates.getYear()) {
                ret = false;
            }
        }
        if (month != dates.getMonth()+1) {
            ret = false;
        }
        if (day   != dates.getDate()) {
            ret = false;
        }
        if (!ret) {
            return false;
        }
    }
    return true;
}

/**
 * メールアドレスチェック
 */
function check_mail(v)
{
    if (isNULL(v)) {
        return true;
    }
    if (!v.match(/^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(\.([a-zA-Z]){2,4})$/)) {
        return false;
    }
    return true;
}

/**
 * 電話(FAX)番号チェック
 */
function check_tel(v)
{
    if (isNULL(v)) {
        return true;
    }
    if (!v.match(/^[-()0-9]+$/)) {
        return false;
    }
    return true;
}

/**
 * ひらがなチェック
 */
function check_hiragana(v)
{
    if (isNULL(v)) {
        return true;
    }
    if (!v.match(/^[ぁ-んー　\s]+$/)) {
        return false;
    }   
    return true;
}

/**
 * カタカナチェック (半角あり)
 */
function check_katakana(v)
{
    if (isNULL(v)) {
        return true;
    }
    if (!v.match(/^[ｦ-ﾟァ-ヶー　\s]+$/)) {
        return false;
    }   
    return true;
}

/**
 * URLチェック
 */
function check_url(v)
{
    if (isNULL(v)) {
        return true;
    }
    if (!v.match(/^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i)) {
        return false;
    }
    return true;
}

function isNULL(v)
{
    if ((v == null) || (v == undefined) || (v.length == 0) || (v.value == '')) {
        return true;
    }
    return false;
}

//====================================================================================================================================---

function _cls_checker()
{
    this.target;
    this.check_list = [];
}
function _cls_checker_iif()
{
    this.type;
    this.target_list = [];
}
function _cls_checker_obj()
{
    this.error = true;
    this.target;
    this.name;
    this.value;
    this.column;
    this.iif;
    this.check_params = [];
    this.name_tmp;
}

//
//無名関数は、ECMAScriptの規格に合わないらしいので本当は良くない書き方
//
_cls_checker_obj.prototype = {
    check: function() {
        var enable = true;
        //iif,checked,id
        var iif_obj = this.iif;
        if (iif_obj != undefined && iif_obj != null) {
            for(var i=0; i < iif_obj.target_list.length; i++) {
                var target_nm = iif_obj.target_list[i];
                var doc_obj;
                if (this.target==undefined) {
                    doc_obj = document.getElementsByName(target_nm);
                }
                else {
                    doc_obj = document.forms[this.target].document.getElementsByName(target_nm);
                }
                if (doc_obj[0].name==undefined) {
                    enable = false;
                    continue;
                }
                var target_vl = doc_obj[0].getAttribute('value');
                var target_ck = doc_obj[0].checked;
                enable = this.is_iif(iif_obj.type, target_vl, target_ck);
            }
        }
        if (enable) {
            if (this.name_tmp != this.name) {
                this.name_tmp = this.name
                if (ERROR_DISPLAY_TYPE=='DISP') {
                    this.non_display();
                }
            }
            for (var i = 0;i<this.check_params.length;i++) {
                var _check = this.check_params[i].split(",");
                var chktype = _check[0].replace(/^\s+|\s+$/g, "");
                if (chktype==''||chktype==undefined) {
                    continue;
                }
                switch(chktype) {
                case 'sql':
                    if (!check_sql(this.value)) {
                        var message = VALIDATE_ERR_11;
                        push_error(message.replace(/%s/, this.column),this);
                        this.error = false;
                    }
                    break;
                case 'null':
                    if (!check_null(this.value)) {
                        var message = VALIDATE_ERR_01;
                        push_error(message.replace(/%s/, this.column),this);
                        this.error = false;
                    }
                    break;
                case 'external':
                    if (!check_external(this.value)) {
                        var message = VALIDATE_ERR_11;
                        push_error(message.replace(/%s/, this.column),this);
                        this.error = false;
                    }
                    break;
                case 'range':
                    if (_check[1]==''||_check[1]==undefined
                        || _check[2]==''||_check[2]==undefined) {
                        alert('range check parameter error!!');
                        this.error = false;
                        break;
                    }
                    var para1 = _check[1].replace(/^\s+|\s+$/g, "");
                    var para2 = _check[2].replace(/^\s+|\s+$/g, "");
                    if (!check_range(this.value, para1, para2)) {
                        var message = VALIDATE_ERR_18;
                        push_error(message.replace(/%s/, para1).replace(/%s/, para2).replace(/%s/, this.column),this);
                        this.error = false;
                    }
                    break;
                case 'len':
                    if (_check[1]==''||_check[1]==undefined
                        || _check[2]==''||_check[2]==undefined) {
                        alert('len check parameter error!!');
                        this.error = false;
                        break;
                    }
                    var para1 = _check[1].replace(/^\s+|\s+$/g, "");
                    var para2 = _check[2].replace(/^\s+|\s+$/g, "");
                    if (!check_length(this.value, para1, para2)) {
                        var message = VALIDATE_ERR_09;
                        push_error(message.replace(/%s/, para1).replace(/%s/, para2).replace(/%s/, this.column),this);
                        this.error = false;
                    }
                    break;
                case 'len-return':
                    if (_check[1]==''||_check[1]==undefined) {
                        alert('len-return check parameter error!!');
                        this.error = false;
                        break;
                    }
                    var para1 = _check[1].replace(/^\s+|\s+$/g, "");
                    if (!check_length_return(this.value, para1)) {
                        var message = VALIDATE_ERR_08;
                        push_error(message.replace(/%s/, para1).replace(/%s/, this.column),this);
                        this.error = false;
                    }
                    break;
                case 'byte':
                    if (_check[1]==''||_check[1]==undefined) {
                        alert('byte check parameter error!!');
                        this.error = false;
                        break;
                    }
                    var para1 = _check[1].replace(/^\s+|\s+$/g, "");
                    if (!check_byte(this.value, para1)) {
                        var message = VALIDATE_ERR_07;
                        var harfLen = parseInt(para1/2);
                        push_error(message.replace(/%s/, para1).replace(/%s/, harfLen).replace(/%s/, this.column),this);
                        this.error = false;
                    }
                    break;
                case 'decimal':
                    if (_check[1]==''||_check[1]==undefined
                        || _check[2]==''||_check[2]==undefined) {
                        alert('decimal check parameter error!!');
                        this.error = false;
                        break;
                    }
                    var para1 = _check[1].replace(/^\s+|\s+$/g, "");
                    var para2 = _check[2].replace(/^\s+|\s+$/g, "");
                    if (!check_decimal(this.value, para1, para2)) {
                        var message = VALIDATE_ERR_16;
                        var intLen = para1 - para2;
                        push_error(message.replace(/%s/, intLen).replace(/%s/, para2).replace(/%s/, this.column),this);
                        this.error = false;
                    }
                    break;
                case 'number':
                    if (!check_number(this.value)) {
                        var message = VALIDATE_ERR_02;
                        push_error(message.replace(/%s/, this.column),this);
                        this.error = false;
                    }
                    break;
                case 'number-sign':
                    if (!check_number_with_sign(this.value)) {
                        var message = VALIDATE_ERR_06;
                        push_error(message.replace(/%s/, this.column),this);
                        this.error = false;
                    }
                    break;
                case 'han':
                    if (!check_hankaku(this.value)) {
                        var message = VALIDATE_ERR_04;
                        push_error(message.replace(/%s/, this.column),this);
                        this.error = false;
                    }
                    break;
                case 'han_eisu':
                    if (!check_hankaku_eisu(this.value)) {
                        var message = VALIDATE_ERR_03;
                        push_error(message.replace(/%s/, this.column),this);
                        this.error = false;
                    }
                    break;
                case 'han_eisukigo':
                    if (!check_hankaku_eisukigo(this.value)) {
                        var message = VALIDATE_ERR_10;
                        push_error(message.replace(/%s/, this.column),this);
                        this.error = false;
                    }
                    break;
                case 'zen':
                    if (!check_zenkaku(this.value)) {
                        var message = VALIDATE_ERR_05;
                        push_error(message.replace(/%s/, this.column),this);
                        this.error = false;
                    }
                    break;
                case 'zen-rtn':
                    if (!check_zenkaku_return(this.value)) {
                        var message = VALIDATE_ERR_05;
                        push_error(message.replace(/%s/, this.column),this);
                        this.error = false;
                    }
                    break;
                case 'date':
                    if (!check_date(this.value)) {
                        var message = VALIDATE_ERR_14;
                        push_error(message.replace(/%s/, this.column),this);
                        this.error = false;
                    }
                    break;
                case 'mail':
                    if (!check_mail(this.value)) {
                        var message = VALIDATE_ERR_19;
                        push_error(message.replace(/%s/, this.column),this);
                        this.error = false;
                    }
                    break;
                case 'tel':
                    if (!check_tel(this.value)) {
                        var message = VALIDATE_ERR_19;
                        push_error(message.replace(/%s/, this.column),this);
                        this.error = false;
                    }
                    break;
                case 'hiragana':
                    if (!check_hiragana(this.value)) {
                        var message = VALIDATE_ERR_20;
                        push_error(message.replace(/%s/, this.column),this);
                        this.error = false;
                    }
                    break;
                case 'katakana':
                    if (!check_katakana(this.value)) {
                        var message = VALIDATE_ERR_21;
                        push_error(message.replace(/%s/, this.column),this);
                        this.error = false;
                    }
                    break;
                case 'url':
                    if (!check_url(this.value)) {
                        var message = VALIDATE_ERR_22;
                        push_error(message.replace(/%s/, this.column),this);
                        this.error = false;
                    }
                    break;
                default:
                    break;
                }
                if (!this.error) {
                    if (ERROR_DISPLAY_TYPE=='DISP') {
                        var messages = _error_list[_error_list.length-1];
                        this.display(messages);
                    }
                }
            }
        }
        return this.error;
    },
    is_iif: function(type,val,chk) {
        var enable = true;
        switch(type) {
            case 'checked':
                if (!chk) {
                    enable = false;
                }
                break;
            case 'unchecked':
                if (chk) {
                    enable = false;
                }
                break;
            case 'null':
                if (val != '') {
                    enable = false;
                }
                break;
            case 'not-null':
                if (val == '') {
                    enable = false;
                }
                break;
        }
        return enable;
    },
    is_error: function() {
        return this.error;
    },
    display: function(msg) {
        var obj = document.getElementsByName(this.name);
        var err = document.getElementById('err_'+this.name);
        if (err==null||err==undefined) {
            obj[0].insertAdjacentHTML('AfterEnd', "<p id=err_" + this.name + " class=error>" + msg + "</p>");
        }
        else {
            err.innerHTML = msg;
        }
    },
    non_display: function() {
        var obj = document.getElementsByName(this.name);
        var err = document.getElementById('err_'+this.name);
        if (err!=null && err!=undefined) {
            err.innerHTML = '';
            err.removeNode();
        }
    }
}

_cls_checker.prototype = {
    init: function(target_form_id) {
        this.clear_check_list();
        this.target = target_form_id;
        if (target_form_id==undefined) {
            for (var i=0; i<document.forms.length; i++) {
                var forms = document.forms[i];
                this._init(forms);
            }
        }
        else {
            var forms = document.forms[target_form_id];
            this._init(forms);
        }
    },
    _init: function(frm) {
        var tmpChecker = null;
        for (var i=0; i<frm.length; i++) {
            var type    = frm.elements[i].getAttribute('type');
            var name    = frm.elements[i].getAttribute('name');
            var value   = frm.elements[i].value;
            var valid   = frm.elements[i].getAttribute('validate');
            var colum   = frm.elements[i].getAttribute('column');
            var checked = frm.elements[i].checked;
            if (name==undefined || name=='') {
                continue;
            }
            if (valid != undefined && valid != null) {
                //iif{}を取得
                var iif_list = valid.match(/iif\{[^}]+\};*/gi);
                if (iif_list != null) {
                    for(var j=0; j<iif_list.length; j++) {
                        var iif_str = iif_list[j];
                        //valid(str)からiif条件(str)を削除
                        valid = valid.replace(iif_list[j], "");
                        //{}で囲まれた中身を取得
                        var iif_params = iif_str.match(/\{[^}]+\}/i);
                        try {
                            //var iif_obj = eval("("+iif_params[0]+")");
                            var iif_obj = JSON.parse(iif_params[0]);
                        }
                        catch(e) {
                            alert('json convert error!!');
                            break;
                        }
                        var clsCheckerIif = new _cls_checker_iif();
                        clsCheckerIif.type = iif_obj.type;
                        clsCheckerIif.target_list = iif_obj.target_list;
                        //
                        var clsChecker = new _cls_checker_obj();
                        clsChecker.target = this.target;
                        clsChecker.name = name;
                        clsChecker.value = value;
                        clsChecker.column = colum;
                        clsChecker.iif = clsCheckerIif;
                        clsChecker.check_params = iif_obj.check_list;
                        this.add_check_list(clsChecker);
                    }
                }
                //「;」で区切る
                var clsChecker = new _cls_checker_obj();
                clsChecker.target = this.target;
                clsChecker.name = name;
                clsChecker.value = value;
                clsChecker.column = colum;
                if (valid!=undefined && valid!=null) {
                    clsChecker.check_params =  valid.split(";");
                }
                if (type=='checkbox') {
                    clsChecker.name = name.substr(0, name.indexOf('['));
                    if (tmpChecker==null) {
                        if (checked==true) {
                            clsChecker.value = '1';
                        }
                        else {
                            clsChecker.value = '';
                        }
                        tmpChecker = clsChecker;
                    }
                    else if ((tmpChecker!=null) && (tmpChecker.name==clsChecker.name)) {
                        if (checked==true) {
                            tmpChecker.value = '1';
                        }
                    }
                }
                else {
                    this.add_check_list(clsChecker);
                }
                if ((tmpChecker!=null) && (tmpChecker.name!=clsChecker.name)) {
                    this.add_check_list(tmpChecker);
                    tmpChecker = null;
                }
            }
        }
        if (tmpChecker!=null) {
            this.add_check_list(tmpChecker);
            tmpChecker = null;
        }
        return true;
    },
    add_check_list: function(checker) {
        this.check_list[this.check_list.length] = checker;
    },
    clear_check_list: function() {
        this.check_list = [];
    },
    check: function() {
        this.error = true;
        var chk_len = this.check_list.length;
        if (chk_len > 0) {
            for (var i=0; i < chk_len; i++) {
                var clsChecker = this.check_list[i];
                if (i>0){
                    clsChecker.name_tmp = this.check_list[i-1].name;
                }
                clsChecker.check();
                if (!clsChecker.is_error()) {
                    this.error = false;
                    if (ERROR_RETURN) {
                        return this.error;
                    }
                }
            }
        }
        return this.error;
    },
    is_error: function() {
        return this.error;
    }
}
var _clsChecker = new _cls_checker();

