//表單檢查
//三個為一組: "欄位名", "錯誤訊息", "格式"

//一般檔案
//"欄位名", "副檔名1|副檔名2|副檔名3...|錯誤訊息", "格式"

//指定檔名
//"欄位名", "檔案名稱.副檔名|錯誤訊息", "格式"
function chkform(){
	var msg = "", args = chkform.arguments;
	var formName = args[0];
	for(i=1;i<args.length;i+=3){
		for(j=0;j<document.forms[formName].length;j++) {
			if(document.forms[formName].elements[j].name == args[i]){
				var temp = j;
				val = document.forms[formName].elements[j].value;
			}
		}
		//字串
		if(args[i+2] == "isStr") msg = isStr(val,args[i+1],msg);
		if(args[i+2] == "orStr") msg = orStr(val,args[i+1],msg);
		//文字區塊
		if(args[i+2] == "isText") msg = isText(val,args[i+1],msg);
		if(args[i+2] == "orText") msg = orText(val,args[i+1],msg);
		//E-Mail
		if(args[i+2] == "isMail") msg = isMail(val,args[i+1],msg);
		if(args[i+2] == "orMail") msg = orMail(val,args[i+1],msg);
		//數字
		if(args[i+2] == "isNum") msg = isNum(val,args[i+1],msg);
		if(args[i+2] == "orNum") msg = orNum(val,args[i+1],msg);
		//身份證字號
		if(args[i+2] == "ckIdCard") msg = ckIdCard(val,args[i+1],msg);
		//日期
		if(args[i+2] == "ckDate") msg = ckDate(val,args[i+1],msg);
		if(args[i+2] == "orckDate") msg = orckDate(val,args[i+1],msg);
		//日期+小時特殊檢查
		if(args[i+2] == "ckDateTimeSpe") msg = ckDateTimeSpe(val,args[i+1],msg);
		
		//帳號
		if(args[i+2] == "ckAcc") msg = ckAcc(val,args[i+1],msg);
		//代號or編號
		if(args[i+2] == "ckSerial") msg = ckSerial(val,args[i+1],msg);
		if(args[i+2] == "orckSerial") msg = orckSerial(val,args[i+1],msg);
		//密碼
		if(args[i+2] == "ckPass"){
			str = args[i].split("|");
			for(j=0;j<document.forms[formName].length;j++) {
				if(document.forms[formName].elements[j].name == str[0]) pass0 = document.forms[formName].elements[j].value;
				if(document.forms[formName].elements[j].name == str[1]) pass1 = document.forms[formName].elements[j].value;
			}
			msg = ckPass(pass0,pass1,args[i+1],msg);
		}
		//下拉選單
		if(args[i+2] == "isSel") msg = isSel(val,args[i+1],msg);
		//檔案
		if(args[i+2] == "isFile"){
			str = args[i+1].split("|");
			msg = isFile(val,str,str[str.length-1],msg);
		}
		if(args[i+2] == "orFile"){
			str = args[i+1].split("|");
			msg = orFile(val,str,str[str.length-1],msg);
		}
		//指定檔案名稱
		if(args[i+2] == "isAFile"){
			str = args[i+1].split("|");
			msg = isAFile(val,str[0],str[1],msg);
		}
		if(args[i+2] == "orAFile"){
			str = args[i+1].split("|");
			msg = orAFile(val,str[0],str[1],msg);
		}
	}
	if(msg){
		alert(msg);
		return false;
	}else return true;
}

//去除前後空白
function trim(strvalue){
	ptntrim = /(^\s*)|(\s*$)/g;
	return strvalue.replace(ptntrim,""); 
}

