//**************************************************************
//檔案名稱:Common.js
//目    的:提供共用的Javascript函數
// 版本變更：
// xx. YYYY/MM/DD	AUTHOR		COMMENTS
//  1. 2005/01/03	Dean		Create
//  2. 2006/02/04	Dean		Modify(增加gsetElmtReadWrite,gEvents)
//**************************************************************

//全域變數
var gInDesignMode = true;	//true:設計模式下，開啟JS錯誤訊息;false:非設計模式下，開閉JS錯誤訊息

//**************************************************************
//*函數名稱:gRequiredCheck()
//*目    的:畫面上必輸欄位檢查
//*參數說明:無
//*回轉值:無
//**************************************************************
function gRequiredCheck(){
	var objField;
	for(i=0; i<document.all.length; i++) {
		//逐一欄位檢查，若必輸屬性="Y"時，檢查是否有輸入
		//alert(document.all(i).tagName);
	}
}

//**************************************************************
//*函數名稱:getParentByTag(vobj,vTagName)
//*目    的:依tag名稱取得參照物件的上層物件(找到或已無上層物件為止)
//*參數說明:
//			vobj:參照物件
//			vTagName:tag名稱
//*回轉值:上層物件
//**************************************************************
function getParentByTag(vobj,vTagName){
	var match = false;
	while (vobj!=null && !match){
		if (vTagName.toLowerCase()==vobj.tagName.toLowerCase()) {
			match=true;
		} else {
			vobj=vobj.parentElement;
		}
	}
	return vobj;
}

//**************************************************************
//*函數名稱:findAttribute(vobj,vAttr,vFindParent)
//*目    的:取得參照物件的屬性值，若參照物件無該屬性，則由上層物件取得(找到或已無上層物件為止)
//*參數說明:
//			vobj:參照物件
//			vAttr:屬性名稱
//			vFindParent:是否由上層物件取得
//*回 轉 值:屬性值
//**************************************************************
function findAttribute(vobj,vAttr,vFindParent){
	var match = false;
	var vAttrValue = "";
	while(vobj!=null && !match){
		vAttrValue = vobj.getAttribute(vAttr);
		if (typeof(vAttrValue)=="string") {
			match=true;
		} else {
			if (vFindParent) {
				vobj=vobj.parentElement;
			} else {
				break;
			}
		}
	}
	if (vAttrValue==null) vAttrValue="";
	return vAttrValue;
}

//**************************************************************
//*函數名稱:jsTrim(vstrVal)
//*目    的:Javascript用的去前後空白函數(Javascript並沒有像VB用的Trim函數)
//*參數說明:
//			vstrVal:原始字串
//*回 轉 值:原始字串去除前後空白後的字串
//**************************************************************
function jsTrim(vstrVal){
	var re = /^[ ]+|[ ]+$/g;
	var newstr = vstrVal.replace(re, "");
	return newstr;
}

//**************************************************************
//*函數名稱:cmdBACK_onClick()
//*目    的:返回上一頁按鈕的公用處理函數
//*參數說明:無
//*回 轉 值:無
//**************************************************************
function cmdBACK_onClick() {
	var blnRtn;
	blnRtn = true;
	if(eval("typeof(cmdBACK_onClick_U)")=="function"){
		blnRtn = cmdBACK_onClick_U();
	}
	if(blnRtn) {
		var mobjCmd = document.all.cmdBACK;
		var mstrUrl = mobjCmd.URL;
	
		var mobjFrm = document.all.frmData;
		var mobjDeep = document.all.fldDeep;
	
		mobjDeep.value = parseInt(mobjDeep.value) - 1;
		document.location = mstrUrl + "?fldDeep=" + mobjDeep.value;
	}
}

