﻿//取得目前Local的日期時間字串。 yyyy-mm-dd hh:nn:ss
function sys_Now(){
	if (typeof(g_intTimezoneOffset) == "undefined") {alert("g_intTimezoneOffset is undefined.");return("");}
	if (typeof(g_intDST) == "undefined") {alert("g_intDST is undefined.");return("");}
	if (typeof(g_strDSTperiod) == "undefined") {alert("g_strDSTperiod is undefined.");return("");}

	var ms = new Date().valueOf();  //讀取目前時間的UTC毫秒數
	var U = new Date(ms+g_intTimezoneOffset*60*1000);	//調整為User所屬時區的時差
	if ((g_intDST>0) && sys_IsDaylightSaving(U,g_strDSTperiod)) {
		ms = U.valueOf();
		U = new Date(ms+60*60*1000);
	}
	return(sys_FormatDatetime(U,0,false));
}

//傳入UTC日期物件及該時區的DST字串，檢查是否為日光節約時間，傳回true/false。
function sys_IsDaylightSaving(utcDate,strDST) {
	var y;
    strDST = strDST.replace(/^\s*/i,""); strDST = strDST.replace(/\s*$/i,"");  //trim字串
	if (strDST == "") {return (false);}

	//範例：04F02-10L02 (美國)
	//      4月的第一個星期天凌晨2點 ~ 10月的最後一個星期天凌晨2點

	strDST = strDST.toUpperCase();
    var strDSTtype = "USA|TAIWAN|";
    strDSTtype += "([0][1-9]|[1][0-2])([FL])([0-6])([0-9])([-])([0][1-9]|[1][0-2])([FL])([0-6])([0-9])|";
    strDSTtype += "([0][1-9]|[1][0-2])([0][1-9]|[1-2][0-9]|[3][0-1])([0-9])([-])"+
    			  "([0][1-9]|[1][0-2])([0][1-9]|[1-2][0-9]|[3][0-1])([0-9])";

    var re=new RegExp("^"+strDSTtype+"$","ig");
    if (re.test(strDST)==false) {alert("DSTpriod can not parse.\n"+strDST);return (false);}

	switch (strDST) {
		case "USA":
			//美國於公元1966年制定之The Uniform Time Act,其有關日光節約時間規定,自1967年生效。
			//而日光節約時間係從每年4月最後一個星期日起,到10月最後一個星期日止。
			y=utcDate.getUTCFullYear();
			if (y < 1967) {return(false);}
			if (y>=1967 && y<1990) {
				strDST = "04L00-10L00";
				return(sys_CalDaylightString(utcDate,strDST));
			}
			//但自1990年起,改自每年4月第一個星期日起，到10月最後一個星期日止，又時間之調整皆定在2:00am。
			strDST = "04F02-10L02";
			return(sys_CalDaylightString(utcDate,strDST));
			break;
		case "TAIWAN":
			y=utcDate.getUTCFullYear();
			if (y<1945) {return(false);}
			if (y>=1962 && y<=1973) {return(false);}
			if (y>=1976 && y<=1978) {return(false);}
			if (y>=1980) {return(false);}
			//1945~1951年於每年5月1日~9月30日
			if (y>=1945 && y<=1951) {strDST = "05010-09300";}
			//1952年3月1日~10月31日.
			if (y==1952) {strDST = "03010-10310";}
			//1953,1954年4月1日~10月31日.
			if (y>=1953 && y<=1954) {strDST = "04010-10310";}
			//1955~1959年4月1日~9月30日.
			if (y>=1955 && y<=1959) {strDST = "04010-09300";}
			//1960,1961年6月1日~9月30日.
			if (y>=1960 && y<=1961) {strDST = "06010-09300";}
			//1974,1975年4月1日~9月30日.
			if (y>=1974 && y<=1975) {strDST = "04010-09300";}
			//1979年7月1日~9月30日.
			if (y>=1979) {strDST = "07010-09300";}
			return(sys_CalDaylightString(utcDate,strDST));
			break;
		default:
			return(sys_CalDaylightString(utcDate,strDST));
			break;
	}

}

//Internal Use Only
function sys_CalDaylightString(utcDate,strDST) {
	var m1 = parseInt(strDST.substr(0,2),10); //起始月份
	var wo1 = strDST.substr(2,1);    //週的計算方式，wo：F=第一,L=最後，空白=不使用
	var w1 = parseInt(strDST.substr(3,1),10); //起始週別
	var h1 = parseInt(strDST.substr(4,1),10); //起始時間

	var m2 = parseInt(strDST.substr(6,2),10);  //截止月份
	var wo2 = strDST.substr(8,1);    //週的計算方式
	var w2 = parseInt(strDST.substr(9,1),10);  //截止週別
	var h2 = parseInt(strDST.substr(10,1),10); //截止時間

	if (wo1=="0" || wo1=="1" || wo1=="2" || wo1=="3") {
		var utcStart= new Date(Date.UTC(utcDate.getUTCFullYear(), m1, parseInt(strDST.substr(2,2),10),h1));
	}
	else {
		var utcStart= sys_GetWeekDay(utcDate.getUTCFullYear(),m1,wo1,w1,h1);
	}

	if (wo2=="0" || wo2=="1" || wo2=="2" || wo2=="3") {
		var utcEnd= new Date(Date.UTC(utcDate.getUTCFullYear(), m2, parseInt(strDST.substr(8,2),10),h2));
	}
	else {
		var utcEnd= sys_GetWeekDay(utcDate.getUTCFullYear(),m2,wo2,w2,h2);
	}

	if (utcEnd > utcStart) {
		if (utcDate>utcStart && utcDate<utcEnd) {return(true);} else {return(false);}
	}
	else {
		if (utcDate>utcStart || utcDate<utcEnd) {return(true);} else {return(false);}
	}
}



