//---------------------------------------------------------------------------


#include <vcl.h>
#include <time.h>
#pragma hdrstop

#include "AppGlobalF.h"
#include "ITSUtilF.h"
#include "CDSCodeF.h"
#include <inifiles.hpp>

//---------------------------------------------------------------------------

#pragma package(smart_init)

//---------------------------------------------------------------------------
ST_GISINFO       g_GisInfo;
ST_SELLINK       g_SelLink;

String           CenterCd = "";         // 지역센터 코드
String           CenterId = "";         // 지역센터 아이디
String           CenterName = "";       // 지역센터 명칭

int              g_nPid    = -1;        // Application Process ID
String           g_sAppDir = "";        // Application Directory
String           g_sAppName= "";        // Program name
String           g_sCfgDir = "";        // Config File Directory
String           g_sLogDir = "";        // Program Log Directory
String           g_sTempDir  = "";      // Program Temp Directory
String           g_sFormsDir = "";      // Program Forms Directory
String           g_sBlackBox = "";
String           g_sLangDir = "";
String           g_sImageDir = "";
String           g_sVideoDir = "";
String           g_sMapDir = "";

APP_CONFIG       g_AppCfg;

LOG_INFO         g_LogCfg;
TITSLog         *ITSLog = NULL;
TITSLog         *FDbLog = NULL;
bool g_bControlAuth = false;


void ActiveProgram()
{
    String AClassName = "TFrmVmsFormEdit";
    String ATitle = g_AppCfg.sTitle + " - Active";
	HWND hExeForm = FindWindow(AClassName.c_str(), ATitle.c_str());
	if (hExeForm)
	{
        LOGINFO("Program exit.... Find Ok... Program already running....");
		bool bResult = SetWindowPos(hExeForm, HWND_TOP, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE);
        if (bResult) {
            bResult = ShowWindow(hExeForm, SW_RESTORE);
            SetForegroundWindow(hExeForm);
        }
	}
}
//---------------------------------------------------------------------------

bool CheckParamRandKey(String AParam)
{
    String appName = "its.vmsformedit://";

    if (!AParam.Pos(appName))
    {
        LOGINFO("Program exit.... Param AppName Error....");
        return false;
    }

    String param = "";
    param = StringReplace(AParam, appName, "",  TReplaceFlags() << rfReplaceAll);
    param = StringReplace(param,  "%20",   ",",  TReplaceFlags() << rfReplaceAll);

    String userId = "";
    String randKey = "";
    String apiUri = "";
    String skinName = "";
    TStringList *pStringList = new TStringList;
    try {
        pStringList->Delimiter = ',';
        pStringList->StrictDelimiter = true;
        pStringList->DelimitedText = param;
        if (pStringList->Count < 3) {
            LOGINFO("Program exit.... Param Count Error....");
            return false;
        }
        userId  = pStringList->Strings[0];
        randKey = pStringList->Strings[1];
        apiUri  = pStringList->Strings[2];
        if (pStringList->Count > 3) {
            skinName = pStringList->Strings[3];
        }

    } __finally {
        if (pStringList) delete pStringList;
    }

    if (!apiUri.Pos("http")) {
        LOGINFO("Program exit.... Param URI Error....");
        return false;
    }

    g_AppCfg.sUserId     = userId;
    g_AppCfg.sRestApiUri = apiUri;
    if (skinName != "") {
        g_AppCfg.sSkinName = skinName;
    }

    if (randKey.UpperCase() == "VMSFORMEDITADMIN")
    {
        return true;
    }

    bool result = false;
    try {
        time_t lCurTm;
        time(&lCurTm);
        double current = (double)lCurTm;
        double paramTime = randKey.ToDouble();
        if (paramTime >= current-3 && paramTime <= current+3) {
            result = true;
        }
    }
    catch(Exception &e) {
    }
    LOGINFO("Program exit.... Param RandKey Error....");
    return result;
}
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
void LoadIcon(TIniFile* AIniFile, String ASection, String AItem, String& AValue)
{
    try
    {
        AValue = AIniFile->ReadString(ASection, AItem, "");
        if (AValue != "")
        {
            AValue = g_sAppDir + "Image\\" + AValue;
            if (!FileExists(AValue)) AValue = "";
        }
    }
    catch(Exception &e)
    {
    }
}
//---------------------------------------------------------------------------