//**************************************************************
//*函數名稱:gsetElmtReadWrite(vobj,vstrType)
//*目    的:設定物件為唯讀或維護
//*參數說明:vobj:要設定的物件,vstrType:"W"可維護;"R"唯讀
//*回 轉 值:無
//**************************************************************
function gsetElmtReadWrite(vobj,vstrType) {
	vstrType = vstrType.toUpperCase();
	if(vobj){
		switch(vstrType){
			case "W":
				vobj.className = "input";
				if(vobj.tagName=="SELECT"){
					vobj.disabled = false;
				} else {
					vobj.readOnly = false;
				}
				break;
			case "R":
				vobj.className = "input_r";
				if(vobj.tagName=="SELECT"){
					vobj.disabled = true;
				} else {
					vobj.readOnly = true;
				}
				break;
		}
	}
}

//**************************************************************
//*函數名稱:gEvents(vstrEvent)
//*目    的:根據觸發事件的物件id與指定的事件名稱，
//*			執行「物件id_事件名稱」的JS函數(若不存在則不執行)
//*參數說明:vstrEvent:HTML事件名稱
//*回 轉 值:無
//**************************************************************
function gEvents() {
	var mstrEvent = event.type;
	var mobj = event.srcElement;
	var mstrFunName = mobj.id + "_on" + mstrEvent;
	if(eval("typeof(" + mstrFunName + ")")=="function"){
		eval(mstrFunName + "()");
	} else {
		if(gInDesignMode) {
			alert(mstrFunName + "()函數不存在，請檢查.JS程式");
		}
	}
}

//**************************************************************
//*函數名稱:gRemCommon(vstrData)
//*目    的:移除字串中出現的逗號
//*參數說明:vstrData:原始字串
//*回 轉 值:移除逗號後的字串
//**************************************************************
function gRemCommon(vstrData) {
	return vstrData.replace(/,/g,"");
}

//**************************************************************
//*函數名稱:gAddCommon(vstrData)
//*目    的:將數值的整數部分加上三位一撇
//*參數說明:vstrData:原始字串
//*回 轉 值:加上三位一撇後的字串
//**************************************************************
function gAddCommon(vstrData) {
	if(vstrData=="" || !gValidateData("F",vstrData)) {return "";}
	var mintIndex = vstrData.indexOf(".");
	if(mintIndex>=0) {
		//浮點數處理
		var mstrI;	//整數部分
		var mstrS;	//小數部分
		mstrI = vstrData.substring(0,mintIndex);
		mstrS = vstrData.substr(mintIndex+1);
		
	} else {
		//整數處理
		mstrI = vstrData;
	}

	//整數部分加上三位一撇
	var mstrRtn = "";	//加上三位一撇後的字串
	var j = 0;	//計數器
	for(var i=mstrI.length-1;i>=0;i--) {
		if(j==3) {
			mstrRtn = "," + mstrRtn;
			j = 0; //歸零
		}
		mstrRtn =  mstrI.substr(i,1) + mstrRtn;
		j++;
	}
	if(mintIndex>=0) {mstrRtn = mstrRtn + "." + mstrS;}
	return mstrRtn;
}


