//#################################################################################
//#   系統名稱: Web
//#   程式名稱: cGlobal.js
//#   日    期: 2005/08/15
//#   語    言: JavaScript << Client端 >>
//#   內含部份: １、欄位編審函式庫(cChkField)
//#                 1.1 gfcChkIsNull                 - 編審欄位必須輸入
//#                 1.2 gfcChkIsNaN                  - 編審欄位必須是數字
//#                 1.3 gfcChkEMail                  - 編審eMail的合理性
//#                 1.4 gfcChkLen                    - 編審欄位長度
//#                 1.5 gfcChkIdNo                   - 編審身份證字號是否正確
//#                 1.6 gfcChkBoxIsNull              - 編審CheckBox及Radio物件必須選擇
//#                 1.7 gfcChkDate_yyyymmdd          - 編審日期格式為yyyymmdd的合理性
//#                 1.8 gfcChkNum                    - 編審數字
//#                 1.9 gfcChkDecLen                 - 編審數字及小數位數
//#                 1.10 gfcChkNumNoMsg              - 編審數字(不含alert)
//#
//#             ２、格式轉換函式庫(cTrnValue)
//#                 2.1 gfcAddCommas               - 將字串的數字3位1撇
//#                 2.2 gfcCDate                   - 轉換日期格式(須YYYYMMDD日期格式)
//#
//#             ３、一般函式庫(cPub)
//#                 3.1 gfcOpenNewWin              - 開啟新視窗
//#                 3.2 gfcCalendar                - 開啟萬年曆
//#                 3.3 gfcCboSeqNo                - 連續數字下拉選單
//#                 3.4 gfcChkAll                  - CheckBox全選或全不選
//#################################################################################

//********************************************************************************
//*   類    別: １、欄位編審函式庫(cChkField)
//*   說    明: 內含各類欄位編審所需用到的函式
//********************************************************************************
//=============================================================================
//=   功能說明: 1.1 編審欄位必須輸入
//=   傳入參數: pField     : 要編審的欄位(Object)
//=             pFieldName : 要編審的欄位中文名稱
//=   傳回參數: Boolean    : true  編審失敗
//=                          false 編審成功
//=============================================================================
function gfcChkIsNull(pField,pFieldName)
{
    var tFValue;

    tFValue = pField.value.replace(/[\s　]+/g, "");

    if ((tFValue == null) || (tFValue == ""))
    {   
        alert('【' + pFieldName + '】尚未輸入！！');
        pField.focus();
        if (pField.isTextEdit)
        {
        	pField.select();
        }
        return true;
    }
    return false;
}

//=============================================================================
//=   功能說明: 1.2 編審欄位必須是數字
//=   傳入參數: pField     : 要編審的欄位(Object)
//=             pFieldName : 要編審的欄位中文名稱
//=   傳回參數: Boolean    : true  編審失敗
//=                          false 編審成功
//=============================================================================
function gfcChkIsNaN(pField,pFieldName)
{
    var tFValue;
    tFValue = pField.value;

    if (isNaN(tFValue)==true)
    {   
        alert('【' + pFieldName + '】請以【數字】表示！！');
        pField.focus();
        if (pField.isTextEdit)
        {
        	pField.select();
        }
        return true;
    }
    return false;
}

//=============================================================================
//=   功能說明: 1.3 編審eMail的合理性
//=   傳入參數: pField     : 要編審的欄位(Object)
//=             pFieldName : 要編審的欄位中文名稱
//=   傳回參數: Boolean    : true  編審失敗
//=                          false 編審成功
//=============================================================================
function gfcChkEMail(pField,pFieldName)
{
    var tFValue;
    tFValue = pField.value;

    if ((tFValue.indexOf("@") == -1)||(tFValue.indexOf(".") == -1))
    {   
        alert('【' + pFieldName + '】格式錯誤！！');
        pField.focus();
        if (pField.isTextEdit)
        {
        	pField.select();
        }
        return true;
    }
    return false;
}

