function removeFrm() {
	if (document.getElementById('frmDIV')) {
		var shimmer = document.getElementById('frmDIV');
		document.body.removeChild(shimmer);
	}
}

function createFrm(element,top,left,width,height) {
	var shimmer = document.createElement('iframe');
	var result_height = 0;
	
	shimmer.id = 'frmDIV';
	shimmer.style.position = 'absolute';
	shimmer.style.top = top +'px';
	shimmer.style.left = left + 'px';
	shimmer.style.width = width + 'px';
	shimmer.style.height = height + 'px';
	shimmer.style.zIndex = '999';
	
	document.body.appendChild(shimmer);
}

/**
 * 取得某元素在螢幕的中間位置。
 *
 * @return 回傳左上角的座標陣列。
 */
function getUIPosition(element) {
	var position = new Array(2);  // left、top
	var agent = navigator.userAgent.toLowerCase();
	
	position[0] = $(window).width() / 2 - $(element).outerWidth() / 2;
	position[1] = $(window).height() / 2 - $(element).outerHeight() / 2;
	
	if (agent.indexOf('firefox') != -1)  // FireFox
		createFrm(element, position[1], position[0], $(element).width(), $(element).height() + 18);
	
	return position;
}

/**
 * 主要用在 Grid 上，當某一列取得滑鼠指標時，變更該列的背景顏色。
 * obj ---------- 欲更改背景顏色的物件。
 */
function doGridMouseOver(obj) {
	obj.style.backgroundColor = '#CCE0EB';
}

/**
 * 主要用在 Grid 上，當某一列失去滑鼠指標時，還原該列的背景顏色，有區分單、雙列不同的顏色。
 * obj ---------- 欲更改背景顏色的物件。
 */
function doGridMouseOut(obj) {
	//obj.style.backgroundColor = '#FFFFFF';
	
	if (obj.className.indexOf('row_odd') != -1)
		obj.style.backgroundColor = '#EEEEEE';
	else
		obj.style.backgroundColor = '#FFFFFF';
}

/**
 * 主要運用在按鈕的字型變色上，以達到更好的 UI 效果。
 * isOver ------ 若為 true，表示由 doMouseOver 事件觸發；反之則由 doMouseOut 事件觸發。
 * objID ------- 欲進行處理的物件 ID。
 * clsOver ----- 此物件被觸發 MouseOver 事件時，文字顏色要變成哪個 css 的 class name。
 * clsOut ------ 此物件被觸發 MouseOut 事件時，文字顏色要變成哪個 css 的 class name。
 */
function doButtonMouseHover(isOver, objID, clsOver, clsOut) {
	if (isOver)
		$('#' + objID).removeClass(clsOut).addClass(clsOver).css('cursor', 'pointer');
	else
		$('#' + objID).removeClass(clsOver).addClass(clsOut).css('cursor', 'default');
}

/**
 * 計算 sString 的字元長度，中文為 2，其餘為 1。
 * sString ---------- 欲進行計算的字串。
 */
function calTextLen(sString) {
	var iLen = 0;
	
	for (var idx = 0; idx < sString.length; idx++) {
		if (sString.charCodeAt(idx) > 255)
			iLen += 2;
		else
			iLen++;
	}
	
	return iLen;
}

/**
* 回傳 iMaxLen 指定長度的字串，計算長度的方式：小寫字母為 1；中文為 2；其餘為 1.5。
* sSourceWord ----- 欲進行處理的文字。
* iMaxLen --------- 指定的最大長度。
*/
function cutTextByLen(sSourceWord, iMaxLen) {
	var sResult = sSourceWord;
	var iLen = 0;
	
	for (var idx = 0; idx < sSourceWord.length; idx++) {
		if (iLen >= iMaxLen) {
			sResult = sSourceWord.substring(0, idx) + '...';
			break;
		}
		
		if (sSourceWord.charAt(idx).charCodeAt(0) <= 255)
			(sSourceWord.charAt(idx).charCodeAt(0) >= 65) && (sSourceWord.charAt(idx).charCodeAt(0) <= 90) ? iLen += 1.5 : iLen += 1;
		else
			iLen += 2;
	}
	
	return sResult;
}

