/*
 * descript:
 *     這元件主要是放置一般網頁常用的功能，如數字的檢查、字串前後空白的去除等等…
 * update date:
 *     2007-02-02
 *     2006-06-29
 *
 * author:
 *     Camus Chou (周文瑞)
 * varsion : 
 *     1.1.1.1
 *         . 修正isEmailFormat()的判斷規則
 *     1.1.1
 * 
*/

/*
 * prototype list
 * 	String:
 * 		trim()：傳回去除前後空白的值	20080331 rita modify 同時去除前後全形空白
 * 		ltrim()：傳回去除左邊空白的值	20080331 rita modify 同時去除左邊全形空白
 * 		rtrim()：傳回去除右邊空白的值	20080331 rita modify 同時去除右邊全形空白
 * 	
 * 	Node:
 * 		swapNode(targetNode);
 */

/*
 * object list
 * 	LabelValueObj: 可同時儲存 label 與 value 兩個值的物件。
 * 		getLabel();
 * 		getValue();
 */ 
 
/*
 * function list
 * 		sendPost(url)：用來將原本用Get連結的方式改成用Post
 * 		isNumeric(value)：檢查是否為數字
 * 		isInteger(value)：檢查是否為整數數字
 * 		isPositiveInteger(value)：檢查是否為正整數數字
 * 		isPositiveFloat(value)：檢查是否為正浮點數數字
 * 		isWestDate(year, month, day)：檢查是否為有效的西元日期
 * 		isRocDate (year, month, day)：檢查是否為民國日期
 * 		compareWestDate(date1, date2)：比對 date1 與 date2 那個西元日期比較大
 * 		compareRocDate(date1, date2)： 比對 date1 與 date2 那個民國日期比較大
 * 		isAnyOneChecked(obj)： 判斷傳進來的checkbox或radio陣列(或物件)是否有任何一個被勾選了。
 *		isEmailFormat(email)：判斷傳進來的字串是否符何Email格式
 * 		isAboveMaxNumOfWord(string, maxNum, analyzed2BytesWord)：判斷傳進來的字串是否大於指定的字數
 * 		existOneByteWord(string)：判斷傳進來的字串中，是否存在1Byte的字(英文與符號)
 * 		exist2BytesWord(string)：判斷傳進來的字串中，是否存在2Byte的字(中文字或全形符號)
 * 		isRocId(rocId)：判斷傳進來的字串是否為中華民國身分證號。
 * 
 * 		checkOperation(obj, checkedFlag)：執行勾選/取消勾選所傳入的checkbox陣列(或物件)
 * 		checkAll(obj) ：執行勾選所傳入的checkbox陣列(或物件)
 * 		uncheckAll(obj)：執行取消勾選所傳入的checkbox陣列(或物件)
 * 		reverseCheck(obj)：執行反向勾選所傳入的checkbox陣列(或物件)。
 * 
 * 		selectAllOptions(selectObj)：將傳入的select物件中的所有選項都選取起來
 * 		setSelectDefault (selectObj, defaultCode)：為傳入的Select物件設定初值
 * 		deleteAllSelectOptions (selectObj)：將傳入的Select物件中的所有選項清除
 * 
 * 		generateRandomString(len)：亂數產生一組字串
 * 
 * 		isSpecifyHtmlTag(tagName, obj)： 判斷傳進來的物件是否為指定的html tag
 *
 *		ValidateSpecialChar(objStr,ErrMsg):判斷傳進來的字串是否有包含某些特定字元
 *		f_check(obj,type):核查身分證與護照 ==>會呼叫check_tw_id(sId)
 */ 
//===================================================================================================================//
    /*
        description:
            去除字串前後空白。
            使用增加原 Javascript String 方法的方式，來讓 Javascript String 自身擁有去除前後空白的功能。
        brower version:
            IE?Netscape
        example:
            var testString = "   this is a sample.  ";
            alert("'" + testString + "'");
            alert("'" + testString.trim() + "'");
            alert("'" + testString.ltrim() + "'");
            alert("'" + testString.rtrim() + "'");
            
    */

    String.prototype.trim=trim;  //傳回去除前後空白的值	20080331 rita modify 同時去除前後全形空白
    String.prototype.ltrim=ltrim;  //傳回去除左邊空白的值	20080331 rita modify 同時去除左邊全形空白
    String.prototype.rtrim=rtrim;  //傳回去除右邊空白的值	20080331 rita modify 同時去除右邊全形空白
    
    function trim() {      
	  return this.replace(/^\s+|\s+$/g, "").replace(/^　+|　+$/g, "").replace(/^\s+|\s+$/g, "");
    } 
    function ltrim() {
      return this.replace(/(^\s*)/g, "").replace(/(^　*)/g, "").replace(/(^\s*)/g, "");
    }
    function rtrim() {
      return this.replace(/(\s*$)/g, "").replace(/(　*$)/g, "").replace(/(\s*$)/g, "");
    }

