﻿/* 去除掉指定字串的前、後空白字元
 * @param   strText	 想要去除前後空白字元的字串
 * @return  string
 */
function trim(strText) {
	strText = ltrim(strText);
	strText = rtrim(strText);

	return strText;
}

/* 去除掉指定字串的左側空白字元
 * @param   strText	 想要去除左側空白字元的字串
 * @return  string
 */
function ltrim(strText) {
	while (strText.substring(0,1) == ' ')
		strText = strText.substring(1, strText.length);

	return strText;
}

/* 去除掉指定字串的右側空白字元
 * @param   strText	 想要去除右側空白字元的字串
 * @return  string
 */
function rtrim(strText) {
	while (strText.substring(strText.length-1,strText.length) == ' ')
		strText = strText.substring(0, strText.length-1);

	return strText;
}

/* 設定指定表單欄位物件的值，支援所有的表單物件型態
 * checkbox, radio, select, text, textarea, hidden,
 * password, button, submit, reset
 * (唯有file型態的物件因為安全性的關係，無法設定值)
 * @param   myobj	   表單欄位物件or表單欄位物件的字串(格式為"formname.elementname")
 * @param   value	   欲設定的值
 * @return  none
 */
function setValue(myobj, value) {
	var obj;

	// IF 傳入的myobj是字串(格式為formname.elementname) THEN 取得此物件的指標
	if (typeof(myobj) == "string") {
		var form_name = myobj.substring(0, myobj.indexOf("."));
		var element_name = myobj.substr(myobj.indexOf(".")+1);
		obj = document.forms[form_name].elements[element_name];
	} else {
		obj = myobj;
	}

	if (typeof(obj) != "object") {
		if (typeof(myobj) == "string") {
			alert("Cannot set \""+value+"\" to the "+myobj+" field.");
		} else {
			alert("Cannot set \""+value+"\" to the undefined form field.");
		}
		return false;
	}
	switch (obj.type) {
		case "checkbox":
			setCheckboxValue(obj, value);
			break;
		case "select-multiple":
		case "select-one":
			setSelectValue(obj, value);
			break;
		case "hidden":
		case "text":
		case "textarea":
		case "password":
		case "file":
		case "button":
		case "submit":
		case "reset":
			obj.value = decodeHtml(value);		  // 若文字有含html編碼「&#dddd;」，會將其還原
			break;
		case "radio":
		default:
			setRadioValue(obj, value);
	}
}

/* 設定radio表單欄位物件的值，也就是說，選取符合的項目
 * @param   obj		 radio表單欄位物件
 * @param   value	   欲設定的值
 * @return  none
 */
function setRadioValue(obj, value) {
	if (typeof(obj.length) == "number") {
		for (var i=0; i<obj.length; i++) {
			if (obj[i].value == value) {
				obj[i].checked = true;
				break;
			}
		}
	} else {
		alert(obj);
		alert(obj.value);
		if (obj.value == value) {
			obj.checked = true;
		}
	}
}

/* 設定checkbox表單欄位物件的值，也就是說，選取符合的項目
 * @param   obj		 checkbox表單欄位物件
 * @param   value	   欲設定的值
 * @return  none
 */
function setCheckboxValue(obj, value) {
	if (typeof(obj.length) == "number") {
		for (var i=0; i<obj.length; i++) {
			if (obj[i].value == value) {
				obj[i].checked = true;
				break;
			}
		}
	} else {
		if (obj.value == value) {
			obj.checked = true;
		}
	}
}

/* 設定select表單欄位物件的值，也就是說，選取符合的項目
 * @param   obj		 select表單欄位物件
 * @param   value	   欲設定的值
 * @return  none
 */
function setSelectValue(obj, value) {
	for (var i=0; i<obj.options.length; i++) {
		if (obj.options[i].value == value) {
			obj.options[i].selected = true;
			break;
		}
	}
}

/* 取得指定表單欄位物件的值，支援所有的表單物件型態
 * checkbox, radio, select, text, textarea, hidden,
 * password, file, button, submit, reset
 * @param   myobj	   表單欄位物件or表單欄位物件的字串(格式為"formname.elementname")
 * @return  string	  若有多個值的話，每個值之間以,隔開
 */
function getValue(myobj) {
	var obj;
	var result = "";

	// IF 傳入的myobj是字串(格式為formname.elementname) THEN 取得此物件的指標
	if (typeof(myobj) == "string") {
		var pos = myobj.indexOf(".");
		if (pos > 0) {
			var form_name = myobj.substring(0, pos);
			var element_name = myobj.substr(pos+1);
			obj = document.forms[form_name].elements[element_name];
		} else {
			return getValueByName(myobj);
		}
	} else {
		obj = myobj;
	}

	if (typeof(obj) != "object") {
		if (typeof(myobj) == "string") {
			alert("Cannot get the value of "+myobj+" field.");
		} else {
			alert("Cannot get the value of undefined form field.");
		}
		return false;
	}

	switch (obj.type) {
		case "checkbox":
			result = getCheckboxValue(obj);
			break;
		case "select-multiple":
		case "select-one":
			result = getSelectValue(obj);
			break;
		case "hidden":
		case "text":
		case "textarea":
		case "password":
		case "file":
		case "button":
		case "submit":
		case "reset":
			result = obj.value;
			break;
		case "radio":
		default:
			result = getRadioValue(obj);
	}

	return result;
}

