//彈跳錯誤訊息
function EmptyAlert(strTmp,objs){
	alert(strTmp);
	objs.focus();
	return false;				
}
//判斷特定欄位值是否有填
function isEmpty(str) { 
	for (var i = 0; i < str.length; i++)
		if (" " != str.charAt(i))return false; 
	return true; 
}

//第一個字母必須是a-z, A-Z, 0-9
//之後的字元除了a-z, A-Z, 0-9 , -, _ 不能有其他字元
function checkMemberAccount(obj){
	var arg = obj.value;
	//第一個字元用 a-z, A-Z, 0-9
	pattern = new RegExp("^[a-zA-Z0-9]+", "g");
	flag = pattern.test(arg)
	if(!flag) {
		alert("會員帳號第一個字母必須是a-z, A-Z, 0-9"); 
		obj.focus();
		return false; 
	}
	//不能有例外字元
	pattern = new RegExp("[^a-zA-Z0-9_-]+", "g");
	flag = pattern.test(arg);
	if( flag ) {
		alert("會員帳號除了a-z, A-Z, 0-9 , -, _ 不能有其他字元"); 
		obj.focus();
		return false; 
	}
	return true;
}

//會員帳號
function check_memberaccount(f,tmp) {
	if (isEmpty(f[tmp[1]].value))
		return EmptyAlert("您還有這欄位忘了填喔！\n\n"+tmp[2],f[tmp[1]]);
	if (!checkMemberAccount(f[tmp[1]])) {
		return false;
	}
	return true;
}

/*--檢驗日期--*/
function checkDateFormat(iYear, iMonth, iDay) {
	if (iDay == null || iMonth == null || iYear == null)  { return false; }
	if (iYear.length != 4 || isNaN(iYear) || iYear <= 0)  { return false; }
	if (iMonth.length == 0 || iMonth <= 0)  { return false; }
	if (iDay.length == 0 || iDay <= 0)  { return false; }

	if ((iMonth == 4) || 
		(iMonth == 6) || 
		(iMonth == 9) || 
		(iMonth == 11) ) {
		if (iDay > 30) { return false; }  
		}

	if (iMonth==2) {
		if ((iYear % 4)==0) {
			if (iDay > 29) { return false; }
		} else {
			if (iDay > 28) { return false; } 
		}
	}
	return true;
}

//檢查密碼, 第二個欄位名稱為第一個欄位後面加上2
function verifyPassword(form, obj) { 
	var psw = obj.value; 
	var pswName = obj.name; 
	var pattern = /^[a-zA-Z0-9]{4,}/;
	vpswObj = eval("form."+pswName+"2");
	vpsw = vpswObj.value;
	flag = pattern.test(psw);
	if( !flag ) { 
		alert("請輸入四碼以上的英文或數字!"); 
		obj.focus();
		return false; 
	} 
	if(vpsw != psw) {
		alert("您兩個密碼不一致, 請重新輸入!"); 
		vpswObj.focus();
		return false; 
	}
	return true;
} 

//檢查網址
function verifyWebSite(obj) { 
	
	
	var webSite = obj.value; 
	
	pattern = new RegExp("^[http://]?[a-zA-Z0-9_-]+(\.+[a-zA-Z0-9_-]+){1,}", "g");
	
	if (webSite.length = 0) 
		return true;
	flag = pattern.test(webSite); 
	if(flag) { 
		return true; 
	}else { 
		alert("不正確的網址!"); 
		obj.focus();
		return false; 
	} 
} 	