//===================================================================================================================//
	/*
	 * description:
	 *     可同時儲存 label 與 value 兩個值的物件。
	 * brower version:
	 *     IE、Netscape
	 */ 

	function LabelValueObj(label, value) {
		this.label    = label;
		this.value    = value;
		this.getLabel = LabelValueObj_getLabel;
		this.getValue = LabelValueObj_getValue;
	}
	function LabelValueObj_getLabel() {
		return this.label;
	}
	function LabelValueObj_getValue() {
		return this.value;
	}
//===================================================================================================================//
	/*
	 * descript:
	 *     用來將原本用Get連結的方式改成用Post
	 * parameter:
	 * 	   url: Get方式的字串，如：url?key1=value1&key2=value2......
	 */	
	function sendPost(url) {
		var tmp = url.indexOf("?");
        if (tmp >= 0) {
            // ** 1. 將參數取出來 ** //
            var linkUrl = url.substring(0, tmp);   // 要連結的 url
            var params  = url.substring(tmp + 1);  // 要傳遞的參數串
            
            // ** 2. 將參數串切割出來 ** //
            /*
             * 概念說明：
             *   1. 以「=」符號來切割字串，得到一個陣列。
             *   2. 從陣列中的第1個元素(元素從0開始計算)開始，再以"&"開始切割，
             *      此時是從字串的後面開始往前找，找到的第一個&的即是分割的token。
             *   3. 將&前的字串為前一個元素的value，&後的字串則為下一個key。
             * 
             * p.s.
             *    因為考量到傳遞的參數值中可能會帶有「=」與「&」的字元，所以
             *    此處並不使用「&」字元來切割字串。
             */
            // 以「=」符號來切割字串，得到一個陣列。
            var keys   = new Array();    // 用來存放參數的key
            var values = new Array();    // 用來存被參數的value
            var result = params.split("="); // 將參數串以"="符號切割
            var index = 0;               // 參數個數的計數器，由0開始
            var addEqualFlag = false;    // 當此值為true時，則value前要加上"="符號，
                                         // 此值是用來避免 key=value1=value2 的情況，
                                         // 如沒加此參數判斷，會切成key = value1
                                         // 加上此參數後，會正確切成 key = value1=value2
            
            keys[index]   = result[0];
            values[index] = "";
            index ++;
            for (var i=1; i<result.length; i++)
            {
                tmp = result[i].lastIndexOf("&");
                if (tmp >= 0 && i < result.length - 1)
                {
                    if (addEqualFlag)
                      values[index-1] += "=" + result[i].substring(0,tmp);
                    else
                      values[index-1] = result[i].substring(0,tmp);
                    
                    
                    keys[index]   = result[i].substring(tmp + 1);
                    values[index] = "";
                    index ++;
                    addEqualFlag = false;
                }
                else
                {
                    if (addEqualFlag)
                      values[index-1] += "=" + result[i];
                    else
                      values[index-1] = result[i];
                    addEqualFlag = true;
                    
                }
            }
            // ** 3. 組成一個form ** //
            var formObj = document.createElement("FORM");
            formObj.name = "sendPostForm";
            formObj.method = "POST";
            formObj.action = linkUrl;
            
            var inputObj = null;
            for (var i=0; i<keys.length; i++) {
            	
                if (keys[i].length > 0) { // 如果key的值是零長度字串，就不傳
                	inputObj = document.createElement("INPUT");
	            	inputObj.type = "hidden";    
	            	inputObj.name = keys[i];
	            	inputObj.value = values[i];
	            	formObj.appendChild(inputObj);
                }
                  
            }
            
            document.body.appendChild(formObj);
            
            // ** 4. 送出 **//
            formObj.submit();
            
            
        } else {
            location.href = url;
        }
	}
//===================================================================================================================//
	if (!document.all) {
		Node.prototype.swapNode = swapNode;
	}
	function swapNode(targetNode) {
		var targetNextNode   = targetNode.nextSibling;
		var targetParentNode = targetNode.parentNode;
		this.parentNode.replaceChild(targetNode, this);
		targetParentNode.insertBefore(this,targetNextNode);
	}