//=============================================================================
//=   功能說明: 1.4 編審欄位長度
//=   傳入參數: pField     : 要編審的欄位(Object)
//=             pFieldName : 要編審的欄位中文名稱
//=             pFieldLen  : 欄位長度
//=             pType      : 0 = 必須大於等於
//=                          1 = 必須小於等於  
//=   傳回參數: Boolean    : true  編審失敗
//=                          false 編審成功
//=============================================================================
function gfcChkLen(pField,pFieldName,pFieldLen,pType)
{
    var tFValue;
    var tFLen;
    tFValue = pField.value;
    tFLen   = tFValue.length;
	if ( pType == 0 )
	{
		if (pFieldLen > tFLen)
		{
			alert('【' + pFieldName + '】輸入錯誤！！\n\n該欄位長度必須大於等於 ' + pFieldLen + ' 碼');
	        pField.focus();
    	    if (pField.isTextEdit)
        	{
        		pField.select();
	        }
    	    return true;
	    }
	}
	if ( pType == 1 )
	{
		if (pFieldLen < tFLen)
		{
			alert('【' + pFieldName + '】輸入錯誤！！\n\n該欄位長度必須小於等於 ' + pFieldLen + ' 碼');
	        pField.focus();
    	    if (pField.isTextEdit)
        	{
        		pField.select();
	        }
    	    return true;
	    }
	}	
   	return false;	
}	

//=============================================================================
//=   功能說明: 1.5 編審身份證字號是否正確
//=   傳入參數: pUserID : 要編審的號碼(身份證字號:10位文數字)
//=   傳回參數: 物件    : eErr           表編審成功/失敗
//=                       eErrDesc       編審失敗錯誤訊息
//=============================================================================
function gfcChkIdNo(pUserID)
{
    var tobjRtn = new Object();  //-傳回Object
    var ixI;
    var tAreaNo;
    var tSum;
    var tAreaCode;
    var tSecondID;         //身份證第二碼

    if (pUserID == "" || pUserID == null)
    {
        tobjRtn.eErr = false;
        return tobjRtn;
    }
    tobjRtn.eErr = true;
    pUserID = pUserID.toUpperCase(); 
    if (pUserID.length != 10)//確定身份證字號有10碼
    {   
        tobjRtn.eErrDesc = "輸入無效的身份證字號 (ex:資料長度錯誤) !";
        return tobjRtn;             
    }       
    tAreaCode = pUserID.substr(0,1);
    if (tAreaCode.valueOf() < "A" || tAreaCode.valueOf() > "Z")//確定首碼在A-Z之間
    {   
        tobjRtn.eErrDesc = "輸入無效的身份證字號 (ex:首碼應介於A-Z之間) !";
        return tobjRtn;
    }  
    if (isNaN(parseInt(pUserID.substring(1,10),10)) == true) //確定2-10碼是數字
    {   
        tobjRtn.eErrDesc = "輸入無效的身份證字號 (ex:第2-10碼須是數字) !";
        return tobjRtn;
    }   
    //身份證號碼第 2 碼必須為 1 或 2
    tSecondID = pUserID.substr(1,1);
    if (tSecondID != "1" && tSecondID != "2")
    {   
        tobjRtn.eErrDesc = "輸入無效的身份證字號 !";
        return tobjRtn;
    }
    //取得首碼對應的區域碼，A ->10, B->11, ..H->17,I->34, J->18...
    tAreaNo = "ABCDEFGHJKLMNPQRSTUVXYWZIO".search(tAreaCode) + 10;
    pUserID = tAreaNo.toString(10) + pUserID.substring(1,10);   
   
    //  取得CheckSum的值
    //  核對身份證號碼是否正確
    //  A  = 身份證號碼區域碼第 1碼
    //  A0 = 身份證號碼區域碼第 2碼 * (10 - 1)
    //  A1 = 身份證號碼第 2碼 * (10 - 2)
    //  A2 = 身份證號碼第 3碼 * (10 - 3)
    //  A3 = 身份證號碼第 4碼 * (10 - 4)
    //  A4 = 身份證號碼第 5碼 * (10 - 5)
    //  A5 = 身份證號碼第 6碼 * (10 - 6)
    //  A6 = 身份證號碼第 7碼 * (10 - 7)
    //  A7 = 身份證號碼第 8碼 * (10 - 8)
    //  A8 = 身份證號碼第 9碼 * (10 - 9)
    //  CheckSum = A + A0 + A1 + A2 + ........ + A7 + A8

    tSum = parseInt(pUserID.substr(0,1),10) + parseInt(pUserID.substr(10,1),10);   
   
    for(ixI=1;ixI<=9;ixI++)
    {   
        tSum = tSum + parseInt(pUserID.substr(ixI,1),10)*(10-ixI);
    }  
    if ((tSum % 10) != 0)
    {
        tobjRtn.eErrDesc = "輸入無效的身份證字號 !";
        return tobjRtn;
    }
    tobjRtn.eErr = false;
    return tobjRtn;
}

