Files
sryang 577060bc78 chore: 首次簽入 Thinkyu ASP.NET 專案
- 加入 Visual Studio / ASP.NET .gitignore
- 排除建置輸出、IDE 設定、NuGet packages、大型 MSI 安裝檔
2026-09-10 09:42:37 +08:00

632 lines
22 KiB
JavaScript

//--------------------------------------------
// 開窗挑選日期
//--------------------------------------------
function PickDate(objid, aCY11, OLD_VALUE)
{
var aValue = "";
var CY11 = 1911;
var SEPARATOR = "";
//alert(UserLangId.toUpperCase());
//if (UserLangId.toUpperCase() == "ZH-TW")
// CY11 = 1911;
if (window.showModalDialog)
{
var datePicker = document.getElementById("DatePicker");
var objValue = document.getElementById(objid);
datePicker.setAttribute("src", "utility/DatePicker.aspx?SENDER=" + objid + "&CY11=" + CY11 + "&SEPARATOR=" + SEPARATOR);
//datePicker.style.display = "block";
datePicker.style.width = 260;
datePicker.style.height = 260;
datePicker.style.left = offsetLeft(objValue) + "px";
datePicker.style.top = offsetTop(objValue) + objValue.offsetHeight + "px";
//alert(datePicker.offsetTop);
//alert(datePicker.offsetHeight);
//alert(document.body.clientHeight);
if (datePicker.offsetTop + datePicker.offsetHeight > document.body.clientHeight)
datePicker.style.top = document.body.clientHeight - datePicker.offsetHeight + "px";
if (datePicker.offsetLeft + datePicker.offsetWidth > document.body.clientWidth)
datePicker.style.left = document.body.clientWidth - datePicker.offsetWidth + "px";
//datePicker.sender = document.getElementById(objid);
//var blocker = document.getElementById("Blocker");
//blocker.src = "utility/blocker.htm";
//blocker.src = "about:blank";
//blocker.style.display = "block";
//blocker.style.width = "100%";
//blocker.style.height = "100%";
}
else
{
window.open(`utility/DatePicker.aspx?SENDER=${objid}&CY11=${CY11}&SEPARATOR=${SEPARATOR}&VALUE=${OLD_VALUE}`
, "_new"
, `height=${240 * window.devicePixelRatio}px,width=${280 * window.devicePixelRatio}px,help=no,status=no,resizable=no,toolbar=no`
);
}
}
//--------------------------------------------
// 存檔前檢查
//--------------------------------------------
function CheckInput()
{
var i = 0;
// 檢查不可空白欄位
for (i in arNotEmpty)
{
obj = document.getElementById(arNotEmpty[i]);
if (!CheckEmpty(obj, arObjName[arNotEmpty[i]]))
return false;
}
// 檢查數值欄位
i = 0;
for (i in arIsNumber)
{
obj = document.getElementById(arIsNumber[i]);
if (!CheckNumber(obj, arObjName[arIsNumber[i]]))
return false;
}
// 檢查日期欄位
i = 0;
for (i in arIsDate)
{
obj = document.getElementById(arIsDate[i]);
if (!CheckDate(obj, arObjName[arIsDate[i]]))
return false;
}
return confirm(msgConfirmSave);
}
//--------------------------------------------
// 檢查是否空白
//--------------------------------------------
function CheckEmpty(obj, objCaption)
{
if (obj.value === "")
{
s = msgNotEmpty + " \"" + objCaption + "\".";
alert(s);
obj.focus();
return false;
}
return true;
}
//--------------------------------------------
// 檢查是否輸入為數值
//--------------------------------------------
function CheckNumber(obj, objCaption)
{
if (isNaN(parseFloat(obj.value)))
{
s = " \"" + objCaption + "\" " + msgMustNumber;
alert(s);
obj.focus();
return false;
}
return true;
}
//--------------------------------------------
// 檢查日期是否合理
//--------------------------------------------
function CheckDate(obj, objCaption)
{
if (parseDate(obj) !== null)
{
s = " \"" + objCaption + "\" " + msgMustDate;
alert(s);
obj.focus();
return false;
}
return true;
}
//------------------------------------------------------------
// 取得按下按鍵相關資料
//------------------------------------------------------------
function GetKeyData(evt)
{
if (!evt)
{
// grab IE event object
evt = window.event
}
else if (!evt.keyCode)
{
// grab NN4 event info
evt.keyCode = evt.which;
evt.altKey = evt.modifiers & Event.ALT_MASK;
evt.ctrlKey = evt.modifiers & Event.CONTROL_MASK;
evt.shiftKey = evt.modifiers & Event.SHIFT_MASK;
}
return evt;
}
//------------------------------------------------------------
// 取得按下的按鍵,可在 onKeyDown, onKeyUp, onKeyPress 中使用
//------------------------------------------------------------
function GetKeyCode(evt)
{
return GetKeyData(evt).keyCode;
}
//------------------------------------------------------------
// 判斷按下的是否為某鍵
//------------------------------------------------------------
function IsKeyCode(evt, keyCode, altKey, ctrlKey, shiftKey)
{
var keyEvt = GetKeyData(evt);
return (keyEvt.keyCode === keyCode &&
((!altKey && !keyEvt.altKey) || (altKey && keyEvt.altKey)) &&
((!ctrlKey && !keyEvt.ctrlKey) || (ctrlKey && keyEvt.ctrlKey)) &&
((!shiftKey && !keyEvt.shiftKey) || (shiftKey && keyEvt.shiftKey)));
}
//------------------------------------------------------------
// 延遲若干毫秒後顯示 "處理中"
//------------------------------------------------------------
function ShowProcessing(delay)
{
if (typeof delay !== "undefined")
window.setTimeout(ShowProcessing1, delay);
else
ShowProcessing1();
}
//------------------------------------------------------------
// 顯示 "處理中"
//------------------------------------------------------------
function ShowProcessing1()
{
var datePicker = document.getElementById("DatePicker");
datePicker.src = "utility/Processing.htm";
datePicker.style.width = 340;
datePicker.style.height = 180;
datePicker.style.left = Math.round((document.body.clientWidth - datePicker.offsetWidth) / 2) + "px";
datePicker.style.top = Math.round((document.body.clientHeight - datePicker.offsetHeight) / 2) + "px";
datePicker.style.border = "none";
}
//------------------------------------------------------------
// 隱藏 "處理中"
//------------------------------------------------------------
function HideProcessing()
{
var datePicker = document.getElementById("DatePicker");
datePicker.style.width = 0;
datePicker.style.height = 0;
datePicker.style.left = 0;
datePicker.style.top = 0;
}
/**
* 顯示 CR 報表
* @param {string} ra 服務器 URL
* @param {string} rr 報表檔名稱
* @param {string} rd 資料檔名稱
* @param {string} rp 參數檔名稱
* @param {string} ldir 本地暫存目錄,可空白
* @param {string} lr 本地暫存報表檔名稱,可空白
* @param {string} ld 本地暫存資料檔名稱,可空白
* @param {string} lp 本地暫存參數檔名稱,可空白
* @param {string} un 登入的帳號,若服務器要求 Windows 登入則需要
* @param {string} up 登入的密碼,若服務器要求 Windows 登入則需要
* @param {string} ud 登入的域名,若服務器要求 Windows 登入則需要
*/
function ShowReportJSONP(ra, rr, rd, rp, ldir, lr, ld, lp, un, up, ud)
{
var url = "http://localhost:8688/CRV";
url += ra ? "?ra=" + ra : "";
url += rr ? "&rr=" + rr : "";
url += rd ? "&rd=" + rd : "";
url += rp ? "&rp=" + rp : "";
url += ldir ? "&ldir=" + ldir : "";
url += lr ? "&lr=" + lr : "";
url += ld ? "&ld=" + ld : "";
url += lp ? "&lp=" + lp : "";
url += un ? "&un=" + un : "";
url += up ? "&up=" + up : "";
url += ud ? "&ud=" + ud : "";
url += "&now=" + Date.now();
// navigator.sendBeacon(url);
var script = document.createElement('script');
script.setAttribute('src', url);
document.getElementsByTagName('head')[0].appendChild(script);
}
// ===================================================================
// Author: Matt Kruse <matt@mattkruse.com>
// WWW: http://www.mattkruse.com/
//
// NOTICE: You may use this code for any purpose, commercial or
// private, without any further permission from the author. You may
// remove this notice from your final code if you wish, however it is
// appreciated by the author if at least my web site address is kept.
//
// You may *NOT* re-distribute this code in any way except through its
// use. That means, you can include it in your product, or your web
// site, or any other form where the code is actually being used. You
// may not put the plain javascript up on your site for download or
// include it in your javascript libraries for download.
// If you wish to share this code with others, please just point them
// to the URL instead.
// Please DO NOT link directly to my .js files from your site. Copy
// the files to your server and use them there. Thank you.
// ===================================================================
// HISTORY
// ------------------------------------------------------------------
// May 17, 2003: Fixed bug in parseDate() for dates <1970
// March 11, 2003: Added parseDate() function
// March 11, 2003: Added "NNN" formatting option. Doesn't match up
// perfectly with SimpleDateFormat formats, but
// backwards-compatability was required.
// ------------------------------------------------------------------
// These functions use the same 'format' strings as the
// java.text.SimpleDateFormat class, with minor exceptions.
// The format string consists of the following abbreviations:
//
// Field | Full Form | Short Form
// -------------+--------------------+-----------------------
// Year | yyyy (4 digits) | yy (2 digits), y (2 or 4 digits)
// Month | MMM (name or abbr.)| MM (2 digits), M (1 or 2 digits)
// | NNN (abbr.) |
// Day of Month | dd (2 digits) | d (1 or 2 digits)
// Day of Week | EE (name) | E (abbr)
// Hour (1-12) | hh (2 digits) | h (1 or 2 digits)
// Hour (0-23) | HH (2 digits) | H (1 or 2 digits)
// Hour (0-11) | KK (2 digits) | K (1 or 2 digits)
// Hour (1-24) | kk (2 digits) | k (1 or 2 digits)
// Minute | mm (2 digits) | m (1 or 2 digits)
// Second | ss (2 digits) | s (1 or 2 digits)
// AM/PM | a |
//
// NOTE THE DIFFERENCE BETWEEN MM and mm! Month=MM, not mm!
// Examples:
// "MMM d, y" matches: January 01, 2000
// Dec 1, 1900
// Nov 20, 00
// "M/d/yy" matches: 01/20/00
// 9/2/00
// "MMM dd, yyyy hh:mm:ssa" matches: "January 01, 2000 12:30:45AM"
// ------------------------------------------------------------------
var MONTH_NAMES = new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
var DAY_NAMES = new Array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat');
function LZ(x) { return (x < 0 || x > 9 ? "" : "0") + x }
// ------------------------------------------------------------------
// isDate ( date_string, format_string )
// Returns true if date string matches format of format string and
// is a valid date. Else returns false.
// It is recommended that you trim whitespace around the value before
// passing it to this function, as whitespace is NOT ignored!
// ------------------------------------------------------------------
function isDate(val, format)
{
var date = getDateFromFormat(val, format);
if (date === 0) { return false; }
return true;
}
// -------------------------------------------------------------------
// compareDates(date1,date1format,date2,date2format)
// Compare two date strings to see which is greater.
// Returns:
// 1 if date1 is greater than date2
// 0 if date2 is greater than date1 of if they are the same
// -1 if either of the dates is in an invalid format
// -------------------------------------------------------------------
function compareDates(date1, dateformat1, date2, dateformat2)
{
var d1 = getDateFromFormat(date1, dateformat1);
var d2 = getDateFromFormat(date2, dateformat2);
if (d1 === 0 || d2 === 0)
{
return -1;
}
else if (d1 > d2)
{
return 1;
}
return 0;
}
// ------------------------------------------------------------------
// formatDate (date_object, format)
// Returns a date in the output format specified.
// The format string uses the same abbreviations as in getDateFromFormat()
// ------------------------------------------------------------------
function formatDate(date, format)
{
format = format + "";
var result = "";
var i_format = 0;
var c = "";
var token = "";
var y = date.getYear() + "";
var M = date.getMonth() + 1;
var d = date.getDate();
var E = date.getDay();
var H = date.getHours();
var m = date.getMinutes();
var s = date.getSeconds();
var yyyy, yy, MMM, MM, dd, hh, h, mm, ss, ampm, HH, KK, K, kk, k;
// Convert real date parts into formatted versions
var value = new Object();
if (y.length < 4) { y = "" + (y - 0 + 1900); }
value["y"] = "" + y;
value["yyyy"] = y;
value["yy"] = y.substring(2, 4);
value["M"] = M;
value["MM"] = LZ(M);
value["MMM"] = MONTH_NAMES[M - 1];
value["NNN"] = MONTH_NAMES[M + 11];
value["d"] = d;
value["dd"] = LZ(d);
value["E"] = DAY_NAMES[E + 7];
value["EE"] = DAY_NAMES[E];
value["H"] = H;
value["HH"] = LZ(H);
if (H === 0) { value["h"] = 12; }
else if (H > 12) { value["h"] = H - 12; }
else { value["h"] = H; }
value["hh"] = LZ(value["h"]);
if (H > 11) { value["K"] = H - 12; } else { value["K"] = H; }
value["k"] = H + 1;
value["KK"] = LZ(value["K"]);
value["kk"] = LZ(value["k"]);
if (H > 11) { value["a"] = "PM"; }
else { value["a"] = "AM"; }
value["m"] = m;
value["mm"] = LZ(m);
value["s"] = s;
value["ss"] = LZ(s);
while (i_format < format.length)
{
c = format.charAt(i_format);
token = "";
while ((format.charAt(i_format) === c) && (i_format < format.length))
{
token += format.charAt(i_format++);
}
if (value[token] !== null) { result = result + value[token]; }
else { result = result + token; }
}
return result;
}
// ------------------------------------------------------------------
// Utility functions for parsing in getDateFromFormat()
// ------------------------------------------------------------------
function _isInteger(val)
{
var digits = "1234567890";
for (var i = 0; i < val.length; i++)
{
if (digits.indexOf(val.charAt(i)) === -1) { return false; }
}
return true;
}
function _getInt(str, i, minlength, maxlength)
{
for (var x = maxlength; x >= minlength; x--)
{
var token = str.substring(i, i + x);
if (token.length < minlength) { return null; }
if (_isInteger(token)) { return token; }
}
return null;
}
// ------------------------------------------------------------------
// getDateFromFormat( date_string , format_string )
//
// This function takes a date string and a format string. It matches
// If the date string matches the format string, it returns the
// getTime() of the date. If it does not match, it returns 0.
// ------------------------------------------------------------------
function getDateFromFormat(val, format)
{
val = val + "";
format = format + "";
var i_val = 0;
var i_format = 0;
var c = "";
var token = "";
var token2 = "";
var x, y;
var now = new Date();
var year = now.getYear();
var month = now.getMonth() + 1;
var date = 1;
var hh = now.getHours();
var mm = now.getMinutes();
var ss = now.getSeconds();
var ampm = "";
while (i_format < format.length)
{
// Get next token from format string
c = format.charAt(i_format);
token = "";
while ((format.charAt(i_format) === c) && (i_format < format.length))
{
token += format.charAt(i_format++);
}
// Extract contents of value based on format token
if (token === "yyyy" || token === "yy" || token === "y")
{
if (token === "yyyy") { x = 4; y = 4; }
if (token === "yy") { x = 2; y = 2; }
if (token === "y") { x = 2; y = 4; }
year = _getInt(val, i_val, x, y);
if (year === null) { return 0; }
i_val += year.length;
if (year.length === 2)
{
if (year > 70) { year = 1900 + (year - 0); }
else { year = 2000 + (year - 0); }
}
}
else if (token === "MMM" || token === "NNN")
{
month = 0;
for (var i = 0; i < MONTH_NAMES.length; i++)
{
var month_name = MONTH_NAMES[i];
if (val.substring(i_val, i_val + month_name.length).toLowerCase() === month_name.toLowerCase())
{
if (token === "MMM" || (token === "NNN" && i > 11))
{
month = i + 1;
if (month > 12) { month -= 12; }
i_val += month_name.length;
break;
}
}
}
if ((month < 1) || (month > 12)) { return 0; }
}
else if (token === "EE" || token === "E")
{
for (i = 0; i < DAY_NAMES.length; i++)
{
var day_name = DAY_NAMES[i];
if (val.substring(i_val, i_val + day_name.length).toLowerCase() === day_name.toLowerCase())
{
i_val += day_name.length;
break;
}
}
}
else if (token === "MM" || token === "M")
{
month = _getInt(val, i_val, token.length, 2);
if (month === null || (month < 1) || (month > 12)) { return 0; }
i_val += month.length;
}
else if (token === "dd" || token === "d")
{
date = _getInt(val, i_val, token.length, 2);
if (date === null || (date < 1) || (date > 31)) { return 0; }
i_val += date.length;
}
else if (token === "hh" || token === "h")
{
hh = _getInt(val, i_val, token.length, 2);
if (hh === null || (hh < 1) || (hh > 12)) { return 0; }
i_val += hh.length;
}
else if (token === "HH" || token === "H")
{
hh = _getInt(val, i_val, token.length, 2);
if (hh === null || (hh < 0) || (hh > 23)) { return 0; }
i_val += hh.length;
}
else if (token === "KK" || token === "K")
{
hh = _getInt(val, i_val, token.length, 2);
if (hh === null || (hh < 0) || (hh > 11)) { return 0; }
i_val += hh.length;
}
else if (token === "kk" || token === "k")
{
hh = _getInt(val, i_val, token.length, 2);
if (hh === null || (hh < 1) || (hh > 24)) { return 0; }
i_val += hh.length; hh--;
}
else if (token === "mm" || token === "m")
{
mm = _getInt(val, i_val, token.length, 2);
if (mm === null || (mm < 0) || (mm > 59)) { return 0; }
i_val += mm.length;
}
else if (token === "ss" || token === "s")
{
ss = _getInt(val, i_val, token.length, 2);
if (ss === null || (ss < 0) || (ss > 59)) { return 0; }
i_val += ss.length;
}
else if (token === "a")
{
if (val.substring(i_val, i_val + 2).toLowerCase() === "am") { ampm = "AM"; }
else if (val.substring(i_val, i_val + 2).toLowerCase() === "pm") { ampm = "PM"; }
else { return 0; }
i_val += 2;
}
else
{
if (val.substring(i_val, i_val + token.length) !== token) { return 0; }
else { i_val += token.length; }
}
}
// If there are any trailing characters left in the value, it doesn't match
if (i_val !== val.length) { return 0; }
// Is date valid for month?
if (month === 2)
{
// Check for leap year
if (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0))
{ // leap year
if (date > 29) { return 0; }
}
else { if (date > 28) { return 0; } }
}
if ((month === 4) || (month === 6) || (month === 9) || (month === 11))
{
if (date > 30) { return 0; }
}
// Correct hours value
if (hh < 12 && ampm === "PM") { hh = hh - 0 + 12; }
else if (hh > 11 && ampm === "AM") { hh -= 12; }
var newdate = new Date(year, month - 1, date, hh, mm, ss);
return newdate.getTime();
}
// ------------------------------------------------------------------
// parseDate( date_string [, prefer_euro_format] )
//
// This function takes a date string and tries to match it to a
// number of possible date formats to get the value. It will try to
// match against the following international formats, in this order:
// y-M-d MMM d, y MMM d,y y-MMM-d d-MMM-y MMM d
// M/d/y M-d-y M.d.y MMM-d M/d M-d
// d/M/y d-M-y d.M.y d-MMM d/M d-M
// A second argument may be passed to instruct the method to search
// for formats like d/M/y (european format) before M/d/y (American).
// Returns a Date object or null if no patterns match.
// ------------------------------------------------------------------
function parseDate(val)
{
var preferEuro = (arguments.length === 2) ? arguments[1] : false;
generalFormats = new Array('y/M/d', 'yyyy/MM/dd', 'y-M-d', 'MMM d, y', 'MMM d,y', 'y-MMM-d', 'd-MMM-y', 'MMM d');
monthFirst = new Array('M/d/y', 'M-d-y', 'M.d.y', 'MMM-d', 'M/d', 'M-d');
dateFirst = new Array('d/M/y', 'd-M-y', 'd.M.y', 'd-MMM', 'd/M', 'd-M');
var checkList = new Array('generalFormats', preferEuro ? 'dateFirst' : 'monthFirst', preferEuro ? 'monthFirst' : 'dateFirst');
var d = null;
for (var i = 0; i < checkList.length; i++)
{
var l = window[checkList[i]];
for (var j = 0; j < l.length; j++)
{
d = getDateFromFormat(val, l[j]);
if (d !== 0) { return new Date(d); }
}
}
return null;
}