//**************************************************************
//*函數名稱:gValidateData(vstrDataType,vstrData)
//*目    的:根據指定的類型檢查資料
//*參數說明:vstrDataType:I-整數,F-浮點數,S-字串,D-日期
//			vstrData:要檢查的資料(若不輸入則檢查事件來源的value)
//			有輸入vstrData時，只做簡單的型態檢查
//			沒有輸入時，會根據件來源相關屬性設定來檢查輸入的資料
//			data_size:資料長度(浮點數整數+小數的長度)
//			data_scale:浮點數的小數長度
//*回 轉 值:true/false
//**************************************************************
function gValidateData(vstrDataType,vstrData) {
	vstrDataType = vstrDataType.toUpperCase();
	var blnNoData
	if(vstrData) {
		blnNoData = false;
	} else {
		blnNoData = true;
	}
	if(blnNoData) {
		var mobj = event.srcElement;
		var vstrData = mobj.value;
		var mintDataSize = parseInt(mobj.data_size);
		var mintDataInt = mintDataSize;

		//數值需移除三位一撇
		if(vstrDataType=="I" || vstrDataType=="F") {vstrData = gRemCommon(vstrData);}
		
		//取得數值長度限制
		if(vstrDataType=="F") {
			var mintDataScale = parseInt(mobj.data_scale);
			mintDataInt = mintDataInt - mintDataScale;
		} else if(vstrDataType=="I") {
			mintDataScale = 0;
		}
	}

	if(blnNoData) {
		//根據data_size與data_scale檢查資料
		if(vstrDataType=="I" || vstrDataType=="F") {
			if(vstrData==""){return true;}
			//(^-?\\d{1,%}\\.\\d{0,#}$)|(^-?\\d{1,%}$)
			//%為整數長度,#為小數長度
			var mstrRE = "(^-?\\d{1," + mintDataInt + "}\\.\\d{0," + mintDataScale + "}$)|(^-?\\d{1," + mintDataInt + "}$)"
			var re = new RegExp(mstrRE);
			var blnRtn = re.test(vstrData);
			if(blnRtn) {
				return true;
			} else {
				if(blnNoData) {mobj.value="";}
				var mstrMsg = "輸入的數值限制在整數" + mintDataInt + "位";
				if (vstrDataType=="F") {
					mstrMsg = mstrMsg + "，小數" + mintDataScale + "位";
				}
				alert(mstrMsg);
				return false;
			}			
		} else if(vstrDataType=="S") {
			var maryLen = gGetStrLen(vstrData,mintDataSize) ;
			if(maryLen[0] > mintDataSize) {
				if(blnNoData) {mobj.value = mobj.value.substr(0,maryLen[1]);}
				var mstrMsg = "輸入的文字限制在半形字元" + mintDataSize + "個字或全形字元" + (mintDataSize/2).toString() + "個字";
				alert(mstrMsg);
				return false;
			} else {
				return true;
			}
		} else 	if(vstrDataType=="D") {
			
		}
	} else {
		//簡單的型態檢查
		if(vstrDataType=="I") {
			return gIsDigit(vstrData);
		} else if(vstrDataType=="F") {
			var mintIndex = vstrData.indexOf(".");
			if(mintIndex>=0) {
				var mstrI;	//整數部分
				var mstrS;	//小數部分
				mstrI = vstrData.substring(0,mintIndex);
				mstrS = vstrData.substr(mintIndex+1);
				if(gIsDigit(mstrI) && gIsDigit(mstrS)) {
					return true;
				} else {
					return false;
				}
			} else {
				return gIsDigit(vstrData);
			}
			return;
		} else if(vstrDataType=="S") {
			//不做字串長度檢查
			var mstrMsg = "傳入要檢查的資料參數時，系統不提供字串長度檢查";
			alert(mstrMsg);
		} else 	if(vstrDataType=="D") {
			
		}		
	}
}

//**************************************************************
//*函數名稱:gGetStrLen(vstrData,vintMaxLength)
//*目    的:計算字串長度(ASCII字元長度為1，非ASCII字元長度為2)與第幾字元後超過指定長度
//*參數說明:vstrData:原始字串;vintMaxLength:最大允許長度
//*回 轉 值:字串的總長度與第幾字元後超過指定長度(陣列)
//**************************************************************
function gGetStrLen(vstrData,vintMaxLength) {
	var mstrCode;
	var maryLen = new Array(2);
	maryLen[0] = 0;	//總長度
	maryLen[1] = 0;	//第幾字元後超過指定長度
	for(var i=0;i<vstrData.length;i++) {
		mstrCode = escape(vstrData.substr(i,1));
		if(mstrCode.substr(0,2)=="%u") {
			maryLen[0] = maryLen[0] + 2
		} else {
			maryLen[0] = maryLen[0] + 1
		}
		if(vintMaxLength) {
			if(maryLen[0]<=vintMaxLength) {
				maryLen[1] = maryLen[1] + 1;
			}
		}
	}
	return maryLen;
}