//==================================================================================================================//
	/*
	 * descript:
	 *      檢查是否為數字
	 * parameter:
	 * 	    value:要被檢查的字串
	 * return:
	 * 		true : 數字
	 * 		false: 非數字
	 * 
	 * since: 1.1
	 */	
	function isNumeric(value) {
		if (typeof(value) == 'number') {
			return true;
		} else {
			var data = value.match(/^-?\d+(\.?\d+)?/g);
			return (data == value);
		}
	}
	/*
	 * descript:
	 *      檢查是否為整數數字
	 * parameter:
	 * 	    value:要被檢查的字串
	 * return:
	 * 		true : 整數數字
	 * 		false: 非整數數字
	 * 
	 * since: 1.1
	 */	
	function isInteger(value) {
		if (typeof(value) == 'number') {
			if (("" + value).indexOf(".") < 0) {
				return true;
			} else {
				return false;
			}
		} else {
			var data = value.match(/^-?\d+/g);
			return (data == value);
		}
	}
	/*
	 * descript:
	 *      檢查是否為正整數數字
	 * parameter:
	 * 	    value:要被檢查的字串
	 * return:
	 * 		true : 正整數數字
	 * 		false: 非正整數數字
	 * 
	 * since: 1.1
	 */	
	function isPositiveInteger(value) {
		if (typeof(value) == 'number') {
			if (value > 0 && ("" + value).indexOf(".") < 0) {
				return true;
			} else {
				return false;
			}
		} else {
			var data = value.match(/\d+/g);
			return (data == value);
		}
	}
	/*
	 * descript:
	 *      檢查是否為正浮點數數字
	 * parameter:
	 * 	    value:要被檢查的字串
	 * return:
	 * 		true : 正浮點數數字
	 * 		false: 非正浮點數數字
	 * 
	 * since: 1.1
	 */	
	function isPositiveFloat(value) {
		if (typeof(value) == 'number') {
			if (value > 0) {
				return true;
			} else {
				return false;
			}
		} else {
			var data = value.match(/\d+(\.?\d+)?/g);
			return (data == value);
		}
	}
	
	function isEnglishAndNumeric (value) {
		if (value == null) {
			return false;
		}
		value = value.trim();
		if (value.length == 0) {
			return false;
		}
		
		if (value.match(/[^a-z|^A-Z|^0-9]/g)) {
			return false;
		} else {
			return true;
		}
		
	}
//==================================================================================================================//
	/*
	 * descript:
	 *      檢查是否為有效的西元日期
	 * parameter:
	 * 	    year : 西元年
	 * 	    month: 月
	 *      day  : 日
	 * return:
	 * 		true : 有效的西元日期
	 *		false: 無效的西元日期
	 * 
	 * since: 1.1
	 */	
	function isWestDate(year, month, day) {
		if (year == null)
			return false;

		month = month == null ? 1 : month;
		day   = day   == null ? 1 :day;

		if (isInteger(year) && isPositiveInteger(month) && isPositiveInteger(day)) {
			// 檢查年份是否合理
			if (year <= 0) {
				return false;
			}
			
			// 檢查月份是否合理
			if (month > 12 || month < 1) {
				return false;
			}
			
			// 檢查日期是否合理
			if (day < 1) {
				return false;
			}
			if (month == 1 || month == 3 || month == 5 || month == 7 || 
			    month == 8 || month == 10 || month == 12) {
				if (day > 31) {
					return false;
				}
			} else if (month != 2) {
				if (day > 30) {
					return false;
				}
			} else {
				var febDay = 28;
				// 判斷是否為閏年
				if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {
					febDay = 29;
				}
				
				if (day > febDay) {
					return false;
				}
			}
			
			return true;
		} else {
			return false;
		}
	}
	
	/*
	 * descript:
	 *     檢查是否為民國日期
	 * parameter:
	 * 	   year : 民國年
	 * 	   month: 月
	 *     day  : 日
	 * return:
	 * 		true : 有效的民國日期
	 *		false: 無效的民國日期
	 * 
	 * since: 1.1
	 */	
	function isRocDate (year, month, day) {
		if (year != null && isInteger(year)) {
			year = parseInt(year) + 1911;
			return isWestDate(year, month, day);
		} else {
			return false;
		}
	}