#include <windows.h>
#include <shlwapi.h>
#pragma comment (lib, "shlwapi.lib")
bool IsDirectoryExists(LPCTSTR path)
{
    return PathFileExists(path);
#if 0
    struct _stat buffer;
    int          iRetTemp = 0;

    memset((void*)&buffer, 0, sizeof(buffer));
    iRetTemp = _stat(path, &buffer);
    if (iRetTemp == 0)
    {
        if (buffer.st_mode & _S_IFDIR)
        {
            return true;
        }
    }
    return false;
#endif
}
//---------------------------------------------------------------------------

bool LoadDefaultConfigInfo(String ACfgFile/*=""*/)
{   
    String   sCfgFile;
    TIniFile *pIniFile = NULL;

    String sIniFile = ChangeFileExt(ExtractFileName(Application->ExeName), ".ini");
    if (!ACfgFile.IsEmpty())
        sIniFile = ACfgFile + ".ini";

    sCfgFile = g_sCfgDir + sIniFile;
    g_AppCfg.sConfigFile = sCfgFile;

    g_AppCfg.AutoLogout.Enabled = false;
    g_AppCfg.AutoLogout.IntervalMin = 0;
    g_AppCfg.AutoLogout.LogoutExit = false;

    g_AppCfg.thr.pThread    = NULL;
    g_AppCfg.thr.dwThreadId = 0;
    g_AppCfg.thr.nHandle    = 0;
    g_AppCfg.thr.bRunning   = false;

    g_AppCfg.bAppClose    = false;

    try
    {
        String sTmp;

        pIniFile = new TIniFile(sCfgFile);

        g_AppCfg.sTitle         = pIniFile->ReadString("APPLICATION", "TITLE",          "VMS 폼 편집기");
        g_AppCfg.sProcessId     = pIniFile->ReadString("APPLICATION", "PROCESSID",      "999999");
        g_AppCfg.nVmsServerPort = pIniFile->ReadString("APPLICATION", "VMSSERVERPORT",  "6001").ToIntDef(6001);
        g_AppCfg.sLogDay        = pIniFile->ReadString("APPLICATION", "LOGDAY",         "");
        g_AppCfg.sAppPath       = pIniFile->ReadString("APPLICATION", "APP_PATH",       "");

        g_AppCfg.sSkinName  = pIniFile->ReadString("APPLICATION", "SKINNAME", "Black");
        if (g_AppCfg.sSkinName.IsEmpty()) g_AppCfg.sSkinName = "Blue";

        sTmp = pIniFile->ReadString("APPLICATION", "SAVEFORM", "1");
        g_AppCfg.bSaveForm = (sTmp == "1") ? true : false;

        sTmp = "1";
        sTmp = pIniFile->ReadString("APPLICATION", "LOGINPROMPT", "1");
        g_AppCfg.bLoginPrompt = (sTmp == "1") ? true : false;
        g_AppCfg.sDefUseId = pIniFile->ReadString("APPLICATION", "LASTUSER", "");

        g_AppCfg.sLang = pIniFile->ReadString("APPLICATION", "LANGUAGE", "kr");
        g_AppCfg.sLang = g_AppCfg.sLang.LowerCase();
        if (g_AppCfg.sLang != "en" && g_AppCfg.sLang != "kr")
            g_AppCfg.sLang = "kr";

        g_AppCfg.isDispOfflineMsg = false;
        sTmp = pIniFile->ReadString("APPLICATION", "DISPOFFLINEMSG", "0");
        if (sTmp == "1") g_AppCfg.isDispOfflineMsg = true;

        g_AppCfg.bDebug = false;
        sTmp = pIniFile->ReadString("APPLICATION", "DEBUG", "0");
        if (sTmp == "1") g_AppCfg.bDebug = true;

        g_AppCfg.bTermChildProg = true;
        sTmp = pIniFile->ReadString("APPLICATION", "TERMCHILD", "1");
        if (sTmp == "0") g_AppCfg.bTermChildProg = false;

        g_AppCfg.bOnlyOneScreen = true;
        sTmp = pIniFile->ReadString("APPLICATION", "ONESCREEN", "1");
        if (sTmp == "0") g_AppCfg.bOnlyOneScreen = false;

        sTmp = pIniFile->ReadString("ALARM", "WINDOW", "1");
        g_AppCfg.Alarm.Window = (sTmp == "1") ? true : false;
        sTmp = pIniFile->ReadString("ALARM", "ENABLED", "0");
        g_AppCfg.Alarm.Enabled = (sTmp == "1") ? true : false;
        sTmp = pIniFile->ReadString("ALARM", "TIMEOUT", "10");
        g_AppCfg.Alarm.TimeOut = sTmp.ToIntDef(0);
        if (g_AppCfg.Alarm.TimeOut == 0) g_AppCfg.Alarm.TimeOut = 10;
        if (g_AppCfg.Alarm.TimeOut > 60) g_AppCfg.Alarm.TimeOut = 60;

        sTmp = pIniFile->ReadString("TEMPERATURE", "ALARMVALUE", "45");
        g_AppCfg.Temp.AlarmValue = sTmp.ToIntDef(0);

        sTmp = pIniFile->ReadString("INCIDENT", "WINDOW", "1");
        g_AppCfg.Incident.Window = (sTmp == "1") ? true : false;
        sTmp = pIniFile->ReadString("INCIDENT", "ENABLED", "0");
        g_AppCfg.Incident.Enabled = (sTmp == "1") ? true : false;
        sTmp = pIniFile->ReadString("INCIDENT", "TIMEOUT", "30");
        g_AppCfg.Incident.TimeOut = sTmp.ToIntDef(0);
        if (g_AppCfg.Incident.TimeOut == 0) g_AppCfg.Incident.TimeOut = 30;
        if (g_AppCfg.Incident.TimeOut > 300) g_AppCfg.Incident.TimeOut = 60;

        sTmp = pIniFile->ReadString("AUTOLOGOUT", "ENABLED", "0");
        g_AppCfg.AutoLogout.Enabled = (sTmp == "1") ? true : false;
        sTmp = pIniFile->ReadString("AUTOLOGOUT", "INTERVALMIN", "10");
        g_AppCfg.AutoLogout.IntervalMin = sTmp.ToIntDef(0);
        if (g_AppCfg.AutoLogout.IntervalMin == 0) g_AppCfg.AutoLogout.IntervalMin = 10;
        sTmp = pIniFile->ReadString("AUTOLOGOUT", "LOGOUTEXIT", "0");
        g_AppCfg.AutoLogout.LogoutExit = (sTmp == "1") ? true : false;

        String sSqlLog;
        g_AppCfg.itsdb.bSqlLog     = false;
        g_AppCfg.itsdb.sProvider   = pIniFile->ReadString("ITSDB", "PROVIDER",   "OraOLEDB.Oracle.1");
        g_AppCfg.itsdb.sServerName = pIniFile->ReadString("ITSDB", "SERVERNAME", "HANTE");
        g_AppCfg.itsdb.sUserName   = pIniFile->ReadString("ITSDB", "USERNAME",   "hnits");
        g_AppCfg.itsdb.sPassword   = pIniFile->ReadString("ITSDB", "PASSWORD",   "hnits");
        //sSqlLog                    = pIniFile->ReadString("ITSDB", "SQLLOG",     "0");
        //if (sSqlLog == "1") g_AppCfg.itsdb.bSqlLog = true;

#if 0
        //시설물 아이콘 경로 로딩ㄷ
        LoadIcon(pIniFile, "VMS", "ICON_N", g_AppCfg.vms.ICON[icon_n]);
        LoadIcon(pIniFile, "VMS", "ICON_E", g_AppCfg.vms.ICON[icon_e]);
        LoadIcon(pIniFile, "VMS", "ICON_M", g_AppCfg.vms.ICON[icon_m]);
        LoadIcon(pIniFile, "VMS", "ICON_R", g_AppCfg.vms.ICON[icon_r]);
        LoadIcon(pIniFile, "VMS", "ICON_S", g_AppCfg.vms.ICON[icon_s]);

        LoadIcon(pIniFile, "VDS", "ICON_N", g_AppCfg.vds.ICON[icon_n]);
        LoadIcon(pIniFile, "VDS", "ICON_E", g_AppCfg.vds.ICON[icon_e]);
        LoadIcon(pIniFile, "VDS", "ICON_M", g_AppCfg.vds.ICON[icon_m]);
        LoadIcon(pIniFile, "VDS", "ICON_R", g_AppCfg.vds.ICON[icon_r]);
        LoadIcon(pIniFile, "VDS", "ICON_S", g_AppCfg.vds.ICON[icon_s]);
#endif

        CenterId   = pIniFile->ReadString("CENTER", "CENTERID",   "L01");
        CenterName = pIniFile->ReadString("CENTER", "CENTERNAME", "중앙센터");
        CenterCd   = CenterId.SubString(2, 2).ToIntDef(0);

        // GIS 설정정보 로딩
        g_GisInfo.mapType        = pIniFile->ReadInteger("MAP", "MAPTYPE",    1);
        g_GisInfo.offLineMapPath = pIniFile->ReadString ("MAP", "OFFLINEMAP", "");
        //g_GisInfo.onLineMapPath  = pIniFile->ReadString ("MAP", "ONLINEMAP",  "");
        if (g_GisInfo.mapType != 0 && g_GisInfo.mapType != 1) g_GisInfo.mapType = 1;    /* 1: Online, 0: Offline */
        if (IsDirectoryExists(g_GisInfo.offLineMapPath.c_str()))
        {
            g_GisInfo.offLineMapPath = g_GisInfo.offLineMapPath+"\\";
            g_GisInfo.offLineMapPath = StringReplace(g_GisInfo.offLineMapPath, ":\\", "://", TReplaceFlags() << rfReplaceAll);
            g_GisInfo.offLineMapPath = StringReplace(g_GisInfo.offLineMapPath, "\\", "/", TReplaceFlags() << rfReplaceAll);
        }
        else
        {
            if (g_GisInfo.offLineMapPath.UpperCase().Pos("HTTP"))
            {
                g_GisInfo.offLineMapPath = g_GisInfo.offLineMapPath+"/";
            }
            else
            {
                g_GisInfo.offLineMapPath = "";
            }
        }
        g_GisInfo.imagePath = g_sMapDir+"images\\";
        g_GisInfo.imagePath = StringReplace(g_GisInfo.imagePath, ":\\", "://", TReplaceFlags() << rfReplaceAll);
        g_GisInfo.imagePath = StringReplace(g_GisInfo.imagePath, "\\", "/", TReplaceFlags() << rfReplaceAll);

        g_GisInfo.sApiKey       = pIniFile->ReadString ("MAP", "APIKEY",       "");
        g_GisInfo.nZoomLevel    = pIniFile->ReadInteger("MAP", "INITZOOM",     11);
        g_GisInfo.nMinZoom      = pIniFile->ReadInteger("MAP", "MINZOOM",      1);
        g_GisInfo.nMaxZoom      = pIniFile->ReadInteger("MAP", "MAXZOOM",      19);
        g_GisInfo.nFacilityZoom = pIniFile->ReadInteger("MAP", "FACILITYZOOM", 14);
        g_GisInfo.dCenterX      = pIniFile->ReadString ("MAP", "CENTERX",      "33.3536449").ToDouble();
        g_GisInfo.dCenterY      = pIniFile->ReadString ("MAP", "CENTERY",      "126.5278103").ToDouble();

        //VMS FTP
        g_AppCfg.vmsFtp.SERVER  = pIniFile->ReadString("VMS_FTP", "SERVER",  "");
        g_AppCfg.vmsFtp.PORT    = pIniFile->ReadString("VMS_FTP", "PORT",    "21").ToIntDef(21);
        g_AppCfg.vmsFtp.USER    = pIniFile->ReadString("VMS_FTP", "USER",    "");
        g_AppCfg.vmsFtp.PSWD    = pIniFile->ReadString("VMS_FTP", "PSWD",    "");
        g_AppCfg.vmsFtp.PASSIVE = pIniFile->ReadString("VMS_FTP", "PASSIVE", "0").ToIntDef(0) == 0 ? false : true;
    }
    __finally
    {
        if (pIniFile) delete pIniFile;
        pIniFile = NULL;
        //WriteConfigInfo(sCfgFile, "AUTOLOGOUT", "LOGOUTEXIT", "0");
    }

    return true;
}
//---------------------------------------------------------------------------