function getValueByName(myobj_name) {
	var oform = document.forms[0];
	var obj = null;
	var result = "";
	var item_name;

	if (typeof(myobj_name) != "string") {
		alert("getValueByName: Please give the \"string\" id name to get the values.");
		return false;
	}
	
	obj = oform.elements[myobj_name];
	if (typeof(obj) == "object") {
		result = getValue(obj);
	} else {
		for (var i=0; i<oform.elements.length; i++) {
			obj = oform.elements[i];
			item_name = obj.name;
			if (item_name.indexOf(myobj_name+":") == 0 && obj.type=="checkbox") {
				result = getCheckBoxListValue(myobj_name);
				break;
			}
		}
	}

	return result;
}

/* 取得在radio表單欄位物件上，使用者所選取的值
 * @param   obj		 radio表單欄位物件
 * @return  string
 */
function getRadioValue(obj) {
	var result = "";

	if (typeof(obj.length) == "number") {
		for (var i=0; i<obj.length; i++) {
			if (obj[i].checked) {
				result = obj[i].value;
				break;
			}
		}
	} else {
		if (obj.checked) {
			result = obj.value;
		}
	}

	return result;
}

/* 取得在checkbox表單欄位物件上，使用者所選取的值
 * @param   obj		 checkbox表單欄位物件
 * @return  string	  若有多個值的話，每個值之間以,隔開
 */
function getCheckboxValue(obj) {
	var result = "";

	if (typeof(obj.length) == "number") {
		for (var i=0; i<obj.length; i++) {
			if (obj[i].checked) {
				result += "," + obj[i].value;
			}
		}
	} else {
		if (obj.checked) {
			result += "," + obj.value;
		}
	}

	if (result != "") {
		result = result.substr(1);
	}

	return result;
}

/* 取得在checkbox表單欄位物件上，使用者所選取的值
 * @param   obj		 checkbox表單欄位物件
 * @return  Array	   傳回所選取的值的陣列
 */
function getCheckboxValueArray(obj) {
	var result = Array();
	var index = 0;

	if (typeof(obj.length) == "number") {
		for (var i=0; i<obj.length; i++) {
			if (obj[i].checked) {
				result[index++] = obj[i].value;
			}
		}
	} else {
		if (obj.checked) {
			result[index++] = obj[i].value;
		}
	}

	return result;
}

/* 在ASP.NET網頁上，CheckBoxList所產生的表單欄位物件，取得使用者選取的狀態 (以01表示選取的狀態)
 * @param   objname		CheckBoxList控制項名稱
 * @return  string		傳回所選取的值的字串。例如：101，代表的是1、3項有被選取，第2項沒被選取
 */
 function getCheckBoxListValue(objname) {
	var oform = document.forms[0];
	var obj = null;
	var result = "";
	var item_name;
	var index;
	var values = Array();

	if (typeof(objname) != "string") {
		alert("getCheckBoxListValue: Please give the \"string\" id name to get the index.");
		return false;
	}
	
	for (var i=0; i<oform.elements.length; i++) {
		obj = oform.elements[i];
		item_name = obj.name;
		//alert(item_name);
		if (obj.type=="checkbox" && item_name.indexOf(objname+":") == 0) {
			index = parseInt(item_name.substring(item_name.indexOf(":")+1), 10)

			if (obj.checked) {
				values[index] = 1;
			} else {
				values[index] = 0;
			}
		}
	}
	
	for (var i=0; i<values.length; i++) {
		if (values[i] == 1) {
			result += "1";
		} else {
			result += "0";
		}
	}

	return result;
}

/* 在ASP.NET網頁上，檢查CheckBoxList在指定的索引項目上，是否有被選取 (索引從0開始)
 * @param   objname		CheckBoxList控制項名稱
 * @return  bool		若指定的索引項目有被選取，則傳回true，則否為false
 */
 function hasCheckBoxListIndex(objname, index) {
	var result = false;
	var value = getCheckBoxListValue(objname);
	if (value.length > index && value.charAt(index) == '1') {
		result = true;
	}
	
	return result;
}

/* 取得在select表單欄位物件上，使用者所選取的值
 * @param   obj		 select表單欄位物件
 * @return  string	  若有多個值的話，每個值之間以,隔開
 */
function getSelectValue(obj) {
	var result = "";

	for (var i=0; i<obj.options.length; i++) {
		if (obj.options[i].selected) {
			result += "," + obj.options[i].value;
		}
	}

	if (result != "") {
		result = result.substr(1);
	}

	return result;
}

/* 取得在select表單欄位物件上，使用者所選取的值
 * @param   obj		 select表單欄位物件
 * @return  Array	   傳回所選取的值的陣列
 */
function getSelectValueArray(obj) {
	var result = Array();
	var index = 0;

	for (var i=0; i<obj.options.length; i++) {
		if (obj.options[i].selected) {
			result[index++] = obj[i].value;
		}
	}

	return result;
}

/* 檢查指定表單欄位物件的值是否為空值或空白字串，支援所有的表單物件型態 checkbox,
 * radio, select, text, textarea, hidden
 * @param   obj		 表單欄位物件
 * @return  boolean
 */