//==================================================================================================================//	
	/*
	 * descript:
	 *      比對 date1 與 date2 那個西元日期比較大
	 * parameter:
	 * 	    date1: Array 物件，代表西元日期，陣列中依序放置 西元年、月、日
	 * 	    date2: Array 物件，代表西元日期，陣列中依序放置 西元年、月、日
	 * return:
	 * 		= 0; 兩個日期相等
	 * 		> 0; date1 > date2
	 * 		< 0; date2 > date1
	 * 
	 * since: 1.1
	 */	
	function compareWestDate(date1, date2) {

		if (typeof(date1) != "object" &&
		    date1[0] == 'undefined') {
			throw new Error(1000001, "input argument data1 is not a array");
		}
		if (typeof(date2) != "object" &&
		    date2[0] == 'undefined') {
			throw new Error(1000002, "input argument data2 is not a array");
		}

		var year1  = date1[0];
		var month1 = date1[1] == null ? 1 : date1[1];
		var day1   = date1[2] == null ? 1 : date1[2];
		
		var year2  = date2[0];
		var month2 = date2[1] == null ? 1 : date2[1];
		var day2   = date2[2] == null ? 1 : date2[2];

		if (!isWestDate(year1, month1, day1)) {
			throw new Error(1000003, "input argument data1 is not a valid date");
		}

		if (!isWestDate(year2, month2, day2)) {
			throw new Error(1000004, "input argument data2 is not a valid date");
		}

		var westDate1 = new Date();
		westDate1.setFullYear(year1);
		westDate1.setMonth(month1 - 1);
		westDate1.setDate(day1);
		
		var westDate2 = new Date();
		westDate2.setFullYear(year2);
		westDate2.setMonth(month2 - 1);
		westDate2.setDate(day2);
		
		return westDate1.getTime() - westDate2.getTime();
	}
	/*
	 * descript:
	 *      比對 date1 與 date2 那個民國日期比較大
	 * parameter:
	 * 	    date1: Array 物件，代表民國日期，陣列中依序放置 民國年、月、日
	 * 	    date2: Array 物件，代表民國日期，陣列中依序放置 民國年、月、日
	 * return:
	 * 		= 0; 兩個日期相等
	 * 		> 0; date1 > date2
	 * 		< 0; date2 > date1
	 */	
	function compareRocDate(date1, date2) {

		if (typeof(date1) != "object" &&
		    date1[0] == 'undefined') {
			throw new Error(1000001, "input argument data1 is not a array");
		}

		if (typeof(date2) != "object" &&
		    date2[0] == 'undefined') {
			throw new Error(1000002, "input argument data2 is not a array");
		}

		if (date1[0] == null || !isInteger(date1[0])) {

			throw new Error(1000005, "input argument date1's year is not a numeric");
		}

		if (date2[0] == null || !isInteger(date2[0])) {
			throw new Error(1000006, "input argument date2's year is not a numeric");
		}
		date1[0] = parseInt(date1[0]) + 1911;
		date2[0] = parseInt(date2[0]) + 1911;
		
		return compareWestDate(date1, date2);
	}	
//==================================================================================================================//
	/*
	 * descript:
	 *      判斷傳進來的checkbox或radio陣列(或物件)是否有任何一個被勾選了。
	 * parameter:
	 * 	    obj: checkbox 陣列(或物件)
	 * return:
	 * 		true : 至少有一個checkbox或radio被勾選
	 * 		false: 完全沒有一個checkbox或radio被勾選
	 * 
	 * since: 1.1
	 */	
	function isAnyOneChecked(obj) {
		if (obj == null) {
			throw new Error(1000010, "input argument obj is null");
		}
		if (obj.length == null) { // 非陣列
			if (obj.tagName.toUpperCase() != 'INPUT' || (obj.type.toLowerCase() != "checkbox" && obj.type.toLowerCase() != "radio")) {
				throw new Error(1000011, "input argument obj is not a checkbox or radio obj");
			}
			return obj.checked;
			
		} else { // 陣列
			if (obj[0].tagName.toUpperCase() != 'INPUT' || (obj[0].type.toLowerCase() != "checkbox" && obj[0].type.toLowerCase() != "radio")) {
				throw new Error(1000011, "input argument obj is not a checkbox or radio obj");
			}
			for (var i=0; i<obj.length; i++) {
				if (obj[i].checked) {
					return true;
				}
			}
			return false;
		}
	}
//==================================================================================================================//
	/*
	 * descript:
	 *      判斷傳進來的字串是否符何Email格式
	 * parameter:
	 * 	    email: 字串
	 * return:
	 * 		true : 為Email格式字串
	 * 		false: 非Email格式字串
	 * 
	 * since: 1.1
	 * update: 2007-02-02 version 1.1.1.1
	 */	
	function isEmailFormat(email) {
		//var data = email.match(/^\S+@\S+\.\S+$/);
		//var data = email.match(/^[a-zA-Z0-9]+([\._-][a-zA-Z0-9]+)*@[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)+$/);
		//  2007-02-02
		var data = email.match(/^[a-zA-Z0-9]+([\._-][a-zA-Z0-9]+)*@([a-zA-Z0-9]+([_-][a-zA-Z0-9]+)*)(\.([a-zA-Z0-9]+([_-][a-zA-Z0-9]+)*))+$/);
		if (!data || !email) {
			return false;
		} else {
			return true;
		}
	}