//=============================================================================
//=   功能說明: 1.6 編審CheckBox及Radio物件必須選擇
//=   傳入參數: pField     : 要編審的欄位(Object)
//=             pFieldName : 要編審的欄位中文名稱
//=   傳回參數: Boolean    : true  編審失敗
//=                          false 編審成功
//=============================================================================
/*
//第 1 版本
function gfcChkBoxIsNull(pField,pFieldName)
{
    var i = 0
    for(var j = 0; j < pField.length; j++)
    {
    　  if (pField[j].checked == true)
        {
            i = i + 1;
        }
    }
    if (i == 0)
    {
        alert('【' + pFieldName + '】尚未選擇！！');
        pField[0].focus();
        return true;
    }
    return false;
}
*/
//第 2 版本 : checkbox個數為 1 時，特別處理
function gfcChkBoxIsNull(pField,pFieldName)
{
    var i = 0
    var objCnt = pField.length
    
    if (isNaN(objCnt) == true)    //若個數非數字，則非陣列
    {
        if (pField.checked != true)
        {
            alert('【' + pFieldName + '】尚未選擇！！');
            pField.focus();
            return true;
        }
    }
    else
    {
        for(var j = 0; j < objCnt; j++)
        {
        　  if (pField[j].checked == true)
            {
                i = i + 1;
            }
        }
        if (i == 0)
        {
            alert('【' + pFieldName + '】尚未選擇！！');
            pField[0].focus();
            return true;
        }        
    }
    return false;
}

