﻿//==================表單驗證通式開始=======================
function check_all_fields(form_name) {
	document.getElementById(form_name).submit_button.disabled=true;//先讓SUBMIT按鈕失去作用，若表單驗證不過再讓它恢復
	var form_item;	
	var forms=document.getElementById(form_name);
	for (var i=0; i<forms.elements.length; i++) {
		if (forms.elements(i).getAttribute("validate")=='YES') {
			switch(forms.elements(i).getAttribute("type")) {
				case "select-one" :
					if (forms.elements(i).options[forms.elements(i).selectedIndex].value=="") {
						alert("請選擇"+forms.elements(i).getAttribute("ChtName")+"!");
						forms.elements(i).focus();
						document.getElementById(form_name).submit_button.disabled=false;
						return false;
						brealk;
					}
					break;
				case "text" :
					if (!validate_form(forms.elements(i), i)) {//驗證不通過，傳回驗證失敗旗標
						forms.elements(i).focus();
						document.getElementById(form_name).submit_button.disabled=false;
						return false;
						break;
					}
					break;
				case "checkbox" :
					var check_box_check=false;
					for (var j=0; j<document.all(forms.elements(i).getAttribute("name")).length; j++) {
						if (document.all(forms.elements(i).getAttribute("name"))(j).checked==true) {
							check_box_check=true;
							break;
						}
					}
					if (!check_box_check) {
						alert("請選取"+forms.elements(i).getAttribute("ChtName")+"!");
						document.getElementById(form_name).submit_button.disabled=false;
						return false;
						break;
					}
					break;
				case "password":
					if (forms.elements(i).getAttribute("RegularExpressionValidator")=="COMPARE") {//要與密碼欄位進行比對
						if (forms.elements(i).value!=document.getElementById(form_name).password.value) {
							alert("密碼與確認密碼欄位值不符，請重新輸入!");
							forms.elements(i).value="";
							document.getElementById(form_name).password.value="";
							document.getElementById(form_name).password.focus();
							document.getElementById(form_name).submit_button.disabled=false;
							return false;
							break;							
						}
					}
					else {
						if (!validate_form(forms.elements(i), i)) {//驗證不通過，傳回驗證失敗旗標
							forms.elements(i).focus();
							document.getElementById(form_name).submit_button.disabled=false;
							return false;
							break;
						}
					}
				default:
			}	
		}
	}
	return true;
}
function validate_form(form_item, column_order) {
	str=form_item.value;//客戶端輸入值
	var regexp_str=form_item.getAttribute("RegularExpressionValidator");
	if (regexp_str!='Identities')
	{
		//alert('||'+regexp_str+'||');
		var re = new RegExp(form_item.getAttribute("RegularExpressionValidator"));
		cht_name=form_item.getAttribute("ChtName");//取得欄位中文名稱
		show_messagebox=form_item.getAttribute("ShowMessageBox");//是否要做彈出式警告?YES
		matchflag=re.exec(str);
		return match_format(form_item, regexp_str, column_order, cht_name, show_messagebox, matchflag);
		//欄位物件, 正規驗證字串, 欄位順序, 中文欄位名稱, 是否要彈出警告視窗. 是否符合驗證格式
	}
	else
	{
		//alert(regexp_str);
		//身分證檢測
		return CheckPID(form_item.value);
	}
}