/**
 * 查詢 sCheckString 是否有包含雙位元的字元。
 * sCheckString ---------- 欲檢查的字串。
 */
function isChinese(sCheckString) {
	for (var idx = 0; idx < sCheckString.length; idx++)
		if (sCheckString.charCodeAt(idx) > 255)
			return true;
	
	return false;
	
	/*
	var kkk = '，、。《》∼→※●^_^：？！【】『』★■http發';
	
	for (var idx = 0; idx < kkk.length; idx++)
		alert(kkk.charAt(idx) + '--->' + escape(kkk.charAt(idx)) + '--->' + kkk.charCodeAt(idx));
		
	var strlen = str.length;
	
	if (strlen > 0) {
		for (var idx = 0; idx < strlen; idx++) {
			c = '';
			c = escape(str.charAt(i));
			
			if (c.charAt(0) == '%') {
				cc = c.charAt(1);  //IE~u,NS~A
				
				if ((cc == 'A') || (cc == 'u'))
					return true;
			}
		}
		
		return false;
	} else {
		return false;
	}
	*/
}

/**
 * 過濾訊息結尾的空白與斷行，不予計算字數。
 * sFilterString ---------- 欲過濾的字串。
 */
function filterBSAndBL(sFilterString) {
	var iLen = 0;
	
	for (var idx = (sFilterString.length - 1); idx >= 0; idx--) {
		if (sFilterString.charAt(idx) == '\u0020' || sFilterString.charAt(idx) == '\n')
			iLen++;
		else
			break;
	}
	
	return iLen;
}

/**
 * 計算 sMessage 的簡訊則數，以位元為計算單位。
 * sMessage ---------- 欲計算的字串。
 */
function countMessageLine(sMessage) {
	var sRemainMessage = sMessage;             // 剩餘的訊息內容
	var sSingleMessage = "";                   // 單通簡訊內容
	var iRemainLen = sRemainMessage.length;  // 剩餘訊息內容的長度
	var iSingleLen = 0;                        // 單通簡訊內容的實際長度
	var iMessageLine = 0;                      // 回傳切割後的簡訊則數數量
	
	while (iRemainLen > 0) {
		if (iRemainLen >= 160) {
			sSingleMessage = sRemainMessage.substring(0, 160);
			iSingleLen = 160;
		} else {
			sSingleMessage = sRemainMessage.substring(0);
			iSingleLen = sRemainMessage.length;
		}
		
		if (sSingleMessage.length > 70) {
			if (isChinese(sSingleMessage)) {
				sSingleMessage = sRemainMessage.substring(0, 70);
				iSingleLen = 70;
			}
		}
		
		sRemainMessage = sRemainMessage.substring(iSingleLen);
		iRemainLen = sRemainMessage.length;
		iMessageLine++;
	}
	
	return iMessageLine;
}

/**
 * 取得 XMLHttpRequest 物件。
 */
function getXMLHttpRequest() {
	if (window.ActiveXObject) {
		try {
			return new ActiveXObject('Microsoft.XMLHTTP');
		} catch (e) {
			return new ActiveXObject('Msxml2.XMLHTTP');
		}
	} else if (window.XMLHttpRequest) {
		return new XMLHttpRequest();
	}
}

/**
 * 建立 AJAX 的 connection，如果成功則會有一全域變數 reqHttp 可供後續使用。
 * sURL ------------------ 呼叫 server side 的 URL。
 * sURLString ------------ 帶入 sURL 的使用者參數。
 * sCallbackFunction ----- 後續處理回傳資料事宜的 function name。
 *
 * return HttpRequest 物件，不使用全域變數是避免在同一個網頁中執行兩次 AJAX 時，造成 HttpRequest 物件被第二次呼叫的程式覆蓋。
 */
function runAJAX(sURL, sURLString, sCallbackFunction) {
	var reqHttp = getXMLHttpRequest();
	
	if (reqHttp) {
		reqHttp.open('POST', sURL, true);
		reqHttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
		reqHttp.setRequestHeader('Content-length', sURLString.length);
		reqHttp.setRequestHeader('Connection', 'close');
		reqHttp.onreadystatechange = eval(sCallbackFunction);
		reqHttp.send(sURLString);
	} else {
		alert('Your browser does not support AJAX!');
	}
	
	return reqHttp;
}