function isEmpty(obj) {
	var oform = document.forms[0];
	var result = false;
	var obj_name;

	if (typeof(obj) == "string") {
		obj_name = obj;
		obj = oform.elements[obj_name];
		if (typeof(obj) != "object") {
			var valuelist = getCheckBoxListValue(obj_name);
			if (parseInt(valuelist, 10) == 0) {
				return true;
			} else {
				return false;
			}
		}
	}
	
	if (typeof(obj) != "object") {
  		alert("isEmpty: Please give the \"string\" id name to check empty.");
		return false;
	}	

	switch (obj.type) {
		case "select-multiple":
		case "select-one":
			result = !isSelected(obj);
			break;
		case "hidden":
		case "password":
		case "text":
		case "textarea":
			result = isBlank(obj);
			break;
		case "checkbox":
		case "radio":
		default:
			result = !isChecked(obj);
	}

	return result;
}

/* 檢查指定的radio或checkbox表單欄位物件是否被使用者選取過
 * @param   obj		 radio或checkbox表單欄位物件
 * @return  boolean
 */
function isChecked(obj) {
	var result = false;

	if (typeof(obj.length) == "number") {
		for (var i=0; i<obj.length; i++) {
			if (obj[i].checked) {
				result = true;
				break;
			}
		}
	} else {
		if (obj.checked) {
			result = true;
		}
	}

	return result;
}

/* 檢查指定的select表單欄位物件是否被使用者選取過
 * (若使用者選取的項目值為空字串，則仍傳回未被選取)
 * @param   obj		 select表單欄位物件
 * @return  boolean
 */
function isSelected(obj) {
	var result = false;

	for (var i=0; i<obj.options.length; i++) {
		if (obj.options[i].selected  && obj.options[i].value != "") {
			result = true;
			break;
		}
	}

	return result;
}

/* 檢查指定的text或textarea或hidden表單欄位物件是否已輸入值
 * (若欄位值為空白字串，則仍傳回未被輸入)
 * @param   obj		 select表單欄位物件
 * @return  boolean
 */
function isBlank(obj) {
	return isSpace(obj.value);
}

/* 檢查指定的字串是否為空字串或為空白字串
 * @param   value	   欲檢查的值
 * @return  boolean
 */
function isSpace(value) {
	var result = false;

	if (trim(value) == "") {
		result = true;
	}

	return result;
}

/* 判斷是否為英文字
 * @param   value	   欲檢查的值
 * @return  boolean
 */
function isEng(value) {
	var pattern = /^[A-Za-z\- ]+$/;
	return pattern.test(value);
}

/* 判斷是否為正整數或負整數，例如: +25, -33, 77 皆符合條件
 * @param   value	   欲檢查的值
 * @return  boolean
 */
function isInt(value) {
	var pattern = /^(\+|\-)?\d+$/;
	return pattern.test(value);
}

/* 判斷是否為全為數字，例如: 25, 002 皆符合條件 (有含正號、負號的整數不符合條件)
 * @param   value	   欲檢查的值
 * @return  boolean
 */
function isUnsignedInt(value) {
	var pattern = /^\d+$/;
	return pattern.test(value);
}

/* 判斷是否為正整數，例如: +25, 77 皆符合條件
 * @param   value	   欲檢查的值
 * @return  boolean
 */
function isPositiveInt(value) {
	var pattern = /^(\+)?\d+$/;
	return pattern.test(value);
}

/* 判斷是否為負整數，例如: -33, -006 皆符合條件
 * @param   value	   欲檢查的值
 * @return  boolean
 */
function isNegativeInt(value) {
	var pattern = /^\-\d+$/;
	return pattern.test(value);
}

/* 判斷是否為正浮點數或負浮點數，例如: +25.7, -33.7, 77.7 皆符合條件
 * @param   value	   欲檢查的值
 * @return  boolean
 */
function isFloat(value) {
	var pattern = /^(\+|\-)?\d+\.\d+$/;
	return pattern.test(value);
}

/* 判斷是否為正浮點數，例如: +25.7, 77.7 皆符合條件
 * @param   value	   欲檢查的值
 * @return  boolean
 */
function isPositiveFloat(value) {
	var pattern = /^(\+)?\d+\.\d+$/;
	return pattern.test(value);
}

/* 判斷是否為負浮點數，例如: -33.7, -006.7 皆符合條件
 * @param   value	   欲檢查的值
 * @return  boolean
 */
function isNegativeFloat(value) {
	var pattern = /^\-\d+\.\d+$/;
	return pattern.test(value);
}

/* 選擇或不選擇所有的相同名稱的checkbox項目
 * @param   obj		 checkbox表單欄位物件
 * @param   value	   true/false (全選/全不選)
 * @return  none
 */
function checkAll(obj, value) {
	if (typeof(obj.length) == "number") {
		for (var i=0; i<obj.length; i++) {
			obj[i].checked = value;
		}
	} else {
		obj.checked = value;
	}
}

/* 將不是目前使用者點選的checkbox項目狀態全部設為不選
 * 模擬出radio只能單選的效果，但是又能取消選取
 * 用法: checkOnlyOne(form1.chkLevel, this.value)
 * @param   obj		 checkbox表單欄位物件
 * @param   value	   目前點選的checkbox值
 * @return  none
 */
function checkOnlyOne(obj, value) {
	if (typeof(obj.length) == "number") {
		for (var i=0; i<obj.length; i++) {
			if (obj[i].value != value) {
				obj[i].checked = false;
			}
		}
	} else {
		if (obj.value != value) {
			obj.checked = false;
		}
	}
}