//==================================================================================================================//
	/*
	 * descript:
	 *      判斷傳進來的字串是否大於指定的字數
	 * parameter:
	 * 	    string: 字串
	 * 		maxNum: 最大字數
	 * 		resolved2BytesWord: 是否要將中文字解析成兩個字數。true:要，false:不要 (預設為false)
	 * return:
	 * 		true : 傳進來的字串大於指定的字數
	 * 		false: 傳進來的字串小於、等於指定的字數
	 * 
	 * since: 1.1
	 */	
	function isAboveMaxNumOfWord(string, maxNum, analyzed2BytesWord) {
		analyzed2BytesWord = analyzed2BytesWord == null ? false : analyzed2BytesWord;
		if (!analyzed2BytesWord) {
			return string.length > maxNum;
		} else {
			var realNum = 0;
			for (var i=0; i<string.length; i++) {
				if (escape(string.charAt(i)).length >= 4) {
					realNum += 2;
				} else {
					realNum ++;
				}
			}

			return (realNum > maxNum)
		}
	}
//==================================================================================================================//
	/*
	 * descript:
	 *      判斷傳進來的字串中，是否存在1Byte的字(英文與符號)
	 * parameter:
	 * 	    string: 字串
	 * return:
	 * 		true : 傳進來的字串中存在1Byte的字(英文與符號)
	 * 		false: 傳進來的字串中並不存在1Byte的字(英文與符號)
	 * 
	 * since: 1.1
	 */	
	function existOneByteWord(string) {
		var len = string.length;
		for (var i=0; i<string.length; i++) {
			if (escape(string.charAt(i)).length < 4) {
				return true;
			}
		}
		return false;
	}
	/*
	 * descript:
	 *      判斷傳進來的字串中，是否存在2Byte的字(中文字或全形符號)
	 * parameter:
	 * 	    string: 字串
	 * return:
	 * 		true : 傳進來的字串中存在2Byte的字(中文字或全形符號)
	 * 		false: 傳進來的字串中並不存在2Byte的字(中文字或全形符號)
	 * 
	 * since: 1.1
	 */	
	function exist2BytesWord(string) {
		var len = string.length;
		for (var i=0; i<string.length; i++) {
			if (escape(string.charAt(i)).length >= 4) {
				return true;
			}
		}
		return false;
	}
//==================================================================================================================//	
	/*
	 * descript:
	 *      判斷傳進來的字串是否為中華民國身分證號。
	 * parameter:
	 * 	    rocId: 字串
	 * return:
	 * 		true : 是中華民國身分證號
	 * 		false: 不是中華民國身分證號
	 * 
	 * since: 1.1
	 */	
	function isRocId(rocId) {
		if (typeof(rocId).toLowerCase() != "string") {
			return false;
		}
		if (rocId.length != 10) {
			return false;
		}
		rocId = rocId.toUpperCase();
		var headChar = rocId.charAt(0);
		var bodyNum  = rocId.substring(1);
		
		if (headChar > 'Z' || headChar < 'A') {
			return false;
		}
		
		if (!isPositiveInteger(bodyNum)) {
			return false;
		}
		
		if (bodyNum.charAt(0) != '1' && bodyNum.charAt(0) != '2') {
			return false;
		}
		
		// 開始進入規則檢查
		var codes = new Array("10", "11", "12", "13", "14", "15", "16", "17", "34", "18", "19", "20", "21", "22", "35", "23", "24", "25", "26", "27", "28", "29", "32", "30", "31", "33");
		var headCode = codes[headChar.charCodeAt(0) - "A".charCodeAt(0)];

		var chkSum = 0;
		chkSum += parseInt(headCode.charAt(0)) * 1;
		chkSum += parseInt(headCode.charAt(1)) * 9;
		for (var i=8; i>=1; i--) {
			chkSum += parseInt(bodyNum.charAt(8-i)) * i;
		}
		var chkCode = Math.floor(chkSum % 10);
		chkCode = chkCode != 0 ? 10 - chkCode : chkCode;
		return parseInt(bodyNum.charAt(8)) == chkCode;
	}