//找出指定年月的第幾個星期幾的指定時分秒，傳回一個UTC日期物件。
function sys_GetWeekDay(y,m,wo,w,h,n,s){
	if (typeof(h)=="undefined") {h=0};
	if (typeof(n)=="undefined") {n=0};
	if (typeof(s)=="undefined") {s=0};
	switch (wo.toUpperCase()) {
		case "F":
			var U = new Date(Date.UTC(y,m-1,1)); //先找出當月第一天
			for (i=0; i<=6; i++) {
				if (U.getUTCDay() == w) {
					break; //找到了
				}
				else {
					U = new Date(Date.UTC(y,m-1,1+i)); //找下一天
				}
			}
			U = new Date(Date.UTC(y,m-1,U.getUTCDate(),h,n,s));
			break;
		case "L":
			var U = new Date(Date.UTC(y,m,1)); //先找出下個月的第一天
			var ms = U.valueOf() - (24*60*60*1000);
			U = new Date(ms); //下個月的第一天減去24小時，就是當月的最後一天
			for (i=0; i<=6; i++) {
				if (U.getUTCDay() == w) {
					break; //找到了
				}
				else {
					U = new Date(Date.UTC(y,m-1,U.getUTCDate()-1)); //找前一天
				}
			}
			U = new Date(Date.UTC(y,m-1,U.getUTCDate(),h,n,s));
			break;
	}
	return(U);
}

//取得目前的UTC日期時間標準格式字串。 yyyy-mm-dd hh:nn:ss
function sys_NowUTC(){
	var U, y,m,d,h,n,s;
	U = new Date();
	y=U.getUTCFullYear();
	m=U.getUTCMonth()+1;m=(m<10)?"0"+m:m;
	d=U.getUTCDate();d=(d<10)?"0"+d:d;
	h=U.getUTCHours();h=(h<10)?"0"+h:h;
	n=U.getUTCMinutes();n=(n<10)?"0"+n:n;
	s=U.getUTCSeconds();s=(s<10)?"0"+s:s;
	return(y+"-"+m+"-"+d+" "+h+":"+n+":"+s);
}

//取得目前的UTC日期物件。
function sys_NowUTCdate(){
	if (typeof(g_intTimezoneOffset) == "undefined") {alert("g_intTimezoneOffset is undefined.");return("");}
	if (typeof(g_intDST) == "undefined") {alert("g_intDST is undefined.");return("");}
	if (typeof(g_strDSTperiod) == "undefined") {alert("g_strDSTperiod is undefined.");return("");}

	var ms = new Date().valueOf();  //讀取目前時間的UTC毫秒數
	var U = new Date(ms+g_intTimezoneOffset*60*1000);	//調整為User所屬時區的時差
	if ((g_intDST>0) && sys_IsDaylightSaving(U,g_strDSTperiod)) {
		ms = U.valueOf();
		U = new Date(ms+60*60*1000);
	}
	return(U);
}

//將傳入的標準日期格式的字串或日期物件，轉換成指定TimeStyle的時間格式
function sys_FormatDatetime(varDate,intTimeStyle,blnShort) {
	var str1 = sys_ConvertDatetime(varDate,0,blnShort); //將日期字串Convert為標準的格式
	if (str1=="") return("");

    var y=str1.substr(0,4);
    var m=str1.substr(5,2);
    var d=str1.substr(8,2);

    if (!blnShort) {
	    var h=str1.substr(11,2);
	    var n=str1.substr(14,2);
	    var s=str1.substr(17,2);
    }

	var aryMonth = new Array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');

    switch (intTimeStyle) {
        case 0: //  yyyy-mm-dd hh:nn:ss
        	if (blnShort) {return(str1.substr(0,10));}
        	else {return(str1);}
        	break;
        case 1: //  yyyy/mm/dd hh:nn:ss
        	if (blnShort) {return(str1.substr(0,10).replace(/-/gi,'/'));}
        	else {return(str1.replace(/-/gi,'/'));}
        	break;
        case 2: //  ee/mm/dd hh:nn:ss
    		y = parseInt(y,10) - 1911;
        	if (blnShort) {return(y+"/"+m+"/"+d);}
        	else {return(y+"/"+m+"/"+d+" "+h+":"+n+":"+s);}
        	break;
        case 3: //  mm/dd/yyyy hh:nn:ss
        	if (blnShort) {return(m+"/"+d+"/"+y);}
        	else {return(m+"/"+d+"/"+y+" "+h+":"+n+":"+s);}
        	break;
        case 4: //  dd/mm/yyyy hh:nn:ss
        	if (blnShort) {return(d+"/"+m+"/"+y);}
        	else {return(d+"/"+m+"/"+y+" "+h+":"+n+":"+s);}
        	break;
        case 5: //  Mon dd yyyy hh:nn:ss
			m = parseInt(m,10)-1;
        	if (blnShort) {return(aryMonth[m]+" "+d+" "+y);}
        	else {return(aryMonth[m]+" "+d+" "+y+" "+h+":"+n+":"+s);}
        	break;
        case 6: //  dd Mon yyyy hh:nn:ss
			m = parseInt(m,10)-1
        	if (blnShort) {return(d+" "+aryMonth[m]+" "+y);}
        	else {return(d+" "+aryMonth[m]+" "+y+" "+h+":"+n+":"+s);}
        	break;
        default: //  yyyy-mm-dd hh:nn:ss
        	if (blnShort) {return(str1.substr(0,10));}
        	else {return(str1);}
        	break;
    }
}