function match_format(form_item, regexp_str, column_order, cht_name, show_messagebox, matchflag) {
	//alert(regexp_str);
	var error_message="";
	switch(regexp_str) {
		case "\\S{1,}" ://表示必填欄位
			error_message=cht_name+"不得空白!"
			break;
		case "\\S+@\\S+\\.\\S{2,}" ://表示 E-mail 欄位
			error_message=cht_name+"格式不符，必須符合 name@company.com 的格式!"
			break;
		case "(19|20)\\d\\d[-/.](0[1-9]|1[012])[-/.](0[1-9]|[12][0-9]|3[01])" ://表示日期欄位
			error_message=cht_name+"格式不符，必須是 2005-01-01 或 2005/01/01 或 2005.01.01!"
			break;
		case "^\d+$" ://表示數字欄位(不含小數點)
			error_message=cht_name+"必須是數字格式!"
			break;
		case "^\d{1,}[\.]?\d+$" ://表示數字欄位(可含小數點)
			error_message=cht_name+"必須是數字格式(可含小數點)!"
			break;
		case "\\b0\\d{1,3}-\\d{5,8}" ://表示電話格式欄位
			error_message=cht_name+"格式不符，必須符合 02-87323348!"
			break;
		default ://其他定義格式的欄位
			if (form_item.getAttribute("maxlength")) {
				error_message=cht_name+"格式不符，"
				error_message+="必須輸入 "+form_item.getAttribute("minlength")+" ~ "+form_item.getAttribute("maxlength")+" 個字元!"
			}
			else {
				error_message=cht_name+"格式不符!"
			}
	}
	if (!matchflag) {//驗證不通過
		if (show_messagebox=="YES") {//要彈出警告視窗
			alert("『" + error_message + "』");
		}
		else {
			var spans=document.getElementById("new_span_"+column_order);
			//如果之前已經建立了錯誤訊息的 SPAN 區塊，就將錯誤訊息填入訊息區塊
			if (spans!=null) {
				spans.innerHTML='<img src="hand02-01.gif">&nbsp;<font color=FF0000>'+ error_message +'</font>';
			}
			//如果之前尚未建立錯誤訊息的 SPAN 區塊，就建立一個新的訊息區塊
			else {
				form_item.insertAdjacentHTML('afterEnd', '&nbsp;<span id=new_span_'+column_order+'><img src="hand02-01.gif">&nbsp;<font color=FF0000>'+ error_message +'</font></span>');
			}
		}
		return false;
	}
	else {//如果驗證通過，就把錯誤訊息自訊息區塊中移除
		if (show_messagebox!="YES") {//不需要彈出警告視窗
			var spans=document.getElementById("new_span_"+column_order);
			if (spans!=null) {
				spans.innerHTML='';
			}
		}
		return true;
	}
}

// ------------------------------------------------------------
// 身份證驗證

var ALP_STR = "ABCDEFGHJKLMNPQRSTUVXYWZIO";
var NUM_STR = "0123456789";
var SEX_STR = "12";
var MAX_COUNT = 999;

// ------------------------------------------------------------
// 去字串前後空白
function trim(str) {
	while (str.indexOf(" ")==0) {
		str = str.substring(1, str.length);
	}
	while ((str.length>0) && (str.indexOf(" ")==(str.length-1))) {
		str = str.substring(0, str.length-1);
	}
	return str;
}

// ------------------------------------------------------------
// 補前置零
function getZero(iLen, val) {
	var val = val + "";
	var rtn = "";
	for(var i=0; i<iLen; i++) {
		rtn += "0";
	}
	rtn += val;
	rtn = rtn.substring(val.length, rtn.length);
	return rtn;
}


// ------------------------------------------------------------
// 身分證字號產生器
// 產生 iCount 個亂數值的身分證字號
function MakePID(form) {
	var iCount = form.COUNT.value
	var sList = "";
	var SelectALP = "";
	var SelectSEX = "";

	// 檢查個數
	var iCount = form.COUNT.value;
	iCount = Math.max(Math.min(iCount, MAX_COUNT), 0);

	// 字母組
	for(var k=0;k<form.ALP.length;k++) {
		SelectALP += form.ALP[k].selected?form.ALP[k].value:"";
	}
	SelectALP = SelectALP.length==0?ALP_STR:SelectALP;

	// 性別組
	for(var k=0;k<form.SEX.length;k++) {
		SelectSEX += form.SEX[k].selected?form.SEX[k].value:"";
	}
	SelectSEX = SelectSEX.length==0?SEX_STR:SelectSEX;

	// 產生 iCount 組字號
	for (var k=0; k<iCount; k++) {
		var j = 0;
		var iChkSum = 0;
		var sNewPID = "";

		// 第1碼 (英文字母)
		j = SelectALP.substr(Math.round(Math.random()*(SelectALP.length-1)), 1);
		sNewPID += j;
		j = ALP_STR.indexOf(sNewPID) + 10;
		iChkSum = (j-j%10)/10 + (j%10*9); /* X1 + X2*9 */

		// 第2碼 (性別)
		j = SelectSEX.substr(Math.round(Math.random()*(SelectSEX.length-1)), 1);
		sNewPID += j;
		iChkSum += j*8; /* X3*8 */

		// 第3~9碼
		for (var i=0; i<7; i++) {
			c = Math.round(Math.random()*9);
			sNewPID += c;
			iChkSum += c * (7-i);
		}

		// 第10碼 (檢查碼)
		sNewPID += ((10 - iChkSum % 10) % 10);

		sList += sNewPID + "\n";
	}
	form.list.value = sList;
	return false;
}

