/*
CheckFormValid(form, fields, rules)
form(obj) = form ref
fields(array) = 檢查的Element Name[,當欄位錯誤會focus的物件],欄位顯示名稱
rules(array) = 檢查的規則，範例如下
	"!"								->  非空白
	/^(\d{10},)*\d{10}$/			->	 符合正規式
	"*RuleCheckSelectDate"		->  使用自訂函數RuleCheckSelectDate來判別
	"#1,10000"						->  數字1到10000
	"#1,infinity"					->  數字1到無限大
	"#i1,100"						->  數字1到100，限定整數
	"$1,10"							->  字串長度為1到10 (中文字算一個)
	"@1,3,5,7,9"					->  必須為1,3,5,7,9之一
	"~345"							->  必須為345
	"345"								->	 同~
	
目前自訂判斷function
	RuleCheckDate				檢查三個text 組成的Date(順序是月日年)
									Ex: "DeliveTimeMonth/DeliveTimeDay/DeliveTimeYear,Delive時間"
	RuleCheckSelectDate		檢查三個select 組成的Date(順序是月日年)
									Ex: "DeliveTimeMonth/DeliveTimeDay/DeliveTimeYear,Delive時間"
	RuleValueDate				檢查一個text的內容 例如2005/06/06
									Ex: "DeliveTime,Delive時間"
	RuleValueDate				檢查一個text的內容為YYYY/MM/DD 例如2005/06/06
									Ex: "DeliveTime,Delive時間"
	RuleValueDateCYMMDD		檢查一個text的內容為CYMMDD 例如940606
									Ex: "DeliveTime,Delive時間"
									Editer : Fred 2005.07.08
	RuleCheckHourMin		檢查text的value為hhmm 例如:1430
									Editer : Fred 2005.10.31
	RuleCheckDateTime		檢查text的value為yyyy/MM/dd HH:mm:ss 或是yyyy/MM/dd HH:mm
									Ex: 2005/10/31 08:52:00	, 2005/10/31 08:52
									Editer : Fred 2005.10.31
	RuleValueDate2			檢查一個text的內容為YYYY/MM/DD或是CY/MM/DD 例如2005/06/06或是94/06/06
									Ex: "DeliveTime,Delive時間"
									Editer : Fred 2006.1.11
	RuleInternalPersonID	身分證字號檢查
									Editer : Fred 2006.6.29
	RuleInternalCompanyID	統一編號檢查
									Editer : Fred 2006.6.29
    RuleForeignPersonID     居留證檢查
*/

var RegExpPattern_MobilPhone = /^\d{10}$/;
var RegExpPattern_Email = /^\w+([\.\-]\w+)*\@\w+([\.\-]\w+)*\.\w+$/;
var RegExpPattern_Emails = /^\w+([\.\-]\w+)*\@\w+([\.\-]\w+)*\.\w+(;\w+([\.\-]\w+)*\@\w+([\.\-]\w+)*\.\w+)*$/;

function CheckFormVersion()
{
	alert("CheckForm 1.0.20050711.1");
}

function MakeResult(desc, postfixMsg)
{
	switch(desc.charAt(0))
	{
		case '~' :
			desc = desc.substr(1);
			return desc + "\n";
	}	
	return desc + postfixMsg + "\n";
}