//=============================================================================
//=   功能說明: 1.7 編審日期格式為yyyymmdd的合理性
//=   傳入參數: pDate : 要編審的日期
//=   傳回參數: 
//=============================================================================
function gfcChkDate_yyyymmdd(pField,pFieldName)
{
    var tFValue;
    tFValue = pField.value;
    
    if (isNaN(tFValue)==true)
    {
        //alert('【' + pFieldName + '】請以【YYYYMMDD】表示！！');
        alert('【' + pFieldName + '】格式錯誤！！( 格式為:yyyymmdd )');
        pField.focus();
        if (pField.isTextEdit)
        {
            pField.select();
        }
        return true;  
    }
    else
    {
        
        if (tFValue.length != 8)
        {
            //alert('【' + pFieldName + '】請以【YYYYMMDD】表示！！');
            alert('【' + pFieldName + '】格式錯誤！！( 格式為:yyyymmdd )');
            pField.focus();
            if (pField.isTextEdit)
            {
                pField.select();
            }
            return true;  
        }       

        tYear  = parseInt(tFValue.substr(0,4),10);
        tMonth = parseInt(tFValue.substr(4,2),10);
        tDay   = parseInt(tFValue.substr(6,2),10);

        if (tMonth > 12 || tMonth < 1)
        {
            alert('【' + pFieldName + '】【月】輸入有誤！！\n\n請輸入 01 ~ 12 之間的數值');
            pField.focus();
            if (pField.isTextEdit)
            {
                pField.select();
            }
            return true;           
        }
        
        if (tDay > 31 || tDay < 1)
        {
            alert('【' + pFieldName + '】【日】輸入有誤！！\n\n請輸入 01 ~ 31 之間的數值');
            pField.focus();
            if (pField.isTextEdit)
            {
                pField.select();
            }
            return true;
        }
        
        if ((tMonth == 4 || tMonth == 6 || tMonth == 9 || tMonth == 11) && tDay == 31)   
        {   
            alert('【' + pFieldName + '】【日】輸入有誤！！\n\n' + tMonth + '月沒有31號');
            pField.focus();
            if (pField.isTextEdit)
            {
                pField.select();
            }
            return true;  
        }         
        
        if (tMonth==2)   
        {   
            var isleap = (tYear % 4 == 0 && (tYear % 100 != 0 || tYear % 400 == 0));   
            if (tDay > 29)
            {                  
                alert('【' + pFieldName + '】【日】輸入有誤！！\n\n2月最多有29天');
                pField.focus();
                if (pField.isTextEdit)
                {
                    pField.select();
                }
                return true;    
            }   
            if ((tDay == 29) && (!isleap))
            {                  
                alert('【' + pFieldName + '】【日】輸入有誤！！\n\n閏年2月才有29天');
                pField.focus();
                if (pField.isTextEdit)
                {
                    pField.select();
                }
                return true;   
            }   
        }           
        return false;
    }
}


//=============================================================================
//=   功能說明: 1.8 編審數字
//=   傳入參數: pField     : 要編審的欄位(Object)
//=             pFieldName : 要編審的欄位中文名稱
//=             pRefNum    : 參照數字
//=             pKind      : 比對類別 1 : 大於
//=                                   2 : 等於
//=                                   3 : 小於
//=                                   4 : 大於等於
//=                                   5 : 小於等於
//=                                   6 : 不等於
//=             pUnit      : 單位
//=   傳回參數: Boolean    : true  編審失敗
//=                          false 編審成功
//=============================================================================
function gfcChkNum(pField,pFieldName,pRefNum,pKind,pUnit)
{
    var tFValue;
    tFValue = pField.value;
    
    if (pUnit == undefined) pUnit = '';
    
    //數字檢查
    if (isNaN(tFValue)==true)
    {   
        alert('【' + pFieldName + '】請以【數字】表示！！');
        pField.focus();
        if (pField.isTextEdit)
        {
            pField.select();
        }
        return true;
    }
    if ((pKind == 1) && (tFValue <= pRefNum))
    {   
        alert('【' + pFieldName + '】必須【大於】' + gfcAddCommas(pRefNum) + ' ' + pUnit);
        pField.focus();
        if (pField.isTextEdit)
        {
            pField.select();
        }
        return true;
    }
    if ((pKind == 2) && (tFValue != pRefNum))
    {   
        alert('【' + pFieldName + '】必須【等於】' + gfcAddCommas(pRefNum) + ' ' + pUnit);
        pField.focus();
        if (pField.isTextEdit)
        {
            pField.select();
        }
        return true;
    }  
    if ((pKind == 3) && (tFValue >= pRefNum))
    {   
        alert('【' + pFieldName + '】必須【小於】' + gfcAddCommas(pRefNum) + ' ' + pUnit);
        pField.focus();
        if (pField.isTextEdit)
        {
            pField.select();
        }
        return true;
    }  
    if ((pKind == 4) && (tFValue < pRefNum))
    {   
        alert('【' + pFieldName + '】必須【大於等於】' + gfcAddCommas(pRefNum) + ' ' + pUnit);
        pField.focus();
        if (pField.isTextEdit)
        {
            pField.select();
        }
        return true;
    }
    if ((pKind == 5) && (tFValue > pRefNum))
    {   
        alert('【' + pFieldName + '】必須【小於等於】' + gfcAddCommas(pRefNum) + ' ' + pUnit);
        pField.focus();
        if (pField.isTextEdit)
        {
            pField.select();
        }
        return true;
    }
    if ((pKind == 6) && (tFValue == pRefNum))
    {   
        alert('【' + pFieldName + '】【不可以等於】' + gfcAddCommas(pRefNum) + ' ' + pUnit);
        pField.focus();
        if (pField.isTextEdit)
        {
            pField.select();
        }
        return true;
    }      
    return false;
}