//將傳入的使用者偏好日期字串，根據指定的TimeStyle來解析，將之轉換成標準的日期時間格式字串。 yyyy-mm-dd hh:nn:ss
function sys_ConvertDatetime(strDate,intTimeStyle,blnShort) {
    var U,y,m,d,h,n,s,str1,re;
	var aryMonth = new Array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');

    switch (intTimeStyle) {
        case 0: //  yyyy-mm-dd hh:nn:ss
        case 1: //  yyyy/mm/dd hh:nn:ss
		    U = sys_ParseDateYMD(strDate); if (isNaN(U)) {return("");}
        	break;
        case 2: //  yyyy/mm/dd hh:nn:ss
		    U = sys_ParseDateEMD(strDate); if (isNaN(U)) {return("");}
        	break;
        case 3: //  mm/dd/yyyy hh:nn:ss
		    U = sys_ParseDateMDY(strDate); if (isNaN(U)) {return("");}
        	break;
        case 4: //  dd/mm/yyyy hh:nn:ss
		    U = sys_ParseDateDMY(strDate); if (isNaN(U)) {return("");}
        	break;
        case 5: //  Mon dd yyyy hh:nn:ss
		    U = sys_ParseDateMonDY(strDate); if (isNaN(U)) {return("");}
        	break;
        case 6: //  dd Mon yyyy hh:nn:ss
		    U = sys_ParseDateDMonY(strDate); if (isNaN(U)) {return("");}
        	break;
       	default:
		    U = sys_ParseDateYMD(strDate); if (isNaN(U)) {return("");}
       		break;
    }
    y=U.getUTCFullYear(); y=(y<50)?y+=2000:y=(y<100)?y+=1900:y=(y<1000)?"0"+y:y;
    m=U.getUTCMonth()+1;m=(m<10)?"0"+m:m;
    d=U.getUTCDate();d=(d<10)?"0"+d:d;
    h=U.getUTCHours();h=(h<10)?"0"+h:h;
    n=U.getUTCMinutes();n=(n<10)?"0"+n:n;
    s=U.getUTCSeconds();s=(s<10)?"0"+s:s;
    if (blnShort) {return(y+"-"+m+"-"+d);} else {return(y+"-"+m+"-"+d+" "+h+":"+n+":"+s);}
}

//將UTC標準日期格式的字串，轉換為Local標準日期格式字串。 yyyy-mm-dd hh:nn:ss
function sys_UTCdatetimeToLocal(strUTC) {
	if (typeof(g_intTimezoneOffset) == "undefined") {alert("g_intTimezoneOffset is undefined.");return("");}
	if (typeof(g_intDST) == "undefined") {alert("g_intDST is undefined.");return("");}
	if (typeof(g_strDSTperiod) == "undefined") {alert("g_strDSTperiod is undefined.");return("");}

	var U = sys_ParseDateYMD(strUTC);
	if (isNaN(U)) {return("");}
	var ms = U.valueOf();
	U = new Date(ms+g_intTimezoneOffset*60*1000);
	if ((g_intDST>0) && sys_IsDaylightSaving(U,g_strDSTperiod)) {
		ms = U.valueOf();
		U = new Date(ms+60*60*1000);
	}
	return(sys_FormatDatetime(U,0,false));
}

//將Local標準日期格式的字串，轉換為UTC標準日期格式字串。 yyyy-mm-dd hh:nn:ss
function sys_LocalDatetimeToUTC(strLocalDatetime) {
	if (typeof(g_intTimezoneOffset) == "undefined") {alert("g_intTimezoneOffset is undefined.");return("");}
	if (typeof(g_intDST) == "undefined") {alert("g_intDST is undefined.");return("");}
	if (typeof(g_strDSTperiod) == "undefined") {alert("g_strDSTperiod is undefined.");return("");}

	var U = sys_ParseDateYMD(strLocalDatetime);
	if (isNaN(U)) {return("");}
	var ms = U.valueOf();
	U = new Date(ms-g_intTimezoneOffset*60*1000);
	if ((g_intDST>0) && sys_IsDaylightSaving(U,g_strDSTperiod)) {
		ms = U.valueOf();
		U = new Date(ms-60*60*1000);
	}
	return(sys_FormatDatetime(U,0,false));
}

//依據使用者偏好的日期時間格式(TimeStyle)來檢查指定的欄位是否為合法的日期時間字串。
function sys_CheckDatetimeField(strFieldName,blnNotEmpty) {
	if (typeof(document.all[strFieldName]) == "undefined") {
		alert('document.all["' + strFieldName + '"] is undefined.'); return;
	}

	if (typeof(g_msgThisFieldCouldNotBeBlank) == "undefined") {
		alert("g_msgThisFieldCouldNotBeBlank is undefined."); return;
	}

	if (typeof(g_msgInvalidDatetimeStyleFormat) == "undefined") {
		alert("g_msgInvalidDatetimeStyleFormat is undefined."); return;
	}

	if (typeof(blnNotEmpty) == "undefined") {blnNotEmpty=false;}

	var strDate = document.all[strFieldName].value;
    strDate = strDate.replace(/^\s*/i,""); strDate = strDate.replace(/\s*$/i,"");  //trim字串
	if (strDate == "" && blnNotEmpty) {alert(g_msgThisFieldCouldNotBeBlank); return;}

	var aryTimeStyleName = new Array("yyyy-mm-dd hh:nn:ss","yyyy/mm/dd hh:nn:ss","ee/mm/dd hh:nn:ss",
							         "mm/dd/yyyy hh:nn:ss","dd/mm/yyyy hh:nn:ss","Mon dd yyyy hh:nn:ss","dd Mon yyyy hh:nn:ss");

	var aryTimeStyleExample = new Array("2003-8-25 17:30:5","2003/8/25 17:30:5","92/8/25 17:30:5",
							            "8/25/2003 17:30:5","25/8/2003 17:30:5","Aug 25 2003 17:30:5","6 Aug 2003 17:30:5");

	strDate = sys_ConvertDatetime(strDate, g_intTimeStyle,false);
	if (strDate == "") {
		var strMsg = g_msgInvalidDatetimeStyleFormat.replace(/<var1>/gi,aryTimeStyleName[g_intTimeStyle]);
		strMsg = strMsg.replace(/<var2>/gi,aryTimeStyleExample[g_intTimeStyle]);
		alert(strMsg);
		document.all[strFieldName].value = "";
	}
	else {
		document.all[strFieldName].value = sys_FormatDatetime(strDate, g_intTimeStyle,false);
	}
}

