[WINHTTP] Sync with Wine Staging 3.9. CORE-14656
[reactos.git] / dll / cpl / intl / date.c
index e81422b..6b533cd 100644 (file)
@@ -20,7 +20,8 @@
  * PROJECT:         ReactOS International Control Panel
  * FILE:            dll/cpl/intl/date.c
  * PURPOSE:         Date property page
- * PROGRAMMER:      Eric Kohl
+ * PROGRAMMERS:     Eric Kohl
+ *                  Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
  */
 
 #include "intl.h"
@@ -29,7 +30,7 @@
 
 #define YEAR_STR_MAX_SIZE        5
 #define MAX_SHRT_DATE_SEPARATORS 3
-#define STD_DATE_SEP             _T(".")
+#define STD_DATE_SEP             L"."
 #define YEAR_DIFF                (99)
 #define MAX_YEAR                 (9999)
 
@@ -39,9 +40,9 @@ static HWND hwndEnum = NULL;
 
 /* If char is 'y' or 'M' or 'd' return TRUE, else FALSE */
 BOOL
-isDateCompAl(TCHAR alpha)
+isDateCompAl(WCHAR alpha)
 {
-    if ((alpha == _T('y')) || (alpha == _T('M')) || (alpha == _T('d')) || (alpha == _T(' ')))
+    if ((alpha == L'y') || (alpha == L'M') || (alpha == L'd') || (alpha == L' '))
         return TRUE;
     else
         return FALSE;
@@ -49,27 +50,29 @@ isDateCompAl(TCHAR alpha)
 
 /* Find first date separator in string */
 LPTSTR
-FindDateSep(const TCHAR *szSourceStr)
+FindDateSep(const WCHAR *szSourceStr)
 {
-    LPTSTR pszFoundSep;
+    PWSTR pszFoundSep;
     UINT nDateCompCount=0;
     UINT nDateSepCount=0;
 
-    pszFoundSep = (LPTSTR)malloc(MAX_SAMPLES_STR_SIZE * sizeof(TCHAR));
+    pszFoundSep = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, MAX_SAMPLES_STR_SIZE * sizeof(WCHAR));
+    if (pszFoundSep == NULL)
+        return NULL;
 
-    _tcscpy(pszFoundSep,STD_DATE_SEP);
+    wcscpy(pszFoundSep,STD_DATE_SEP);
 
-    while (nDateCompCount < _tcslen(szSourceStr))
+    while (nDateCompCount < wcslen(szSourceStr))
     {
-        if (!isDateCompAl(szSourceStr[nDateCompCount]) && (szSourceStr[nDateCompCount] != _T('\'')))
+        if (!isDateCompAl(szSourceStr[nDateCompCount]) && (szSourceStr[nDateCompCount] != L'\''))
         {
-            while (!isDateCompAl(szSourceStr[nDateCompCount]) && (szSourceStr[nDateCompCount] != _T('\'')))
+            while (!isDateCompAl(szSourceStr[nDateCompCount]) && (szSourceStr[nDateCompCount] != L'\''))
             {
                 pszFoundSep[nDateSepCount++] = szSourceStr[nDateCompCount];
                 nDateCompCount++;
             }
 
-            pszFoundSep[nDateSepCount] = _T('\0');
+            pszFoundSep[nDateSepCount] = L'\0';
             return pszFoundSep;
         }
 
@@ -84,323 +87,294 @@ FindDateSep(const TCHAR *szSourceStr)
 
 /* Setted up short date separator to registry */
 static BOOL
-SetShortDateSep(HWND hwndDlg, LCID lcid)
+SetShortDateSep(HWND hwndDlg, PWSTR pszShortDateSep)
 {
-    TCHAR szShortDateSep[MAX_SAMPLES_STR_SIZE];
     INT nSepStrSize;
     INT nSepCount;
 
-    /* Get setted separator */
-    SendMessage(GetDlgItem(hwndDlg, IDC_SHRTDATESEP_COMBO),
-                WM_GETTEXT,
-                (WPARAM)MAX_SAMPLES_STR_SIZE,
-                (LPARAM)szShortDateSep);
+    /* Get separator */
+    SendDlgItemMessageW(hwndDlg, IDC_SHRTDATESEP_COMBO,
+                        WM_GETTEXT,
+                        (WPARAM)MAX_SAMPLES_STR_SIZE,
+                        (LPARAM)pszShortDateSep);
 
-    /* Get setted separator string size */
-    nSepStrSize = _tcslen(szShortDateSep);
+    /* Get separator string size */
+    nSepStrSize = wcslen(pszShortDateSep);
 
     /* Check date components */
     for (nSepCount = 0; nSepCount < nSepStrSize; nSepCount++)
     {
-        if (_istalnum(szShortDateSep[nSepCount]) || (szShortDateSep[nSepCount] == _T('\'')))
+        if (iswalnum(pszShortDateSep[nSepCount]) || (pszShortDateSep[nSepCount] == L'\''))
         {
-            MessageBox(NULL,
-                       _T("Entered short date separator contain incorrect symbol"),
-                       _T("Error"), MB_OK | MB_ICONERROR);
+            PrintErrorMsgBox(IDS_ERROR_SYMBOL_SEPARATE);
             return FALSE;
         }
     }
 
-    /* Save date separator */
-    SetLocaleInfo(lcid, LOCALE_SDATE, szShortDateSep);
+    if (nSepStrSize == 0)
+    {
+        PrintErrorMsgBox(IDS_ERROR_SYMBOL_SEPARATE);
+        return FALSE;
+    }
 
     return TRUE;
 }
 
 /* Setted up short date format to registry */
 static BOOL
-SetShortDateFormat(HWND hwndDlg, LCID lcid)
+SetShortDateFormat(HWND hwndDlg, PWSTR pszShortDateFmt)
 {
-    TCHAR szShortDateFmt[MAX_SAMPLES_STR_SIZE];
-    TCHAR szShortDateSep[MAX_SAMPLES_STR_SIZE];
-    TCHAR szFindedDateSep[MAX_SAMPLES_STR_SIZE];
-    LPTSTR pszResultStr;
+    WCHAR szShortDateSep[MAX_SAMPLES_STR_SIZE];
+    WCHAR szFoundDateSep[MAX_SAMPLES_STR_SIZE];
+    PWSTR pszResultStr;
+    PWSTR pszFoundSep;
     BOOL OpenApostFlg = FALSE;
     INT nFmtStrSize;
     INT nDateCompCount;
 
-    /* Get setted format */
-    SendMessage(GetDlgItem(hwndDlg, IDC_SHRTDATEFMT_COMBO),
-                WM_GETTEXT,
-                (WPARAM)MAX_SAMPLES_STR_SIZE,
-                (LPARAM)szShortDateFmt);
+    /* Get format */
+    SendDlgItemMessageW(hwndDlg, IDC_SHRTDATEFMT_COMBO,
+                        WM_GETTEXT,
+                        (WPARAM)MAX_SAMPLES_STR_SIZE,
+                        (LPARAM)pszShortDateFmt);
 
-    /* Get setted separator */
-    SendMessage(GetDlgItem(hwndDlg, IDC_SHRTDATESEP_COMBO),
-                WM_GETTEXT,
-                (WPARAM)MAX_SAMPLES_STR_SIZE,
-                (LPARAM)szShortDateSep);
+    /* Get separator */
+    SendDlgItemMessageW(hwndDlg, IDC_SHRTDATESEP_COMBO,
+                        WM_GETTEXT,
+                        (WPARAM)MAX_SAMPLES_STR_SIZE,
+                        (LPARAM)szShortDateSep);
 
-    /* Get setted format-string size */
-    nFmtStrSize = _tcslen(szShortDateFmt);
+    /* Get format-string size */
+    nFmtStrSize = wcslen(pszShortDateFmt);
 
     /* Check date components */
     for (nDateCompCount = 0; nDateCompCount < nFmtStrSize; nDateCompCount++)
     {
-        if (szShortDateFmt[nDateCompCount] == _T('\''))
+        if (pszShortDateFmt[nDateCompCount] == L'\'')
         {
             OpenApostFlg = !OpenApostFlg;
         }
 
-        if (_istalnum(szShortDateFmt[nDateCompCount]) &&
-            !isDateCompAl(szShortDateFmt[nDateCompCount]) &&
+        if (iswalnum(pszShortDateFmt[nDateCompCount]) &&
+            !isDateCompAl(pszShortDateFmt[nDateCompCount]) &&
             !OpenApostFlg)
         {
-            MessageBox(NULL,
-                       _T("Entered short date format contain incorrect symbol"),
-                       _T("Error"), MB_OK | MB_ICONERROR);
+            PrintErrorMsgBox(IDS_ERROR_SYMBOL_FORMAT_SHORT);
             return FALSE;
         }
-
     }
 
-    if (OpenApostFlg)
+    if (OpenApostFlg || nFmtStrSize == 0)
     {
-        MessageBoxW(NULL,
-                    _T("Entered short date format contain incorrect symbol"),
-                    _T("Error"), MB_OK | MB_ICONERROR);
+        PrintErrorMsgBox(IDS_ERROR_SYMBOL_FORMAT_SHORT);
         return FALSE;
     }
 
-    /* Substring replacement of separator */
-    _tcscpy(szFindedDateSep, FindDateSep(szShortDateFmt));
-    pszResultStr = ReplaceSubStr(szShortDateFmt, szShortDateSep, szFindedDateSep);
-    _tcscpy(szShortDateFmt, pszResultStr);
-    free(pszResultStr);
+    pszFoundSep = FindDateSep(pszShortDateFmt);
+    if (pszFoundSep != NULL)
+    {
+        /* Substring replacement of separator */
+        wcscpy(szFoundDateSep, pszFoundSep);
+        pszResultStr = ReplaceSubStr(pszShortDateFmt, szShortDateSep, szFoundDateSep);
+        if (pszResultStr != NULL)
+        {
+            wcscpy(pszShortDateFmt, pszResultStr);
+            HeapFree(GetProcessHeap(), 0, pszResultStr);
+        }
 
-    /* Save short date format */
-    SetLocaleInfo(lcid, LOCALE_SSHORTDATE, szShortDateFmt);
+        HeapFree(GetProcessHeap(), 0, pszFoundSep);
+    }
 
     return TRUE;
 }
 
 /* Setted up long date format to registry */
 static BOOL
-SetLongDateFormat(HWND hwndDlg, LCID lcid)
+SetLongDateFormat(HWND hwndDlg, PWSTR pszLongDateFmt)
 {
-    TCHAR szLongDateFmt[MAX_SAMPLES_STR_SIZE];
     BOOL OpenApostFlg = FALSE;
     INT nFmtStrSize;
     INT nDateCompCount;
 
-    /* Get setted format */
-    SendMessage(GetDlgItem(hwndDlg, IDC_LONGDATEFMT_COMBO),
-                WM_GETTEXT,
-                (WPARAM)MAX_SAMPLES_STR_SIZE,
-                (LPARAM)szLongDateFmt);
+    /* Get format */
+    SendDlgItemMessageW(hwndDlg, IDC_LONGDATEFMT_COMBO,
+                        WM_GETTEXT,
+                        (WPARAM)MAX_SAMPLES_STR_SIZE,
+                        (LPARAM)pszLongDateFmt);
 
-    /* Get setted format string size */
-    nFmtStrSize = _tcslen(szLongDateFmt);
+    /* Get format string size */
+    nFmtStrSize = wcslen(pszLongDateFmt);
 
     /* Check date components */
     for (nDateCompCount = 0; nDateCompCount < nFmtStrSize; nDateCompCount++)
     {
-        if (szLongDateFmt[nDateCompCount] == _T('\''))
+        if (pszLongDateFmt[nDateCompCount] == L'\'')
         {
             OpenApostFlg = !OpenApostFlg;
         }
 
-        if (_istalnum(szLongDateFmt[nDateCompCount]) &&
-            !isDateCompAl(szLongDateFmt[nDateCompCount]) &&
+        if (iswalnum(pszLongDateFmt[nDateCompCount]) &&
+            !isDateCompAl(pszLongDateFmt[nDateCompCount]) &&
             !OpenApostFlg)
         {
-            MessageBox(NULL,
-                       _T("Entered long date format contain incorrect symbol"),
-                       _T("Error"), MB_OK | MB_ICONERROR);
+            PrintErrorMsgBox(IDS_ERROR_SYMBOL_FORMAT_LONG);
             return FALSE;
         }
-
     }
 
-    if (OpenApostFlg)
+    if (OpenApostFlg || nFmtStrSize == 0)
     {
-        MessageBoxW(NULL,
-                    _T("Entered long date format contain incorrect symbol"),
-                    _T("Error"), MB_OK | MB_ICONERROR);
+        PrintErrorMsgBox(IDS_ERROR_SYMBOL_FORMAT_LONG);
         return FALSE;
     }
 
-    /* Save short date format */
-    SetLocaleInfo(lcid, LOCALE_SLONGDATE, szLongDateFmt);
-
     return TRUE;
 }
 
 /* Init short date separator control box */
 static VOID
-InitShortDateSepSamples(HWND hwndDlg, LCID lcid)
+InitShortDateSepSamples(HWND hwndDlg, PGLOBALDATA pGlobalData)
 {
-    LPTSTR ShortDateSepSamples[MAX_SHRT_DATE_SEPARATORS] =
+    PWSTR ShortDateSepSamples[MAX_SHRT_DATE_SEPARATORS] =
     {
-        _T("."),
-        _T("/"),
-        _T("-")
+        L".",
+        L"/",
+        L"-"
     };
-    TCHAR szShortDateSep[MAX_SAMPLES_STR_SIZE];
     INT nCBIndex;
     INT nRetCode;
 
-    /* Get current short date separator */
-    GetLocaleInfo(lcid,
-                  LOCALE_SDATE,
-                  szShortDateSep,
-                  MAX_SAMPLES_STR_SIZE);
-
     /* Clear all box content */
-    SendMessage(GetDlgItem(hwndDlg, IDC_SHRTDATESEP_COMBO),
-                CB_RESETCONTENT,
-                (WPARAM)0,
-                (LPARAM)0);
+    SendDlgItemMessageW(hwndDlg, IDC_SHRTDATESEP_COMBO,
+                        CB_RESETCONTENT,
+                        (WPARAM)0,
+                        (LPARAM)0);
 
     /* Create standard list of separators */
     for (nCBIndex = 0; nCBIndex < MAX_SHRT_DATE_SEPARATORS; nCBIndex++)
     {
-        SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATESEP_COMBO),
-                     CB_ADDSTRING,
-                     0,
-                     (LPARAM)ShortDateSepSamples[nCBIndex]);
+        SendDlgItemMessageW(hwndDlg, IDC_SHRTDATESEP_COMBO,
+                            CB_ADDSTRING,
+                            0,
+                            (LPARAM)ShortDateSepSamples[nCBIndex]);
     }
 
     /* Set current item to value from registry */
-    nRetCode = SendMessage(GetDlgItem(hwndDlg, IDC_SHRTDATESEP_COMBO),
-                           CB_SELECTSTRING,
-                           -1,
-                           (LPARAM)szShortDateSep);
+    nRetCode = SendDlgItemMessageW(hwndDlg, IDC_SHRTDATESEP_COMBO,
+                                   CB_SELECTSTRING,
+                                   -1,
+                                   (LPARAM)pGlobalData->szDateSep);
 
     /* If it is not successful, add new value to list and select them */
     if (nRetCode == CB_ERR)
     {
-        SendMessage(GetDlgItem(hwndDlg, IDC_SHRTDATESEP_COMBO),
-                    CB_ADDSTRING,
-                    0,
-                    (LPARAM)szShortDateSep);
-        SendMessageW(GetDlgItem(hwndDlg, IDC_SHRTDATESEP_COMBO),
-                     CB_SELECTSTRING,
-                     -1,
-                     (LPARAM)szShortDateSep);
+        SendDlgItemMessageW(hwndDlg, IDC_SHRTDATESEP_COMBO,
+                            CB_ADDSTRING,
+                            0,
+                            (LPARAM)pGlobalData->szDateSep);
+        SendDlgItemMessageW(hwndDlg, IDC_SHRTDATESEP_COMBO,
+                            CB_SELECTSTRING,
+                            -1,
+                            (LPARAM)pGlobalData->szDateSep);
     }
 }
 
 static BOOL CALLBACK
-ShortDateFormatEnumProc(LPTSTR lpTimeFormatString)
+ShortDateFormatEnumProc(PWSTR lpTimeFormatString)
 {
-    SendMessage(hwndEnum,
-                CB_ADDSTRING,
-                0,
-                (LPARAM)lpTimeFormatString);
+    SendMessageW(hwndEnum,
+                 CB_ADDSTRING,
+                 0,
+                 (LPARAM)lpTimeFormatString);
 
     return TRUE;
 }
 
 /* Init short date control box */
 VOID
-InitShortDateCB(HWND hwndDlg, LCID lcid)
+InitShortDateCB(HWND hwndDlg, PGLOBALDATA pGlobalData)
 {
-    TCHAR szShortDateFmt[MAX_SAMPLES_STR_SIZE];
     INT nRetCode;
 
     /* Limit text lengths */
-    SendMessage(GetDlgItem(hwndDlg, IDC_SHRTDATEFMT_COMBO),
-                CB_LIMITTEXT,
-                MAX_SHRTDATEFMT,
-                0);
-    SendMessage(GetDlgItem(hwndDlg, IDC_SHRTDATESEP_COMBO),
-                CB_LIMITTEXT,
-                MAX_SHRTDATESEP,
-                0);
-
-    /* Get current short date format */
-    GetLocaleInfo(lcid,
-                  LOCALE_SSHORTDATE,
-                  szShortDateFmt,
-                  MAX_SAMPLES_STR_SIZE);
+    SendDlgItemMessageW(hwndDlg, IDC_SHRTDATEFMT_COMBO,
+                        CB_LIMITTEXT,
+                        MAX_SHORTDATEFORMAT,
+                        0);
+    SendDlgItemMessageW(hwndDlg, IDC_SHRTDATESEP_COMBO,
+                        CB_LIMITTEXT,
+                        MAX_DATESEPARATOR,
+                        0);
 
     /* Clear all box content */
-    SendMessage(GetDlgItem(hwndDlg, IDC_SHRTDATEFMT_COMBO),
-                CB_RESETCONTENT,
-                (WPARAM)0,
-                (LPARAM)0);
+    SendDlgItemMessageW(hwndDlg, IDC_SHRTDATEFMT_COMBO,
+                        CB_RESETCONTENT,
+                        (WPARAM)0,
+                        (LPARAM)0);
 
     /* Enumerate short date formats */
     hwndEnum = GetDlgItem(hwndDlg, IDC_SHRTDATEFMT_COMBO);
-    EnumDateFormats(ShortDateFormatEnumProc, lcid, DATE_SHORTDATE);
+    EnumDateFormatsW(ShortDateFormatEnumProc, pGlobalData->UserLCID, DATE_SHORTDATE);
 
     /* Set current item to value from registry */
-    nRetCode = SendMessage(GetDlgItem(hwndDlg, IDC_SHRTDATEFMT_COMBO),
-                           CB_SELECTSTRING,
-                           -1,
-                           (LPARAM)szShortDateFmt);
+    nRetCode = SendDlgItemMessageW(hwndDlg, IDC_SHRTDATEFMT_COMBO,
+                                   CB_SELECTSTRING,
+                                   -1,
+                                   (LPARAM)pGlobalData->szShortDateFormat);
 
     /* If it is not successful, add new value to list and select them */
     if (nRetCode == CB_ERR)
     {
-        SendMessage(GetDlgItem(hwndDlg, IDC_SHRTDATEFMT_COMBO),
-                    CB_ADDSTRING,
-                    0,
-                    (LPARAM)szShortDateFmt);
-        SendMessage(GetDlgItem(hwndDlg, IDC_SHRTDATEFMT_COMBO),
-                    CB_SELECTSTRING,
-                    -1,
-                    (LPARAM)szShortDateFmt);
+        SendDlgItemMessageW(hwndDlg, IDC_SHRTDATEFMT_COMBO,
+                            CB_ADDSTRING,
+                            0,
+                            (LPARAM)pGlobalData->szShortDateFormat);
+        SendDlgItemMessageW(hwndDlg, IDC_SHRTDATEFMT_COMBO,
+                            CB_SELECTSTRING,
+                            -1,
+                            (LPARAM)pGlobalData->szShortDateFormat);
     }
 }
 
 /* Init long date control box */
 static VOID
-InitLongDateCB(HWND hwndDlg, LCID lcid)
+InitLongDateCB(HWND hwndDlg, PGLOBALDATA pGlobalData)
 {
-    TCHAR szLongDateFmt[MAX_SAMPLES_STR_SIZE];
     INT nRetCode;
 
     /* Limit text length */
-    SendMessage(GetDlgItem(hwndDlg, IDC_LONGDATEFMT_COMBO),
-                CB_LIMITTEXT,
-                MAX_LONGDATEFMT,
-                0);
-
-    /* Get current long date format */
-    GetLocaleInfo(lcid,
-                  LOCALE_SLONGDATE,
-                  szLongDateFmt,
-                  MAX_SAMPLES_STR_SIZE);
+    SendDlgItemMessageW(hwndDlg, IDC_LONGDATEFMT_COMBO,
+                        CB_LIMITTEXT,
+                        MAX_LONGDATEFORMAT,
+                        0);
 
     /* Clear all box content */
-    SendMessage(GetDlgItem(hwndDlg, IDC_LONGDATEFMT_COMBO),
-                CB_RESETCONTENT,
-                (WPARAM)0,
-                (LPARAM)0);
+    SendDlgItemMessageW(hwndDlg, IDC_LONGDATEFMT_COMBO,
+                        CB_RESETCONTENT,
+                        (WPARAM)0,
+                        (LPARAM)0);
 
     /* Enumerate short long formats */
     hwndEnum = GetDlgItem(hwndDlg, IDC_LONGDATEFMT_COMBO);
-    EnumDateFormats(ShortDateFormatEnumProc, lcid, DATE_LONGDATE);
+    EnumDateFormatsW(ShortDateFormatEnumProc, pGlobalData->UserLCID, DATE_LONGDATE);
 
     /* Set current item to value from registry */
-    nRetCode = SendMessage(GetDlgItem(hwndDlg, IDC_LONGDATEFMT_COMBO),
-                           CB_SELECTSTRING,
-                           -1,
-                           (LPARAM)szLongDateFmt);
+    nRetCode = SendDlgItemMessageW(hwndDlg, IDC_LONGDATEFMT_COMBO,
+                                   CB_SELECTSTRING,
+                                   -1,
+                                   (LPARAM)pGlobalData->szLongDateFormat);
 
     /* If it is not successful, add new value to list and select them */
     if (nRetCode == CB_ERR)
     {
-        SendMessage(GetDlgItem(hwndDlg, IDC_LONGDATEFMT_COMBO),
-                    CB_ADDSTRING,
-                    0,
-                    (LPARAM)szLongDateFmt);
-        SendMessage(GetDlgItem(hwndDlg, IDC_LONGDATEFMT_COMBO),
-                    CB_SELECTSTRING,
-                    -1,
-                    (LPARAM)szLongDateFmt);
+        SendDlgItemMessageW(hwndDlg, IDC_LONGDATEFMT_COMBO,
+                            CB_ADDSTRING,
+                            0,
+                            (LPARAM)pGlobalData->szLongDateFormat);
+        SendDlgItemMessageW(hwndDlg, IDC_LONGDATEFMT_COMBO,
+                            CB_SELECTSTRING,
+                            -1,
+                            (LPARAM)pGlobalData->szLongDateFormat);
     }
 }
 
@@ -408,26 +382,26 @@ InitLongDateCB(HWND hwndDlg, LCID lcid)
 static VOID
 SetMaxDate(HWND hwndDlg, LCID lcid)
 {
-    TCHAR szMaxDateVal[YEAR_STR_MAX_SIZE];
+    WCHAR szMaxDateVal[YEAR_STR_MAX_SIZE];
     HWND hWndYearSpin;
     INT nSpinVal;
 
     hWndYearSpin = GetDlgItem(hwndDlg, IDC_SCR_MAX_YEAR);
 
     /* Get spin value */
-    nSpinVal=LOWORD(SendMessage(hWndYearSpin,
-                    UDM_GETPOS,
-                    0,
-                    0));
+    nSpinVal = LOWORD(SendMessageW(hWndYearSpin,
+                                   UDM_GETPOS,
+                                   0,
+                                   0));
 
     /* convert to wide char */
-    _itot(nSpinVal, szMaxDateVal, DECIMAL_RADIX);
+    _itow(nSpinVal, szMaxDateVal, DECIMAL_RADIX);
 
     /* Save max date value */
-    SetCalendarInfo(lcid,
-                    CAL_GREGORIAN,
-                    48 , /* CAL_ITWODIGITYEARMAX */
-                    (LPCTSTR)szMaxDateVal);
+    SetCalendarInfoW(lcid,
+                     CAL_GREGORIAN,
+                     48 , /* CAL_ITWODIGITYEARMAX */
+                     (PCWSTR)szMaxDateVal);
 }
 
 /* Get max date value from registry set */
@@ -436,105 +410,133 @@ GetMaxDate(LCID lcid)
 {
     INT nMaxDateVal = 0;
 
-    GetCalendarInfo(lcid,
-                    CAL_GREGORIAN,
-                    CAL_ITWODIGITYEARMAX | CAL_RETURN_NUMBER,
-                    NULL,
-                    0, /* ret type - number */
-                    (LPDWORD)&nMaxDateVal);
+    GetCalendarInfoW(lcid,
+                     CAL_GREGORIAN,
+                     CAL_ITWODIGITYEARMAX | CAL_RETURN_NUMBER,
+                     NULL,
+                     0, /* ret type - number */
+                     (LPDWORD)&nMaxDateVal);
 
     return nMaxDateVal;
 }
 
 /* Set's MIN data edit control value to MAX-99 */
 static VOID
-SetMinData(HWND hwndDlg)
+SetMinDate(HWND hwndDlg)
 {
-    TCHAR OutBuffer[YEAR_STR_MAX_SIZE];
+    WCHAR OutBuffer[YEAR_STR_MAX_SIZE];
     HWND hWndYearSpin;
     INT nSpinVal;
 
     hWndYearSpin = GetDlgItem(hwndDlg, IDC_SCR_MAX_YEAR);
 
     /* Get spin value */
-    nSpinVal = LOWORD(SendMessage(hWndYearSpin,
-                                  UDM_GETPOS,
-                                  0,
-                                  0));
+    nSpinVal = LOWORD(SendMessageW(hWndYearSpin,
+                                   UDM_GETPOS,
+                                   0,
+                                   0));
 
     /* Set min year value */
-    wsprintf(OutBuffer, _T("%d"), (DWORD)nSpinVal - YEAR_DIFF);
-    SendMessage(GetDlgItem(hwndDlg, IDC_FIRSTYEAR_EDIT),
-                WM_SETTEXT,
-                0,
-                (LPARAM)OutBuffer);
+    wsprintf(OutBuffer, L"%d", (DWORD)nSpinVal - YEAR_DIFF);
+    SendDlgItemMessageW(hwndDlg, IDC_FIRSTYEAR_EDIT,
+                        WM_SETTEXT,
+                        0,
+                        (LPARAM)OutBuffer);
 }
 
 /* Init spin control */
 static VOID
-InitMinMaxDateSpin(HWND hwndDlg, LCID lcid)
+InitMinMaxDateSpin(HWND hwndDlg, PGLOBALDATA pGlobalData)
 {
-    TCHAR OutBuffer[YEAR_STR_MAX_SIZE];
+    WCHAR OutBuffer[YEAR_STR_MAX_SIZE];
     HWND hWndYearSpin;
 
     /* Limit text lengths */
-    SendMessage(GetDlgItem(hwndDlg, IDC_FIRSTYEAR_EDIT),
-                EM_LIMITTEXT,
-                MAX_YEAR_EDIT,
-                0);
-    SendMessage(GetDlgItem(hwndDlg, IDC_SECONDYEAR_EDIT),
-                EM_LIMITTEXT,
-                MAX_YEAR_EDIT,
-                0);
+    SendDlgItemMessageW(hwndDlg, IDC_FIRSTYEAR_EDIT,
+                        EM_LIMITTEXT,
+                        MAX_YEAR_EDIT,
+                        0);
+    SendDlgItemMessageW(hwndDlg, IDC_SECONDYEAR_EDIT,
+                        EM_LIMITTEXT,
+                        MAX_YEAR_EDIT,
+                        0);
 
     hWndYearSpin = GetDlgItem(hwndDlg, IDC_SCR_MAX_YEAR);
 
     /* Init max date value */
-    wsprintf(OutBuffer, _T("%04d"), (DWORD)GetMaxDate(lcid));
-    SendMessage(GetDlgItem(hwndDlg, IDC_SECONDYEAR_EDIT),
-                WM_SETTEXT,
-                0,
-                (LPARAM)OutBuffer);
+    wsprintf(OutBuffer, L"%04d", (DWORD)GetMaxDate(pGlobalData->UserLCID));
+    SendDlgItemMessageW(hwndDlg, IDC_SECONDYEAR_EDIT,
+                        WM_SETTEXT,
+                        0,
+                        (LPARAM)OutBuffer);
 
     /* Init min date value */
-    wsprintf(OutBuffer, _T("%04d"), (DWORD)GetMaxDate(lcid) - YEAR_DIFF);
-    SendMessage(GetDlgItem(hwndDlg, IDC_FIRSTYEAR_EDIT),
-                WM_SETTEXT,
-                0,
-                (LPARAM)OutBuffer);
+    wsprintf(OutBuffer, L"%04d", (DWORD)GetMaxDate(pGlobalData->UserLCID) - YEAR_DIFF);
+    SendDlgItemMessageW(hwndDlg, IDC_FIRSTYEAR_EDIT,
+                        WM_SETTEXT,
+                        0,
+                        (LPARAM)OutBuffer);
 
     /* Init updown control */
     /* Set bounds */
-    SendMessage(hWndYearSpin,
-                UDM_SETRANGE,
-                0,
-                MAKELONG(MAX_YEAR,YEAR_DIFF));
+    SendMessageW(hWndYearSpin,
+                 UDM_SETRANGE,
+                 0,
+                 MAKELONG(MAX_YEAR,YEAR_DIFF));
 
     /* Set current value */
-    SendMessage(hWndYearSpin,
-                UDM_SETPOS,
-                0,
-                MAKELONG(GetMaxDate(lcid),0));
+    SendMessageW(hWndYearSpin,
+                 UDM_SETPOS,
+                 0,
+                 MAKELONG(GetMaxDate(pGlobalData->UserLCID),0));
 }
 
 /* Update all date locale samples */
 static VOID
 UpdateDateLocaleSamples(HWND hwndDlg,
-                        LCID lcidLocale)
+                        PGLOBALDATA pGlobalData)
 {
-    TCHAR OutBuffer[MAX_SAMPLES_STR_SIZE];
+    WCHAR OutBuffer[MAX_SAMPLES_STR_SIZE];
 
     /* Get short date format sample */
-    GetDateFormat(lcidLocale, DATE_SHORTDATE, NULL, NULL, OutBuffer,
-                  MAX_SAMPLES_STR_SIZE);
-    SendMessage(GetDlgItem(hwndDlg, IDC_SHRTDATESAMPLE_EDIT), WM_SETTEXT,
-        0, (LPARAM)OutBuffer);
+    GetDateFormatW(pGlobalData->UserLCID, 0, NULL,
+                   pGlobalData->szShortDateFormat, OutBuffer,
+                   MAX_SAMPLES_STR_SIZE);
+    SendDlgItemMessageW(hwndDlg, IDC_SHRTDATESAMPLE_EDIT, WM_SETTEXT,
+                        0, (LPARAM)OutBuffer);
 
     /* Get long date sample */
-    GetDateFormat(lcidLocale, DATE_LONGDATE, NULL, NULL, OutBuffer,
-                  MAX_SAMPLES_STR_SIZE);
-    SendMessage(GetDlgItem(hwndDlg, IDC_LONGDATESAMPLE_EDIT),
-        WM_SETTEXT, 0, (LPARAM)OutBuffer);
+    GetDateFormatW(pGlobalData->UserLCID, 0, NULL,
+                   pGlobalData->szLongDateFormat, OutBuffer,
+                   MAX_SAMPLES_STR_SIZE);
+    SendDlgItemMessageW(hwndDlg, IDC_LONGDATESAMPLE_EDIT,
+                        WM_SETTEXT, 0, (LPARAM)OutBuffer);
+}
+
+
+static
+BOOL
+GetDateSetting(
+    HWND hwndDlg,
+    PGLOBALDATA pGlobalData)
+{
+    WCHAR szLongDateFormat[MAX_LONGDATEFORMAT];
+    WCHAR szShortDateFormat[MAX_SHORTDATEFORMAT];
+    WCHAR szDateSeparator[MAX_DATESEPARATOR];
+
+    if (!SetLongDateFormat(hwndDlg, szLongDateFormat) ||
+        !SetShortDateFormat(hwndDlg, szShortDateFormat) ||
+        !SetShortDateSep(hwndDlg, szDateSeparator))
+    {
+        return FALSE;
+    }
+
+    /* Store settings in global data */
+    wcscpy(pGlobalData->szLongDateFormat, szLongDateFormat);
+    wcscpy(pGlobalData->szShortDateFormat, szShortDateFormat);
+    wcscpy(pGlobalData->szDateSep, szDateSeparator);
+
+    return TRUE;
 }
 
 /* Property page dialog callback */
@@ -554,65 +556,56 @@ DatePageProc(HWND hwndDlg,
             pGlobalData = (PGLOBALDATA)((LPPROPSHEETPAGE)lParam)->lParam;
             SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pGlobalData);
 
-            InitMinMaxDateSpin(hwndDlg, pGlobalData->lcid);
-            UpdateDateLocaleSamples(hwndDlg, pGlobalData->lcid);
-            InitShortDateCB(hwndDlg, pGlobalData->lcid);
-            InitLongDateCB(hwndDlg, pGlobalData->lcid);
-            InitShortDateSepSamples(hwndDlg, pGlobalData->lcid);
+            InitMinMaxDateSpin(hwndDlg, pGlobalData);
+            UpdateDateLocaleSamples(hwndDlg, pGlobalData);
+            InitShortDateCB(hwndDlg, pGlobalData);
+            InitLongDateCB(hwndDlg, pGlobalData);
+            InitShortDateSepSamples(hwndDlg, pGlobalData);
             /* TODO: Add other calendar types */
+            pGlobalData->bEnableYearNotification = TRUE;
             break;
 
         case WM_COMMAND:
-    {
-        switch (LOWORD(wParam))
-        {
-            case IDC_SECONDYEAR_EDIT:
-            {
-                if(HIWORD(wParam)==EN_CHANGE)
-                {
-                    SetMinData(hwndDlg);
-                }
-            }
-            case IDC_SCR_MAX_YEAR:
+            switch (LOWORD(wParam))
             {
-                               /* Set "Apply" button enabled */
-                               /* FIXME */
-                               //PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
+                case IDC_SECONDYEAR_EDIT:
+                    if (HIWORD(wParam) == EN_CHANGE &&
+                        pGlobalData != NULL &&
+                        pGlobalData->bEnableYearNotification == TRUE)
+                    {
+                        SetMinDate(hwndDlg);
+
+                        /* Enable the Apply button */
+                        PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
+                    }
+                    break;
+
+                case IDC_CALTYPE_COMBO:
+                case IDC_HIJCHRON_COMBO:
+                case IDC_SHRTDATEFMT_COMBO:
+                case IDC_LONGDATEFMT_COMBO:
+                case IDC_SHRTDATESEP_COMBO:
+                    if (HIWORD(wParam) == CBN_SELCHANGE ||
+                        HIWORD(wParam) == CBN_EDITCHANGE)
+                    {
+                        /* Enable the Apply button */
+                        PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
+                    }
+                    break;
             }
             break;
-            case IDC_CALTYPE_COMBO:
-            case IDC_HIJCHRON_COMBO:
-            case IDC_SHRTDATEFMT_COMBO:
-            case IDC_SHRTDATESEP_COMBO:
-            case IDC_LONGDATEFMT_COMBO:
+
+        case WM_NOTIFY:
+            if (((LPNMHDR)lParam)->code == (UINT)PSN_APPLY)
             {
-                if (HIWORD(wParam) == CBN_SELCHANGE || HIWORD(wParam) == CBN_EDITCHANGE)
+                if (GetDateSetting(hwndDlg, pGlobalData))
                 {
-                    /* Set "Apply" button enabled */
-                    PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
+                    pGlobalData->bUserLocaleChanged = TRUE;
+                    SetMaxDate(hwndDlg, pGlobalData->UserLCID);
+                    UpdateDateLocaleSamples(hwndDlg, pGlobalData);
                 }
             }
             break;
-        }
-    }
-    break;
-    case WM_NOTIFY:
-    {
-        LPNMHDR lpnm = (LPNMHDR)lParam;
-        /* If push apply button */
-        if (lpnm->code == (UINT)PSN_APPLY)
-        {
-            SetMaxDate(hwndDlg, pGlobalData->lcid);
-            if(!SetShortDateSep(hwndDlg, pGlobalData->lcid)) break;
-            if(!SetShortDateFormat(hwndDlg, pGlobalData->lcid)) break;
-            if(!SetLongDateFormat(hwndDlg, pGlobalData->lcid)) break;
-            InitShortDateCB(hwndDlg, pGlobalData->lcid);
-            /* FIXME: */
-            //Sleep(15);
-            UpdateDateLocaleSamples(hwndDlg, pGlobalData->lcid);
-        }
-    }
-    break;
     }
 
     return FALSE;