/**
 * 建立 XMLDOM 物件，用來載入 XML 格式的檔案。
 */
function getXMLDOM(sXMLURL) {
	var xmlDoc;
	
	// Chrome browser 處理方式是當做一個 HTTP Request
	if ((navigator.userAgent.toLowerCase().indexOf("chrome") != -1)) {
		var reqHttp = getXMLHttpRequest();
		var aryURL = sXMLURL.split('?');
		
		// 有帶入 URLString 時
		if (aryURL.length == 2) {
			reqHttp.open('POST', aryURL[0], false);
			reqHttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
			reqHttp.setRequestHeader('Content-length', aryURL[1].length);
			reqHttp.setRequestHeader('Connection', 'close');
			
			reqHttp.onreadystatechange = function() {
				if ((reqHttp.readyState == 4) && (reqHttp.status == 200))
					xmlDoc = reqHttp.responseXML;
			};
			
			reqHttp.send(aryURL[1]);
		} else {
			reqHttp.open('GET', aryURL[0], false);
			reqHttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
			reqHttp.setRequestHeader('Connection', 'close');
			
			reqHttp.onreadystatechange = function() {
				if ((reqHttp.readyState == 4) && (reqHttp.status == 200))
					xmlDoc = reqHttp.responseXML;
			};
			
			reqHttp.send('');
		}
	} else {
		// Load XML
		if (window.ActiveXObject) {
			xmlDoc = new ActiveXObject('Microsoft.XMLDOM');
			xmlDoc.async = false;
		} else if (document.implementation && document.implementation.createDocument) {
			// code for Mozilla, Firefox, Opera, etc.
			xmlDoc = document.implementation.createDocument('', '', null);
			xmlDoc.async = false;
		} else {
			alert('Your browser cannot handle this script!');
			return null;
		}
		
		xmlDoc.load(sXMLURL); 
	}
	
	return xmlDoc;
}

/**
 * 使用 JavaScript 物件 Parse XML String，回傳 XML 物件。
 * sXMLString ----- XML 文件。
 */
function parseXML(sXMLString) {
	if (window.ActiveXObject) {
		var xmlDoc = new ActiveXObject('Microsoft.XMLDOM');
		xmlDoc.loadXML(sXMLString)
		return xmlDoc;
	} else if (document.implementation && document.implementation.createDocument) {
		// code for Mozilla, Firefox, Opera, etc.
		return new DOMParser().parseFromString(sXMLString, 'text/xml');
	} else {
		alert('Your browser cannot handle this script!');
		return null;
	}
}

/**
 * 處理 FireFox、IE 瀏覽器的 Client 端使用 XSLT 轉換 XML 文件的功能。
 * xmlDoc ------------ XML 文件。
 * xslDoc ------------ XSL 文件。
 * sXSLTResultID ----- XSLT 轉換完之後的 HTML 要置放的 DIV ID 值，預設是 idXSLTResult。
 */
function writeXSLTResult(xmlDoc, xslDoc, sXSLTResultID) {
	// 更新報價資訊 (根據瀏覽器的差異有不同的程式碼)
	if (window.ActiveXObject) {
		document.getElementById(sXSLTResultID).innerHTML = xmlDoc.transformNode(xslDoc);
	} else if (document.implementation && document.implementation.createDocument) {
		var xsltProcessor = new XSLTProcessor();
		
		xsltProcessor.importStylesheet(xslDoc);
		
		document.getElementById(sXSLTResultID).innerHTML = new XMLSerializer().serializeToString(xsltProcessor.transformToDocument(xmlDoc));
	} else {
		document.write('Your browser cannot handle this script!');
	}
}

/**
 * 去掉開頭或結尾的空白字元。
 */
function trim(stringToTrim) {
	return stringToTrim.replace(/^\s+|\s+$/g, '');
}

/**
 * 置換 HTML 的特殊字元 (有順序)：&、<、>。
 */
function replaceHTMLChar(sReplaceString) {
	if (typeof sReplaceString != 'undefined')
		return sReplaceString.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
	else
		return '';
}
 
