/**
 * 共通データチェック処理
 * 
 * @copyright 2009 BearRootSystems Co.,Ltd.  
 * @author BRS) R.Tokubuchi
 * @version   1.0.0
 * 
 * 【履歴】
 * 追加 2010/10/21 Kunioka 文字数範囲内チェックを追加
 * 追加 2010/10/21 Kunioka 同一文字列チェックを追加
 * 修正 2010/10/27 Kunioka パスワードパターンチェックを修正
 * 修正 2010/10/09 Kunioka パスワードパターンチェックを修正
 */
var CheckUtil = function()
{
    this.version = '1.0';
    this._errs   = "";
}

CheckUtil.prototype = {

    /**
     * 各種入力チェック
     * エラー内容をバッファし、一つ以上のエラーが発生していればMSGを表示する
     */
    getErrors : function()
    {
        if (this._errs != "") {
            window.alert(this._errs);
            return false;
        } else {
            return true;
        }
    },

    /**
     * 入力チェック（テキストボックス）
     * value 対象文字列
     * item  対象項目名称
     */
    requiredCheck : function(value, item)
    {
        if (value == "" || value == undefined) {
            this._errs += item + "は必須入力です \n";
        }
    },

    /**
     * 入力チェック（ラジオボタン）
     * elm  コントロール群
     * item 対象項目名称
     */
    requiredRadioCheck : function(elm, item)
    {
        flag = false;
        for (i=0; i<elm.length; i++) {
            if (elm[i].checked) {
                flag = true;
            }
        }
        if (!flag) {
            this._errs += item + "は必須入力です \n";
        }
    },
    
    /**
     * 入力チェック(チェックボックス)
     * @param elm  コントロール群
     * @param item 対象項目名称
     * @return
     */
    requiredChkBoxCheck : function(elm, item)
    {
        flag = false;
        
        if (!elm.value) {
	        for (i=0; i<elm.length; i++) {
	            if(elm[i].checked){
	                flag = true;
	            }
	        }
        } else {
        	if(elm.checked){
                flag = true;
            }
        }
        if(!flag) {
            this._errs += item + 'を選択してください。';
    	}
    },

    /**
     * 桁数チェック
     * value 対象文字列
     * max   最大桁数
     * item  対象項目名称
     */
    lengthCheck : function(value, max, item)
    {
        if (value != "" && value != undefined) {
            if (value.length > max) {
                this._errs += item + "は" + max + "桁以下で入力してください \n";
            }
        }
    },
    
    /**
     * 数値の桁数一致チェック
     * @param $value 対象文字列
     * @param $max   最大桁数
     * @param $item  対象項目名
     */
    lengthMatchCheck : function(value, max, item)
    {
        if (value != "" && value != undefined){
        	if (isNaN(value)){
        		this._errs += item + "は数字" + max + "文字で入力してください \n";
        	} else {
            	if (value.length != max) {
            		this._errs += item + "は数字" + max + "文字で入力してください \n";
            	}
        	}
        }
    },

    /**
     * 文字数チェック
     * value 対象文字列
     * max   最大文字数
     * item  対象項目名称
     */
    lengthCheckStr : function(value, max, item)
    {
        if (value != "" && value != undefined) {
            if (value.length > max) {
                this._errs += item + "は" + max + "文字以内で入力してください \n";
            }
        }
    },
    
    /**
     * 文字数範囲内チェック
     * value 対象文字列
     * max   最大文字数
     * item  対象項目名称
     */
    lengthRangeCheckStr : function(value, min, max, item)
    {
        if (value != "" && value != undefined) {
        	if (value.length < min || value.length > max){
        		this._errs += item + "は" + min + "文字以上" + max +"文字以内で入力してください \n";
        	}
        }
    },

    /**
     * 半角数字形式チェック
     * value　対象文字列
     * item  対象項目名称
     */
    numberTypeCheck : function(value, item)
    {
        if (value != "" && value != undefined) {
            if (isNaN(value)) {
                this._errs += item + "は数値で入力してください \n";
            }
        }
    },
    
    /**
     * 形式チェック
     * value 対象文字列
     * item  対象項目名称
     */
    phonenumTypeCheck : function(value, item)
    {
        if (value != "" && value != undefined) {
            var reg = new RegExp("^[0-9]|-$");
            if (!(reg.test(value))) {
                this._errs += item + "を正しい形式で入力してください \n";
            }
        }
    },
    
    /**
     * 日付形式チェック
     * value 対象文字列
     * item  対象項目名称
     */
    dateValidityCheck : function(year, month, day, item)
    {
        var dat = new Date(year, month - 1, day);
        if(dat == null || dat.getFullYear() != year || dat.getMonth() + 1 != month || dat.getDate() != day) {
            this._errs += item + "は正しい日付を入力して下さい \n";
        }
    },
    
    /**
     * 日付形式チェック
     * value 対象文字列
     * item  対象項目名称
     */
    dateTypeCheck : function(value, item)
    {
//        if (value != "" && value != undefined) {
        if (value != "" && value != undefined && value != "00000000") {
            // RegExp.test()は使用しない
//            // 入力は数字8桁とし、登録時に整形する
//            var reg = new RegExp("^[0-9]{8}$","gi");
////            var reg=new RegExp("^[0-9]{4}/[0-9]{2}/[0-9]{2}$","gi");
//            if (!reg.test(value)) {
            if (isNaN(value) || (value < 0)) {
                this._errs += item + "は日付形式で入力してください \n";
            } else {
//                var year  = value.substring(0, 4);
//                var month = value.substring(5, 7);
//                var day   = value.substring(8, 10);
                var year  = value.substring(0, 4);
                var month = value.substring(4, 6);
                var day   = value.substring(6, 8);
                var dat   = new Date(year, month - 1, day);
                if (year != dat.getFullYear() || month - 1 != dat.getMonth() || day != dat.getDate()) {
                    this._errs += item + "は日付形式で入力してください \n";
                }
            }
        }
    },

    /**
     * 日付範囲チェック
     * valueStart 対象文字列（開始日）
     * valueEnd   対象文字列（終了日）
     * item       対象項目名称
     */
    dateTermCheck : function(valueStart, valueEnd, item)
    {
        // いずれかが未入力の場合は対象外とする
        if ((valueStart != "" && valueStart != undefined) && (valueEnd != "" && valueEnd != undefined)) {
            // いずれかが数値でない場合は対象外とする
            if (!(isNaN(valueStart) && isNaN(valueEnd))) {
                // 大小比較
                if (valueStart > valueEnd) {
                    // 開始日が終了日よりも前である場合、エラーとする
                    this._errs += item + "の大小関係に誤りがあります\n";
                }
            }
        }
    },

    /**
     * 時間形式チェック
     * value 対象文字列
     * item  対象項目名称
     */
    timeTypeCheck : function(value, item)
    {
        // 未入力の場合は対象外とする
        if (value != "" && value != undefined) {
            // RegExp.test()は使用しない
//            // 書式：HHmm
//            var reg = new RegExp("^[0-9]{4}$");
//            // 形式チェック
//            if (!reg.test(value)) {
            if (isNaN(value) || (value < 0)) {
                // 時間形式でない場合、エラーとする
                this._errs += item + "は時間形式で入力してください \n";
            } else {
//                var hour   = value.substring(0, 2);
                var minute = value.substring(2, 4);
                // 範囲チェック
                // 「24:00」以降の入力を可能とする
//                if ("00" > hour || hour > "24" || "00" > minute || minute > "60") {
                if ("00" > minute || minute > "60") {
                    // 時刻の範囲にない場合、エラーとする
                    this._errs += item + "は時間形式で入力してください \n";
                }
            }
        }
    },

    /**
     * 電話番号形式チェック
     * value 対象文字列
     * item  対象項目名称
     */
    telnumTypeCheck : function(value, item)
    {
        // 未入力の場合は対象外とする
        if (value != "" && value != undefined) {
            // 書式：999-9999-9999（例）
            var reg = new RegExp("^[0-9]|-$");
            // 形式チェック
            if (!(reg.test(value))) {
                // 電話番号形式でない場合、エラーとする
                this._errs += item + "は電話番号形式で入力してください \n";
            }
        }
    },

    /**
     * 半角数値範囲チェック
     * value 対象文字列
     * max   最大値
     * min   最小値
     * item  対象項目名称
     */
    rangeCheck : function(value, max, min, item)
    {
        val = parseInt(value, 10);
        if (value!="" && value != undefined) {
            if (isNaN(value)) {
                this._errs += item + "は数値で入力してください \n";
            } else {
                if ((max != '') && (min != '')) {
                    if (val<min || val>max){this._errs += item + "は" + min + "以上、かつ" + max + "以下で入力してください \n";}
                }else if((max != '') && (min == '')){
                    if (val>max){
                        this._errs += item + "は" + max + "以下で入力してください \n";
                    }
                }else if(($max == '') && ($min != '')){
                    if (val<min){
                        this._errs += item + "は" + min + "以上で入力してください \n";
                    }
                }
            }
        }
    },

    
//    /**
//     * 半角数値範囲チェック
//     * value    対象文字列
//     * max      最大値
//     * min      最小値
//     * item        対象項目名称
//     */
//    rangeCheck : function(value, max, min, item)
//    {
//        if (value!="" && value != undefined) {
//            if (isNaN(value)) {
//                this._errs += item + "は数値で入力してください \n";
//            } else {
//                val = parseInt(value, 10);
//                if (val<min || val>max) {
//                    this._errs += item + "は" + min + "以上、かつ" + max + "以下で入力してください \n";
//                }
//            }
//        }
//    },

    /**
     * 汎用形式チェック
     * value 対象文字列
     * ptn   パターン（正規表現）
     * item  対象項目名称
     */
    regExCheck : function(value, ptn, item)
    {
        if (value != "" && value != undefined) {
            var reg = new RegExp(ptn, "gi");
            if (!reg.test(value)) {
                this._errs += item + "を正しい形式で入力してください \n";
            }
        }
    },
    
    /**
     * 全角カタカナ形式チェック
     * value 対象文字列
     * item  対象項目名称
     */
    zenKanaTypeCheck : function(value, item)
    {
        // 未入力の場合は対象外とする
        if (value != "" && value != undefined) {
            var reg = new RegExp("/^[ァ-ヶー]|^[ 　\t]+|[ 　\t]+$/");
            // 形式チェック
            if (!reg.test(value)) {
                // 全角カタカナ形式でない場合、エラーとする
                this._errs += item + "は全角カタカナで入力してください \n";
            }
        }
    },
    
    /**
     * 番地形式チェック
     * value 対象文字列
     * item  対象項目名称
     */
    banchinumTypeCheck : function(value, item)
    {
        // 未入力の場合は対象外とする
        if (value != "" && value != undefined) {
            // 書式：9-99（例）
            var reg = new RegExp("^[0-9]|-$");
            // 形式チェック
            if (!reg.test(value)) {
                // 番地形式でない場合、エラーとする
                this._errs += item + "は番地形式で入力してください \n";
            }
        }
    },
    
    /**
     * 正の数チェック
     * value 対象文字列
     * item  対象項目名称
     */
    positivenumberTypeCheck : function(value, item)
    {
        if (value != "" && value != undefined) {
            if (value < 0){
                this._errs += item + "は正の数で入力してください\n";
            }
        }
    },
    
    /**
     * 全角カタカナ形式チェック
     * value 対象文字列
     * item  対象項目名称
     */
    isZenKanaTypeCheck : function(value, item)
    {
        var zen="ｱｲｳｴｵｶｷｸｹｺｻｼｽｾｿﾀﾁﾂﾃﾄﾅﾆﾇﾈﾉﾊﾋﾌﾍﾎﾏﾐﾑﾒﾓﾔﾕﾖﾗﾘﾙﾚﾛﾜｦﾝｧｨｩｪｫｯｬｭｮ 　";
        var str=value; /* 入力値 */
        var mes="";
        for (var i=0; i<str.length; i++) {
            /* 文字列を１文字ずつ調べる */
            var tmp1=str.substr(i,1);
            for (var j=0; j<zen.length; j++) {
                var tmp2=zen.substr(j,1);
                /* 含まれていた全角カナを格納 */
                if (tmp1==tmp2) {
                    mes+="「"+tmp1+"」";
                }
            }
        }
        
        if(mes!=""){
            this._errs += item + "は全角カタカナで入力してください \n";
        }
    },
    
    /**
     * 全角形式チェック
     * value 対象文字列
     * item  対象項目名称
     */
    isZenTypeCheck : function(value, item)
    {
        var str=value; /* 入力値 */
        var count = 0;
        for(var i=0; i<str.length; i++){
            /* 1文字ずつ文字コードをエスケープし、その長さが4文字以上なら全角 */
            var len=escape(str.charAt(i)).length;
            if(len<4){
                count = count +1;
            }
        }
        if (count>0){
            this._errs += item + "は全角で入力してください \n";
        }
    },
    
    /**
     * 半角形式チェック
     * value 対象文字列
     * item  対象項目名称
     */
    isHanTypeCheck : function(value, item)
    {
        var str=value; /* 入力値 */
        var count = 0;
        for(var i=0; i<str.length; i++){
            /* 1文字ずつ文字コードをエスケープし、その長さが4文字未満なら半角 */
            var len=escape(str.charAt(i)).length;
            if(len>=4){
                count = count +1;
            }
        }
        if (count>0){
            this._errs += item + "は半角で入力してください \n";
        }
    },
    
    /**
     * メールアドレス形式チェック
     * value 対象文字列
     * item  対象項目名称
     */
    emailTypeCheck : function(value, item){
        var Seiki=/[!#-9A-~]+@+[a-z0-9]+.+[^.]$/i;
        /* 入力された値がパターンにマッチするか調べる */
        if(value!=""){
            if(!(value.match(Seiki))){
                this._errs += item + "はメールアドレスの形式で入力してください\n";
            }
        }
    },
    
    /**
     * 同一文字列チェック
     * value1 対象文字列1
     * value2 対象文字列2
     * item1  対象項目名称1
     * item2  対象項目名称2
     */
    sameChkstr : function(value1, value2, item1, item2){
    	if (value1 != "" && value2 != ""){
    		if (value1 != value2){
    			this._errs += item1 + "と" + item2 + "は同じパスワードを入力して下さい\n";
    		}
    	}
    },
    
    /**
     * パスワードパターンチェック
     * value 対象文字列
     * item  対象項目名
     */
    passPatterCheck : function(value, item)
    {
    	var str = value;
    	var alpCnt = 0;
    	var numCnt = 0;
    	var emFlg  = false;
    	
    	/* 全角チェック */
    	for (var i = 0; i < str.length; ++i) {
    		var c = str.charCodeAt(i);
            
            if (c < 256) {
            	//  半角カタカナは不許可
            	if (c >= 0xff61 && c <= 0xff9f){
                	emFlg = true;
                	break;
            	}
            	// 半角の場合処理はなし
            }else{
            	emFlg = true;
            	break;
            }
        }
    	
    	if (emFlg == true){
    		this._errs += item + "に全角文字及び半角カタカナは使用できません\n";
    	}else{
	    	/* 文字列を１文字ずつ調べる */
	    	for (var i=0; i<str.length; i++){
	    	    var tmp = str.substr(i,1);
	
	    	    /* 数値チェック */
	    	    if (!isNaN(tmp)){
	    	    	numCnt = numCnt + 1;
	    	    }else{
		    	    /* 英大文字チェック */
		    	    var uq = tmp.indexOf(tmp.toUpperCase());
		    	    if (uq == 0){
		    	    	/*uppCnt = uppCnt + 1;*/
		    	    	alpCnt = alpCnt + 1;
		    	    }
		    	    /* 英小文字チェック */
		    	    var lq = tmp.indexOf(tmp.toLowerCase());
		    	    if (lq == 0){
		    	    	/*lowCnt = lowCnt + 1;*/
		    	    	alpCnt = alpCnt + 1;
		    	    }
	    	    }
	    	}
	    	
	    	if (alpCnt == 0 || numCnt == 0){
	    		this._errs += item + "には必ず英字・数値をいれてください\n";
	    	}
    	}
    }
};