// ------------------------------------------------------------
//身份證字號檢查器 - 累加檢查碼
function getPID_SUM(sPID) {
	var iChkNum = 0;

	// 第 1 碼
	iChkNum = ALP_STR.indexOf(sPID.substr(0,1)) + 10;
	iChkNum = Math.floor(iChkNum/10) + (iChkNum%10*9);

	// 第 2 - 9 碼
	for(var i=1; i<sPID.length-1; i++) {
		iChkNum += sPID.substr(i,1) * (9-i);
	}

	// 第 10 碼
	iChkNum += sPID.substr(9,1)*1;

	return iChkNum;
}

// ------------------------------------------------------------
// 身分證字號檢查器 - 檢查合法字元
function chkPID_CHAR(sPID) {
	var sMsg = "";
	//sPID = trim(sPID.toUpperCase());
	var iPIDLen = String(sPID).length;

	var sChk = ALP_STR + NUM_STR;
	for(i=0;i<iPIDLen;i++) {
		if (sChk.indexOf(sPID.substr(i,1)) < 0) {
			sMsg = "這個身分證字號含有不正確的字元！";
			break;
		}
	}

	if (sMsg.length == 0) {
		if (ALP_STR.indexOf(sPID.substr(0,1)) < 0) {
			sMsg = "身分證字號第 1 碼應為英文字母(A~Z)。";
		} else if ((sPID.substr(1,1) != "1") && (sPID.substr(1,1) != "2")) {
			sMsg = "身分證字號第 2 碼應為數字(1~2)。";
		} else {
			for(var i=2; i<iPIDLen; i++) {
				if (NUM_STR.indexOf(sPID.substr(i, 1)) < 0) {
					sMsg = "第 " + (i+1) + " 碼應為數字(0~9)。";
					break;
				}
			}
		}
	}

	if (sMsg.length != 0) {
		alert(sMsg);
		return false;
	} else {
		return true;
	}
}

// ------------------------------------------------------------
// 身分證字號檢查器
function CheckPID(sPID) {
	var sMsg = "正確";

	if (sPID == '') {
		sMsg = "請輸入身分證字號";
	} else if (sPID.length != 10) {
		sMsg = "長度應為 10 ！";
	} else {
		sPID = trim(sPID.toUpperCase());
		if (!chkPID_CHAR(sPID)) return;

		var iChkNum = getPID_SUM(sPID);

		if (iChkNum % 10 != 0) {
			var iLastNum = sPID.substr(9, 1) * 1;
			for (i=0; i<10; i++) {
				var xRightAlpNum = iChkNum - iLastNum + i;
				if ((xRightAlpNum % 10) ==0) {
					sMsg = "身份證字號不正確!";
					break;
				}
			}
		}
	}
	
	if (sMsg!='正確')
	{
		alert("身分證字號有誤");
		return false;
	}
	return true;
}


//==================表單驗證通式結束=======================
function MM_openCalendar(theURL,winName,features,obj) //開啟月曆
{ 
	dateStr = showModalDialog('../Calendar.htm',"請選擇日期","dialogWidth:17em;dialogHeight:18em");
	if (dateStr)
	{
		obj.value = dateStr;
	}
}