function CheckFormValid(form, fields, rules) 
{
	result = "";
	tmp_result = "";
	ret = 0 ;
	numBegin = 0 ;
	numEnd = 0;
	focus_obj = null;

	for (var i=0; i<rules.length; i++) 
	{
		focus_obj_str = "";
		j = fields[i].indexOf(",")
		if(j >= 0)
		{
			field = fields[i].substr(0,j);
			desc = fields[i].substr(j+1);
			k = desc.indexOf(",");
			if(k > 0)
			{
				focus_obj_str = desc.substr(0,k);
				desc = desc.substr(k+1);
			}
		}
		else
		{
			field = fields[i];
			desc = "";
		}

		// check what kind of rule.
		rule = rules[i].toString();
		if(field.charAt(0) == '?')
		{
			field = field.substr(1);
			if(form.elements[field].value ==  "") {continue;}
		}		
		
		if(desc == "")	{desc = field;}
		
		switch(rule.charAt(0))
		{
			case '/': // regular expression rule.
				ret = form.elements[field].value.match(rules[i]);
				if(ret==null)
				{
					// result += desc+" doesn't match input format." + "\n"
					result += MakeResult(desc, " 不符合格式");
				}
				break;
			case '#': // number rule.			
				if(form.elements[field].value == "")
				{
					// result += desc + " field is required."+ "\n"
					result += MakeResult(desc, " 不可空白");
					break;
				}
				if(isNaN(form.elements[field].value))
				{	
					// result += desc + " field must be number." + "\n"
					result += MakeResult(desc, " 必須是數字");
					break ;	
				}
				flag = rule.charAt(1);
				if(flag == 'i')
				{
					num = form.elements[field].value;
					if(num.match(/[^0-9]/))
					{
						result += MakeResult(desc, " 必須是整數");
						break ;
					}
					rule = rule.substr(1);
				} 
				else if(flag == 'f')
				{
					rule = rule.substr(1);
				}
				else
				{
					/* nothing to do */
				}
				j = rule.indexOf(",");
				numBegin = rule.substr(1, j-1);
				numEnd = rule.substr(j+1);
				if(numEnd=="infinity")
				{
					numEnd = Number.POSITIVE_INFINITY;
				}
				if(Number(numBegin) > Number(form.elements[field].value) || Number(form.elements[field].value) > Number(numEnd))
				{
					// result += desc + " field must between " + numBegin + " and " + numEnd + "\n"
					result += MakeResult(desc, " 必須介於 " + numBegin + " 和 " + numEnd + " 之間");
				}
				break;
			case '!': // NOT NULL rule.
				if(form.elements[field].value.length <=0)
				{
					// result += desc + " field cannot be empty." + "\n"
					result += MakeResult(desc, " 不可為空");
				}
				break;
			case '$': // string rule.
				j = rule.indexOf(",");
				numBegin = rule.substr(1, j-1);
				numEnd = rule.substr(j+1);
				if(form.elements[field].value.length < numBegin || form.elements[field].value.length > numEnd)
				{
					// result += desc + "'s length must between " + numBegin + " and " + numEnd + "\n"
					result += MakeResult(desc, " 的長度必須介於 " + numBegin + " 和 " + numEnd);
				}
				break;
			case '@': // enum rule
				enumList = rule.split(",");
				enumList[0] = enumList[0].substr(1);
				for(j = 0 ; j < enumList.length; j++)
				{
					if(form.elements[field].value.toUpperCase() == enumList[j].toUpperCase())
					{
						break;
					}
				}
				if(j>=enumList.length)
				{
					// result += desc + " field is not a valid data." + "\n"
					result += MakeResult(desc, " 錯誤，必須為" + rule.substr(1) + "之一");
				}		
				break;
			case '*': // programable rule
				ret = eval(rule.substr(1) + "(form, field, desc)");
				if(ret != "")
				{
					result += ret;
				}
				break ;
			case '~': // exactly rule(escape special rule character.)
				rule = rule.substr(1);
			default : // exactly rule
		 		if(form.elements[field].value != rule)
		 		{
		 			// result += desc + " must be '" + rule + "'\n"
		 			result += MakeResult(desc, " 必須為 " + rule + "");
		 		}
		}
		
		if(focus_obj_str != "" && focus_obj == null && tmp_result != result)
		{
			try
			{
				if(focus_obj_str == "this") 
					focus_obj = form.elements[field];
				else
					focus_obj = eval(focus_obj_str);
				focus_obj.focus();
			}
			catch(e){}
		}
		tmp_result = result;
	}
	
	if(result != "")
	{
		alert(result);
		ret = false ;
	}
	else
	{
		ret = true;
	}
	return ret;
}

function GetFormalFloat(a)
{
	re = /^\d\d*\.\d{2}/;
	b = re.exec(a);
	if(b!=null)	{return b;}

	re = /^\d\d*\.\d{1}/;
	b = re.exec(a);
	if(b!=null) {return String(b) + "0";}

	re = /^\d\d*/;
	b = re.exec(a);
	if(b!=null) {return String(b) + ".00";}

	return null;
}