/* 選擇符合條件值的checkbox項目
 * @param   obj		 checkbox表單欄位物件
 * @param   value	   條件值
 * @return  none
 */
function checkValue(obj, value) {
	setValue(obj, value);
}

/* 不選擇符合條件值的checkbox項目
 * @param   obj		 checkbox表單欄位物件
 * @param   value	   條件值
 * @return  none
 */
function uncheckValue(obj, value) {
	if (typeof(obj.length) == "number") {
		for (var i=0; i<obj.length; i++) {
			if (obj[i].value == value) {
				obj[i].checked = false;
				break;
			}
		}
	} else {
		if (obj.value == value) {
			obj.checked = false;
		}
	}
}

/* 選擇或不選擇所有的清單項目
 * @param   obj		 select表單欄位物件
 * @param   value	   true/false (全選/全不選)
 * @return  none
 */
function selectAll(obj, value) {
	for (var i=0; i<obj.options.length; i++) {
		obj.options[i].selected = value;
	}
}

/* 選擇符合條件值的清單項目
 * @param   obj		 select表單欄位物件
 * @param   value	   項目值
 * @return  none
 */
function selectValue(obj, value) {
	setValue(obj, value);
}

/* 不選擇符合條件值的清單項目
 * @param   obj		 select表單欄位物件
 * @param   value	   項目值
 * @return  none
 */
function unselectValue(obj, value) {
	for (var i=0; i<obj.options.length; i++) {
		if (obj.options[i].value == value) {
			obj.options[i].selected = false;
			break;
		}
	}
}

/* 判斷是有符合條件值的清單項目名稱
 * @param   obj		 select表單欄位物件
 * @param   text		項目名稱
 * @return  boolean
 */
function hasOptionByText(obj, text) {
	var result = false;
	for (var i=0; i<obj.options.length; i++) {
		if (obj.options[i].text == text) {
			result = true;
			break;
		}
	}

	return result;
}

/* 判斷是有符合條件值的清單項目值
 * @param   obj		 select表單欄位物件
 * @param   value	   條件值
 * @return  boolean
 */
function hasOptionByValue(obj, value) {
	var result = false;

	for (var i=0; i<obj.options.length; i++) {
		if (obj.options[i].value == value) {
			result = true;
			break;
		}
	}

	return result;
}

/* 加入一新的清單項目至指定的清單物件
 * @param   obj		 select表單欄位物件
 * @param   text		項目名稱
 * @param   value	   項目值
 * @return  none
 */
function addOption(obj, text, value) {
	var newOpt;

	newOpt = document.createElement("OPTION");
	newOpt.text = text;
	newOpt.value = value;
	obj.add(newOpt);
}

/* 移除符合條件值的清單項目名稱
 * @param   obj		 select表單欄位物件
 * @param   text		項目名稱
 * @return  boolean
 */
function delOptionByText(obj, text) {
	var result = false;

	for (var i=0; i<obj.options.length; i++) {
		if (obj.options[i].text == text) {
			obj.options.remove(i);
			result = true;
			break;
		}
	}

	return result;
}

/* 移除符合條件值的清單項目值
 * @param   obj		 select表單欄位物件
 * @param   value	   項目值
 * @return  boolean
 */
function delOptionByValue(obj, value) {
	var result = false;

	for (var i=0; i<obj.options.length; i++) {
		if (obj.options[i].value == value) {
			obj.options.remove(i);
			result = true;
			break;
		}
	}

	return result;
}

/* 從指定的清單xfrom，搬移選擇的項目至另一清單xto
 * @param   xfrom	   來源select表單欄位物件
 * @param   xto		 目的select表單欄位物件
 * @return  none
 */
function moveOption(xfrom, xto) {
	for (var i=0; i<xfrom.options.length;) {
		if (xfrom.options[i].selected) {
			addOption(xto, xfrom.options[i].text, xfrom.options[i].value);
			xfrom.options.remove(i);
		} else {
			i++;
		}
	}
}

/* 從指定的清單xfrom，搬移所有的項目至另一清單xto
 * @param   xfrom	   來源select表單欄位物件
 * @param   xto		 目的select表單欄位物件
 * @return  none
 */
function moveAllOption(xfrom, xto) {
	for (var i=0; i<xfrom.options.length;) {
		addOption(xto, xfrom.options[i].text, xfrom.options[i].value);
		xfrom.options.remove(i);
	}
}

/* 檢查指定email格式是否正確
 * @param   email	   欲檢查的email
 * @return  boolean
 */
function checkEmail(email) {
	var filter=/^\w+[\w\.\-]*\w+@.+\..{2,3}$/;
	if (filter.test(email)) {
		return true;
	}
	else{
		return false;
	}
}

/* 檢查指定檔案名稱格式是否正確 (在Windows系統上，有些特別的字元不可為檔案名稱的一部份)
 * @param   filename	欲檢查的檔名
 * @return  boolean
 */