//**************************************************************
//*函數名稱:gIsDigit(vstrData)
//*目    的:檢查傳入的字串是否為數字所組成
//*參數說明:vstrData:原始字串
//*回 轉 值:true:由數字組成;false:其中包含非數字之文字
//**************************************************************
function gIsDigit(vstrData) {
	var mintCode;
	for(var i=0;i<vstrData.length;i++) {
		mintCode = vstrData.charCodeAt(i);
		if((mintCode<48) || (mintCode>57)) {
			return false;
		}
	}
	return true;
}

//**************************************************************
//*函數名稱:gSubmit()
//*目    的:根據指定的action、target執行submit
//*參數說明:vstrActFlag:執行的動作,vstrTarget:執行的Frame,vstrUrl:執行的程式
//*回 轉 值:無
//**************************************************************
function gSubmit(vstrActFlag,vstrUrl,vstrTarget) {
	if(!vstrActFlag) {
		var mobjCmd = event.srcElement;
		vstrActFlag = mobjCmd.ACTFLAG;
		vstrTarget = mobjCmd.TARGET;
		vstrUrl = mobjCmd.URL;
	}

	//未輸入ActFlag或Url時，不繼續做submit處理
	if(vstrActFlag==""||vstrActFlag==undefined||vstrUrl==""||vstrUrl==undefined){return;}


	var mobjFrm = document.all.frmData;
	var mobjDeep = document.all.fldDeep;
	var mobjActFlag = document.all.fldActFlag;

	//於ifrmae執行程式時，Deep值不增加
	if(vstrTarget != "ifExec") {
		mobjDeep.value = parseInt(mobjDeep.value) + 1;
	}

	mobjActFlag.value = vstrActFlag;

	mobjFrm.action = vstrUrl;
	mobjFrm.target = vstrTarget;
	mobjFrm.submit();
}

//**************************************************************
//*函數名稱:toXMLFormat(vstrVal)
//*目    的:將原始字串編碼成XML可接受的資料
//*參數說明:vstrVal:原始字串
//*回 轉 值:編碼後的字串
//**************************************************************
function toXMLFormat(vstrVal) {
	var sTmp, sOut='';
	for (var i=0;i<vstrVal.length;i++) {
		sTmp=vstrVal.substr(i,1)
		if (sTmp=='"') sTmp='&quot;'
		else if (sTmp=='&') sTmp='&amp;'
		else if (sTmp=='<') sTmp='&lt;'
		else if (sTmp=='>') sTmp='&gt;'
		sOut+=sTmp;
	}	
	return sOut
}

//**************************************************************
//*函數名稱:gGrdChgPage(vstrUrl, vlngAbsolutePage)
//*目    的:切換Grid分頁顯示
//*參數說明:
//*        vstrUrl:負責分頁資料切換的程式路徑
//*        vlngAbsolutePage:切換目的頁碼
//*回 轉 值:無
//**************************************************************
function gGrdChgPage(vstrUrl, vTarget, vlngAbsolutePage) {
	var mobjGrd = getParentByTag(event.srcElement,"TABLE");
	var mstrGrdName = mobjGrd.id;

	//重新設定頁面上此Grid的頁碼索引
	document.all[mstrGrdName+"_PageIndex"].value = vlngAbsolutePage;
	//重新載入畫面
	var mobjFrm = document.all.frmData;
	mobjFrm.action = vstrUrl;
	if(vTarget!="") {
		mobjFrm.target = vTarget;
	}
	mobjFrm.submit();
}

function gPageCtrl_Selection(vstrUrl, vTarget) {
	var mobjSel = event.srcElement;
	var mlngAbsolutePage = mobjSel.options(mobjSel.selectedIndex).value;

	gGrdChgPage(vstrUrl, vTarget, mlngAbsolutePage);
}