//============================================================================================= //函數區 //============================================================================================= //之前的錯誤訊息,為了預防無限迴圈 var beforeMsg = ""; //儲存檢查之前的值 var beforesValue = ''; //顯示錯誤訊息 function ShowMsg(obj, sErrMsg) { //預防無限迴圈 if (sErrMsg == beforeMsg) { return; } beforeMsg = sErrMsg; var obj_valid; if (obj.id.indexOf("_tb") != -1) { //obj_valid = document.getElementById(obj.id.replace("_tb", "_err")); obj_valid = document.getElementById(obj.id.replace(/_tb$/g, "_err")); } else { if (obj.id.indexOf("_ddl") != -1) { //obj_valid = document.getElementById(obj.id.replace("_ddl", "_labErr")); obj_valid = document.getElementById(obj.id.replace(/_ddl$/g, "_labErr")); } } if (obj_valid == null) return; obj_valid.style.display = ""; obj_valid.innerText = sErrMsg; //設定計時器為0時動作(預防無限迴圈) setTimeout(function () { beforeMsg = ""; }, 0); //setTimeout(function () { obj.select(); }, 0); //alert(sErrMsg); } //限制輸入 //目前遇到問題無法時做....擺著先 function Keylimit(e, type) { /* var code = ('which' in e) ? e.which : e.keyCode; //alert(code); //倒退、刪除、左、右直接允許 if (code == 8 || code == 46 || code == 37 || code == 39) { return true; } switch (type) { //允許數字鍵,負號, 逗號 case "Num": if ((code >= 96 && code <= 105) || //數字鍵盤 (code >= 48 && code <= 57 || //鍵盤上的數字 code == 110 || code == 190 || //小數點 code == 109 || code == 189 || //負號 code == 188)) { //逗號 return true; } else { return false; } break; case "Date": if ((code >= 96 && code <= 105) || //數字鍵盤 (code >= 48 && code <= 57 || //鍵盤上的數字 code == 109 || code == 189 || //負號 code == 111 || code == 191)) { //除號 return true; } else { return false; } break; default: return true; break; } */ } //日期是否正確西元或民國 //sValue只能是正確的日期字串 例如 2017/01/01 或 106/01/01 function isDate(sValue, isRocDate) { if (isRocDate) { sValue = (Number(sValue.substring(0, 3)) + 1911).toString() + sValue.substring(3); } var r = sValue.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/); if (r == null) return false; var d = new Date(r[1], r[3] - 1, r[4]); return (d.getFullYear() == r[1] && (d.getMonth() + 1) == r[3] && d.getDate() == r[4]); } //檢查 身份證(I)、護照(P)、居留證(R) function check_id(sValue, kind) { var id = sValue; //檢查身分證字號 if (kind == "I") { if (id.length != 10) return false; if (isNaN(id.substr(1, 9)) || (id.substr(0, 1) < "A" || id.substr(0, 1) > "Z")) { return false; } var head = "ABCDEFGHJKLMNPQRSTUVXYWZIO"; id = (head.indexOf(id.substring(0, 1)) + 10) + '' + id.substr(1, 9) s = parseInt(id.substr(0, 1)) + parseInt(id.substr(1, 1)) * 9 + parseInt(id.substr(2, 1)) * 8 + parseInt(id.substr(3, 1)) * 7 + parseInt(id.substr(4, 1)) * 6 + parseInt(id.substr(5, 1)) * 5 + parseInt(id.substr(6, 1)) * 4 + parseInt(id.substr(7, 1)) * 3 + parseInt(id.substr(8, 1)) * 2 + parseInt(id.substr(9, 1)) + parseInt(id.substr(10, 1)); //判斷是否可整除 if ((s % 10) != 0) return false; //身分證字號正確 return true; //檢查護照 } else if (kind == "P") { //檢查居留證號碼 } else if (kind == "R") { if (id.length != 10) return false; if (isNaN(id.substr(2, 8)) || (id.substr(0, 1) < "A" || id.substr(0, 1) > "Z") || (id.substr(1, 1) < "A" || id.substr(1, 1) > "Z")) { return false; } var head = "ABCDEFGHJKLMNPQRSTUVXYWZIO"; id = (head.indexOf(id.substr(0, 1)) + 10) + '' + ((head.indexOf(id.substr(1, 1)) + 10) % 10) + '' + id.substr(2, 8) s = parseInt(id.substr(0, 1)) + parseInt(id.substr(1, 1)) * 9 + parseInt(id.substr(2, 1)) * 8 + parseInt(id.substr(3, 1)) * 7 + parseInt(id.substr(4, 1)) * 6 + parseInt(id.substr(5, 1)) * 5 + parseInt(id.substr(6, 1)) * 4 + parseInt(id.substr(7, 1)) * 3 + parseInt(id.substr(8, 1)) * 2 + parseInt(id.substr(9, 1)) + parseInt(id.substr(10, 1)); //判斷是否可整除 if ((s % 10) != 0) { //檢查是否新式 if (isNaN(id.substr(2, 8)) || (id.substr(0, 1) < "A" || id.substr(0, 1) > "Z") || (id.substr(1, 1) < "8" || id.substr(1, 1) > "9")) { return false; } var head = "ABCDEFGHJKLMNPQRSTUVXYWZIO"; id = (head.indexOf(id.substr(0, 1)) + 10) + '' + id.substr(1, 9) s = parseInt(id.substr(0, 1)) + parseInt(id.substr(1, 1)) * 9 + parseInt(id.substr(2, 1)) * 8 + parseInt(id.substr(3, 1)) * 7 + parseInt(id.substr(4, 1)) * 6 + parseInt(id.substr(5, 1)) * 5 + parseInt(id.substr(6, 1)) * 4 + parseInt(id.substr(7, 1)) * 3 + parseInt(id.substr(8, 1)) * 2 + parseInt(id.substr(9, 1)) + parseInt(id.substr(10, 1)); //判斷是否可整除 if ((s % 10) != 0) { return false; } return true; } //居留證號碼正確 return true; } else { return false; } } //左邊補0 function padLeft(str, len) { str = '' + str; return str.length >= len ? str : new Array(len - str.length + 1).join("0") + str; } //============================================================================================= //格式化數字 //============================================================================================= //格式化數字 function numFormat(sValue, sFormat) { //格式化為空回傳原值 if (sFormat.length == 0 || sValue.length == 0) { return sValue; } //回傳的變數 var sValueReturn = ''; //依照小數點分割成左右 var sFormatArr = ((sFormat.indexOf('.') < 0) ? sFormat + "." : sFormat).split('.'); //格式化的字串格式錯誤 if (sFormatArr.length > 2) { return sValue; } //先處理小數點後 //字串轉字元陣列 var sFormatChar_Right = sFormatArr[1].split(""); //找出最右邊的數字 從右邊開始找 var sFormatMaxRightNum = 0; if (sFormatChar_Right.length > 0) { //找出最右邊的數字 從右邊開始找 for (var m = sFormatChar_Right.length - 1; m >= 0; m--) { if (sFormatChar_Right[m] == "#" || /\d/.test(sFormatChar_Right[m])) { sFormatMaxRightNum = m; //四捨五入至小數點後第sFormatMaxRightNum位 var size = Math.pow(10, m + 1); sValue = Math.round(sValue * size) / size; break; } } } else {//20201228_就算沒有小數位也要四捨五入 var size = Math.pow(10, sFormatChar_Right.length + 1); sValue = Math.round(sValue * size) / size; } //將值分為左右 var sValueArr = ((sValue.toString().indexOf('.') < 0) ? sValue.toString() + "." : sValue.toString()).split('.'); //字串轉字元陣列 var sValueChar_Right = sValueArr[1].split(""); //迴圈從小數點後第一位開始 var i = 0; var j = 0; //開始填入 while (i < sValueChar_Right.length || j < sFormatChar_Right.length) { //當兩者皆沒輸出完 if (i < sValueChar_Right.length && j < sFormatChar_Right.length) { //符合的項目 if (sFormatChar_Right[j] == "#" || /\d/.test(sFormatChar_Right[j])) { sValueReturn = sValueReturn + sValueChar_Right[i]; i++; j++; } else if (j > sFormatMaxRightNum) { sValueReturn = sValueReturn + sValueChar_Right[i]; i++; } else { sValueReturn = sValueReturn + sFormatChar_Right[j]; j++; } continue; } if (i < sValueChar_Right.length && j >= sFormatChar_Right.length) { sValueReturn = sValueReturn + sValueChar_Right[i]; i++; continue; } if (i >= sValueChar_Right.length && j < sFormatChar_Right.length) { if (sFormatChar_Right[j] != "#" && sFormatChar_Right[j] != ",") { sValueReturn = sValueReturn + sFormatChar_Right[j]; } j++ continue; } } if (sValueReturn.length > 0) { sValueReturn = "." + sValueReturn; } //處理左邊 //字串轉字元陣列 var sFormatChar_Left = sFormatArr[0].split(""); var sValueChar_Left = sValueArr[0].split(""); //20201225_依平_處理多出來的0 //?? if (sValueChar_Left.length > 1) { for (var z = 0; z < sValueChar_Left.length; z++) { if (sValueChar_Left[z] == "0") { sValueChar_Left[z] = ""; } else { break; } } } //找到最左邊輸入的數字 var sFormatMaxLeftNum = sFormatChar_Left.length - 1; for (var m = 0; m < sFormatChar_Left.length; m++) { if (sFormatChar_Left[m] == "#" || /\d/.test(sFormatChar_Left[m])) { sFormatMaxLeftNum = m; break; } } //用來迴圈整數部分必須從個位開始 var j = sFormatChar_Left.length - 1; var i = sValueChar_Left.length - 1; //開始填入值 當Format或輸入值沒輸出完 while (i >= 0 || j >= 0) { //找到負號強制加入 if (i >= 0 && sValueChar_Left[i] == "-") { sValueReturn = sValueChar_Left[i] + sValueReturn; i--; } //當兩者皆沒輸出完 if (i >= 0 && j >= 0) { //符合的項目 if (sFormatChar_Left[j] == "#" || /\d/.test(sFormatChar_Left[j])) { sValueReturn = sValueChar_Left[i] + sValueReturn; i--; j--; } else if (j < sFormatMaxLeftNum) { sValueReturn = sValueChar_Left[i] + sValueReturn; i--; } else { sValueReturn = sFormatChar_Left[j] + sValueReturn; j--; } continue; } if (i >= 0 && j < 0) { sValueReturn = sValueChar_Left[i] + sValueReturn; i--; continue; } if (i < 0 && j >= 0) { if (sFormatChar_Left[j] != "#" && sFormatChar_Left[j] != ",") { sValueReturn = sFormatChar_Left[j] + sValueReturn; } j-- continue; } } return sValueReturn; } //轉換為數字格式 function numReFormat(sValue) { if (sValue.length == 0) { return ""; } //尋找小數點位置 var sValueArr = sValue.split('.'); //判斷是否為負數 var Minus = (sValue.indexOf("-") >= 0) ? "-" : ""; var sValueReturn = ""; switch (sValueArr.length) { case 2: sValueReturn = (sValueArr[0].length == 0) ? "0" : "" + "." + sValueArr[1].replace(/\D/g, ""); case 1: sValueReturn = Minus + sValueArr[0].replace(/\D/g, "") + sValueReturn; break; default: return ""; } return parseFloat(sValueReturn); } //成為焦點時 function numFocus(obj) { //取得檢查之前的值(檢查錯誤用) if (beforesValue.length > 0) { obj.value = beforesValue; } else { obj.value = numReFormat(obj.value); } } //失去焦點時 function numBlur(obj) { var sValue = obj.value; var bMust = (obj.getAttribute('asMust').toLowerCase() == "true") ? true : false; var iMin = obj.getAttribute('asMin'); var iMax = obj.getAttribute('asMax'); var sErrMsg = obj.getAttribute('asErrMsg'); var sFormat = obj.getAttribute('asFormat'); //檢查是否必須值 if (bMust && sValue.length == 0) { ShowMsg(obj, "輸入資料不能為空白"); return; } sValue = sValue.replace(/[,]+/g, ""); //檢查是否為數字 if (sValue.length > 0 && isNaN(sValue)) { ShowMsg(obj, sErrMsg); return; } //當最小值或最大值都為0時不檢查範圍 if (!(iMin == 0 && iMax == 0)) { if (parseFloat(sValue) < parseFloat(iMin) || parseFloat(sValue) > parseFloat(iMax)) { ShowMsg(obj, "輸入資料範圍必須在" + iMin + "~" + iMax + "之間"); return; } } //檢查小數位數 if (sValue.length > 0) { var nValue = parseFloat(sValue).toString(); var sValueA = nValue.split('.'); var sValueLen = ((sValueA.length == 2) ? sValueA[1].length : 0); if (sValueLen > 0) { var sFormatA = sFormat.split('.'); var sFormatLen = ((sFormatA.length == 2) ? sFormatA[1].length : 0); if (sValueLen > sFormatLen) { ShowMsg(obj, "小數位不符"); return; } } //var nValue = numFormat(sValue, sFormat); //if (sValue.length > nValue.length) { // var FormatLen = ((sFormat.indexOf('.') < 0)? sFormat + ".": sFormat).split('.'); // //格式化的字串格式錯誤 // if (FormatLen.length > 2) { // return sValue; // } // ShowMsg(obj, "小數位不符"); // return; //} } //檢查成功將值清空 var obj_valid = document.getElementById(obj.id.replace(/_tb$/g, "_err")); if (obj_valid != null) { obj_valid.innerText = ''; } obj.value = numFormat(sValue, sFormat); } //============================================================================================= //格式化西元日期 //============================================================================================= //格式化西元日期 function dateFormat(sValue, sFormat) { var sValueArr = sValue.match(/\d+/g); var sValueReturn = ""; if (sFormat.length > 0) { sValueReturn = sFormat; } else { sValueReturn = "YYYY/MM/DD"; } sValueReturn = sValueReturn.replace(/(Y|y)+/g, sValueArr[0]).replace(/(M|m)+/g, sValueArr[1]).replace(/(D|d)+/g, sValueArr[2]); return sValueReturn; } //轉成西元日期格式 YYYY/MM/DD function dateReFormat(sValue) { if (sValue.length == 0) { return ""; } //找出數字部分 var sValueArr = sValue.match(/\d+/g); var sValueReturn = ""; if (sValueArr != null) { switch (sValueArr.length) { case 3: sValueReturn = padLeft(sValueArr[0], 4) + "/" + padLeft(sValueArr[1], 2) + "/" + padLeft(sValueArr[2], 2); break; case 2: var Today = new Date(); sValueReturn = Today.getFullYear() + "/" + padLeft(sValueArr[0], 2) + "/" + padLeft(sValueArr[1], 2); break; case 1: if (sValueArr[0].length == 8) { sValueReturn = sValueArr[0].substr(0, 4) + "/" + sValueArr[0].substr(4, 2) + "/" + sValueArr[0].substr(6, 2); } if (sValueArr[0].length == 4) { var Today = new Date(); sValueReturn = Today.getFullYear() + "/" + sValueArr[0].substr(0, 2) + "/" + sValueArr[0].substr(2, 2); } break; default: break; } } return sValueReturn; } //成為焦點時 function dateFocus(obj) { //取得檢查之前的值(檢查錯誤用) if (beforesValue.length > 0) { obj.value = beforesValue; } else { obj.value = dateReFormat(obj.value); } } //失去焦點時 function dateBlur(obj) { var sValue = obj.value; var bMust = (obj.getAttribute('asMust').toLowerCase() == "true") ? true : false; var dMin = obj.getAttribute('asMin'); var dMax = obj.getAttribute('asMax'); var sErrMsg = obj.getAttribute('asErrMsg'); var sFormat = obj.getAttribute('asFormat'); if (sValue.length == 0 && bMust) { ShowMsg(obj, "輸入資料不能為空白"); return; } if (sValue.length > 0) { sValue = dateReFormat(sValue); if (!isDate(sValue, false)) { ShowMsg(obj, sErrMsg); return; } } //檢查範圍 if (sValue.length > 0) { if (dMin != null && dMax != null) { if (sValue.replace(/\D/g, "") < dMin.replace(/\D/g, "") || sValue.replace(/\D/g, "") > dMax.replace(/\D/g, "")) { ShowMsg(obj, "輸入資料範圍必須在" + dMin + "~" + dMax + "之間"); return; } } else if (dMin != null) { if (sValue.replace(/\D/g, "") < dMin.replace(/\D/g, "")) { ShowMsg(obj, "輸入資料範圍必須大於" + dMin); return; } } else if (dMax != null) { if (sValue.replace(/\D/g, "") > dMax.replace(/\D/g, "")) { ShowMsg(obj, "輸入資料範圍必須小於" + dMax); return; } } } var checkBeginEnd = DateBeginEndCheck(obj.id, false); if (checkBeginEnd.length > 0) { ShowMsg(obj, checkBeginEnd); return; } //檢查成功將值清空 var obj_valid = document.getElementById(obj.id.replace(/_tb$/g, "_err")); if (obj_valid != null) { obj_valid.innerText = ''; } if (sValue.length > 0) obj.value = dateFormat(sValue, sFormat); } //============================================================================================= //格式化民國日期 //============================================================================================= //格式化民國日期預設為 YYYMMDD function rocFormat(sValue, sFormat) { if (sValue.length == 0) { return ""; } var sValueArr = sValue.match(/\d+/g); var sValueReturn = ""; if (sFormat.length > 0) { sValueReturn = sFormat; } else { sValueReturn = "YYYMMDD"; } sValueReturn = sValueReturn.replace(/(Y|y)+/g, sValueArr[0]).replace(/(M|m)+/g, sValueArr[1]).replace(/(D|d)+/g, sValueArr[2]); return sValueReturn; } //轉成日期格式 YYY/MM/DD function rocReFormat(sValue) { if (sValue.length == 0) { return ""; } //找出數字部分 var sValueArr = sValue.match(/\d+/g); var sValueReturn = ""; if (sValueArr != null) { switch (sValueArr.length) { case 3: sValueReturn = padLeft(sValueArr[0], 3) + "/" + padLeft(sValueArr[1], 2) + "/" + padLeft(sValueArr[2], 2); break; case 2: var Today = new Date(); sValueReturn = padLeft(Today.getFullYear() - 1911, 3) + "/" + padLeft(sValueArr[0], 2) + "/" + padLeft(sValueArr[1], 2); break; case 1: if (sValueArr[0].length == 7) { sValueReturn = sValueArr[0].substr(0, 3) + "/" + sValueArr[0].substr(2, 2) + "/" + sValueArr[0].substr(4, 2); } if (sValueArr[0].length == 4) { var Today = new Date(); sValueReturn = padLeft(Today.getFullYear() - 1911, 3) + "/" + sValueArr[0].substr(0, 2) + "/" + sValueArr[0].substr(2, 2); } break; default: break; } } return sValueReturn; } //成為焦點時 function rocFocus(obj) { //取得檢查之前的值(檢查錯誤用) if (beforesValue.length > 0) { obj.value = beforesValue; } else { obj.value = rocReFormat(obj.value); } } //失去焦點時 function rocBlur(obj) { //debugger; var sValue = obj.value; var sChkValue = sValue; var bMust = (obj.getAttribute('asMust').toLowerCase() == "true") ? true : false; var dMin = obj.getAttribute('asMin'); var dMax = obj.getAttribute('asMax'); var sErrMsg = obj.getAttribute('asErrMsg'); var sFormat = obj.getAttribute('asFormat'); if (sValue.length == 0 && bMust) { ShowMsg(obj, "輸入資料不能為空白"); return; } if (sValue.length > 0) { sValue = rocReFormat(sValue); if (!isDate(sValue, true)) { ShowMsg(obj, sErrMsg); return; } else { if (dMin != null ) { dMin = (Number(dMin.substring(0, 4)) - 1911).toString() + dMin.substring(4); dMin=rocReFormat(dMin); } if (dMax != null) { dMax = (Number(dMax.substring(0, 4)) - 1911).toString() + dMax.substring(4); dMax=rocReFormat(dMax); } } } //檢查範圍 if (sValue.length > 0) { if (dMin != null && dMax != null) { if (parseInt(sValue.replace(/\D/g, "")) < parseInt(dMin.replace(/\D/g, "")) || parseInt(sValue.replace(/\D/g, "")) > parseInt(dMax.replace(/\D/g, ""))) { ShowMsg(obj, "輸入資料範圍必須在" + dMin + "~" + dMax + "之間"); return; } } else if (dMin != null) { if (sValue.replace(/\D/g, "") < dMin.replace(/\D/g, "")) { ShowMsg(obj, "輸入資料範圍必須大於" + dMin); return; } } else if (dMax != null) { if (sValue.replace(/\D/g, "") > dMax.replace(/\D/g, "")) { ShowMsg(obj, "輸入資料範圍必須小於" + dMax); return; } } } var checkBeginEnd = DateBeginEndCheck(obj.id, true); if (checkBeginEnd.length > 0) { ShowMsg(obj, checkBeginEnd); return; } // //檢查成功將值清空 var obj_valid = document.getElementById(obj.id.replace(/_tb$/g, "_err")); if (obj_valid != null) { obj_valid.innerText = ''; } if (sValue.length > 0) obj.value = rocFormat(sChkValue, sFormat); } //============================================================================================= //其他檢查 //============================================================================================= function tbFocus(obj) { var obj_valid = document.getElementById(obj.id.replace(/_tb$/g, "_err")); if (obj_valid != null) { obj_valid.innerText = ''; } } //檢查長度 function tbBlur(obj) { var sValue = obj.value; var bMust = (obj.getAttribute('asMust').toLowerCase() == "true") ? true : false; var iMin = obj.getAttribute('asMin'); var iMax = obj.getAttribute('asMax'); var sErrMsg = obj.getAttribute('asErrMsg'); var bReadOnly = (obj.getAttribute('ReadOnly') == "ReadOnly") ? true : false; if (bReadOnly) { return; } if (sValue.length == 0 && bMust) { ShowMsg(obj, "輸入資料不能為空白"); return; } if (iMin != 0 && sValue.length < iMin) { ShowMsg(obj, "輸入資料最小長度為" + iMin); return; } if (iMax != 0 && sValue.length > iMax) { ShowMsg(obj, "輸入資料最大長度為" + iMax); return; } //2021042309依平_增加regex檢查 if (obj.getAttribute('asregex')) { var sRmsg = RegexBlur(obj); if (sRmsg.length > 0) { ShowMsg(obj, sRmsg); return; } } //檢查成功將值清空 var obj_valid = document.getElementById(obj.id.replace(/_tb$/g, "_err")); if (obj_valid != null) { obj_valid.innerText = ''; } } //20210219依平_增加session檢查 function changeCheck() { if (!asCheckSession()) { alert('您尚未登入或已逾登入有效時限!\n請重新登入...'); ReloginWindow(); return false; } return true; } function ddlchange(obj) { //20210218依平_增加session檢查 if (!changeCheck()) { return false; } var sValue = obj.value; var bMust = (obj.getAttribute('asMust').toLowerCase() == "true") ? true : false; var sErrMsg = obj.getAttribute('asErrMsg'); var bReadOnly = (obj.getAttribute('ReadOnly') == "ReadOnly") ? true : false; if (bReadOnly) { return; } if (sValue.length == 0 && bMust) { ShowMsg(obj, "輸入資料不能為空白"); return; } //檢查成功將值清空 var obj_valid = document.getElementById(obj.id.replace(/_ddl$/g, "_labErr")); if (obj_valid != null) { obj_valid.innerText = ''; } } function RegexBlur(obj) { var sValue = obj.value; var sRegex = obj.getAttribute('asregex'); var sRegexmsg = obj.getAttribute('asregexmsg'); if (sRegex && sValue.length > 0) { var rules = new RegExp(sRegex) var tmpRegex = rules.test(sValue); if (!tmpRegex) { if (!sRegexmsg) { sRegexmsg = "輸入格式不符"; } return sRegexmsg; } } return ""; } //檢查身分證 function idnoBlur(obj) { var sValue = obj.value; var bMust = (obj.getAttribute('asMust').toLowerCase() == "true") ? true : false; var iMin = obj.getAttribute('asMin'); var iMax = obj.getAttribute('asMax'); var sErrMsg = obj.getAttribute('asErrMsg'); var sIdType = obj.getAttribute('asIdType'); if (sValue.length == 0 && bMust) { ShowMsg(obj, "輸入資料不能為空白"); return; } var IdTypeI = false; var IdTypeP = false; var IdTypeR = false; if (sIdType.indexOf("I") > -1) IdTypeI = check_id(sValue, "I"); if (sIdType.indexOf("P") > -1) IdTypeP = check_id(sValue, "P"); if (sIdType.indexOf("R") > -1) IdTypeR = check_id(sValue, "R"); if (sValue.length > 0 && !IdTypeI && !IdTypeP && !IdTypeR) { ShowMsg(obj, sErrMsg); return; } //檢查成功將值清空 var obj_valid = document.getElementById(obj.id.replace(/_tb$/g, "_err")); if (obj_valid != null) { obj_valid.innerText = ''; } } //檢查email function emailBlur(obj) { var sValue = obj.value; var bMust = (obj.getAttribute('asMust').toLowerCase() == "true") ? true : false; var iMin = obj.getAttribute('asMin'); var iMax = obj.getAttribute('asMax'); var sErrMsg = obj.getAttribute('asErrMsg'); if (sValue.length == 0 && bMust) { ShowMsg(obj, "輸入資料不能為空白"); return; } if (iMax != 0 && sValue.length > iMax) { ShowMsg(obj, "最大長度為" + iMax.toString() + "字"); return; } if (sValue.length > 0 && !(/\w+([-+.´]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(sValue))) { ShowMsg(obj, sErrMsg); return; } //檢查成功將值清空 var obj_valid = document.getElementById(obj.id.replace(/_tb$/g, "_err")); if (obj_valid != null) { obj_valid.innerText = ''; } } //檢查電話號碼 MH(M=手機、H=市話) function phoneBlur(obj) { var sValue = obj.value; var bMust = (obj.getAttribute('asMust').toLowerCase() == "true") ? true : false; var iMin = obj.getAttribute('asMin'); var iMax = obj.getAttribute('asMax'); var sErrMsg = obj.getAttribute('asErrMsg'); var sPhoneType = obj.getAttribute('asPhoneType'); if (sValue.length == 0 && bMust) { ShowMsg(obj, "輸入資料不能為空白"); return; } if (iMax != 0 && sValue.length > iMax) { ShowMsg(obj, "最大長度為" + iMax.toString() + "字"); return; } var bcheckphone = false; if (sPhoneType.indexOf("M") > -1 && sValue.length > 0 && (/^09\d{2}[- ]?(\d{6}|\d{3}-\d{3})$/.test(sValue))) { bcheckphone = true; } //if (sPhoneType.indexOf("H")>-1 && sValue.length > 0 && !(/^[\(]?\d{2,3}[\-\) ]?\d{6,8}(#\d+)?$/.test(sValue))) { if (sPhoneType.indexOf("H") > -1 && sValue.length > 0 && (/^(\d{2,3}-?|\(\d{2,3}\))\d{3,4}-?\d{4}$/.test(sValue))) { bcheckphone = true; } if (!bcheckphone && sValue.length > 0) { ShowMsg(obj, sErrMsg); return; } //檢查成功將值清空 var obj_valid = document.getElementById(obj.id.replace(/_tb$/g, "_err")); if (obj_valid != null) { obj_valid.innerText = ''; } } //========================================================================= //格式化數字 //========================================================================= function numFomat(sValue, sFormat) { //格式化為空回傳原值 if (sFormat.length == 0) { return sValue; } //回傳的變數 var sValueReturn = ''; //依照小數點分割成左右 var sFormatArr = sFormat.split('.'); //格式化的字串格式錯誤 if (sFormatArr.length > 2) { return sValue; } //代表輸出沒有小數點後的數字 if (sFormatArr.length == 1) { //四捨五入至整數 sValue = Math.round(sValue); //字串轉字元陣列 var sFormatChar = sFormatArr[0].split(""); var sValueChar = sValue.toString().split(""); //找到最左邊輸入的數字 var sFormatMaxLeftNum = sFormatChar.length - 1; for (var m = 0; m < sFormatChar.length; m++) { if (sFormatChar[m] == "#" || /\d/.test(sFormatChar[m])) { sFormatMaxLeftNum = m; break; } } //用來迴圈整數部分必須從個位開始 var j = sFormatChar.length - 1; var i = sValueChar.length - 1; //開始填入值 當Fomat或輸入值沒輸出完 while (i >= 0 || j >= 0) { //找到負號強制加入 if (i >= 0 && sValueChar[i] == "-") { sValueReturn = sValueChar[i] + sValueReturn; i--; } //當兩者皆沒輸出完 if (i >= 0 && j >= 0) { //符合的項目 if (sFormatChar[j] == "#" || /\d/.test(sFormatChar[j])) { sValueReturn = sValueChar[i] + sValueReturn; i--; j--; } else if (j < sFormatMaxLeftNum) { sValueReturn = sValueChar[i] + sValueReturn; i--; } else { sValueReturn = sFormatChar[j] + sValueReturn; j--; } continue; } if (i >= 0 && j < 0) { sValueReturn = sValueChar[i] + sValueReturn; i--; continue; } if (i < 0 && j >= 0) { if (sFormatChar[j] != "#" && sFormatChar[j] != ",") { sValueReturn = sFormatChar[j] + sValueReturn; } j-- continue; } } return sValueReturn; } //輸出有小數點 if (sFormatArr.length == 2) { //先處理小數點後 //字串轉字元陣列 var sFormatChar_Right = sFormatArr[1].split(""); //找出最右邊的數字 從右邊開始找 var sFormatMaxRightNum = 0; for (var m = sFormatChar_Right.length - 1; m >= 0; m--) { if (sFormatChar_Right[m] == "#" || /\d/.test(sFormatChar_Right[m])) { sFormatMaxRightNum = m; var size = Math.pow(10, m + 1); sValue = Math.round(sValue * size) / size; break; } } //四捨五入至小數點後第sFormatMaxRightNum位 //將值分為左右 var sValueArr = ((sValue.toString().indexOf('.') < 0) ? sValue.toString() + "." : sValue.toString()).split('.'); //字串轉字元陣列 var sValueChar_Right = sValueArr[1].split(""); //迴圈從小數點後第一位開始 var i = 0; var j = 0; //開始填入 while (i < sValueChar_Right.length || j < sFormatChar_Right.length) { //當兩者皆沒輸出完 if (i < sValueChar_Right.length && j < sFormatChar_Right.length) { //符合的項目 if (sFormatChar_Right[j] == "#" || /\d/.test(sFormatChar_Right[j])) { sValueReturn = sValueReturn + sValueChar_Right[i]; i++; j++; } else if (j > sFormatMaxRightNum) { sValueReturn = sValueReturn + sValueChar_Right[i]; i++; } else { sValueReturn = sValueReturn + sFormatChar_Right[j]; j++; } continue; } if (i < sValueChar_Right.length && j >= sFormatChar_Right.length) { sValueReturn = sValueReturn + sValueChar_Right[i]; i++; continue; } if (i >= sValueChar_Right.length && j < sFormatChar_Right.length) { if (sFormatChar_Right[j] != "#" && sFormatChar_Right[j] != ",") { sValueReturn = sValueReturn + sFormatChar_Right[j]; } j++ continue; } } if (sValueReturn.length > 0) { sValueReturn = "." + sValueReturn; } //處理左邊 //字串轉字元陣列 var sFormatChar_Left = sFormatArr[0].split(""); var sValueChar_Left = sValueArr[0].split(""); //找到最左邊輸入的數字 var sFormatMaxLeftNum = sFormatChar_Left.length - 1; for (var m = 0; m < sFormatChar_Left.length; m++) { if (sFormatChar_Left[m] == "#" || /\d/.test(sFormatChar_Left[m])) { sFormatMaxLeftNum = m; break; } } //用來迴圈整數部分必須從個位開始 var j = sFormatChar_Left.length - 1; var i = sValueChar_Left.length - 1; //開始填入值 當Fomat或輸入值沒輸出完 while (i >= 0 || j >= 0) { //找到負號強制加入 if (i >= 0 && sValueChar_Left[i] == "-") { sValueReturn = sValueChar_Left[i] + sValueReturn; i--; } //當兩者皆沒輸出完 if (i >= 0 && j >= 0) { //符合的項目 if (sFormatChar_Left[j] == "#" || /\d/.test(sFormatChar_Left[j])) { sValueReturn = sValueChar_Left[i] + sValueReturn; i--; j--; } else if (j < sFormatMaxLeftNum) { sValueReturn = sValueChar_Left[i] + sValueReturn; i--; } else { sValueReturn = sFormatChar_Left[j] + sValueReturn; j--; } continue; } if (i >= 0 && j < 0) { sValueReturn = sValueChar_Left[i] + sValueReturn; i--; continue; } if (i < 0 && j >= 0) { if (sFormatChar_Left[j] != "#" && sFormatChar_Left[j] != ",") { sValueReturn = sFormatChar_Left[j] + sValueReturn; } j-- continue; } } return sValueReturn; } } //轉換為數字格式 function numReFomat(sValue) { if (sValue.length == 0) { return ""; } //尋找小數點位置 var sValueArr = sValue.split('.'); //判斷是否為負數 var Minus = (sValue.indexOf("-") >= 0) ? "-" : ""; var sValueReturn = ""; switch (sValueArr.length) { case 2: sValueReturn = (sValueArr[0].length == 0) ? "0" : "" + "." + sValueArr[1].replace(/\D/g, ""); case 1: sValueReturn = Minus + sValueArr[0].replace(/\D/g, "") + sValueReturn; break; default: return ""; } return parseFloat(sValueReturn); } //成為焦點時 function numFocus(obj) { //取得檢查之前的值(檢查錯誤用) if (beforesValue.length > 0) { obj.value = beforesValue; } else { obj.value = numReFomat(obj.value); } } function hourless(objid, hourid) { var hourobj = document.getElementById(hourid); var obj = document.getElementById(objid); var iMin = obj.getAttribute('asHMin'); var iMax = obj.getAttribute('asHMax'); var ihour = hourobj.innerText; if ((parseInt(ihour) - 1) >= iMin) { hourobj.innerText = (parseInt(ihour) - 1); } } function hourplus(objid, hourid) { var hourobj = document.getElementById(hourid); var obj = document.getElementById(objid); var iMin = obj.getAttribute('asHMin'); var iMax = obj.getAttribute('asHMax'); var ihour = hourobj.innerText; if ((parseInt(ihour) + 1) <= iMax) { hourobj.innerText = (parseInt(ihour) + 1); } } function minutesless(objid, minutesid, minutesrange) { var minutesobj = document.getElementById(minutesid); var obj = document.getElementById(objid); var iMin = obj.getAttribute('asMMin'); var iMax = obj.getAttribute('asMMax'); var iminutes = minutesobj.innerText; if ((parseInt(iminutes) - 1) >= iMin) { minutesobj.innerText = (parseInt(iminutes) - parseInt(minutesrange)); } } function minutesplus(objid, minutesid, minutesrange) { var minutesobj = document.getElementById(minutesid); var obj = document.getElementById(objid); var iMin = obj.getAttribute('asMMin'); var iMax = obj.getAttribute('asMMax'); var iminutes = minutesobj.innerText; if ((parseInt(iminutes) + 1) <= iMax) { minutesobj.innerText = (parseInt(iminutes) + parseInt(minutesrange)); } } //限制輸入 //目前遇到問題無法時做....擺著先 function Keylimit(e, type) { var code = ('which' in e) ? e.which : e.keyCode; //暫時只阻擋ENTER if (code == 13) { return false; } else { return true; } /* switch (type) { //允許數字鍵,負號, 逗號 case "num": if ((code > 47 && code < 58) || code == 45 || code == 46) { return true; } else { return false; } break; default: return true; break; } */ } //==================================================================================================== // 已輸入的字數處理 //==================================================================================================== function CountNChar(objid) { var tbobj = document.getElementById(objid + "_tb"); var objMsg = document.getElementById(objid + "_showlen"); var intMax = tbobj.getAttribute('asMax'); var asLenMsg = tbobj.getAttribute('asLenMsg'); var intChars = GetRealLength(tbobj, "U"); var MsgStr = asLenMsg.replace("[Max]", intMax.toString()).replace("[Now]", intChars.toString()); if (intChars > intMax) { MsgStr = "" + MsgStr + ""; } if (objMsg) { objMsg.innerHTML = MsgStr; } } function CountChar(objid) { //Length var tbobj = document.getElementById(objid + "_tb"); var objMsg = document.getElementById(objid + "_showlen"); var intMax = tbobj.getAttribute('asMax'); var asLenMsg = tbobj.getAttribute('asLenMsg'); var intChars = GetRealLength(tbobj, "B"); var MsgStr = asLenMsg.replace("[Max]", intMax.toString()).replace("[Now]", intChars.toString()); if (intChars > intMax) { MsgStr = "" + MsgStr + ""; } if (objMsg) { objMsg.innerHTML = MsgStr; } } function GetRealLength(obj, sType) { //var objvalue = obj.value; var objvalue = obj.value.replace("\r\n", "\n"); if (objvalue == null || typeof objvalue == 'undefined') return 0; var intChars = parseInt(objvalue.length); //if (objvalue.indexOf("\n") !=-1){ //var reg = new RegExp("\n","g"); //var count =objvalue.match(reg); //intChars = intChars + count.length; //} if (sType.toUpperCase() == "U") return intChars; //NChar (以byte計算) var TChar = 0; for (var i = 0; i < intChars; i++) { //若為中文字視為2Byte if (obj.value.charCodeAt(i) > 255) TChar = TChar + 2; else TChar++; } return TChar; } //==================================================================================================== // 離開前檢查字數 //==================================================================================================== // CheckMsg: 確保欄位已通過檢核.(說明: A欄位未通過檢核時又進入B欄位,會造成IE一直跳出警告視窗) //var CheckMsg = true; function ShowCheckMsg(objid) { var tbobj = document.getElementById(objid + "_tb"); var objMsg = document.getElementById(objid + "_showlen"); var intMax = tbobj.getAttribute('asMax'); var asLenMsg = tbobj.getAttribute('asLenMsg'); var sType = tbobj.getAttribute('asShowLen'); var intChars = GetRealLength(tbobj, sType) if (intChars > intMax) { var defMsg = asLenMsg.replace("[Max]", intMax.toString()).replace("[Now]", intChars.toString()); window.alert(defMsg); //tbobj.select(); //tbobj.setActive(); //tbobj.focus(); } } //檢查日期起迄 function DateBeginEndCheck(objid, isRocDate) { var begin_date; var end_date; var input_obj; //先確定目前進來是Begin還是End if (objid.indexOf("_tbBegin_tb") > -1) { begin_date = document.getElementById(objid); //取得另一個 end_date = document.getElementById(objid.replace(/_tbBegin_tb$/g, "_tbEnd_tb")); input_obj = "B"; } else if (objid.indexOf("_tbEnd_tb") > -1) { end_date = document.getElementById(objid); //取得另一個 begin_date = document.getElementById(objid.replace(/_tbEnd_tb$/g, "_tbBegin_tb")); input_obj = "E"; } if (begin_date != null && typeof (begin_date) != 'undefined' && end_date != null && typeof (end_date) != 'undefined') { var begin_date_err = document.getElementById(begin_date.id.replace(/_tb$/g, "_err")); var end_date_err = document.getElementById(end_date.id.replace(/_tb$/g, "_err")); //20210630_依平_當其中一個欄位有輸入,另一個欄位就必須要輸入 if (input_obj == "B") { begin_date_err.innerText = ""; if (begin_date.value.length == 0 && end_date.value.length > 0) { return "起訖日期必須都有值"; } } else if (input_obj == "E") { end_date_err.innerText = ""; if (begin_date.value.length > 0 && end_date.value.length == 0) { return "起訖日期必須都有值"; } } //確定有起訖,檢查是不是都有值 if (begin_date.value.length > 0 && end_date.value.length > 0) { if (begin_date_err != null && typeof (begin_date_err) != 'undefined' && end_date_err != null && typeof (end_date_err) != 'undefined') { //先把錯誤都拿掉 if (beforeMsg == "起始日期要在結束日期之前") { beforeMsg = ""; } begin_date_err.innerText = begin_date_err.innerText.replace("起始日期要在結束日期之前", ""); end_date_err.innerText = end_date_err.innerText.replace("起始日期要在結束日期之前", ""); var startDate = begin_date.value; var endDate = end_date.value; //民國轉西元 if (isRocDate) { startDate = (Number(startDate.substring(0, 3)) + 1911).toString() + startDate.substring(3); endDate = (Number(endDate.substring(0, 3)) + 1911).toString() + endDate.substring(3); } //轉換為日期格式 startDate = startDate.replace(/-/g, "/"); endDate = endDate.replace(/-/g, "/"); //如果起始日期大於結束日期 if (Date.parse(startDate) - Date.parse(endDate) > 0) { return "起始日期要在結束日期之前"; } } } if (begin_date.value.length == 0 && end_date.value.length == 0) { begin_date_err.innerText = ""; end_date_err.innerText = ""; } } return ""; } //檢查密碼 function pswdBlur(obj) { debugger; var sValue = obj.value; var bMust = (obj.getAttribute('asMust').toLowerCase() == "true") ? true : false; var iMin = obj.getAttribute('asMin'); var iMax = obj.getAttribute('asMax'); var sErrMsg = obj.getAttribute('asErrMsg'); var bReadOnly = (obj.getAttribute('ReadOnly') == "ReadOnly") ? true : false; if (bReadOnly) { return; } if (sValue.length == 0 && bMust) { ShowMsg(obj, "密碼複雜度不符合要求"); return; } if (iMin != 0 && sValue.length < iMin) { ShowMsg(obj, "密碼複雜度不符合要求最小長度為" + iMin); return; } if (iMax != 0 && sValue.length > iMax) { ShowMsg(obj, "超過資料長度" + iMax); return; } //規則檢查 var ruleType = obj.getAttribute('asrulttype').split(""); for (var jrt = 0; jrt < ruleType.length; jrt++) { var sRegex; switch (ruleType[jrt]) { case "E": sRegex = /[a-zA-Z]/; break; case "U": sRegex = /[A-Z]/; break; case "L": sRegex = /[a-z]/; break; case "D": sRegex = /[0-9]/; break; case "N": sRegex = /[\W_]/; break; default: break; } if (sRegex != null) { var re = new RegExp(sRegex); var found = sValue.match(re); if (found == null) { ShowMsg(obj, "密碼複雜度不符合要求"); return; } } } //檢查成功將值清空 var obj_valid = document.getElementById(obj.id.replace(/_tb$/g, "_err")); if (obj_valid != null) { obj_valid.innerText = ''; } } function pswdShowCom(obj) { debugger; var pswdscore = 0; var sValue = obj.value; var wobj = document.getElementById(obj.id.replace("_tb", "_weak")); var mobj = document.getElementById(obj.id.replace("_tb", "_medium")); var sobj = document.getElementById(obj.id.replace("_tb", "_strong")); var pswdscore = pswcomplexity(sValue); if (pswdscore > 0) { if (pswdscore == 1) { if (!wobj.classList.contains("active")) wobj.classList.add("active"); if (mobj.classList.contains("active")) mobj.classList.remove("active"); if (sobj.classList.contains("active")) sobj.classList.remove("active"); } else if (pswdscore < 4) { if (!wobj.classList.contains("active")) wobj.classList.add("active"); if (!mobj.classList.contains("active")) mobj.classList.add("active"); if (sobj.classList.contains("active")) sobj.classList.remove("active"); } else { if (!wobj.classList.contains("active")) wobj.classList.add("active"); if (!mobj.classList.contains("active")) mobj.classList.add("active"); if (!sobj.classList.contains("active")) sobj.classList.add("active"); } } else { if (wobj.classList.contains("active")) wobj.classList.remove("active"); if (mobj.classList.contains("active")) mobj.classList.remove("active"); if (sobj.classList.contains("active")) sobj.classList.remove("active"); } } function pswcomplexity(pvalue) { var score = 0, length = pvalue.length, upperCase, lowerCase, digits, nonAlpha; //字串長度分數 if (length < 5) score += 0; else if (length < 8) score += 5; else if (length < 16) score += 10; else score += 15; //小寫字母分數 lowerCase = pvalue.match(/[a-z]/g);//回傳Array字串 if (lowerCase) score += 1; //大寫字母分數 upperCase = pvalue.match(/[A-Z]/g); if (upperCase) score += 5; //同時有大小寫的分數 if (upperCase && lowerCase) score += 2; digits = pvalue.match(/\d/g); //if(digits && digits.length > 1) score += 5; //有至少一個數字的分數 if (digits) { score += 5; } //底線也算特殊字元 nonAlpha = pvalue.match(/[\W_]/g); if (nonAlpha) {//特殊字元 //共兩個以上 score += (nonAlpha.length > 1) ? 15 : 10; } //同時有大小寫字母+數字+特殊字元 if (upperCase && lowerCase && digits && nonAlpha) score += 15; //console.log("score:" + score); //五個級距 if (score < 15) return 0; if (score < 20) return 1; if (score < 35) return 2; if (score < 50) return 3; return 4; };