//==================================================================================================================//	
	/*
	 * descript:
	 *      執行勾選/取消勾選所傳入的checkbox陣列(或物件)
	 * parameter:
	 * 	    obj: 要被勾選/取消勾選的checkbox陣列(或物件)
	 * 		checkedFlag : 要執行勾選(true)或取消勾選(false)的動作
	 * 
	 * since: 1.1
	 */	
	function checkOperation(obj, checkedFlag) {
		if (obj == null) {
			throw new Error(1000010, "input argument obj is null");
		}
		if (obj.length == null) { // 非陣列
			if (obj.tagName.toUpperCase() != 'INPUT' || obj.type.toLowerCase() != "checkbox") {
				throw new Error(1000020, "input argument obj is not a checkbox obj");
			}
			obj.checked = checkedFlag;
			
		} else { // 陣列
			if (obj[0].tagName.toUpperCase() != 'INPUT' || obj[0].type.toLowerCase() != "checkbox" ) {
				throw new Error(1000020, "input argument obj is not a checkbox obj");
			}
			for (var i=0; i<obj.length; i++) {
				obj[i].checked = checkedFlag;
				
			}
		}
	}
	/*
	 * descript:
	 *      執行勾選所傳入的checkbox陣列(或物件)
	 * parameter:
	 * 	    obj: 要被勾選的checkbox陣列(或物件)
	 * 
	 * since: 1.1
	 */	
	function checkAll(obj) {
		checkOperation (obj, true);
	}
	/*
	 * descript:
	 *      執行取消勾選所傳入的checkbox陣列(或物件)
	 * parameter:
	 * 	    obj: 要被取消勾選的checkbox陣列(或物件)
	 * 
	 * since: 1.1
	 */	
	function uncheckAll(obj) {
		checkOperation (obj, false);
	}
	
	/*
	 * descript:
	 *      執行反向勾選所傳入的checkbox陣列(或物件)。
	 * 		反向勾選即為將還本勾選的變成取消勾選，原本沒勾選的變成勾選。
	 * parameter:
	 * 	    obj: 要被反向勾選的checkbox陣列(或物件)
	 * 
	 * since: 1.1
	 */	
	function reverseCheck(obj) {
		if (obj == null) {
			throw new Error(1000010, "input argument obj is null");
		}
		if (obj.length == null) { // 非陣列
			if (obj.tagName.toUpperCase() != 'INPUT' || obj.type.toLowerCase() != "checkbox") {
				throw new Error(1000020, "input argument obj is not a checkbox obj");
			}
			if (obj.checked) {
				obj.checked = false;
			} else {
				obj.checked = true;
			}
			
		} else { // 陣列
			if (obj[0].tagName.toUpperCase() != 'INPUT' || obj[0].type.toLowerCase() != "checkbox" ) {
				throw new Error(1000020, "input argument obj is not a checkbox obj");
			}
			for (var i=0; i<obj.length; i++) {
				if (obj[i].checked) {
					obj[i].checked = false;
				} else {
					obj[i].checked = true;
				}
				
			}
		}
	}
//==================================================================================================================//
	/*
	 * descript:
	 *      將傳入的select物件中的所有選項都選取起來
	 * parameter:
	 * 	    selectObj: select物件
	 * 
	 * since: 1.1
	 */	
	function selectAllOptions(selectObj) {
		if (selectObj.tagName.toUpperCase() != 'SELECT') {
			throw new Error(1000030, "input argument obj is not a select obj");
		}
		
		for (var i=0; i<selectObj.options.length; i++) {
			selectObj.options[i].selected = true;
		}
	}
	
	/*
	 * descript:
	 *      為傳入的Select物件設定初值
	 * parameter:
	 * 	    selectObj: select物件
	 * 		defaultCode: 要設定的初值
	 * 
	 * since: 1.1
	 */	
	function setSelectDefault (selectObj, defaultCode) {
		if (selectObj.tagName.toUpperCase() != 'SELECT') {
			throw new Error(1000030, "input argument obj is not a select obj");
		}
		for (var i=0; i<selectObj.options.length; i++) {
			if (selectObj.options[i].value == defaultCode) {
				selectObj.options[i].selected = true;
				break;
			}
		}
		
	}
	
	/*
	 * descript:
	 *      將傳入的Select物件中的所有選項清除
	 * parameter:
	 * 	    selectObj: select物件
	 * 
	 * since: 1.1.1
	 */	
	function deleteAllSelectOptions (selectObj) {
		if (selectObj.tagName.toUpperCase() != 'SELECT') {
			throw new Error(1000030, "input argument obj is not a select obj");
		}
		for (var i=0; i<selectObj.options.length;) {
			selectObj.options[0] = null;
		}
		
	}	
//==================================================================================================================//
	/*
	 * descript:
	 *      亂數產生一組字串
	 * parameter:
	 * 	    len: 要產生的字串長度
	 * return:
	 * 		亂數產生的字串
	 * since: 1.1.1
	 */	
	function generateRandomString(len) {
		var randomString = "";
		var randomNum;
		for (var i=0; i<len; i++) {
			randomNum = Math.floor(Math.random() * 62);
			if (randomNum <= 25) {
				randomString += String.fromCharCode(65 + randomNum);
			} else if (randomNum >= 52) {
				randomString += String.fromCharCode(48 + (randomNum - 52));
			} else {
				randomString += String.fromCharCode(97 + (randomNum - 26));
			}
		}
		return randomString;
	}	