//檢查電子郵件
function verifyAddress(obj) { 
	// obtain form value into variable 
	var email = obj.value; 
	// define regex 
	var pattern = /^([a-zA-Z\.0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/; 
	// test for pattern 
	if (email.length = 0) return true;
	flag = pattern.test(email); 
	if(!flag) { 
		alert("不正確的Email"); 
		obj.focus();
		return false; 
	} 
	return true;
} 

//檢查身份證字號
function checkID(obj){ 
	var AreaNo,UserID; 
	var I; 
	var CheckSum; 
	var AreaCode; 
	UserID = obj.value;
	UserID = UserID.toUpperCase(); 
	AreaCode = UserID.charAt(0); 
	
	// 確定身分證有10碼 
	if ((UserID.length) != 10) { 
		alert("身分證字號長度不正確！"); 
		obj.focus();
		return false; 
	} 
	
	// 確定首碼在A-Z之間 
	if ((AreaCode < "A") || (AreaCode > "Z")) { 
		alert("身分證字號首碼在 A - Z 之間！"); 
		obj.focus();
		return false; 
	} 
	
	// 確定2-10碼是數字 
	if (isNaN(parseInt(UserID.substring(1,10)))){ 
		alert("身分證字號 2 - 10 碼是數字！"); 
		obj.focus();
		return false; 
	} 
	
	// 取得首碼對應的區域碼，A ->10, B->11, ..H->17,I->34, J->18... 
	AreaNo = ("ABCDEFGHJKLMNPQRSTUVXYWZIO".indexOf(AreaCode)) + 10; 
	
	UserID = AreaNo.toString() + UserID.substring(1,10); 
	// 取得CheckSum的值 
	CheckSum = parseInt(UserID.charAt(0)) + parseInt(UserID.substring(10,11)); 
	for (I=2;I<=10;I++){ 
		CheckSum = CheckSum + parseInt(UserID.substring(I-1,I)) * (11 - I); 
	} 
	if ((CheckSum % 10) == 0){ 
		return true; 
	} else { 
		alert("身分證字號不正確！"); 
		obj.focus();
		return false; 
	} 
}

//檢查統編
function checkInvoce( obj ) { 
	Num = obj.value;
	var cx = new Array(1,2,1,2,1,2,4,1);
	var SUM = 0;
	var regexp = /^(\d{8,8})$/;
	if ( !regexp.test(Num) ) {
		alert("統編格式錯誤，應該是八碼的數字");
		obj.focus();
		return false;
	}
	//分割成字元陣列
	var cnum = Num.split("");
	for (i=0; i<8; i++) {
		var n = cnum[i] * cx[i];
		//若乘出來的值為二位數則將十位數和個位數相加, 並傳回
		if (n > 9) {
			n = parseInt(n/10) + n%10;
		}
		SUM += n;
	}
	//最後將所有數值加總, 被 10 整除就為正確
	if (SUM % 10 == 0) {
		return true;
		//若上述演算不正確並且 G 為 7 得話, 再加上 1 被 10 整除也為正確
	} else if (cnum[6] == 7 && (SUM + 1) % 10 == 0) {
		return true;
	} else {
		alert("統一編號："+Num+" 錯誤!");
		obj.focus();
		return false;
	}
	return true;
}


//檢查生日
function checkDate(f, tmp) { 
	intMonth = f[tmp[1]+"Mon"].options[f[tmp[1]+"Mon"].selectedIndex].value;
	intDay = f[tmp[1]+"Day"].options[f[tmp[1]+"Day"].selectedIndex].value;
	if (!checkDateFormat(f[tmp[1]+"Year"].value,intMonth,intDay)) {
		return EmptyAlert("您還有這欄位忘了點選 或 日期不正確 喔！\n\n"+tmp[2],f[tmp[1]+"Year"]);
	}
	return true;
}

//必填文字
function check_text(f,tmp) { 
	if (isEmpty(f[tmp[1]].value))
		return EmptyAlert("您還有這欄位忘了填喔！\n\n"+tmp[2],f[tmp[1]]);
	return true;
}
//必填下拉
function check_select(f,tmp) { 
	if (f[tmp[1]].options.length == 0 || isEmpty(f[tmp[1]].options[f[tmp[1]].selectedIndex].value))
		return EmptyAlert("您還有這欄位忘了填喔！\n\n"+tmp[2],f[tmp[1]]);
	return true;
}

//必填整數
function check_int(f,tmp) { 
	if (isEmpty(f[tmp[1]].value))
		return EmptyAlert("您還有這欄位忘了填喔！\n\n"+tmp[2],f[tmp[1]]);
	if (isNaN(f[tmp[1]].value))
		return EmptyAlert("這欄位應該是數值喔！\n\n"+tmp[2],f[tmp[1]]);
	return true;
}
//整數非必填
function check_int_needless(f,tmp) { 
	if (!isEmpty(f[tmp[1]].value))
		return check_int(f,tmp);
	return true;
}
//整數非必填, 為了跟舊版本相容所以才加上
function check_ints(f,tmp) { 
	if (!isEmpty(f[tmp[1]].value))
		return check_int(f,tmp);
	return true;
}
//單選
function check_radio(f,tmp) { 
	var tmps = f[tmp[1]].length;
	if(f[tmp[1]].length) {
		for(var j = 0; j < tmps; j++) {
			if(f[tmp[1]][j].checked) 
				break;
		}
		if(j == tmps) {
			return EmptyAlert("您還有這欄位忘了點選喔！\n\n"+tmp[2],f[tmp[1]][0]);
		}
	} else {
		if(!f[tmp[1]].checked) 	
			return EmptyAlert("您還有這欄位忘了點選喔！\n\n"+tmp[2],f[tmp[1]]);
	}
	return true;
}

//會員帳號
function check_memberaccount(f,tmp) {
	if (isEmpty(f[tmp[1]].value))
		return EmptyAlert("您還有這欄位忘了填喔！\n\n"+tmp[2],f[tmp[1]]);
	if (!checkMemberAccount(f[tmp[1]])) {
		return false;
	}
	return true;
}


//身分證字號
function check_pid(f,tmp) { 
	if (!checkID(f[tmp[1]]))
		return false;
	return true;
}
//身分證字號非必填
function check_pid_needless(f,tmp) { 
	if (!isEmpty(f[tmp[1]].value))
		return check_pid(f,tmp);
	return true;
}

//統編
function check_vid(f,tmp) { 
	if (!checkInvoce(f[tmp[1]]))
		return false;	
	return true;
}
//統編非必填
function check_vid_needless(f,tmp) { 
	if (!isEmpty(f[tmp[1]].value))
		return check_vid(f,tmp);
	return true;
}
//網址
function check_website(f,tmp) { 
	if (!verifyWebSite(f[tmp[1]]))
		return false;
	return true;
}
//網址非必填
function check_website_needless(f,tmp) { 
	if (!isEmpty(f[tmp[1]].value))
		return check_website(f,tmp);
	return true;
}

//密碼
function check_password(f,tmp) { 
	if (!verifyPassword(f, f[tmp[1]]))
		return false;
	return true;
}

//email
function check_email(f,tmp) { 
	if (!verifyAddress(f[tmp[1]]))
		return false;
	return true;
}
//email非必填
function check_email_needless(f,tmp) { 
	if (!isEmpty(f[tmp[1]].value))
		return check_email(f,tmp);
	return true;
}


//date
function check_date(f,tmp) { 
	if (!checkDate(f, tmp))
		return false;
	return true;
}


function Check(f, oo) { 
	var Lens = 0, tmps = 0;
	var tmp;
	//如果沒有指定form, 用document.CheckDataForm當預設值
	if (!oo) oo = document.CheckDataForm;
	//確定是多個
	if(oo.required.length) {
		for (var i = 0; i < oo.required.length; i++) {
			//分解成矩陣
			tmp = oo.required[i].value.split(";");
			//轉換成小寫
			tmp[0] = tmp[0].toLowerCase();
			//確定有這個欄位存在
			if (tmp[1]=="birth" || null != f[tmp[1]]){
				if(!eval("check_"+tmp[0]+"(f,tmp)")) {
					return false;
				}
			}
		}
		
	//單個
	} else {
		//分解成矩陣
		tmp = oo.required.value.split(";");
		//轉換成小寫
		tmp[0] = tmp[0].toLowerCase();
		//確定有這個欄位存在
		if (null != f[tmp[1]]){
			return eval("check_"+tmp[0]+"(f,tmp)");
		}
	}
	return true;
}