//字串檢查( 必填欄位 )
function isStr(strvalue,filed,msg){
	if(!trim(strvalue) || /\s{2}/.test(strvalue) || /[%\\\'\"]/.test(strvalue) || /mime/i.test(strvalue)) msg = msg?msg +filed +" error !\n\r":filed +" error !\n\r";
	return msg;
}

//字串檢查( 非必填欄位 )
function orStr(strvalue,filed,msg){
	if(trim(strvalue).length > 0) if(/\s{2}/.test(strvalue) || /[%\\\'\"]/.test(strvalue) || /mime/i.test(strvalue)) msg = msg?msg +filed +" error !\n\r":filed +" error !\n\r";
	return msg;
}

//文字區塊( 必填欄位 )
function isText(strvalue,filed,msg){
	if(!trim(strvalue) || /[%\\\'\"]/.test(strvalue) || /mime/i.test(strvalue)) msg = msg?msg +filed +" error !\n\r":filed +" error !\n\r";
	return msg;
}

//文字區塊( 非必填欄位 )
function orText(strvalue,filed,msg){
	if(trim(strvalue).length > 0) if(/[%\\\'\"]/.test(strvalue) || /mime/i.test(strvalue)) msg = msg?msg +filed +" error !\n\r":filed +" error !\n\r";
	return msg;
}

//Mail 檢查( 必填欄位 )
function isMail(strvalue,filed,msg){
	if(!(/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*\.\w+$/.test(strvalue))) msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
	return msg;
}

//Mail 檢查( 非必填欄位 )
function orMail(strvalue,filed,msg){
	if(strvalue.length > 0) if(!(/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*\.\w+$/.test(strvalue))) msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
	return msg;
}

//數字檢查( 必填欄位 )
function isNum(strvalue,filed,msg){
	if(!/^[0-9#\-]+$/.test(strvalue)) msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
	return msg;
}

//數字檢查( 非必填欄位 )
function orNum(strvalue,filed,msg){
	if(strvalue.length > 0) if(!/^[0-9#\-]+$/.test(strvalue)) msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
	return msg;
}

//密碼檢查
function ckPass(passwd,ckpass,filed,msg){
	if(!passwd || (passwd != ckpass)) msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
	return msg;
}

//下拉選單
function isSel(strvalue,filed,msg){
	if(!strvalue) msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
	return msg;
}

//檔案檢查( 須上傳 )
function isFile(strvalue,type,filed,msg){
	if(!FILEBASE(strvalue,type)) msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
	return msg;
}

//檔案檢查( 可上傳 )
function orFile(strvalue,type,filed,msg){
	if(strvalue && !FILEBASE(strvalue,type)) msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
	return msg;
}

//指定檔案名稱檢查( 須上傳 )
function isAFile(strvalue,fname,filed,msg){
	if(!FILENAME(strvalue,fname)) msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
	return msg;
}

//指定檔案名稱檢查( 可上傳 )
function orAFile(strvalue,fname,filed,msg){
	if(strvalue && !FILENAME(strvalue,fname)) msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
	return msg;
}

//檔名資料比對
function FILENAME(obj,fname){
	myfilename = obj.toLowerCase();
	if(myfilename.indexOf(fname) > -1) return true;
	else return false;
}

//副檔名資料比對
function FILEBASE(obj,type){
	myfilename = obj.toLowerCase();
	Ts = type;
	for(k = 0 ; k < Ts.length-1 ; k++){
		if(myfilename.indexOf(Ts[k]) > -1)	return true;
	}
	return false;
}
//身分證字號檢查
function ckIdCard(strvalue,filed,msg){
    strvalue = strvalue.toUpperCase();
    var local=new Array(34)
    local[10]='A'
    local[11]='B'
    local[12]='C'
    local[13]='D'
    local[14]='E'
    local[15]='F'
    local[16]='G'
    local[17]='H'
    local[18]='J'
    local[19]='K'
    local[20]='L'
    local[21]='M'
    local[22]='N'
    local[23]='P'
    local[24]='Q'
    local[25]='R'
    local[26]='S'
    local[27]='T'
    local[28]='U'
    local[29]='V'
    local[32]='W'
    local[30]='X'
    local[31]='Y'
    local[33]='Z'

    var fl=strvalue.substring(0,1);
    var bok = 0;
    for(var i=10;i<=33;i++){
        if(local[i]==fl){
            bok=1;
            break;
        }
    }
    if(!bok) msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
    else if(!/^[a-zA-Z][0-9]{9}$/.test(strvalue)) msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
    return msg;
}

//帳號檢查(最少3碼)
function ckAcc(strvalue,filed,msg){
    if(!/^[0-9a-zA-Z][0-9a-zA-Z_-]+[0-9a-zA-Z]$/.test(strvalue)) msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
    return msg;
}

//代號or編號檢查(最少2碼 , 必填欄位)
function ckSerial(strvalue,filed,msg){
    if(!/^[0-9a-zA-Z]+[0-9a-zA-Z_-]$/.test(strvalue)) msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
    return msg;
}
//代號or編號檢查(最少2碼 ; 非必填欄位 )
function orckSerial(strvalue,filed,msg){
	if(strvalue.length > 0) if(!/^[0-9a-zA-Z]+[0-9a-zA-Z_-]$/.test(strvalue)) msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
	return msg;
}

//密碼檢查
function ckPass(passwd,ckpass,filed,msg){
	if(!passwd || (passwd != ckpass)) msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
	return msg;
}
//日期+小時特殊情形檢查
function ckDateTimeSpe(strvalue,filed,msg){
    if(!/^([0-9]){4}\-([0-9]){2}\-([0-9]){2}\ ([0-2]){1}([0-9]){1}$/.test(strvalue)) msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
    else{
       var tmp = strvalue.split("-");
       yea=tmp[0];
       mon=tmp[1];
       var time = tmp[2].split(" "); 
       da=time[0];
       if( (parseInt(yea,10) < 1000) || (parseInt(yea,10) > 2999) ){//年份
            msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
            return msg;
       }
       if( (parseInt(mon,10) < 1) || (parseInt(mon,10) > 12) ){//月份
       
            msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
            return msg;
       }
       if (parseInt(da,10) < 1){//日
            msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
            return msg;
       }         

       if( ((parseInt(mon,10) == 1) || (parseInt(mon,10) == 3) || (parseInt(mon,10) == 5) || (parseInt(mon,10) == 7) || 
            (parseInt(mon,10) == 8) || (parseInt(mon,10) == 10) || (parseInt(mon,10) == 12)) && (parseInt(da,10) > 31) ){
            msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
            return msg;
       }   
       
       if( ((parseInt(mon,10) == 2) || (parseInt(mon,10) == 4) || (parseInt(mon,10) == 6) || (parseInt(mon,10) == 9) || (parseInt(mon,10) == 11) ) && (parseInt(da,10) > 30) ){
            msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
            return msg;
       }   
       if(parseInt(mon,10) == 2){//月份
         if(( (parseInt(yea,10) % 4) == 0) && (parseInt(da,10) > 29) ){
                msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
                return msg;
         }
         else
           if((parseInt(yea,10) % 4 != 0) && (parseInt(da,10) > 28)){         
                msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
                return msg;
           }
       }
       
       if(time[1]>=24 || time[1]<=0){
            msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
            return msg;
       }
       
	}
        //if(parseInt(tmp[1]) > 12 || parseInt(tmp[2]) > 31) msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
    
    return msg;
}
//日期檢查
function ckDate(strvalue,filed,msg){
    if(!/^([0-9]){4}\-([0-9]){2}\-([0-9]){2}$/.test(strvalue)) msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
    else{
       var tmp = strvalue.split("-");
       yea=tmp[0];
       mon=tmp[1];
       da=tmp[2];
       if( (parseInt(yea,10) < 1000) || (parseInt(yea,10) > 2999) ){//年份
            msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
            return msg;
       }
       if( (parseInt(mon,10) < 1) || (parseInt(mon,10) > 12) ){//月份
       
            msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
            return msg;
       }
       if (parseInt(da,10) < 1){//日
            msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
            return msg;
       }         

       if( ((parseInt(mon,10) == 1) || (parseInt(mon,10) == 3) || (parseInt(mon,10) == 5) || (parseInt(mon,10) == 7) || 
            (parseInt(mon,10) == 8) || (parseInt(mon,10) == 10) || (parseInt(mon,10) == 12)) && (parseInt(da,10) > 31) ){
            msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
            return msg;
       }   
       
       if( ((parseInt(mon,10) == 2) || (parseInt(mon,10) == 4) || (parseInt(mon,10) == 6) || (parseInt(mon,10) == 9) || (parseInt(mon,10) == 11) ) && (parseInt(da,10) > 30) ){
            msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
            return msg;
       }   
       if(parseInt(mon,10) == 2){//月份
         if(( (parseInt(yea,10) % 4) == 0) && (parseInt(da,10) > 29) ){
                msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
                return msg;
         }
         else
           if((parseInt(yea,10) % 4 != 0) && (parseInt(da,10) > 28)){         
                msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
                return msg;
           }
       }            
       
	}
        //if(parseInt(tmp[1]) > 12 || parseInt(tmp[2]) > 31) msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
    
    return msg;
}
//日期檢查(非必填)
function orckDate(strvalue,filed,msg){
    
    if(trim(strvalue).length > 0){
        if(!/^([0-9]){4}\-([0-9]){2}\-([0-9]){2}$/.test(strvalue)) msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
        else{
           var tmp = strvalue.split("-");
           yea=tmp[0];
           mon=tmp[1];
           da=tmp[2];
           if( (parseInt(yea,10) < 1000) || (parseInt(yea,10) > 2999) ){//年份
                msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
                return msg;
           }
           if( (parseInt(mon,10) < 1) || (parseInt(mon,10) > 12) ){//月份
           
                msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
                return msg;
           }
           if (parseInt(da,10) < 1){//日
                msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
                return msg;
           }         
    
           if( ((parseInt(mon,10) == 1) || (parseInt(mon,10) == 3) || (parseInt(mon,10) == 5) || (parseInt(mon,10) == 7) || 
                (parseInt(mon,10) == 8) || (parseInt(mon,10) == 10) || (parseInt(mon,10) == 12)) && (parseInt(da,10) > 31) ){
                msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
                return msg;
           }   
           
           if( ((parseInt(mon,10) == 2) || (parseInt(mon,10) == 4) || (parseInt(mon,10) == 6) || (parseInt(mon,10) == 9) || (parseInt(mon,10) == 11) ) && (parseInt(da,10) > 30) ){
                msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
                return msg;
           }   
           if(parseInt(mon,10) == 2){//月份
             if(( (parseInt(yea,10) % 4) == 0) && (parseInt(da,10) > 29) ){
                    msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
                    return msg;
             }
             else
               if((parseInt(yea,10) % 4 != 0) && (parseInt(da,10) > 28)){         
                    msg = msg?msg + filed +" error !\n\r":filed +" error !\n\r";
                    return msg;
               }
           }            
           
    	}
    }
    return msg;
}