//=============================================================================
//=   功能說明: 1.9 編審數字及小數位數
//=   傳入參數: pField     : 要編審的欄位(Object)
//=             pFieldName : 要編審的欄位中文名稱
//=             pDecLen    : 小數位數
//=   傳回參數: Boolean    : true  編審失敗
//=                          false 編審成功
//=============================================================================
function gfcChkDecLen(pField,pFieldName,pDecLen)
{
    var tFValue;
    var tarFValue;
    var tFDecLen;
    tFValue = pField.value;
    //數字檢查
    if (isNaN(tFValue)==true)
    {   
        alert('【' + pFieldName + '】請以【數字】表示！！');
        pField.focus();
        if (pField.isTextEdit)
        {
            pField.select();
        }
        return true;
    }
    //轉數值型態再轉回文字型態（避免小數最後為零的情況）
    tFValue = eval('tFValue').toString()
    if (tFValue.indexOf(".",0) != -1 )
    {   
        //分割字串
        tarFValue = tFValue.split(".")
        //小數位數    
        tFDecLen = tarFValue[1].length
        //小數位數檢查    
        if (tFDecLen > pDecLen)
        {   
            if (pDecLen == 0)
            {
                alert('【' + pFieldName + '】必須是【整數】！！');    
            }
            else
            {
                alert('【' + pFieldName + '】的小數位數必須【小於等於】' + pDecLen + ' 位！！');
            }
            pField.focus();
            if (pField.isTextEdit)
            {
                pField.select();
            }
            return true;
        }
    }
    return false; 
}

//=============================================================================
//=   功能說明: 1.10 編審數字(不含alert)
//=   傳入參數: pField     : 要編審的欄位(Object)
//=             pRefNum    : 參照數字
//=             pKind      : 比對類別 1 : 大於
//=                                   2 : 等於
//=                                   3 : 小於
//=                                   4 : 大於等於
//=                                   5 : 小於等於
//=                                   6 : 不等於
//=   傳回參數: Boolean    : true  編審失敗
//=                         false 編審成功
//=============================================================================
function gfcChkNumNoMsg(pField,pRefNum,pKind)
{
    var tFValue;
    tFValue = pField.value;

    //數字檢查
    if (isNaN(tFValue)==true) return true;
    if ((pKind == 1) && (tFValue <= pRefNum)) return true;
    if ((pKind == 2) && (tFValue != pRefNum)) return true;
    if ((pKind == 3) && (tFValue >= pRefNum)) return true;
    if ((pKind == 4) && (tFValue < pRefNum))  return true;
    if ((pKind == 5) && (tFValue > pRefNum)) return true;
    if ((pKind == 6) && (tFValue == pRefNum)) return true;
    return false;
}

//********************************************************************************
//*   類    別: ２、格式轉換函式庫(cTrnValue)
//*   說    明: 內含各類格式轉換所需用到的函式
//********************************************************************************
//=============================================================================
//=   功能說明: 2.1 將字串的數字3位1撇
//=   傳入參數: pStr : 字串 
//=   傳回參數: 3位1撇後的字串
//=   備　　註: 由右至左遇連續數字4位以上即進行3位1撇
//=============================================================================
function gfcAddCommas(pStr)
{
    pStr += '';
    
    x  = pStr.split('.');
    x1 = x[0];
    x2 = x.length > 1 ? '.' + x[1] : '';
    
    var rgx = /(\d+)(\d{3})/;
    
    while(rgx.test(x1))
    {
        x1 = x1.replace(rgx, '$1' + ',' + '$2');
    }
    return x1 + x2; 
}