function GetFebruaryDays(year)
{
	return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0) ) ) ? 29 : 28 );
}

function GetMonthDays(month, year)
{
	if(month==2)
		{return GetFebruaryDays(year)}		
	else
	{
		if(month<=7)
		{
	  		if((month % 2) == 1)
	  			{return 31;}
			else
				{return 30;}
		}	
		else
		{
	  		if((month % 2) == 1)
	  			{return 30;}
			else
				{return 31;}
		}
	}
}

function RuleCheckDate(form, field, desc)
{
	fields = field.split("/");
	var result = "";
	if(fields.length!=3)
		{result += (desc + "錯誤1!\n");}
	else 
	{
		if(form.elements[fields[1]].value == "")
		{
			// result += (desc + "'s Day field is empty\n")
			result += MakeResult(desc, "的日為空白");
		}
		if(form.elements[fields[0]].value == "")
		{
	  		// result += (desc + "'s Month field is empty\n")
	  		result += MakeResult(desc, "的月為空白");
		}
  		if(form.elements[fields[2]].value == "")
		{
			// result += (desc + "'s Year field is empty\n")
  			result += MakeResult(desc, "的年為空白");
		}
	}
  
	if(result != "") {return result };

	var iMonth = parseInt(form.elements[fields[0]].value);
	var iDay = parseInt(form.elements[fields[1]].value);
	var iYear = parseInt(form.elements[fields[2]].value);

	if(!IsDate(iYear,iMonth,iDay)) result += MakeResult(desc, " 錯誤");

	return result;
}

function RuleCheckHourMin(form, value, desc)
{
	values = form.elements[value].value;
	if(values.length != 4)
	{
		result += (desc + " 時間格式為hhmm\n");
		return result;
	}
	else
	{
		var iHour = parseInt(values,substr(0,2));
		var iMin = parseInt(values,substr(2,2));
		if(!(iHour <= 23 || iHour >= 0) || !(iMin <= 59 || iMin >= 0))
			result += MakeResult(desc, "時間 錯誤");	
	}
	return result;
}


function RuleCheckDateTime(form, value, desc)
{
	var result = "";
	dateTimeArray = form.elements[value].value.split(" ");
	if(dateTimeArray.length < 2) 
	{
		result += (desc + " 日期格式為yyyy/MM/dd HH:mm:ss 或是 yyyy/MM/dd HH:mm\n");
		return result;
	}
	datestr = dateTimeArray[0];
	timestr = dateTimeArray[1];
	
	values = datestr.split("/");
	if(values.length!=3)
	{
		result += (desc + " 日期格式為yyyy/MM/dd HH:mm:ss 或是 yyyy/MM/dd HH:mm\n");
		return result;
	}
	
	if(values[0].match(/[^0-9]/)) { result += (desc + " 錯誤!\n"); return result; }
	if(values[1].match(/[^0-9]/)) { result += (desc + " 錯誤!\n"); return result; }
	if(values[2].match(/[^0-9]/)) { result += (desc + " 錯誤!\n"); return result; }
	
	var iYear = Number(values[0]);
	var iMonth = Number(values[1]);
	var iDay = Number(values[2]);

	if(!IsDate(iYear,iMonth,iDay)) result += MakeResult(desc, " 錯誤");
	
	//Time
	timeArray = timestr.split(":");
	if(timeArray.length < 2 || timeArray.length > 3)
	{
		result += MakeResult(desc, " 日期格式為yyyy/MM/dd HH:mm:ss 或是 yyyy/MM/dd HH:mm\n");	
		return result;
	}
	var iHour = parseInt(timeArray[0]);
	var iMin = parseInt(timeArray[1]);
	if(timeArray.length == 3)
	{
		var iSec = parseInt(timeArray[2]);
		if(!(iHour <= 23 || iHour >= 0) || !(iMin <= 59 || iMin >= 0) || !(iSec <= 59 || iSec >= 0) )
			result += MakeResult(desc, "時間 錯誤");	
	}
	else
	{
		if(!(iHour <= 23 || iHour >= 0) || !(iMin <= 59 || iMin >= 0))
			result += MakeResult(desc, "時間 錯誤");	
	}
	return result
}