//依據使用者偏好的日期格式(TimeStyle)來檢查指定的欄位是否為合法的日期字串。
function sys_CheckDateField(strFieldName,blnNotEmpty) {
	if (typeof(document.all[strFieldName]) == "undefined") {
		alert('document.all["' + strFieldName + '"] is undefined.'); return;
	}

	if (typeof(g_msgThisFieldCouldNotBeBlank) == "undefined") {
		alert("g_msgThisFieldCouldNotBeBlank is undefined."); return;
	}

	if (typeof(g_msgInvalidDatetimeStyleFormat) == "undefined") {
		alert("g_msgInvalidDatetimeStyleFormat is undefined."); return;
	}
	if (typeof(blnNotEmpty) == "undefined") {blnNotEmpty=false;}

	var strDate = document.all[strFieldName].value;
    strDate = strDate.replace(/^\s*/i,""); strDate = strDate.replace(/\s*$/i,"");  //trim字串
	if (strDate == "" && blnNotEmpty) {alert(g_msgThisFieldCouldNotBeBlank); return;}

	var aryTimeStyleName = new Array("yyyy-mm-dd","yyyy/mm/dd","ee/mm/dd","mm/dd/yyyy","dd/mm/yyyy","Mon dd yyyy","dd Mon yyyy");
	var aryTimeStyleExample = new Array("2003-8-25","2003/8/25","92/8/25","8/25/2003","25/8/2003","Aug 25 2003","6 Aug 2003");

	strDate = sys_ConvertDatetime(strDate, g_intTimeStyle,true);
	if (strDate == "") {
		var strMsg = g_msgInvalidDatetimeStyleFormat.replace(/<var1>/gi,aryTimeStyleName[g_intTimeStyle]);
		strMsg = strMsg.replace(/<var2>/gi,aryTimeStyleExample[g_intTimeStyle]);
		alert(strMsg);
		document.all[strFieldName].value = "";
	}
	else {
		document.all[strFieldName].value = sys_FormatDatetime(strDate, g_intTimeStyle,true);
	}
}

function sys_CheckTimeField(strFieldName,blnNotEmpty) {
	if (typeof(document.all[strFieldName]) == "undefined") {
		alert('document.all["' + strFieldName + '"] is undefined.'); return;
	}

	if (typeof(g_msgThisFieldCouldNotBeBlank) == "undefined") {
		alert("g_msgThisFieldCouldNotBeBlank is undefined."); return;
	}

	if (typeof(g_msgInvalidTimeFormat) == "undefined") {
		alert("g_msgInvalidTimeFormat is undefined."); return;
	}
	if (typeof(blnNotEmpty) == "undefined") {blnNotEmpty=false;}

	var strTime = document.all[strFieldName].value;
    strTime = strTime.replace(/^\s*/i,""); strTime = strTime.replace(/\s*$/i,"");  //trim字串
	if (strTime == "" && blnNotEmpty) {alert(g_msgThisFieldCouldNotBeBlank); return;}

	strTime = sys_FormatTime(strTime)
	if (strTime == "") {
		alert(g_msgInvalidTimeFormat);
		document.all[strFieldName].value = "";
	}
	else {
		document.all[strFieldName].value = strTime;
	}
}

function sys_FormatTime(strTime) {
	var h,n,s;
    var strH = "([0-9]|[0][0-9]|[1][0-9]|[2][0-3])";
    var strNS = "(\x20*[:]\x20*)([0-9]|[0-5][0-9])";
	strTime = strTime.replace(/^\s*/i,""); strTime = strTime.replace(/\s*$/i,"");  //trim字串

	if (strTime == "") {return("");}

    var re = new RegExp("^"+strH+"$","ig");  //僅輸入(時)
    if (re.test(strTime)==true) {
        re.exec(strTime); h=parseInt(RegExp.$1,10); h=(h<10)?"0"+h:h;
        strTime = h + ":00:00";
	}
	else {
	    var re = new RegExp("^"+strH+strNS+"$","ig");  //僅輸入(時:分)
	    if (re.test(strTime)==true) {
	        re.exec(strTime);
	        h=parseInt(RegExp.$1,10); h=(h<10)?"0"+h:h;
	        n=parseInt(RegExp.$3,10); n=(n<10)?"0"+n:n;
	        strTime = h + ":" + n + ":00";
		}
		else {
		    var re = new RegExp("^"+strH+strNS+strNS+"$","ig");  //輸入(時:分:秒)
		    if (re.test(strTime)==true) {
		        re.exec(strTime);
		        h=parseInt(RegExp.$1,10); h=(h<10)?"0"+h:h;
		        n=parseInt(RegExp.$3,10); n=(n<10)?"0"+n:n;
		        s=parseInt(RegExp.$5,10); s=(s<10)?"0"+s:s;
		        strTime = h + ":" + n + ":" + s;
			}
			else {
				strTime = "";
			}
		}
	}
	return(strTime);
}