function checkFileName(filename) {
	var re = /[\\\/\:\*\?\"\'\<\>\|\[\]]/gi;
	return !re.test(filename);
}

/* 傳回不可為檔案名稱的一部份的特別字元)
 * @return  string
 */
function strFileName() {
	return "\\ / : * ? \" ' < > | [ ]";
}

/* 在完整檔案路徑下，取得檔案名稱 (即不包含路徑資訊)
 * @param   myPath	  完整檔案路徑
 * @return  string
 */
function getFileName(myPath) {
	var i;

	i = myPath.lastIndexOf("\\");
	if (i == -1) {
		i = myPath.lastIndexOf("/");
	}
	if (i != -1) {
		return myPath.substring(i+1, myPath.length);
	}
	return "";
}

/* 判斷指定的值是否為空字串或空白字串
 * @param   value	   欲檢查的字串
 * @param   filename	欲檢查的檔名
 * @return  boolean
 */
function checkEmpty(value) {
	var result = false;

	if (trim(value) == "") {
		result = true;
	}

	return result;
}

/* 取得字串長度 (一個中文字算二個字元)
 * @param   myStr	   欲檢查的字串
 * @return  integer
 */
function getStrLen(myStr) {
	var myLength = 0;

	for (var i=0; i<myStr.length; i++) {
		myLength++;
		if (myStr.charCodeAt(i) > 127) {
			myLength++;
		}
	}
	return myLength;
}

/* 判斷指定的字串是否超過最大長度限制值，若超過則傳回true
 * @param   value	   欲檢查的字串
 * @return  boolean
 */
function checkMaxLen(value, Length) {
	var actualLen = getStrLen(value);

	return (actualLen > Length);
}

/* 判斷指定的字串是否小於最小長度限制值，若小於則傳回true
 * @param   value	   欲檢查的字串
 * @return  boolean
 */
function checkMinLen(value, Length) {
	var actualLen = getStrLen(value);

	return (actualLen < Length);
}

/* 將指定的數字四捨五入到指定的小數位數
 * 例如: getRound(2.35, 4) // 傳回 2.3500
 *	   getRound(2.35, 1)  // 傳回 2.4
 * @param   value	   欲檢查的值
 * @return  string
 */
function getRound(number, noOfPlaces){
	if(isNaN(number)){
		alert("Please enter a valid number");
		Number = 0;
	}

	val = (Math.round(number*Math.pow(10,noOfPlaces)))/Math.pow(10,noOfPlaces);
	val = val.toString();
	ind = val.indexOf(".");
	if(ind==-1){
		val = val.toString() + ".";
		for(i=0;i<noOfPlaces;i++)
			val = val + "0";
	}
	else{
		len = val.length;
		x = len-ind-1;
		if(x<noOfPlaces){
			for(i=0;i<(noOfPlaces-x);i++)
				val = val + "0";
		}
	}

	return(val);
}

/* 檢查西元日期是否正確 (格式可為 YYYY-MM-DD 或 YYYY/MM/DD)
 * @param   value	   欲檢查的日期字串
 * @return  boolean
 */
function checkDate(DateString) {
	var separator = "/";
	if (DateString.indexOf("/") != -1) {
		separator = "/";
	} else if (DateString.indexOf("-") != -1) {
		separator = "-";
	}

	return CheckDatefmt(DateString, separator);
}

/* 檢查中華民國日期是否正確 (格式可為 YYY-MM-DD 或 YYY/MM/DD)
 * 為了避免使用者輸入西元年份，若年份欄位超出3碼者，視為不正確的中華民國日期
 * @param   value	   欲檢查的日期字串
 * @return  boolean
 */
function checkRocDate(mydate) {
	var separator = "/";

	// 將日期格式固定為 YYYY/MM/DD or YYYY-MM-DD (即MM, DD皆為兩位數)
	DateString = formatDate(mydate);

	if (DateString.indexOf("/") != -1) {
		separator = "/";
	} else if (DateString.indexOf("-") != -1) {
		separator = "-";
	}

	var idx=DateString.indexOf(separator);
	var y=DateString.substring(0,idx)  //年
	// 使用者可能輸入西元年份
	if (y.length > 3) {
		return false;
	}
	y=parseInt(y,10);

	if (isNaN(y)) return false;
	var md=DateString.substring(idx+1,DateString.length);

	y=y+1911;  //將民國年轉為西元年
	var ymd=y+separator+md;

	return CheckDatefmt(ymd,separator);
}

/* 檢查日期是否正確，可自定分隔字元，但仍必須符合日期格式=4位年+分隔+2位月+分隔+2位日期
 * @param   DateString  欲檢查的日期字串
 * @param   chrFmt	  分隔字元
 * @return  boolean
 */
function CheckDatefmt(DateString, chrFmt) {
	if (DateString.length >10 || DateString.length <8) return false;
	var y,m,d;
	var idx=DateString.indexOf(chrFmt)
	y=DateString.substring(0,idx)  //年
	DateString=DateString.substring(idx+1,DateString.length)
	var idx=DateString.indexOf(chrFmt)
	m=DateString.substring(0,idx); //月
	d=DateString.substring(idx+1,DateString.length);  //日
	if (m.substring(0,1)=='0') m=m.substring(1,m.length);
	if (d.substring(0,1)=='0') d=d.substring(1,d.length);
	/*alert("y="+y);
	alert("m="+m);
	alert("d="+d);*/
	var CharNum = "0123456789";
	//判別是否皆為數字
	for(var i=0;i<y.length;i++) {
		var str=y.substring(i,i+1);
		if (CharNum.indexOf(str)<0) return false;
	}

	for(var i=0;i<m.length;i++) {
		var str=m.substring(i,i+1);
		if (CharNum.indexOf(str)<0) return false;
	}

	for(var i=0;i<d.length;i++){
		var str=d.substring(i,i+1);
		if (CharNum.indexOf(str)<0) return false;
	}

	y=parseInt(y,10);
	m=parseInt(m,10);
	d=parseInt(d,10);

	if (isNaN(y)) return false;
	if (isNaN(m)) return false;
	if (isNaN(d)) return false;

	/*if (y < 100 && y > 70) y += 1900;
	if (y < 70) y += 2000;
	if (y > 2070 || y < 1970) return false;*/
	
	if (y<1900 || y>2100) return false;

	if (m < 1 || m > 12) return false;

	if (d < 1 || d > 31) return false;

	var isleap = ((y % 100) && !(y % 4)) || !(y % 400);

	switch (m)
	{
	  case 1:
	  case 3:
	  case 5:
	  case 7:
	  case 8:
	  case 10:
	  case 12:
		return true;
	  case 4:
	  case 6:
	  case 9:
	  case 11:
		if (d > 30) return false;
		else return true;
	  case 2:

		if (isleap) {
		  if (d > 29){
			 return false;
		  }else{
			 return true;
		  }
		}else{
		   if (parseInt(d,10) > 28){
			  return false;
		   }
		}
		return true;
	  default:
		return false;
	}
}

/* 比較兩個日期的大小
 * 參數日期格式必須為「MM/DD/YYYY」或者「MM-DD-YYYY」，可先使用YMD2MDY()作轉換
 * @param   date1	   日期字串1
 * @param   date2	   日期字串2
 * @return  integer	 -1 if date1 is less than date2
 *					   1 if date1 is greater than date2
 *					   0 if they are equal.
 */
function compareDate(date1, date2) {
	var myStartDate, myEndDate;
	var re = /\-/g;

	myStartDate = Date.parse(date1);
	if (isNaN(myStartDate)) {
		return NaN;
	}
	myEndDate = Date.parse(date2);
	if (isNaN(myEndDate)) {
		return NaN;
	}

	if (myStartDate < myEndDate) {
		return -1;
	} else if (myStartDate > myEndDate) {
		return 1;
	} else {
		return 0;
	}

}
/* 將日期的「月」、「日」格式化為兩位數的 YYYYY/MM/DD 或 YYYY-MM-DD 格式
 * @param   DateString  日期字串
 * @return  string
 */
function formatDate(DateString) {
	var separator = "/";
	var idx;
	var temp;
	var y, m, d;
	if (DateString.indexOf("/") != -1) {
		separator = "/";
	} else if (DateString.indexOf("-") != -1) {
		separator = "-";
	}

	// Year
	temp = DateString;
	idx = temp.indexOf(separator);
	y = temp.substring(0,idx);
	temp = temp.substring(idx+1);

	// Month
	idx = temp.indexOf(separator);
	m = temp.substring(0,idx);
	if (m.length == 1) {
		m = "0" + m;
	}

	// Day
	d = temp.substring(idx+1);
	if (d.length == 1) {
		d = "0" + d;
	}

	return (y + separator + m + separator + d);
}

/* 將傳入的民國日期 (其格式可為YY/MM/DD或YY-MM-DD)
 * 格式化為西元年的日期
 */
function getAdDate(DateString) {
	var separator = "/";
	if (DateString.indexOf("/") != -1) {
		separator = "/";
	} else if (DateString.indexOf("-") != -1) {
		separator = "-";
	}
	var idx=DateString.indexOf(separator);
	var y=DateString.substring(0,idx)  //年
	y=parseInt(y,10);

	if (isNaN(y)) return "";
	var md=DateString.substring(idx+1,DateString.length);
	y=y+1911;  //將民國年轉為西元年
	var ymd=y+separator+md;
	return ymd;
}

/* 將傳入的西元年日期 (其格式可為YYYY/MM/DD或YYYY-MM-DD)
 * 格式化為民國年日期
 */
function getRocDate(DateString) {
	var separator = "/";
	if (DateString.indexOf("/") != -1) {
		separator = "/";
	} else if (DateString.indexOf("-") != -1) {
		separator = "-";
	}

	var idx=DateString.indexOf(separator);
	var y=DateString.substring(0,idx)  //年
	y=parseInt(y,10);

	if (isNaN(y)) return "";
	var md=DateString.substring(idx+1,DateString.length);
	y=y-1911;  //將西元年轉為民國年
	var ymd=y+separator+md;
	return ymd;
}

/* 取得兩個日期之間所相差的天數
 * 參數日期格式必須為「MM/DD/YYYY」或者「MM-DD-YYYY」，可先使用YMD2MDY()作轉換
 * @param   date1	   開始日期字串1
 * @param   date2	   結束日期字串2
 * @return  integer
 */
function getDiffDay(date1, date2) {
	var laterdate, earlierdate;
	var difference;

	earlierdate = Date.parse(date1);
	laterdate = Date.parse(date2);

	difference = laterdate - earlierdate;

	return Math.floor(difference/1000/60/60/24);
}

/* 將指定的日期字串加/減天數
  * 傳回的日期格式為「YYYY/MM/DD」
 * @param   date1	   指定的日期字串
 * @param   day		 欲加/減的天數
 * @return  string
 */
function addDateByDay(mydate, day) {
	var lngDate;
	var newdate;
	var result;

	lngDate = Date.parse(mydate);
	lngDate += day*24*60*60*1000;

	newdate = new Date(lngDate);

	result = newdate.getFullYear() + "/";
	if ((newdate.getMonth()+1)<10) {
		result += "0";
	}
	result += (newdate.getMonth()+1) + "/";

	if (newdate.getDate()<10) {
		result += "0";
	}
	result += newdate.getDate();

	return result;
}

/* 將指定的日期字串加/減月數
 * 傳回的日期格式為「YYYY/MM/DD」
 * @param   mydate	  指定的日期字串
 * @param   value	   欲加/減的月數
 * @return  string
 */
function addDateByMonth(mydate, value) {
	var newdate;
	var y, m, d;
	var myvalue;

	newdate = new Date(mydate)
	 y = newdate.getFullYear();
	m = (newdate.getMonth()+1);
	d = newdate.getDate();
	myvalue = parseInt(value,10);

	m += myvalue;

	if (m>12){
		y += 1;
	}
	
	m %= 12;
	if (m==0)
		m=12;
	result = y + "/";
	if (m<10) {
		result += "0";
	}
	result += m + "/";

	if (d<10) {
		result += "0";
	}
	result += d;
	if (!checkDate(result)) {
		result = getLastDay(y+"/"+m+"/1");
	}
	return result;
}

/* 將民國年加上月數，ex:"92/01/31"加上"1"個月，結果為"92/02/28"
 * 注：當大月加上某月後，變成小月，日期會為小月的最後一天，而不是再下個月的第一天
 * @param   datestr	欲加月數的日期
 * @param   addstr	 想加幾月
 * @return  string	 加總後的結果字串
 */
function addMonth(datestr,addstr)
{
	var mydate;
	var newdate;

	if (!checkRocDate(datestr))
		return false;

	mydate = getAdDate(datestr);
	newdate = addDateByMonth(mydate, addstr);

	return getRocDate(newdate);
}

/* 取得指定日期下，此月份的最後一天的日期
 * 傳回的日期格式為「YYYY/MM/DD」
 * @param   mydate	  指定的日期字串
 * @return  string
 */
function getLastDay(mydate) {
	var newdate;
	var y, m, d;
	var lngDate;
	var result;

	newdate = new Date(mydate);
	y = newdate.getFullYear();
	m = newdate.getMonth()+1;
	d = 1;

	if (m==12) {
		y++;
		m = 1
	} else {
		m++;
	}

	lngDate = Date.parse(y + "/" + m + "/" + d);
	lngDate -= 1000;

	newdate = new Date(lngDate);

	result = newdate.getFullYear() + "/";
	if ((newdate.getMonth()+1)<10) {
		result += "0";
	}
	result += (newdate.getMonth()+1) + "/";

	if (newdate.getDate()<10) {
		result += "0";
	}
	result += newdate.getDate();

	return result;
}

/* 將「年月日」的日期格式轉換為「月日年」字串
 * 傳入的日期格式可為「YYYY/MM/DD」或「YYYY-MM-DD」
 * @param   mydate	  欲轉換的日期字串
 * @return  string
 */
function YMD2MDY(mydate) {
	var pos;
	var separator = "-";
	var newdate;

	pos = mydate.indexOf("-");
	if (pos == -1) {
		pos = mydate.indexOf("/");
		separator = "/";
	}

	// IF 不是正確的日期格式 THEN 傳回NaN
	if (pos == -1) {
		return NaN;
	}

	newdate = mydate.substring(pos+1) + separator + mydate.substring(0, pos);

	return newdate;

}

/* 檢查輸入的身份證字號是否正確
 * @param   IDString	欲檢查的身份證字號
 * @return  boolean
 */
function checkId(IDString) {
	var ErrString = "" ;
	var ID1 = IDString.toUpperCase();
	if (IDString.length != 0 ) {IDString =IDString.toUpperCase()}
	if (IDString.length != 10){ErrString = ErrString + "身分證字號字數不對。" + unescape('%0D')}
	if (ID1.length != 10) return false; //alert("身分證字號字數不對 !");
	var IDdigit = new Array(10);
	for (var i=0; i<10; i++) { IDdigit[i] = ID1.charAt(i); }
	var CharEng = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	IDdigit[0]   = CharEng.indexOf(IDdigit[0]);
	if (IDdigit[0] == -1)  return false; //alert("身分證字號第一位為錯誤英文字母 !");
	if (IDdigit[1] !=1 && IDdigit[1] !=2) return false; //alert("身分證字號無法辨識性別 !");

	var Array1  = new Array(26);
	Array1[0]   = 1 ; Array1[1]  = 10; Array1[2]  = 19;
	Array1[3]   = 28; Array1[4]  = 37; Array1[5]  = 46;
	Array1[6]   = 55; Array1[7]  = 64; Array1[8]  = 39;
	Array1[9]   = 73; Array1[10] = 82; Array1[11] = 2 ;
	Array1[12]  = 11; Array1[13] = 20; Array1[14] = 48;
	Array1[15]  = 29; Array1[16] = 38; Array1[17] = 47;
	Array1[18]  = 56; Array1[19] = 65; Array1[20] = 74;
	Array1[21]  = 83; Array1[22] = 21; Array1[23] = 3 ;
	Array1[24]  = 12; Array1[25] = 30;
	var result = Array1[IDdigit[0]];
	for (var i=1; i<10; i++) {
		var Number = "0123456789";
		IDdigit[i] = Number.indexOf(IDdigit[i]);
		if (IDdigit[i] == -1) {
			//alert("身分證字號錯誤 !");
			return false;
		} else {
			result += IDdigit[i] * (9-i);
		}
	}
	result += 1 * IDdigit[9];
	//alert("result=="+result);
	if (result % 10 != 0) {
		//alert("身分證字號錯誤 !");
		return false; }
	else {
		return true;
	}
}

/* 檢查指定的數值，其值的限制是否符合指定的最小or最大值
 * @param   my_value	指定的數值 (可為整數or浮點數)
 * @param   my_min	  最小值。若不想有最小值限制，可給空字串""
 * @param   my_max	  最大值。若不想有最大值限制，可給空字串""
 * @return  boolean
 */
function checkRange(my_value, my_min, my_max) {
	var result;
	var now_value, min_value, max_value;

	now_value = parseFloat(my_value);
	if (min_value == "") {
		min_value = now_value;
	} else {
		min_value = parseFloat(my_min);
	}

	if (max_value == "") {
		max_value = now_value;
	} else {
		max_value = parseFloat(my_max);
	}

	result = true;
	if ((now_value < min_value) || (now_value > max_value)) {
		result = false;
	}

	return result;
}

/* 檢查指定的日期，其值的限制是否符合指定的最小or最大值
 * @param   my_value	指定的日期
 * @param   my_min	  最小值。若不想有最小值限制，可給空字串""
 * @param   my_max	  最大值。若不想有最大值限制，可給空字串""
 * @return  boolean
 */
function checkDateRange(my_value, my_min, my_max) {
	var result;
	var now_value, min_value, max_value;

	now_value = YMD2MDY(my_value);
	if (min_value == "") {
		min_value = now_value;
	} else {
		min_value = YMD2MDY(my_min);
	}

	if (max_value == "") {
		max_value = now_value;
	} else {
		max_value = YMD2MDY(my_max);
	}

	result = true;
	if ((compareDate(now_value, min_value) < 0) || (compareDate(now_value, max_value) > 0)) {
		result = false;
	}

	return result;
}

/* 檢查指定的字串，其長度的限制是否符合指定的最小or最大長度
 * @param   my_value	指定的字串
 * @param   my_min	  最小長度。若不想有最小長度限制，可給空字串""
 * @param   my_max	  最大長度。若不想有最大長度限制，可給空字串""
 * @return  boolean
 */
function checkLength(my_value, my_min, my_max) {
	var result;
	var now_value, min_value, max_value;

	now_value = getStrLen(my_value);
	if (min_value == "") {
		min_value = now_value;
	} else {
		min_value = parseInt(my_min,10);
	}

	if (max_value == "") {
		max_value = now_value;
	} else {
		max_value = parseInt(my_max,10);
	}

	result = true;
	if ((now_value < min_value) || (now_value > max_value)) {
		result = false;
	}

	return result;
}

/* 從一組同樣名稱但序號為1開始的checkbox，依其勾選與否的狀態組成一01的字串值
 * @param   itemname	checkbox的ID名稱
 * @param   value	   位元值
 * @return  boolean
 */
function getBits(itemname, count) {
	var result = "";

	for (var i=1; i<=count; i++) {
		if (document.getElementById(itemname+i).checked) {
			result += "1";
		} else {
			result += "0";
		}
	}
	return result;
}

/* 依據一個由01組成的字串，來設定一組同樣名稱但序號為1開始的checkbox是否要勾選
 * @param   itemname	checkbox的ID名稱
 * @param   value	   位元值
 * @return  boolean
 */
function setBits(itemname, value) {
	var count = value.length;
	var status;

	for (var i=1; i<=count; i++) {
		if (value.charAt(i-1) == "1") {
			document.getElementById(itemname+i).checked = true;
		} else {
			document.getElementById(itemname+i).checked = false;
		}
	}
}

/* 將有含html編碼的文字&#dddd;，還原回其所代表unicode碼的字符
 * @param   strMessage  欲解碼的文字
 * @return  string
 */
function decodeHtml(strMessage) {
	var lngStartPos;
	var lngEndPos;
	var intCharCode;
	var HtmlDecode = new String(strMessage);
	
	do {
		lngStartPos = 0
		lngEndPos = 0
		lngStartPos = HtmlDecode.indexOf("&#");
		if (lngStartPos != -1) {
			lngEndPos = HtmlDecode.indexOf(";", lngStartPos+2);

			if (lngEndPos > 0) {
				intCharCode = parseInt(HtmlDecode.substring(lngStartPos+2, lngEndPos), 10);
				if (!isNaN(intCharCode)) {
					HtmlDecode = HtmlDecode.substring(0, lngStartPos) + String.fromCharCode(intCharCode) + HtmlDecode.substring(lngEndPos+1, HtmlDecode.length);
				}
			}
		}
	} while (lngStartPos != -1 && lngEndPos != -1);
	
	return HtmlDecode;
}

/* 取得目前網址列的參數值
 * @param   name		參數名稱
 * @return  string
 */
function getParamValue(name) {
    var querystring;
    var values;
    var result = "";
    
    if (location.search.length>1) {
        querystring = unescape(location.search+"&");
        
        var re = new RegExp("[\?|\&]"+name+"=(.+)\&");
        values = querystring.match(re);
        if (values != null) {

            result = values[1];
            if (result.indexOf("&") != -1) {
                result = result.substring(0, result.indexOf("&"));
            }
        }
    }
    return result;
}