/**
 * 置換 JavaScript 的特殊字元 (有順序)：\、'、"。
 */
function replaceJSChar(sReplaceString) {
	if (typeof sReplaceString != 'undefined')
		return sReplaceString.replace(/\\/g, '\u005C').replace(/'/g, '\u0027').replace(/"/g, '\u0022');
	else
		return '';
}

/**
* 置換 HTML 的特殊字元 (有順序)：&、<、>。
*/
function reserveHTMLChar(sReserveString) {
	if (typeof sReserveString != 'undefined')
		return sReserveString.replace(/&gt;/g, '>').replace(/&lt;/g, '<').replace(/&amp;/g, '&');
	else
		return '';
}

/**
 * 將正整數 number 以三位一撇的樣式格式化，如：'41298312587' 經過格式化的結果為「41,298,312,587」。
 */
function formatNumber(number) {
	// number 字元必需全部由 0-9 數字組成，因此負數、浮點數都不處理
	if (/[^0-9]/.test(number))
		return number;
	
	number = number.replace(/^(\d*)$/, "$1\,");  // 在數字結尾補上一個「,」號
	
	// 尋找「4 個數字並以,結尾的樣式」，將符合的樣式分成兩個小組，第一個小組是「第 1 位數字」，第二個小組是「第 2~4 位數字加,」
	// 如：number = '41298312587,' 時，第一次符合此樣式的回傳值是 {'2', '587,'}
	var re = /(\d)(\d{3}\,)/;
	
	while (re.test(number))
		number = number.replace(re, "$1\,$2");
	
	number = number.substring(0, number.length - 1);
	return number;
}

/**
 * 使用 XSLT 動態將 sXMLURL 內容依據 sXMLURL 格式顯示至 idXSLTResult DIV 裡。
 * sXMLURL ------------ 存取資料內容的 URL。
 * sXSLURL ------------ XSL file 的相對路徑 (從 runtime 開始)。
 * idXSLTResult ------- 由 XSLT 轉換後的 HTML 要呈現在哪個 DIV 裡。預設為 idXSLTResult，若有同一個網頁多份 XSLT 時，就需要另外指定 DIV 的 ID。如：個股相關資的功能都會呈現即時報價，此時就會有兩份 XSLT。
 * iRefreshSecond ----- 使用 JavaScript 的自動更新功能，RefreshSecond 代表更新的間隔時間，若為 -1000 表示不用更新。
 * iStartHHMM --------- 當 iRefreshSecond != -1000 時才有意義，用來判斷自動更新的起始時間。如台股報價的起始時間是 0900。
 * iEndHHMM ----------- 當 iRefreshSecond != -1000 時才有意義，用來判斷自動更新的結束時間。如台股報價的結束時間是 1430。
 * iClearTimeoutID ---- 在列表頁若使用下拉式選單切換子類別時，要先清除之前設定的 setTimeout function，而此值即為該 setTimeout 的 ID。
 *
 * return 回傳 setTimeout 的 ID (全域變數：ClearTimeoutID)，以便後續可以進行 clearTimeout。
 */
function translateXML(sXMLURL, sXSLURL, idXSLTResult, iRefreshSecond, iStartHHMM, iEndHHMM) {
	if ((typeof ClearTimeoutID != 'undefined') || (ClearTimeoutID != ''))
		clearTimeout(ClearTimeoutID);
	
	// 判斷是否在 member 底下的功能
	$('#' + idXSLTResult).html('<img src="' + (sXMLURL.indexOf('..') == -1 ? '' : '../') + 'img/ajax-loader.gif" border="0" />');
	
	// Load XML
	var xmlDoc = getXMLDOM(sXMLURL);
	
	// 有回傳 XML 才需要後續 XSLT 的轉換動作
	if (xmlDoc.childNodes.length >= 1) {
		// Load XSL
		var xslDoc = getXMLDOM(sXSLURL);
		writeXSLTResult(xmlDoc, xslDoc, idXSLTResult);
	}
	
	if (iRefreshSecond != -1000) {
		doHideField();
		
		// 更新時間需介於 9:00 ~ 13:40 之間
		var date = new Date();
		var refreshTime = date.getHours() + '' + (date.getMinutes() < 10 ? '0' : '') + date.getMinutes();
		
		if ((refreshTime > iStartHHMM) && (refreshTime < iEndHHMM))
			ClearTimeoutID = setTimeout("translateXML('" + sXMLURL + "', '" + sXSLURL + "', '" + idXSLTResult + "', " + iRefreshSecond + ", " + iStartHHMM + ", " + iEndHHMM + ");", iRefreshSecond);
	}
}

/**
 * 判斷是否為數字。若是則回傳 true；反之則回傳 false。
 * str -------- 進行判斷的字串。
 */
function isNum(str) {
	if ((str != null) && (str != ''))
		return ! isNaN(str);
	
	return false;
}

/**
 * 取得系統目前的日期，格式為 YYYYMMDD。
 * iDiffDay ----- 整數值，代表要取得與今日相差多少天的日期。
 */
function getSysDate(iDiffDay) {
	var date = new Date();
	var yy = parseInt(date.getFullYear(), 10);
	var mm = parseInt(date.getMonth() + 1, 10);
	mm = mm < 10 ? '0' + mm : mm;
	var dd = parseInt(date.getDate(), 10) < 10 ? '0' + date.getDate() : date.getDate();
	
	if (typeof iDiffDay != 'undefined') {
		var lMilliSeconds = date.getTime();
		date = new Date(lMilliSeconds);
		yy = parseInt(date.getFullYear(), 10);
		mm = parseInt(date.getMonth() + 1, 10);
		mm = mm < 10 ? '0' + mm : mm;
		dd = parseInt(date.getDate(), 10) < 10 ? '0' + date.getDate() : date.getDate();
		
		lMilliSeconds += iDiffDay * 24 * 60 * 60 * 1000;
		
		date = new Date(lMilliSeconds);
		yy = parseInt(date.getFullYear(), 10);
		mm = parseInt(date.getMonth() + 1, 10);
		mm = mm < 10 ? '0' + mm : mm;
		dd = parseInt(date.getDate(), 10) < 10 ? '0' + date.getDate() : date.getDate();
	}
	
	return yy + '' + mm + '' + dd;
}

/**
 * 取得系統目前的時間，格式為 HH:MM:SS。
 */
function getSysTime() {
	var date = new Date();
	var h = parseInt(date.getHours(), 10) < 10 ? '0' + date.getHours() : date.getHours();
	var m = parseInt(date.getMinutes(), 10) < 10 ? '0' + date.getMinutes() : date.getMinutes();
	var s = parseInt(date.getSeconds(), 10) < 10 ? '0' + date.getSeconds() : date.getSeconds();
	
	return h + ':' + m + ':' + s;
}

/**
 * 取得 yyyy 年 month 月份的最大天數。
 */
function getMonthMaxDays(yyyy, month) {
	var date = new Date(yyyy + '/' + (month + 1) + '/0');
	/*
	for (var idx = 0; idx < 13; idx++) {
		var date = new Date('2009/' + idx + '/0');
		alert('2009/' + idx + '/0--->' + date.getDate() + '--->' + date.getFullYear() + '/' + (date.getMonth() + 1) + '/' + date.getDate());
	}
	*/
	return date.getDate();
}

/**
 * 統編驗證
 * idvalue ----- 統一編號
 */
function invoiceChk(idvalue) {
	var tmp = new String('12121241');
	var sum = 0;
	
	re = /^\d{8}$/;
	
	if (! re.test(idvalue))
		return false;
	
	for (var idx = 0; idx < 8; idx++) {
		s1 = parseInt(idvalue.substr(idx, 1));
		s2 = parseInt(tmp.substr(idx, 1));
		sum += cal(s1 * s2);
	}
	
	if (((sum % 10 == 0) ? false : true)) {
		if (idvalue.substr(6, 1) == '7')
			return(((sum + 1) % 10 == 0) ? true : false);
	}
	
	return ((sum % 10 == 0) ? true : false);
}

function cal(n) {
	var sum = 0;
	
	while (n != 0) {
		sum += (n % 10);
		n = (n - n % 10) / 10;  // 取整數
	}
	
	return sum;
}

/**
 * 手機號碼驗證
 * val ----- 手機號碼
 */ 
function mobileChk(val) {
	var moPhone = new RegExp(/^(09([0-9]){8})$/);
	return moPhone.test(val);
}

/**
 * 區域市話號碼驗證(暫時沒用到)
 * val ----- 區域市話號碼
 */ 
function telChk(val) {
	var re = new RegExp(/^(\(0[2-9]{1,2}\)[0-9]{6,8})$/);
	return re.test(val);
}

/**
 * E-mail驗證
 * email ----- E-mail字串
 */
function emailChk(email) {
	if (email == '')
		return false;
	
	var reEmail = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/;
	return reEmail.test(email);
}

/**
 * 判斷字串的長度是否在規定範圍中。
 * 
 * @param sStr 欲進行判斷的字串。
 * @param iMinLen 字串的最小長度。
 * @param iMaxLen 字串的最大長度。
 * 
 * @return boolean。
 */
function isLengthFit(sStr, iMinLen, iMaxLen) {
	return (sStr.length >= iMinLen) && (sStr.length <= iMaxLen);
}

/** 
 * 呼叫 ajax 載入資料  (請指定 ajaxRespSuccessFun(result) 和 ajaxRespErrorFun(xhr, textStatus) 來接收資料 )
 * @param sUrl ------------------- 呼叫server端程式
 * @param sType ------------------ GET or POST
 * @param parameter -------------- 傳遞參數(若無參數,請帶空字串)
 * @param sDataType -------------- 回傳的資料格式(XML,json,text...)
 * @param sTimeout --------------- 設定timeout時間，若為空字串則用預設值
 * @param sErrorCnt -------------- 指定錯誤發生最多次數
 * @param ajax_no_data_count ----- 計數載入錯誤的次數
 * @param successFun ------------- ajax成功時所指定的呼叫函式
 * @param errorFun --------------- ajax失敗時所指定的呼叫函式
 */
function ajaxLoadData(sUrl, sType, parameter, sDataType, sTimeout, sErrorCnt, ajax_no_data_count, successFun, errorFun) {
	if (arguments.length != 9) {
		alert('參數個數有誤');
		return;
	}
	
	if (isNaN(sTimeout)) {
		if (trim(sTimeout) != '') {
			alert('參數 sTimeout 須為數字');
			return;
		}
	} else
		gAjaxSetTimeout = sTimeout;
	
	if (isNaN(sErrorCnt) && (trim(sErrorCnt) != '')) {
		alert('參數 sErrorCnt 須為數字');
		return;
	}
	
	$.ajax({
		url: sUrl,
		type: sType,
		data: parameter,
		dataType: sDataType,
		timeout: gAjaxSetTimeout,
		error: function(XMLHttpRequest, textStatus, errorThrown) {
			if (++ajax_no_data_count > sErrorCnt)
				if (errorFun != null)
					window[errorFun](XMLHttpRequest, textStatus, errorThrown);
			else
				ajaxLoadData(sUrl, sType, parameter, sDataType, sTimeout, sErrorCnt, ajax_no_data_count, successFun, errorFun);
		},
		success: function(data) {
			if (successFun != null)
				window[successFun](data, parameter);
		}
	});
	
	if ((ajax_no_data_count > sErrorCnt) && (errorFun != null))
		window[errorFun](XMLHttpRequest, textStatus, errorThrown);
}

/**
 * 顯示分頁記錄 (querySMS.jsp)。
 * 
 * @param iDisplayPage ------------ 顯示的頁次記錄。
 * @param funcGenerateRows -------- 產生記錄列表的函式名稱。
 * @param funcGenerateLink -------- 非必要參數，產生說明及功能列表的函式名稱。
 * @param funcLoadingNextPage ----- 非必要參數，若有需要動態載入分頁記錄時使用此函式名稱處理相關事宜。
 */
function displayGridList(iDisplayPage, funcGenerateRows, funcGenerateLink, funcLoadingNextPage) {
	var iStartRow = (iDisplayPage - 1) * gPageCount;
	var iEndRow = Math.min(iDisplayPage * gPageCount, paging.iTotalRow);
	var iArrayIndex = paging.iPageCounts == 0 ? 0 : Math.floor(iStartRow / paging.iPageCounts);
	
	if ((typeof xmlDocumentArray != 'undefined') && (typeof xmlDocumentArray[iArrayIndex] == 'undefined')) {
		var aryPosition = getUIPosition('div#divLoading');
		
		$.blockUI({
			message: $('div#divLoading'),
			css: {top: aryPosition[1] + 'px', left: aryPosition[0] + 'px', width: '100px', border: '0px'},
			// allow body element to be stetched in ie6; this makes blocking look better on "short" pages. disable if you wish to prevent changes to the body height
			allowBodyStretch: false
		});
		
		if ((funcLoadingNextPage != null) && (typeof funcLoadingNextPage != 'undefined'))
			window[funcLoadingNextPage](iArrayIndex + 1, iDisplayPage);
		
		return;
	}
	
	$('#queryGridResult').html(window[funcGenerateRows](iArrayIndex, iStartRow - (iArrayIndex * paging.iPageCounts), iEndRow - (iArrayIndex * paging.iPageCounts)));
	
	$('table.table_grid tr:gt(0):odd').addClass('row_odd');
	
	displaySelectPage($('.pagination'), iDisplayPage, paging.iTotalRow, paging.iTotalPage, funcGenerateRows, funcGenerateLink, funcLoadingNextPage);
	
	if ((funcGenerateLink != null) && (typeof funcGenerateLink != 'undefined'))
		window[funcGenerateLink]();
	
	//$('#showPageTop').find('tr:eq(0)').find('td:eq(0)').html(sActionHTML);
	//displaySelectPage($('#selectPageContent'), iTotalPage, iDisplayPage);	
	//$('#showPageBottom').html($('#showPageTop').html());
	
	// 設定 Grid 區間的固定高度
	$('#queryGridResult').css('height', (gPageCount * 30) + 40 + 'px');
	/*
	if ($.browser.msie) {
		$('#queryGridResult').css('height', (gPageCount * 30) + 40 + 'px');
		//$('#queryGridResult').css('height', ((iEndRow - iStartRow) * 30) + 40 + 'px');
		$('#queryGridResult').css('width', '100%');
	} else if (($.browser.firefox) || ($.browser.chrome)) {
		$('#queryGridResult').css('height', (gPageCount * 27) + 40 + 'px');
		//$('#queryGridResult').css('height', ((iEndRow - iStartRow) * 27) + 40 + 'px');
		$('#queryGridResult').css('width', '770px');
	} else {
		// default
		$('#queryGridResult').css('height', (gPageCount * 27) + 40 + 'px');
		//$('#queryGridResult').css('height', ((iEndRow - iStartRow) * 27) + 40 + 'px');
		$('#queryGridResult').css('width', '770px');
	}
	
// 	alert('queryGridResult height--->' + $('#queryGridResult').css('height'));
// 	alert('queryGridResult width--->' + $('#queryGridResult').css('width'));
// 	alert('showPageTop height--->' + $('#showPageTop').css('height'));
// 	alert('showPageTop width--->' + $('#showPageTop').css('width'));
	 */
}

/* Ajax 失敗時的預設回呼函式 */
function funcErrorQueryGrid(XMLHttpRequest, textStatus, errorThrown) {
	// 如果有另行定義「回呼函式」(funcErrorUDF)，則執行這個函式 
	if (typeof funcErrorUDF == 'function')
		funcErrorUDF(XMLHttpRequest, textStatus, errorThrown);
	else
		$('#queryGridResult').empty().addClass('fs_14').addClass('fc_red').html(gAjaxErrorMsg);
}

/* Ajax 成功時的預設回呼函式 */
function funcSuccessQueryGrid(xmlResponse, param) {
	// 需自行定義「回呼函式」(funcSuccessUDF) 
	if (typeof funcSuccessUDF == 'function')
		funcSuccessUDF(xmlResponse, param);
}

/**
 * 產生頁次的下拉式選單。
 * @param objDIV ------------------ 要顯示頁次 HTML 的 DIV 物件，使用 jQuery 封裝。
 * @param iDisplayPage ------------ 目前要顯示的頁次。
 * @param iTotalRow --------------- 總筆數。
 * @param iTotalPage -------------- 總頁次。
 * @param funcGenerateRows -------- 產生記錄列表的函式名稱。
 * @param funcGenerateLink -------- 產生說明及功能列表的函式名稱。
 * @param funcLoadingNextPage ----- 需要動態載入分頁記錄時使用此函式名稱處理相關事宜。
 */
function displaySelectPage(objDIV, iDisplayPage, iTotalRow, iTotalPage, funcGenerateRows, funcGenerateLink, funcLoadingNextPage) {
	if (iTotalPage > 1) {
		var sSelectPage = '共 ' + iTotalRow + ' 筆，分 ' + iTotalPage + ' 頁<span style="padding-left: 20px;"></span>';
		var iStartPage = Math.min(Math.max(1, iDisplayPage - 2), Math.max(1, iTotalPage - 4));
		var iEndPage = Math.min(iStartPage + 4, iTotalPage);
		
		// 組合後面三個函數名稱的字串
		var sFunctionString = '';
		
		if ((funcGenerateRows != null) && (typeof funcGenerateRows != 'undefined'))
			sFunctionString = sFunctionString + ', \'' + funcGenerateRows + '\'';
		
		if ((funcGenerateLink != null) && (typeof funcGenerateLink != 'undefined'))
			sFunctionString = sFunctionString + ', \'' + funcGenerateLink + '\'';
		
		if ((funcLoadingNextPage != null) && (typeof funcLoadingNextPage != 'undefined'))
			sFunctionString = sFunctionString + ', \'' + funcLoadingNextPage + '\'';
		
		if (iDisplayPage != 1) {
			sSelectPage += '<span><a href="#" onclick="javascript: displayGridList(1' + sFunctionString + '); return false;">第一頁</a></span>';
			sSelectPage += '<span><a href="#" onclick="javascript: displayGridList(' + (Number(iDisplayPage) - 1) + sFunctionString + '); return false;">上一頁</a></span>';
		}
		
		for (var idx = iStartPage; idx <= iEndPage; idx++) {
			if (idx == iDisplayPage)
				sSelectPage += '<span class="current">' + idx + '</span>';
			else
				sSelectPage += '<span><a href="#" onclick="javascript: displayGridList(' + idx + sFunctionString + '); return false;">' + idx + '</a></span>';
		}
		
		if (iDisplayPage != iTotalPage) {
			sSelectPage += '<span><a href="#" onclick="javascript: displayGridList(' + (Number(iDisplayPage) + 1) + sFunctionString + '); return false;">下一頁</a></span>';
			sSelectPage += '<span><a href="#" onclick="javascript: displayGridList(' + iTotalPage + sFunctionString + '); return false;">最後頁</a></span>';
		}
		
		objDIV.html(sSelectPage);
	}
}

/**
 * 當某筆記錄的 CheckBox 被選取或取消時，需要同步處理 sToggleAllCheckBoxName CheckBox 物件的選取狀態。
 * @param sToggleAllCheckBoxName ----- 「全選」或「全取消」的 CheckBox 物件名稱。
 */
function checkToggle(sToggleAllCheckBoxName) {
	var isToggleAll = true;
	
	$('input[name^="chk_"]').each(function(idx) {
		if (! $(this).attr('checked')) {
			isToggleAll = false;
			return;
		}
	});
	
	$('input[name^="' + sToggleAllCheckBoxName + '"]').attr('checked', isToggleAll);
}

/**
 * 處理記錄的「全選」或「全取消」功能。
 * @param obj --------------------- 呼叫此功能的 CheckBox 物件，並以此物件的選取狀況來決定是要「全選」或「全取消」。
 * @param sCheckBoxPrefixName ----- Input CheckBox 元件的 prefix name。
 */
function toggleAll(obj, sCheckBoxPrefixName) {
	if ($(obj).attr('checked')) {
		$('input[name^="' + sCheckBoxPrefixName + '"]').each(function(idx) {
			$(this).attr('checked', true);
		});
	} else {
		$('input[name^="' + sCheckBoxPrefixName + '"]').each(function(idx) {
			$(this).attr('checked', false);
		});
	}
}