function RuleCheckSelectDate(form, field, desc)
{
	fields = field.split("/");
	var result = "";

	if(fields.length!=3)
	{
		result += (desc + "錯誤!\n");
		return result;
	}

	var iDay = parseInt(form.elements[fields[1]].options[form.elements[fields[1]].selectedIndex].value);
	var iMonth = parseInt(form.elements[fields[0]].options[form.elements[fields[0]].selectedIndex].value);
	var iYear = parseInt(form.elements[fields[2]].options[form.elements[fields[2]].selectedIndex].value);

	if(!IsDate(iYear,iMonth,iDay)) result += MakeResult(desc, " 錯誤");

	return result;
}

function RuleValueDate(form, value, desc)
{
	values = form.elements[value].value.split("/");
	var result = "";
	
	if(values.length!=3)
	{
		result += (desc + " 日期格式為yyyy/mm/dd\n");
		return result;
	}
	
	if(values[0].match(/[^0-9]/)) { result += (desc + " 錯誤!\n"); return result; }
	if(values[1].match(/[^0-9]/)) { result += (desc + " 錯誤!\n"); return result; }
	if(values[2].match(/[^0-9]/)) { result += (desc + " 錯誤!\n"); return result; }
	
	var iYear = Number(values[0]);
	var iMonth = Number(values[1]);
	var iDay = Number(values[2]);

	if(!IsDate(iYear,iMonth,iDay)) result += MakeResult(desc, " 錯誤");
	
	return result;
}

function RuleValueDate2(form, value, desc)
{
	values = form.elements[value].value.split("/");
	var result = "";
	if(values.length!=3)
	{
		result += (desc + " 日期格式為yyyy/mm/dd或cy/mm/dd\n");
		return result;
	}
	if(values[0].match(/[^0-9]/)) { result += (desc + " 錯誤!\n"); return result; }
	if(values[1].match(/[^0-9]/)) { result += (desc + " 錯誤!\n"); return result; }
	if(values[2].match(/[^0-9]/)) { result += (desc + " 錯誤!\n"); return result; }
	var iYear = Number(values[0]);
	var iMonth = Number(values[1]);
	var iDay = Number(values[2]);
	if(iYear < 1000) iYear += 1911;
	if(!IsDate(iYear,iMonth,iDay)) result += MakeResult(desc, " 錯誤");
	return result;
}

function RuleValueDateCYMMDD(form, value, desc)
{
	var result = "";
	values_string = form.elements[value].value;
	//限定長度6~7
	if(values_string.length<6 || values_string.length>7)
	{
		result += (desc + "錯誤 日期格式應為CYMMDD\n");
		return result;
	}
	var values = new Array(3);
	values[0] = values_string.substr(0,values_string.length-4);
	values[1] = values_string.substr(values_string.length-4,2);
	values[2] = values_string.substr(values_string.length-2);
	
	if(values[0].match(/[^0-9]/)) { result += (desc + " 錯誤!\n"); return result; }
	if(values[1].match(/[^0-9]/)) { result += (desc + " 錯誤!\n"); return result; }
	if(values[2].match(/[^0-9]/)) { result += (desc + " 錯誤!\n"); return result; }
	
	var iYear = Number(values[0]);
	var iMonth = Number(values[1]);
	var iDay = Number(values[2]);

	if(!IsDate(iYear,iMonth,iDay)) result += MakeResult(desc, " 錯誤");
	
	return result
}

function IsDate(iYear,iMonth,iDay)
{
	//如果年小於1000 判定為"民國年" +1911
	//080Memo 禁止輸入民國年
	//if(iYear < 1000) iYear += 1911;
    if (isNaN(iYear) || isNaN(iMonth) || isNaN(iDay)) return false;
	if(iYear<1900 || iYear >9999) return false;
	if(iMonth < 1 || iMonth > 12) return false;
	if(iDay < 1 || iDay > GetMonthDays(iMonth, iYear)) return false;
	return true;
}