//==================================================================================================================//
	/*
	 * descript:
	 *      判斷傳進來的物件是否為指定的html tag
	 * parameter:
	 * 	    tagName: 
	 * 			指定的html tag 名稱，如果要判斷的html tag是input tag 系列，請輸入
	 *          type。如：hidden、text、checkbox…等。
	 *      obj: 要被判斷的物件
	 * return:
	 * 		true: 傳進來的物件是指定的 Html tag
	 * 		false: 傳進來的物件不是指定的 Html tag
	 * since: 1.1.1
	 */	
	 function isSpecifyHtmlTag(tagName, obj) {
	 	tagName = tagName.toUpperCase();
	 	if (new String(typeof(obj)).toLowerCase() != 'object' ||
	 		obj.tagName == null) {
	 		return false;
	 	} else {
	 		var objTagName = obj.tagName.toUpperCase();
	 		objTagName = objTagName == "INPUT" ? obj.type.toUpperCase() : objTagName;
 			if (objTagName == tagName) {
 				return true;
 			} else {
 				return false;
 			}
	 	}
	 }
	//==================================================================================================================//
	/*
	 * descript:
	 *      判斷傳進來的字串是否大於指定的字數
	 * parameter:
	 * 	    string: 字串
	 * 		maxNum: 最大字數
	 *      count: 超過ascii表127的字視為多長的字,若輸入1則視同不判斷2bytes以上的字
	 * return:
	 * 		true : 傳進來的字串大於指定的字數
	 * 		false: 傳進來的字串小於、等於指定的字數
	 * 
	 * since: 1.1
	 */	
	function isOverMaxNumOfWord(string, maxNum, count) {
		var realNum = 0;
		for (var i=0; i<string.length; i++) {
			    var codes=string.charCodeAt(i);
				if (codes<=127) {
					realNum ++;
				} else {
					realNum += count;
				}
		}
			return (realNum > maxNum)
	}
	
	//==================================================================================================================//
	/*
	 * descript:
	 *      判斷傳進來的AreaCode後傳回對應中文名稱
	 * parameter:
	 * 	    ItemName: Area元件
	 * 		areaCode: Area號碼(長度需大於4)
	 * return:
	 * 		true : 地址中文名稱
	 * 		false: 找不到對應code
	 * 
	 * since: 1.1
	 */		
	
	
	function getAreaName(ItemName,areaCode){
		
		if(areaCode.length < 4){
			return "areaCode錯誤"
		}
		RootObj = eval(ItemName);
		
		var first = areaCode.substring(3, 4);
		
		for (var j=(first-1);j<RootObj.n.length; j++){
			if(areaCode == RootObj.n[j].no){
    			return RootObj.n[j].des; 
    		}    
    		for(var i=0;i<RootObj.n[j].n.length; i++){
    			if(areaCode == RootObj.n[j].n[i].no){
    				return RootObj.n[j].n[i].des; 
    			}
    			for(var k=0;k<RootObj.n[j].n[i].n.length; k++){
    				if(areaCode == RootObj.n[j].n[i].n[k].no){
    					return RootObj.n[j].n[i].n[k].des; 
    				}
    			}
    		}
    	}
    	return "查無對應地址";
	}
	
	//==================================================================================================================//
	/*20071130 rita add
	 * descript:
	 *      判斷傳進來的字串是否有包含某些特定字元
	 * parameter:
	 * 	    objStr: 欄位元件
	 * 		ErrMsg: 要顯示的訊息
	 * return:
	 * 		true : 無包含特定字元
	 * 		false: 有包含特定字元
	 * 
	 */		
	
	function ValidateSpecialChar(objStr,ErrMsg)
	{
		var strLen = objStr.value.length;
		//20080516 rita modify
		//var charList = "~!@#$%^&*()_+|`-=\\{}[]:\"';?><,./“"
		var charList = "!@#$%^&*()_+|`=\\{}[]:\"';?><,./“"
	
		if (strLen > 0)
		{
			for(var i=0;i<strLen;i++){
				if(charList.indexOf(objStr.value.charAt(i)) != -1){
					if (ErrMsg != null && ErrMsg != "")
						alert(ErrMsg)
					objStr.focus();
					return false;
				}
			}
		}
	
		return true;
	}
	
	//==================================================================================================================//
	/*20071130 rita add
	 * descript:
	 *      核查身分證與護照 
	 * parameter:
	 * 	    obj: 欄位元件
	 * 		type: 類別  1:身份證檢核 2:護照檢核
	 * return:
	 * 		true : 不符合
	 * 		false: 符合
	 * 
	 */		
	
	function f_check(obj,type){
		var err = false;
	
		if (type == 1) { // 身份證檢核
			if (obj.value.length != 10) {
				return true;
			}else{
				if (!check_tw_id(obj.value)){
					return true;
				}
			}
		}else{// 護照檢核
			if (obj.value.trim() == "") {
				return true;
			}else{
				 var SouceStr = obj.value;
				 var _num = 0;
				 var _err = 0;
					 for(i=0;i<SouceStr.length;i++){
						chr = SouceStr.charCodeAt(i);
						if (chr >= 48 && chr <= 57){
							_num++;
						}else if ( (chr >= 65 && chr <= 90) || (chr >= 97 && chr <= 122)){
							 _num = _num + 0;
						}else{
							 _err++;
						}
					 }
					if (_err > 0 || _num == 0){
					return true;					
				}
			}
		}
	}
	
	function check_tw_id(sId){
		var LegalID = "0123456789"
		var fResult=true;
		if(sId.length<10)
			fResult=false;
		else{
			if((sId.charAt(0)=='A') || (sId.charAt(0)=='a')) value=10
			else if((sId.charAt(0)=='B') || (sId.charAt(0)=='b')) value=11
			else if((sId.charAt(0)=='C') || (sId.charAt(0)=='c')) value=12
			else if((sId.charAt(0)=='D') || (sId.charAt(0)=='d')) value=13
			else if((sId.charAt(0)=='E') || (sId.charAt(0)=='e')) value=14
			else if((sId.charAt(0)=='F') || (sId.charAt(0)=='f')) value=15
			else if((sId.charAt(0)=='G') || (sId.charAt(0)=='g')) value=16
			else if((sId.charAt(0)=='H') || (sId.charAt(0)=='h')) value=17
			else if((sId.charAt(0)=='J') || (sId.charAt(0)=='j')) value=18
			else if((sId.charAt(0)=='K') || (sId.charAt(0)=='k')) value=19
			else if((sId.charAt(0)=='L') || (sId.charAt(0)=='l')) value=20
			else if((sId.charAt(0)=='M') || (sId.charAt(0)=='m')) value=21
			else if((sId.charAt(0)=='N') || (sId.charAt(0)=='n')) value=22
			else if((sId.charAt(0)=='P') || (sId.charAt(0)=='p')) value=23
			else if((sId.charAt(0)=='Q') || (sId.charAt(0)=='q')) value=24
			else if((sId.charAt(0)=='R') || (sId.charAt(0)=='r')) value=25
			else if((sId.charAt(0)=='S') || (sId.charAt(0)=='s')) value=26
			else if((sId.charAt(0)=='T') || (sId.charAt(0)=='t')) value=27
			else if((sId.charAt(0)=='U') || (sId.charAt(0)=='u')) value=28
			else if((sId.charAt(0)=='V') || (sId.charAt(0)=='v')) value=29
			else if((sId.charAt(0)=='X') || (sId.charAt(0)=='x')) value=30
			else if((sId.charAt(0)=='Y') || (sId.charAt(0)=='y')) value=31
			else if((sId.charAt(0)=='W') || (sId.charAt(0)=='w')) value=32
			else if((sId.charAt(0)=='Z') || (sId.charAt(0)=='z')) value=33
			else if((sId.charAt(0)=='I') || (sId.charAt(0)=='i')) value=34
			else if((sId.charAt(0)=='O') || (sId.charAt(0)=='o')) value=35
			else fResult = false ;
			if (!(sId.charAt(1)==1||sId.charAt(1)==2))
			  fResult = false ;
		}
		if(fResult==true){
			value = Math.floor(value/10) + (value%10)*9 + parseInt(sId.charAt(1))*8 +
					parseInt(sId.charAt(2))*7 + parseInt(sId.charAt(3)) * 6 + parseInt(sId.charAt(4)) * 5 +
					parseInt(sId.charAt(5))*4 + parseInt(sId.charAt(6)) * 3+ parseInt(sId.charAt(7)) * 2+
					parseInt(sId.charAt(8)) + parseInt(sId.charAt(9)) ;
			value = value % 10 ;
			if(value!=0) fResult = false ;
	
			var i;
			var c;
			for (i = 1; i < sId.length; i++){
				c = sId.charAt(i);
				if (LegalID.indexOf(c) == -1) fResult = false;
			}
		}
		if(fResult == false)
			return false;
		else
			return true;
	}
	
	//---------------------------------------------------------------------------------------------------