//Internal Use Only
function sys_ParseDateYMD(varDate) {
    if (typeof(varDate) != "string") {return(new Date(varDate));}
    var U,y,m,d,h,n,s,str1,re;
    //**以下4行為YMD格式專用
    var strMD = "([1-9]|[0][1-9]|[1][0-2])([-/\x2e])([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1])";
    var strYMD = "([0-2][0-9][0-9][0-9]|[0-9][0-9][0-9]|[0-9][0-9]|[0-9])([-/\x2e])" + strMD;
    var strH = "([\x20]+)([0-9]|[0][0-9]|[1][0-9]|[2][0-3])";
    var strNS = "(\x20*[:]\x20*)([0-9]|[0-5][0-9])";

    str1 = varDate.replace(/^\s*/i,""); str1 = str1.replace(/\s*$/i,"");  //trim字串
    if (str1=="") {return(NaN);}
    y=new Date().getUTCFullYear();
    //Start Parse Date String
    re=new RegExp("^"+strMD+"$","ig");  //僅輸入(月/日)
    if (re.test(str1)==true) {
        re.exec(str1); U=new Date(Date.UTC(y,RegExp.$1-1,RegExp.$3));}
    else {
        re=new RegExp("^"+strMD+strH+"$","ig");  //僅輸入(月/日 時)
        if (re.test(str1)==true) {
            re.exec(str1); U=new Date(Date.UTC(y,RegExp.$1-1,RegExp.$3,RegExp.$5));}
        else {
            re=new RegExp("^"+strMD+strH+strNS+"$","ig");  //僅輸入(月/日 時:分)
            if (re.test(str1)==true) {
                re.exec(str1); U=new Date(Date.UTC(y,RegExp.$1-1,RegExp.$3,RegExp.$5,RegExp.$7));}
            else {
                re=new RegExp("^"+strMD+strH+strNS+strNS+"$","ig");  //僅輸入(月/日 時:分:秒)
                if (re.test(str1)==true) {
                    re.exec(str1); U=new Date(Date.UTC(y,RegExp.$1-1,RegExp.$3,RegExp.$5,RegExp.$7,RegExp.$9));}
                else {
                    re=new RegExp("^"+strYMD+"$","ig");  //僅輸入(年/月/日)
                    if (re.test(str1)==true) {
                        re.exec(str1); y=parseInt(RegExp.$1,10); if (y<50) {y+=2000;}
                        U=new Date(Date.UTC(y,RegExp.$3-1,RegExp.$5));}
                    else {
                        re=new RegExp("^"+strYMD+strH+"$","ig");  //僅輸入(年/月/日 時)
                        if (re.test(str1)==true) {
                            re.exec(str1); y=parseInt(RegExp.$1,10); if (y<50) {y+=2000;}
                            U=new Date(Date.UTC(y,RegExp.$3-1,RegExp.$5,RegExp.$7));}
                        else {
                            re=new RegExp("^"+strYMD+strH+strNS+"$","ig");  //僅輸入(年/月/日 時:分)
                            if (re.test(str1)==true) {
                                re.exec(str1); y=parseInt(RegExp.$1,10); if (y<50) {y+=2000;}
                                U=new Date(Date.UTC(y,RegExp.$3-1,RegExp.$5,RegExp.$7,RegExp.$9));}
                            else {
                                re=new RegExp("^"+strYMD+strH+strNS+strNS+"$","ig");  //輸入(年/月/日 時:分:秒)
                                if (re.test(str1)==true) {
                                    re.exec(str1); y=parseInt(RegExp.$1,10); if (y<50) {y+=2000;}
                                    m=RegExp.$3-1;d=RegExp.$5;h=RegExp.$7;n=RegExp.$9;
                                    re=new RegExp(strNS+"$","ig"); re.exec(str1);
                                    s=RegExp.$2;
                                    U=new Date(Date.UTC(y,m,d,h,n,s));
                                }
                                else {
                                	//alert("[sys_ParseDateYMD] Could not parse!\n" + varDate);
                                    return(NaN);
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    return(U);
}

//Internal Use Only
function sys_ParseDateEMD(varDate) {
    if (typeof(varDate) != "string") {return(new Date(varDate));}
    var U,y,m,d,h,n,s,str1,re;
    //**以下4行為EMD格式專用
    var strMD = "([1-9]|[0][1-9]|[1][0-2])([-/\x2e])([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1])";
    var strYMD = "([-]?[0-9]|[-]?[0-9][0-9]|[-]?[0-9][0-9][0-9])([-/\x2e])" + strMD;
    var strH = "([\x20]+)([0-9]|[0][0-9]|[1][0-9]|[2][0-3])";
    var strNS = "(\x20*[:]\x20*)([0-9]|[0-5][0-9])";

    str1 = varDate.replace(/^\s*/i,""); str1 = str1.replace(/\s*$/i,""); //trim字串
    if (str1=="") {return(NaN);}
    y=new Date().getUTCFullYear(); //找出目前西元年份
    //Start Parse Date String
    re=new RegExp("^"+strMD+"$","ig");  //僅輸入(月/日)
    if (re.test(str1)==true) {
        re.exec(str1); U=new Date(Date.UTC(y,RegExp.$1-1,RegExp.$3));}
    else {
        re=new RegExp("^"+strMD+strH+"$","ig");  //僅輸入(月/日 時)
        if (re.test(str1)==true) {
            re.exec(str1); U=new Date(Date.UTC(y,RegExp.$1-1,RegExp.$3,RegExp.$5));}
        else {
            re=new RegExp("^"+strMD+strH+strNS+"$","ig");  //僅輸入(月/日 時:分)
            if (re.test(str1)==true) {
                re.exec(str1); U=new Date(Date.UTC(y,RegExp.$1-1,RegExp.$3,RegExp.$5,RegExp.$7));}
            else {
                re=new RegExp("^"+strMD+strH+strNS+strNS+"$","ig");  //僅輸入(月/日 時:分:秒)
                if (re.test(str1)==true) {
                    re.exec(str1); U=new Date(Date.UTC(y,RegExp.$1-1,RegExp.$3,RegExp.$5,RegExp.$7,RegExp.$9));}
                else {
                    re=new RegExp("^"+strYMD+"$","ig");  //僅輸入(年/月/日)
                    if (re.test(str1)==true) {
                        re.exec(str1); y=parseInt(RegExp.$1,10);
                        y+=1911;    //民國年轉西元年
                        U=new Date(Date.UTC(y,RegExp.$3-1,RegExp.$5));}
                    else {
                        re=new RegExp("^"+strYMD+strH+"$","ig");  //僅輸入(年/月/日 時)
                        if (re.test(str1)==true) {
                            re.exec(str1); y=parseInt(RegExp.$1,10);
                            y+=1911;    //民國年轉西元年
                            U=new Date(Date.UTC(y,RegExp.$3-1,RegExp.$5,RegExp.$7));}
                        else {
                            re=new RegExp("^"+strYMD+strH+strNS+"$","ig");  //僅輸入(年/月/日 時:分)
                            if (re.test(str1)==true) {
                                re.exec(str1); y=parseInt(RegExp.$1,10);
                                y+=1911;    //民國年轉西元年
                                U=new Date(Date.UTC(y,RegExp.$3-1,RegExp.$5,RegExp.$7,RegExp.$9));}
                            else {
                                re=new RegExp("^"+strYMD+strH+strNS+strNS+"$","ig");  //輸入(年/月/日 時:分:秒)
                                if (re.test(str1)==true) {
                                    re.exec(str1); y=parseInt(RegExp.$1,10);
                                    y+=1911;    //民國年轉西元年
                                    m=RegExp.$3-1;d=RegExp.$5;h=RegExp.$7;n=RegExp.$9;
                                    re=new RegExp(strNS+"$","ig"); re.exec(str1);
                                    s=RegExp.$2;
                                    U=new Date(Date.UTC(y,m,d,h,n,s));
                                }
                                else {
                                	//alert("[sys_ParseDateEMD] Could not parse!\n" + varDate);
                                    return(NaN);
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    return(U);
}

//Internal Use Only
function sys_ParseDateMDY(varDate) {
    if (typeof(varDate) != "string") {return(new Date(varDate));}
    var U,y,m,d,h,n,s,str1,re;
    //**以下4行為MDY格式專用,  mm/dd/yyyy hh:nn:ss    (USA)
    var strMD = "([1-9]|[0][1-9]|[1][0-2])([-/\x2e])([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1])";
    var strMDY = strMD + "([-/\x2e])([0-2][0-9][0-9][0-9]|[0-9][0-9][0-9]|[0-9][0-9]|[0-9])";
    var strH = "([\x20]+)([0-9]|[0][0-9]|[1][0-9]|[2][0-3])";
    var strNS = "(\x20*[:]\x20*)([0-9]|[0-5][0-9])";

    str1 = varDate.replace(/^\s*/i,""); str1 = str1.replace(/\s*$/i,"");  //trim字串
    if (str1=="") {return(NaN);}
    y=new Date().getUTCFullYear();
    //Start Parse Date String
    re=new RegExp("^"+strMD+"$","ig");  //僅輸入(月/日)
    if (re.test(str1)==true) {
        re.exec(str1); U=new Date(Date.UTC(y,RegExp.$1-1,RegExp.$3));}
    else {
        re=new RegExp("^"+strMD+strH+"$","ig");  //僅輸入(月/日 時)
        if (re.test(str1)==true) {
            re.exec(str1); U=new Date(Date.UTC(y,RegExp.$1-1,RegExp.$3,RegExp.$5));}
        else {
            re=new RegExp("^"+strMD+strH+strNS+"$","ig");  //僅輸入(月/日 時:分)
            if (re.test(str1)==true) {
                re.exec(str1); U=new Date(Date.UTC(y,RegExp.$1-1,RegExp.$3,RegExp.$5,RegExp.$7));}
            else {
                re=new RegExp("^"+strMD+strH+strNS+strNS+"$","ig");  //僅輸入(月/日 時:分:秒)
                if (re.test(str1)==true) {
                    re.exec(str1); U=new Date(Date.UTC(y,RegExp.$1-1,RegExp.$3,RegExp.$5,RegExp.$7,RegExp.$9));}
                else {
                    re=new RegExp("^"+strMDY+"$","ig");  //僅輸入(月/日/年)
                    if (re.test(str1)==true) {
                        re.exec(str1); y=parseInt(RegExp.$5,10); if (y<50) {y+=2000;}
                        U=new Date(Date.UTC(y,RegExp.$1-1,RegExp.$3));}
                    else {
                        re=new RegExp("^"+strMDY+strH+"$","ig");  //僅輸入(月/日/年 時)
                        if (re.test(str1)==true) {
                            re.exec(str1); y=parseInt(RegExp.$5,10); if (y<50) {y+=2000;}
                            U=new Date(Date.UTC(y,RegExp.$1-1,RegExp.$3,RegExp.$7));}
                        else {
                            re=new RegExp("^"+strMDY+strH+strNS+"$","ig");  //僅輸入(月/日/年 時:分)
                            if (re.test(str1)==true) {
                                re.exec(str1); y=parseInt(RegExp.$5,10); if (y<50) {y+=2000;}
                                U=new Date(Date.UTC(y,RegExp.$1-1,RegExp.$3,RegExp.$7,RegExp.$9));}
                            else {
                                re=new RegExp("^"+strMDY+strH+strNS+strNS+"$","ig");  //輸入(月/日/年 時:分:秒)
                                if (re.test(str1)==true) {
                                    re.exec(str1); y=parseInt(RegExp.$5,10); if (y<50) {y+=2000;}
                                    m=RegExp.$1-1;d=RegExp.$3;h=RegExp.$7;n=RegExp.$9;
                                    re=new RegExp(strNS+"$","ig"); re.exec(str1);
                                    s=RegExp.$2;
                                    U=new Date(Date.UTC(y,m,d,h,n,s));
                                }
                                else {
                                	//alert("[sys_ParseDateMDY] Could not parse!\n" + varDate);
                                    return(NaN);
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    return(U);
}

//Internal Use Only
function sys_ParseDateDMY(varDate) {
    if (typeof(varDate) != "string") {return(new Date(varDate));}
    var U,y,m,d,h,n,s,str1,re;
    //**以下4行為MDY格式專用,  dd/mm/yyyy hh:nn:ss    (British/French)
    var strDM = "([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1])([-/\x2e])([1-9]|[0][1-9]|[1][0-2])";
    var strDMY = strDM + "([-/\x2e])([0-2][0-9][0-9][0-9]|[0-9][0-9][0-9]|[0-9][0-9]|[0-9])";
    var strH = "([\x20]+)([0-9]|[0][0-9]|[1][0-9]|[2][0-3])";
    var strNS = "(\x20*[:]\x20*)([0-9]|[0-5][0-9])";

    str1 = varDate.replace(/^\s*/i,""); str1 = str1.replace(/\s*$/i,"");  //trim字串
    if (str1=="") {return(NaN);}
    y=new Date().getUTCFullYear();
    //Start Parse Date String
    re=new RegExp("^"+strDM+"$","ig");  //僅輸入(日/月)
    if (re.test(str1)==true) {
        re.exec(str1); U=new Date(Date.UTC(y,RegExp.$3-1,RegExp.$1));}
    else {
        re=new RegExp("^"+strDM+strH+"$","ig");  //僅輸入(日/月 時)
        if (re.test(str1)==true) {
            re.exec(str1); U=new Date(Date.UTC(y,RegExp.$3-1,RegExp.$1,RegExp.$5));}
        else {
            re=new RegExp("^"+strDM+strH+strNS+"$","ig");  //僅輸入(日/月 時:分)
            if (re.test(str1)==true) {
                re.exec(str1); U=new Date(Date.UTC(y,RegExp.$3-1,RegExp.$1,RegExp.$5,RegExp.$7));}
            else {
                re=new RegExp("^"+strDM+strH+strNS+strNS+"$","ig");  //僅輸入(日/月 時:分:秒)
                if (re.test(str1)==true) {
                    re.exec(str1); U=new Date(Date.UTC(y,RegExp.$3-1,RegExp.$1,RegExp.$5,RegExp.$7,RegExp.$9));}
                else {
                    re=new RegExp("^"+strDMY+"$","ig");  //僅輸入(日/月/年)
                    if (re.test(str1)==true) {
                        re.exec(str1); y=parseInt(RegExp.$5,10); if (y<50) {y+=2000;}
                        U=new Date(Date.UTC(y,RegExp.$3-1,RegExp.$1));}
                    else {
                        re=new RegExp("^"+strDMY+strH+"$","ig");  //僅輸入(日/月/年 時)
                        if (re.test(str1)==true) {
                            re.exec(str1); y=parseInt(RegExp.$5,10); if (y<50) {y+=2000;}
                            U=new Date(Date.UTC(y,RegExp.$3-1,RegExp.$1,RegExp.$7));}
                        else {
                            re=new RegExp("^"+strDMY+strH+strNS+"$","ig");  //僅輸入(日/月/年 時:分)
                            if (re.test(str1)==true) {
                                re.exec(str1); y=parseInt(RegExp.$5,10); if (y<50) {y+=2000;}
                                U=new Date(Date.UTC(y,RegExp.$3-1,RegExp.$1,RegExp.$7,RegExp.$9));}
                            else {
                                re=new RegExp("^"+strDMY+strH+strNS+strNS+"$","ig");  //輸入(日/月/年 時:分:秒)
                                if (re.test(str1)==true) {
                                    re.exec(str1); y=parseInt(RegExp.$5,10); if (y<50) {y+=2000;}
                                    m=RegExp.$3-1;d=RegExp.$1;h=RegExp.$7;n=RegExp.$9;
                                    re=new RegExp(strNS+"$","ig"); re.exec(str1);
                                    s=RegExp.$2;
                                    U=new Date(Date.UTC(y,m,d,h,n,s));
                                }
                                else {
                                	//alert("[sys_ParseDateDMY] Could not parse!\n" + varDate);
                                    return(NaN);
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    return(U);
}

//Internal Use Only
function sys_FindMonthIndex(strMonth) {
	var aryMonth = new Array("JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC");
	strMonth = strMonth.toUpperCase();
	for (var i=0;i<aryMonth.length;i++) {
		if (aryMonth[i]==strMonth) {return(i);}
	}
	alert("sys_FindMonthIndex() not found.\n" + strMonth);
	return(null);
}

//Internal Use Only
function sys_ParseDateMonDY(varDate) {
    if (typeof(varDate) != "string") {return(new Date(varDate));}
    var U,y,m,d,h,n,s,str1,re;
    //**以下4行為MonDY格式專用,  Mon dd yyyy hh:nn:ss    (USA)
    var strMonD = "(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)([\x20])([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1])";
    var strMonDY = strMonD + "([\x20])([0-2][0-9][0-9][0-9]|[0-9][0-9][0-9]|[0-9][0-9]|[0-9])";
    var strH = "([\x20]+)([0-9]|[0][0-9]|[1][0-9]|[2][0-3])";
    var strNS = "(\x20*[:]\x20*)([0-9]|[0-5][0-9])";

    str1 = varDate.replace(/^\s*/i,""); str1 = str1.replace(/\s*$/i,"");  //trim字串
    if (str1=="") {return(NaN);}
    y=new Date().getUTCFullYear();
    //Start Parse Date String
    re=new RegExp("^"+strMonD+"$","ig");  //僅輸入(月/日)
    if (re.test(str1)==true) {
    	m=sys_FindMonthIndex(RegExp.$1);
        re.exec(str1); U=new Date(Date.UTC(y,m,RegExp.$3));}
    else {
        re=new RegExp("^"+strMonD+strH+"$","ig");  //僅輸入(月/日 時)
        if (re.test(str1)==true) {
        	m=sys_FindMonthIndex(RegExp.$1);
            re.exec(str1); U=new Date(Date.UTC(y,m,RegExp.$3,RegExp.$5));}
        else {
            re=new RegExp("^"+strMonD+strH+strNS+"$","ig");  //僅輸入(月/日 時:分)
            if (re.test(str1)==true) {
	        	m=sys_FindMonthIndex(RegExp.$1);
                re.exec(str1); U=new Date(Date.UTC(y,m,RegExp.$3,RegExp.$5,RegExp.$7));}
            else {
                re=new RegExp("^"+strMonD+strH+strNS+strNS+"$","ig");  //僅輸入(月/日 時:分:秒)
                if (re.test(str1)==true) {
		        	m=sys_FindMonthIndex(RegExp.$1);
                    re.exec(str1); U=new Date(Date.UTC(y,m,RegExp.$3,RegExp.$5,RegExp.$7,RegExp.$9));}
                else {
                    re=new RegExp("^"+strMonDY+"$","ig");  //僅輸入(月/日/年)
                    if (re.test(str1)==true) {
                        re.exec(str1); y=parseInt(RegExp.$5,10); if (y<50) {y+=2000;}
			        	m=sys_FindMonthIndex(RegExp.$1);
                        U=new Date(Date.UTC(y,m,RegExp.$3));}
                    else {
                        re=new RegExp("^"+strMonDY+strH+"$","ig");  //僅輸入(月/日/年 時)
                        if (re.test(str1)==true) {
                            re.exec(str1); y=parseInt(RegExp.$5,10); if (y<50) {y+=2000;}
				        	m=sys_FindMonthIndex(RegExp.$1);
                            U=new Date(Date.UTC(y,m,RegExp.$3,RegExp.$7));}
                        else {
                            re=new RegExp("^"+strMonDY+strH+strNS+"$","ig");  //僅輸入(月/日/年 時:分)
                            if (re.test(str1)==true) {
                                re.exec(str1); y=parseInt(RegExp.$5,10); if (y<50) {y+=2000;}
					        	m=sys_FindMonthIndex(RegExp.$1);
                                U=new Date(Date.UTC(y,m,RegExp.$3,RegExp.$7,RegExp.$9));}
                            else {
                                re=new RegExp("^"+strMonDY+strH+strNS+strNS+"$","ig");  //輸入(月/日/年 時:分:秒)
                                if (re.test(str1)==true) {
                                    re.exec(str1); y=parseInt(RegExp.$5,10); if (y<50) {y+=2000;}
						        	m=sys_FindMonthIndex(RegExp.$1);
                                    d=RegExp.$3;h=RegExp.$7;n=RegExp.$9;
                                    re=new RegExp(strNS+"$","ig"); re.exec(str1);
                                    s=RegExp.$2;
                                    U=new Date(Date.UTC(y,m,d,h,n,s));
                                }
                                else {
                                	//alert("[sys_ParseDateMonDY] Could not parse!\n" + varDate);
                                    return(NaN);
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    return(U);
}

//Internal Use Only
function sys_ParseDateDMonY(varDate) {
    if (typeof(varDate) != "string") {return(new Date(varDate));}
    var U,y,m,d,h,n,s,str1,re;
    //**以下4行為DMonY格式專用,  dd Mon yyyy hh:nn:ss    (歐洲)
    var strDMon = "([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1])([\x20])(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)";
    var strDMonY = strDMon + "([\x20])([0-2][0-9][0-9][0-9]|[0-9][0-9][0-9]|[0-9][0-9]|[0-9])";
    var strH = "([\x20]+)([0-9]|[0][0-9]|[1][0-9]|[2][0-3])";
    var strNS = "(\x20*[:]\x20*)([0-9]|[0-5][0-9])";

    str1 = varDate.replace(/^\s*/i,""); str1 = str1.replace(/\s*$/i,"");  //trim字串
    if (str1=="") {return(NaN);}
    y=new Date().getUTCFullYear();
    //Start Parse Date String
    re=new RegExp("^"+strDMon+"$","ig");  //僅輸入(日/月)
    if (re.test(str1)==true) {
    	m=sys_FindMonthIndex(RegExp.$3);
        re.exec(str1); U=new Date(Date.UTC(y,m,RegExp.$1));}
    else {
        re=new RegExp("^"+strDMon+strH+"$","ig");  //僅輸入(日/月 時)
        if (re.test(str1)==true) {
        	m=sys_FindMonthIndex(RegExp.$3);
            re.exec(str1); U=new Date(Date.UTC(y,m,RegExp.$1,RegExp.$5));}
        else {
            re=new RegExp("^"+strDMon+strH+strNS+"$","ig");  //僅輸入(日/月 時:分)
            if (re.test(str1)==true) {
	        	m=sys_FindMonthIndex(RegExp.$3);
                re.exec(str1); U=new Date(Date.UTC(y,m,RegExp.$1,RegExp.$5,RegExp.$7));}
            else {
                re=new RegExp("^"+strDMon+strH+strNS+strNS+"$","ig");  //僅輸入(日/月 時:分:秒)
                if (re.test(str1)==true) {
		        	m=sys_FindMonthIndex(RegExp.$3);
                    re.exec(str1); U=new Date(Date.UTC(y,m,RegExp.$1,RegExp.$5,RegExp.$7,RegExp.$9));}
                else {
                    re=new RegExp("^"+strDMonY+"$","ig");  //僅輸入(日/月/年)
                    if (re.test(str1)==true) {
                        re.exec(str1); y=parseInt(RegExp.$5,10); if (y<50) {y+=2000;}
			        	m=sys_FindMonthIndex(RegExp.$3);
                        U=new Date(Date.UTC(y,m,RegExp.$1));}
                    else {
                        re=new RegExp("^"+strDMonY+strH+"$","ig");  //僅輸入(日/月/年 時)
                        if (re.test(str1)==true) {
                            re.exec(str1); y=parseInt(RegExp.$5,10); if (y<50) {y+=2000;}
				        	m=sys_FindMonthIndex(RegExp.$3);
                            U=new Date(Date.UTC(y,m,RegExp.$1,RegExp.$7));}
                        else {
                            re=new RegExp("^"+strDMonY+strH+strNS+"$","ig");  //僅輸入(日/月/年 時:分)
                            if (re.test(str1)==true) {
                                re.exec(str1); y=parseInt(RegExp.$5,10); if (y<50) {y+=2000;}
					        	m=sys_FindMonthIndex(RegExp.$3);
                                U=new Date(Date.UTC(y,m,RegExp.$1,RegExp.$7,RegExp.$9));}
                            else {
                                re=new RegExp("^"+strDMonY+strH+strNS+strNS+"$","ig");  //輸入(日/月/年 時:分:秒)
                                if (re.test(str1)==true) {
                                    re.exec(str1); y=parseInt(RegExp.$5,10); if (y<50) {y+=2000;}
						        	m=sys_FindMonthIndex(RegExp.$3);
                                    d=RegExp.$1;h=RegExp.$7;n=RegExp.$9;
                                    re=new RegExp(strNS+"$","ig"); re.exec(str1);
                                    s=RegExp.$2;
                                    U=new Date(Date.UTC(y,m,d,h,n,s));
                                }
                                else {
                                	//alert("[sys_ParseDateDMonY] Could not parse!\n" + varDate);
                                    return(NaN);
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    return(U);
}