/*
 * 환경설정 정보를 저장하는 함수.
 *  arguments
 *      String : RegisterKey 또는 파일이름
 *  return
 *      bool : 실패하면 false
 */
bool WriteConfigInfo(String sCfgFile, String sTitle, String sItem, String sValue)
{
	String	 ConfigFile;
	TIniFile *pIniFile = NULL;

    ConfigFile = sCfgFile;

    try
    {
        pIniFile = new TIniFile(ConfigFile);
        if (pIniFile == NULL)
        {
            return false;
        }

        pIniFile->WriteString(sTitle, sItem, sValue);
    }
    catch(...)
    {
    }

    if (pIniFile)
    {
        pIniFile->Free();
        pIniFile = NULL;
    }

	return true;
}
//---------------------------------------------------------------------------

/*
 * 환경설정 정보를 읽어오는 함수.
 *  arguments
 *      String : RegisterKey 또는 파일이름
 *  return
 *      bool : 실패하면 false
 */
bool ReadConfigInfo(String sCfgFile, String sTitle, String sItem, String &sValue)
{
    bool     bRes;
	String   ConfigFile;
	TIniFile *pIniFile = NULL;

    bRes = false;

    ConfigFile = sCfgFile;

    try
    {
        pIniFile = new TIniFile(ConfigFile);
        if (pIniFile == NULL)
        {
            return bRes;
        }

        sValue = pIniFile->ReadString(sTitle, sItem, "");
        if (sValue != "")
        {
            bRes = true;
        }
    }
    catch(...)
    {
    }

    if (pIniFile)
    {
        pIniFile->Free();
        pIniFile = NULL;
    }

	return bRes;
}
//---------------------------------------------------------------------------