//============================================================================
//=   功能說明 : 2.2 轉換日期格式
//=   傳入參數 : pDate ==> 日期(須YYYYMMDD日期格式)
//=              pKind ==> 轉換格式 0 : yyyymmdd
//=                                 1 : yyyy / mm / dd
//=                                 2 : mm / dd
//=                                 3 : yyyy/mm/dd
//=                                 4 : YYYY 年 MM 月 DD 日
//=   傳回參數 : 轉換後日期格式
//============================================================================
function gfcCDate(pDate,pKind)   
{
    var tFValue;
    tFValue = pDate;
    
    tYear  = tFValue.substr(0,4);
    tMonth = tFValue.substr(4,2);
    tDay   = tFValue.substr(6,2);
        
    switch (pKind) {
        case 0 :
            x = tYear + tMonth + tDay;
        case 1 :
            x = tYear + ' / ' + tMonth + ' / ' + tDay ;
        case 2 : 
            x = tMonth + ' / ' + tDay ;
        case 3 :
            x = tYear + '/' + tMonth + '/' + tDay ;
        case 4 :
            x = tYear + ' 年 ' + tMonth + ' 月 ' + tDay + ' 日 ' ;
        default :
            x = tYear + '/' + tMonth + '/' + tDay ;
    }
    return x;
    
}



//********************************************************************************
//*   類    別: ３、一般函式庫(cPub)
//*   說    明: 內含一般常用函式
//********************************************************************************

//=============================================================================
//=   功能說明: 3.1 開啟新視窗
//=   傳入參數: 
//=============================================================================
function gfcOpenNewWin(pUrl,pName,pFeature)
{
    window.name = 'rootWindow';
    window.remoteWindow = window.open(pUrl,pName,pFeature);
    window.remoteWindow.window.focus();
}

//=============================================================================
//=   功能說明: 3.2 開啟萬年曆
//=   傳入參數: 
//=============================================================================
function gfcCalendar(pObj)
{
    Url="/global/html/calendar.html";
    strfeature="dialogHeight:193px;dialogWidth:226px;dialogTop:" +
               (parseInt(window.event.screenY)+10) +
               ";dialogLeft:" +
               window.event.screenX +
               ";help:0;resizable:0;status:0;scroll:0"
    window.showModalDialog(Url,pObj,strfeature);
}

//=============================================================================
//=   功能說明: 3.3 連續數字下拉選單
//=   傳入參數: pDefValue : 預設值
//=             pBNum     : 第一個數字
//=             pENum     : 最後一個數字
//=   備　　註: 可用於下拉月份或日期等 
//=============================================================================
function gfcCboSeqNo(pDefValue,pBNum,pENum)
{
    document.write('<option value=""></option>');
    for (i=pBNum;i<=pENum;i++)
    {
        if (i == pDefValue)        
        {
            document.write('<option value="' + i + '" selected>' + i + '</option>');
        }
        else
        {
            document.write('<option value="' + i + '">' + i + '</option>');
        }
    }
}

//=============================================================================
//=   功能說明: 3.4 CheckBox全選或全不選
//=   傳入參數: pField1 : 觸發物件
//=             pField2 : 全選或全不選物件
//=   備　　註: 
//=============================================================================
function gfcChkAll(pField1,pField2)
{
    var objCnt = pField2.length
    
    if (isNaN(objCnt) == true)    //若個數非數字，則非陣列
    {
        if (pField1.checked == true)
        {
            pField2.checked = true;
        }
        else
        {
            pField2.checked = false;
        }
    }
    else
    {
        for(var i = 0; i < objCnt; i++)
        {
            if (pField1.checked == true)
            {
                pField2[i].checked = true;
            }
            else
            {
                pField2[i].checked = false;
            }
        }
    }
}