// ------------------------------------------------------------
//身份證字號檢查器 - 累加檢查碼
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 RuleInternalPersonID(form, value, desc)
{
	var result = "";
	var sPID = form.elements[value].value;
	if(!sPID.match(/^[A-Z][12]\d{8}$/))
		return desc + " 錯誤!\n";
	else
	{
		//計算累加
		var ALP_STR = "ABCDEFGHJKLMNPQRSTUVXYWZIO";
		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;
		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 = "最後一個數應為：" + i;
					return desc + " 錯誤!\n";
				}
			}
		}		
	}
	return "";
	
/*	舊的2007/1/31
	check:{
		if (values_string.length != 10) break check;
		var no=values_string.split("");
		no[0]=no[0].toUpperCase();
		if ((no[0]<"A") || (no[0]>"Z")) break check;
		if ((no[1]<"1") || (no[1]>"2")) break check;
		for (var i=1;i<10;i++) if ((no[i]<"0" || no[i]>"9")) break check; else no[i]=Number(no[i]);
		no[0]=no[0].charCodeAt(0);
		if (no[0]<73) no[0]-=55;
		else if (no[0]==73) no[0]=34;
		else if (no[0]<79) no[0]-=56;
		else if (no[0]==79) no[0]=35;
		else if (no[0]<87) no[0]-=57;
		else if (no[0]==87) no[0]=32;
		else if (no[0<90]) no[0]-=58; else no[0]=33;
		var sum=Math.floor((no[0]/10))+(no[0]%10)*9;
		for (var i=1;i<9;i++) sum+=no[i]*(9-i);
		sum+=no[9];
		if (sum%10 != 0) break check;
		return "";
	}
	return desc + " 錯誤!\n";
*/	
}

function RuleInternalCompanyID(form, value, desc)
{
	var result = "";
	var values_string = form.elements[value].value;
	var tbNum = new Array(1,2,1,2,1,2,4,1);
    var temp = 0;
    var total = 0;
	if(!values_string.match(/^\d{8}$/))
		return desc + "必須為8碼數字!\n";
	else
	{
        for(var i = 0; i < tbNum.length ;i ++){
            temp = values_string.charAt(i) * tbNum[ i ];
            total += Math.floor(temp/10)+temp%10;
        }
        if(total%10==0 || (total%10==9 && values_string.charAt(6)==7))
			return "";
        else
			return desc + "錯誤!\n";
	}
}

function RuleForeignPersonID(form, value, desc)
{
	/*
		第一碼為區碼
		第二碼為性別 男/女(入出境管理局使用A/B；警察局外事科/課使用C/D；稅捐處使用E/F)
		第三碼到第九碼為流水號
		第十碼為檢查碼
	*/
	var result = "";
	var values_string = form.elements[value].value;
	if(!values_string.match(/^[A-Z][A-F]\d{8}$/))
		return desc + "必須為2碼英文8碼數字!\n";
	var head="ABCDEFGHJKLMNPQRSTUVXYWZIO";
	values_string = 	(head.indexOf(values_string.substr(0,1))+10) + '' + 
							((head.indexOf(values_string.substr(1,1))+10)%10) + '' + 
							values_string.substr(2,8);
	var sum = 	parseInt(values_string.substr(0,1)) +    
					parseInt(values_string.substr(1,1)) * 9 +    
					parseInt(values_string.substr(2,1)) * 8 +    
					parseInt(values_string.substr(3,1)) * 7 +             
					parseInt(values_string.substr(4,1)) * 6 +    
					parseInt(values_string.substr(5,1)) * 5 +    
					parseInt(values_string.substr(6,1)) * 4 +    
					parseInt(values_string.substr(7,1)) * 3 +    
					parseInt(values_string.substr(8,1)) * 2 +    
					parseInt(values_string.substr(9,1)) * 1 +    
					parseInt(values_string.substr(10,1));   
	if ((sum % 10) != 0) return desc + " 檢查碼錯誤!\n";
	return "";
}