void ShowErrorMsg(String ATitle, String AErrMsg)
{
    Application->NormalizeTopMosts();
    Application->MessageBox(AErrMsg.c_str(), ATitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
    Application->RestoreTopMosts();
}
//----------------------------------------------------------------------------

String APP_FillCode(TcxComboBox *ACombo, String ACode)
{
    String sReturn = "";

    ACombo->Properties->Items->Clear();

    TItsCode *FCodeRMF  = ItsCodeManager->FLists.Find(ACode);
    if (FCodeRMF)
    {
		FOR_STL(TItsSubCode *, pSubCode, FCodeRMF->FSubLists)
		{
			if (pSubCode->USE_YN == "N") continue;
			ACombo->Properties->Items->Add(" [" + pSubCode->CMMN_CD + "] " + pSubCode->CMMN_CD_KOR_NM);
            if (sReturn == "")
            {
                sReturn = " [" + pSubCode->CMMN_CD + "] " + pSubCode->CMMN_CD_KOR_NM;
            }
		}
    }
	ACombo->ItemIndex = 0;
    return sReturn;
}
//----------------------------------------------------------------------------

String APP_GetCode(TcxComboBox *ACombo)
{
    String sReturn = "";

    if (ACombo->ItemIndex >= 0)
    {
        String sDesc = ACombo->Properties->Items->Strings[ACombo->ItemIndex];
        String sCode = sDesc.SubString(sDesc.Pos("[") + 1,
                                       sDesc.Pos("]") - (sDesc.Pos("[") + 1));
        sReturn = sCode;
    }
    return sReturn;
}
//----------------------------------------------------------------------------

String APP_GetCodeDesc(TcxComboBox *ACombo, String ACode)
{
    String sReturn = "";

    for (int ii = 0; ii < ACombo->Properties->Items->Count; ii++)
    {
        String sDesc = ACombo->Properties->Items->Strings[ii];
        String sCode = sDesc.SubString(sDesc.Pos("[") + 1,
                                       sDesc.Pos("]") - (sDesc.Pos("[") + 1));
        if (ACode == sCode)
        {
            sReturn = sDesc;
            break;
        }
    }
    return sReturn;
}
//----------------------------------------------------------------------------

String APP_GetCodeName(TcxComboBox *ACombo, String ACode)
{
    String sReturn = "";
    for (int ii = 0; ii < ACombo->Properties->Items->Count; ii++)
    {
        String sDesc = ACombo->Properties->Items->Strings[ii];
        String sName = sDesc.SubString(sDesc.Pos("]") + 1, sDesc.Length());
        String sCode = sDesc.SubString(sDesc.Pos("[") + 1,
                                       sDesc.Pos("]") - (sDesc.Pos("[") + 1));
        if (ACode == sCode)
        {
            sReturn = sName.Trim();
            break;
        }
    }
    return sReturn;
}
//----------------------------------------------------------------------------

String APP_GetCodeIdByName(TcxComboBox *ACombo, String AName)
{
    String sReturn = "3";
    for (int ii = 0; ii < ACombo->Properties->Items->Count; ii++)
    {
        String sDesc = ACombo->Properties->Items->Strings[ii];
        String sName = sDesc.SubString(sDesc.Pos("]") + 1, sDesc.Length());
        String sCode = sDesc.SubString(sDesc.Pos("[") + 1,
                                       sDesc.Pos("]") - (sDesc.Pos("[") + 1));
        if (sName.Trim() == AName.Trim())
        {
            sReturn = sCode;
            break;
        }
    }
    return sReturn;
}
//----------------------------------------------------------------------------

String APP_GetCodeDefCode(TcxComboBox *ACombo)
{
    String sReturn = "";

    if (ACombo->Properties->Items->Count > 0)
    {
        String sDesc = ACombo->Properties->Items->Strings[0];
        String sCode = sDesc.SubString(sDesc.Pos("[") + 1,
                                       sDesc.Pos("]") - (sDesc.Pos("[") + 1));
        sReturn = sCode;
    }
    return sReturn;
}
//----------------------------------------------------------------------------

String APP_GetCodeDefDesc(TcxComboBox *ACombo)
{
    String sReturn = "";

    if (ACombo->Properties->Items->Count > 0)
    {
        String sDesc = ACombo->Properties->Items->Strings[0];
        sReturn = sDesc;
    }
    return sReturn;
}
//----------------------------------------------------------------------------

int APP_SetCode(TcxComboBox *ACombo, String ACode)
{
    int nItemIndex = -1;

    for (int ii = 0; ii < ACombo->Properties->Items->Count; ii++)
    {
        String sDesc = ACombo->Properties->Items->Strings[ii];
        String sCode = sDesc.SubString(sDesc.Pos("[") + 1,
                                       sDesc.Pos("]") - (sDesc.Pos("[") + 1));
        if (ACode == sCode)
        {
            nItemIndex = ii;
            break;
        }
    }
    ACombo->ItemIndex = nItemIndex;
    return nItemIndex;
}
//----------------------------------------------------------------------------

ULONG ProcIDFromWnd(HWND hwnd) // 윈도우 핸들로 프로세스 아이디 얻기
{
  ULONG idProc;
  GetWindowThreadProcessId( hwnd, &idProc );
  return idProc;
}
//----------------------------------------------------------------------------

HWND GetWinHandle(ULONG pid) // 프로세스 아이디로 윈도우 핸들 얻기
{
  HWND tempHwnd = FindWindow(NULL,NULL); // 최상위 윈도우 핸들 찾기

  while( tempHwnd != NULL )
  {
    if( GetParent(tempHwnd) == NULL ) // 최상위 핸들인지 체크, 버튼 등도 핸들을 가질 수 있으므로 무시하기 위해
      if( pid == ProcIDFromWnd(tempHwnd) )
        return tempHwnd;
    tempHwnd = GetWindow(tempHwnd, GW_HWNDNEXT); // 다음 윈도우 핸들 찾기
  }
  return NULL;
}
//----------------------------------------------------------------------------

String ITSUtil_FormatStr(String AStrDateTime, String AFormat)
{
#define SYEAR "-"
#define STIME ":"
#define SPACE " "

    String sDateTime = "";
    String sInData   = AnsiString(AStrDateTime);

//ShowMessage("IN: " + AStrDateTime + "  " + sInData + "   " + AFormat);

    if (sInData.IsEmpty())
        return sInData;

    //sDateTime = sInData;
    try
    {
        if (AFormat == STR_DATETIME)
        {
            if (sInData.Length() < 14) return sInData;
            sDateTime = sInData.SubString( 1, 4) + SYEAR +
                        sInData.SubString( 5, 2) + SYEAR +
                        sInData.SubString( 7, 2) + SPACE +
                        sInData.SubString( 9, 2) + STIME +
                        sInData.SubString(11, 2) + STIME +
                        sInData.SubString(13, 2);
        }
        else
        if (AFormat == STR_HHNN)
        {
            if (sInData.Length() < 12) return sInData;
            sDateTime = sInData.SubString( 1, 4) + SYEAR +
                        sInData.SubString( 5, 2) + SYEAR +
                        sInData.SubString( 7, 2) + SPACE +
                        sInData.SubString( 9, 2) + STIME +
                        sInData.SubString(11, 2);
        }
        else
        if (AFormat == STR_DATEHOUR)
        {
            if (sInData.Length() < 10) return sInData;
            sDateTime = sInData.SubString( 1, 4) + SYEAR +
                        sInData.SubString( 5, 2) + SYEAR +
                        sInData.SubString( 7, 2) + SPACE +
                        sInData.SubString( 9, 2);
        }
        else
        if (AFormat == STR_DATE)
        {
            if (sInData.Length() < 8) return sInData;
            sDateTime = sInData.SubString( 1, 4) + SYEAR +
                        sInData.SubString( 5, 2) + SYEAR +
                        sInData.SubString( 7, 2);
        }
        else
        if (AFormat == STR_MM)
        {
            if (sInData.Length() < 6) return sInData;
            sDateTime = sInData.SubString( 1, 4) + SYEAR +
                        sInData.SubString( 5, 2);
        }
        else
        {
            sDateTime = sInData;
        }

    }
    catch(...)
    {
    }
//ShowMessage("OUT: " + sDateTime);

    return sDateTime;
}
//---------------------------------------------------------------------------

TColor  g_DispColor[MAX_DISPCOLOR];
void APP_InitDisplayColor()
{
#if 0
    g_DispColor[ 0] = Graphics::clBlue;
    g_DispColor[ 1] = Graphics::clRed;
    g_DispColor[ 2] = Graphics::clLime;
    g_DispColor[ 3] = Graphics::clMaroon;
    g_DispColor[ 4] = Graphics::clGreen;
    g_DispColor[ 5] = Graphics::clMenuHighlight;
    g_DispColor[ 6] = Graphics::clBackground;
    g_DispColor[ 7] = Graphics::clPurple;
    g_DispColor[ 8] = Graphics::clTeal;
    g_DispColor[ 9] = Graphics::clYellow;
    g_DispColor[10] = Graphics::clFuchsia;
    g_DispColor[11] = Graphics::clAqua;
    g_DispColor[12] = Graphics::clMoneyGreen;
    g_DispColor[13] = Graphics::clSkyBlue;
    g_DispColor[14] = Graphics::clRed;
    g_DispColor[15] = Graphics::clLime;
    g_DispColor[16] = Graphics::clYellow;
    g_DispColor[17] = Graphics::clBlue;
    g_DispColor[18] = Graphics::clFuchsia;
    g_DispColor[19] = Graphics::clAqua;
    g_DispColor[20] = Graphics::clMoneyGreen;
    g_DispColor[21] = Graphics::clActiveCaption;
#else
    g_DispColor[ 0] = Graphics::clLime;
    g_DispColor[ 1] = (TColor)RGB(0xFF, 0x00, 0x00);
    g_DispColor[ 2] = (TColor)RGB(0x00, 0x00, 0xFF);
    g_DispColor[ 3] = (TColor)RGB(0xFF, 0x82, 0x00);
    g_DispColor[ 4] = (TColor)RGB(0x94, 0x00, 0xD3);
    g_DispColor[ 5] = Graphics::clPurple;//(TColor)RGB(0x00, 0x00, 0x00);
    g_DispColor[ 6] = (TColor)RGB(0x82, 0x82, 0x82);
    g_DispColor[ 7] = (TColor)RGB(0x1E, 0x90, 0xFF);
    g_DispColor[ 8] = (TColor)RGB(0xB9, 0x06, 0x2F);
    g_DispColor[ 9] = (TColor)RGB(0x8c, 0x00, 0x8c);
    g_DispColor[10] = (TColor)RGB(0xFF, 0x82, 0x00);
    g_DispColor[11] = (TColor)RGB(0x94, 0x00, 0xD3);
    g_DispColor[12] = (TColor)RGB(0xB0, 0xC4, 0xDE);
    g_DispColor[13] = (TColor)RGB(0x00, 0xBF, 0xFF);
    g_DispColor[14] = (TColor)RGB(0x87, 0xCE, 0xEB);
    g_DispColor[15] = (TColor)RGB(0x87, 0xCE, 0xFA);
    g_DispColor[16] = (TColor)RGB(0xAD, 0xD8, 0xE6);
    g_DispColor[17] = (TColor)RGB(0xB0, 0xE0, 0xE6);
    g_DispColor[18] = (TColor)RGB(0xE6, 0xE6, 0xFA);
    g_DispColor[19] = (TColor)RGB(0xF0, 0xF8, 0xFF);
#endif
}
//---------------------------------------------------------------------------

TColor APP_GetDisplayColor(int ASeq)
{
    return g_DispColor[ASeq % MAX_DISPCOLOR];
}
//---------------------------------------------------------------------------
void APP_ImageClear(TCanvas *c, int offX, int offY, int w, int h, TColor color)
{
    try
    {
        c->Pen->Color = clWhite;
        c->Pen->Width = 0;
        c->Pen->Style = psClear;
        c->Brush->Style = bsSolid;
        c->Brush->Color = color;
        c->Rectangle(offX, offY, w+offX+2, h+offY+2);
    }
    catch(...)
    {
    }
}
//---------------------------------------------------------------------------
#include <DateUtils.hpp>
TDateTime APP_StrToDateTime(String AStrDateTime)
{
    TDateTime dtReturnValue = NULL;

    if (AStrDateTime.IsEmpty())      return dtReturnValue;
    if (AStrDateTime.Length() != 14) return dtReturnValue;

    AnsiString sDateTime = AnsiString(AStrDateTime);

    try
    {
#if 0
        sDateTime.printf(L"%s-%s-%s %s:%s:%s",
                           AStrDateTime.SubString( 1, 4).c_str(),
                           AStrDateTime.SubString( 5, 2).c_str(),
                           AStrDateTime.SubString( 7, 2).c_str(),
                           AStrDateTime.SubString( 9, 2).c_str(),
                           AStrDateTime.SubString(11, 2).c_str(),
                           AStrDateTime.SubString(13, 2).c_str());
        dtReturnValue = StrToDateTime(sDateTime);
#endif

// swscanf(sRgb.c_str(), L"%d,%d,%d", &r, &g, &b);

        int year, month, day, hour, minute, second;
        sscanf(sDateTime.c_str(), "%4d%2d%2d%2d%2d%2d", &year, &month, &day, &hour, &minute, &second);
        dtReturnValue = EncodeDateTime(year, month, day, hour, minute, second, 0);
    }
    catch(...)
    {
    }

    return dtReturnValue;
}
//---------------------------------------------------------------------------

