blob: 4c0160931eebec9380babd109f5ae2bc6113b87e [file] [log] [blame]
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001// Copyright 2014 PDFium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07004
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07005// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7#include "../../include/javascript/JavaScript.h"
8#include "../../include/javascript/IJavaScript.h"
9#include "../../include/javascript/JS_Define.h"
10#include "../../include/javascript/JS_Object.h"
11#include "../../include/javascript/JS_Value.h"
12#include "../../include/javascript/PublicMethods.h"
13#include "../../include/javascript/JS_EventHandler.h"
14#include "../../include/javascript/resource.h"
15#include "../../include/javascript/JS_Context.h"
16#include "../../include/javascript/JS_Value.h"
17#include "../../include/javascript/util.h"
18#include "../../include/javascript/Field.h"
19#include "../../include/javascript/color.h"
20#include "../../include/javascript/JS_Runtime.h"
21
22static v8::Isolate* GetIsolate(IFXJS_Context* cc)
23{
24 CJS_Context* pContext = (CJS_Context *)cc;
25 ASSERT(pContext != NULL);
26
27 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
28 ASSERT(pRuntime != NULL);
29
30 return pRuntime->GetIsolate();
31}
32
33
34/* -------------------------------- CJS_PublicMethods -------------------------------- */
35
36#define DOUBLE_CORRECT 0.000000000000001
37
38BEGIN_JS_STATIC_GLOBAL_FUN(CJS_PublicMethods)
Tom Sepeze5350ef2015-04-23 18:14:26 -070039 JS_STATIC_GLOBAL_FUN_ENTRY(AFNumber_Format)
40 JS_STATIC_GLOBAL_FUN_ENTRY(AFNumber_Keystroke)
41 JS_STATIC_GLOBAL_FUN_ENTRY(AFPercent_Format)
42 JS_STATIC_GLOBAL_FUN_ENTRY(AFPercent_Keystroke)
43 JS_STATIC_GLOBAL_FUN_ENTRY(AFDate_FormatEx)
44 JS_STATIC_GLOBAL_FUN_ENTRY(AFDate_KeystrokeEx)
45 JS_STATIC_GLOBAL_FUN_ENTRY(AFDate_Format)
46 JS_STATIC_GLOBAL_FUN_ENTRY(AFDate_Keystroke)
47 JS_STATIC_GLOBAL_FUN_ENTRY(AFTime_FormatEx)
48 JS_STATIC_GLOBAL_FUN_ENTRY(AFTime_KeystrokeEx)
49 JS_STATIC_GLOBAL_FUN_ENTRY(AFTime_Format)
50 JS_STATIC_GLOBAL_FUN_ENTRY(AFTime_Keystroke)
51 JS_STATIC_GLOBAL_FUN_ENTRY(AFSpecial_Format)
52 JS_STATIC_GLOBAL_FUN_ENTRY(AFSpecial_Keystroke)
53 JS_STATIC_GLOBAL_FUN_ENTRY(AFSpecial_KeystrokeEx)
54 JS_STATIC_GLOBAL_FUN_ENTRY(AFSimple)
55 JS_STATIC_GLOBAL_FUN_ENTRY(AFMakeNumber)
56 JS_STATIC_GLOBAL_FUN_ENTRY(AFSimple_Calculate)
57 JS_STATIC_GLOBAL_FUN_ENTRY(AFRange_Validate)
58 JS_STATIC_GLOBAL_FUN_ENTRY(AFMergeChange)
59 JS_STATIC_GLOBAL_FUN_ENTRY(AFParseDateEx)
60 JS_STATIC_GLOBAL_FUN_ENTRY(AFExtractNums)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070061END_JS_STATIC_GLOBAL_FUN()
62
63IMPLEMENT_JS_STATIC_GLOBAL_FUN(CJS_PublicMethods)
64
Tom Sepezd7e5cc72015-06-10 14:33:37 -070065static const FX_WCHAR* months[] =
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070066{
Bo Xuf13c1f32014-11-14 17:03:50 -080067 L"Jan", L"Feb", L"Mar", L"Apr", L"May", L"Jun", L"Jul", L"Aug", L"Sep", L"Oct", L"Nov", L"Dec"
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070068};
69
Tom Sepezd7e5cc72015-06-10 14:33:37 -070070static const FX_WCHAR* const fullmonths[] =
71{
72 L"January", L"February", L"March", L"April", L"May", L"June", L"July", L"August", L"September", L"October", L"November", L"December"
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070073};
74
Tom Sepezd7e5cc72015-06-10 14:33:37 -070075FX_BOOL CJS_PublicMethods::IsNumber(const FX_WCHAR* string)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070076{
77 CFX_WideString sTrim = StrTrim(string);
Tom Sepezd7e5cc72015-06-10 14:33:37 -070078 const FX_WCHAR* pTrim = sTrim.c_str();
79 const FX_WCHAR* p = pTrim;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070080
81
82 FX_BOOL bDot = FALSE;
83 FX_BOOL bKXJS = FALSE;
84
85 wchar_t c;
86 while ((c = *p))
87 {
88 if (c == '.' || c == ',')
89 {
90 if (bDot) return FALSE;
91 bDot = TRUE;
92 }
93 else if (c == '-' || c == '+')
94 {
95 if (p != pTrim)
96 return FALSE;
97 }
98 else if (c == 'e' || c == 'E')
99 {
100 if (bKXJS) return FALSE;
101
102 p++;
103 c = *p;
104 if (c == '+' || c == '-')
105 {
106 bKXJS = TRUE;
107 }
108 else
109 {
110 return FALSE;
111 }
112 }
113 else if (!IsDigit(c))
114 {
115 return FALSE;
116 }
117 p++;
118 }
119
120 return TRUE;
121}
122
123FX_BOOL CJS_PublicMethods::IsDigit(wchar_t ch)
124{
125 return (ch >= L'0' && ch <= L'9');
126}
127
128FX_BOOL CJS_PublicMethods::IsDigit(char ch)
129{
130 return (ch >= '0' && ch <= '9');
131}
132
133FX_BOOL CJS_PublicMethods::IsAlphabetic(wchar_t ch)
134{
135 return ((ch >= L'a' && ch <= L'z') || (ch >= L'A' && ch <= L'Z'));
136}
137
138FX_BOOL CJS_PublicMethods::IsAlphaNumeric(wchar_t ch)
139{
140 return (IsDigit(ch) || IsAlphabetic(ch));
141}
142
143FX_BOOL CJS_PublicMethods::maskSatisfied(wchar_t c_Change,wchar_t c_Mask)
144{
145 switch (c_Mask)
146 {
147 case L'9':
Lei Zhanga6d9f0e2015-06-13 00:48:38 -0700148 return IsDigit(c_Change);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700149 case L'A':
Lei Zhanga6d9f0e2015-06-13 00:48:38 -0700150 return IsAlphabetic(c_Change);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700151 case L'O':
Lei Zhanga6d9f0e2015-06-13 00:48:38 -0700152 return IsAlphaNumeric(c_Change);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700153 case L'X':
Lei Zhanga6d9f0e2015-06-13 00:48:38 -0700154 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700155 default:
156 return (c_Change == c_Mask);
157 }
158}
159
160FX_BOOL CJS_PublicMethods::isReservedMaskChar(wchar_t ch)
161{
162 return ch == L'9' || ch == L'A' || ch == L'O' || ch == L'X';
163}
164
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700165double CJS_PublicMethods::AF_Simple(const FX_WCHAR* sFuction, double dValue1, double dValue2)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700166{
Bo Xuf13c1f32014-11-14 17:03:50 -0800167 if (FXSYS_wcsicmp(sFuction,L"AVG") == 0 || FXSYS_wcsicmp(sFuction,L"SUM") == 0)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700168 {
169 return dValue1 + dValue2;
170 }
Bo Xuf13c1f32014-11-14 17:03:50 -0800171 else if (FXSYS_wcsicmp(sFuction, L"PRD") == 0)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700172 {
173 return dValue1 * dValue2;
174 }
Bo Xuf13c1f32014-11-14 17:03:50 -0800175 else if (FXSYS_wcsicmp(sFuction,L"MIN") == 0)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700176 {
177 return FX_MIN(dValue1, dValue2);
178 }
Bo Xuf13c1f32014-11-14 17:03:50 -0800179 else if (FXSYS_wcsicmp(sFuction,L"MAX") == 0)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700180 {
181 return FX_MAX(dValue1, dValue2);
182 }
183
184 return dValue1;
185}
186
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700187CFX_WideString CJS_PublicMethods::StrLTrim(const FX_WCHAR* pStr)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700188{
189 while (*pStr && *pStr == L' ') pStr++;
190
191 return pStr;
192}
193
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700194CFX_WideString CJS_PublicMethods::StrRTrim(const FX_WCHAR* pStr)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700195{
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700196 const FX_WCHAR* p = pStr;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700197 while (*p) p++;
Tom Sepez46773fd2014-07-23 10:50:06 -0700198 while (p > pStr && *(p - 1) == L' ') p--;
199
200 return CFX_WideString(pStr, p - pStr);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700201}
202
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700203CFX_WideString CJS_PublicMethods::StrTrim(const FX_WCHAR* pStr)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700204{
Tom Sepez4f7bc042015-04-27 12:06:58 -0700205 return StrRTrim(StrLTrim(pStr).c_str());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700206}
207
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700208CFX_ByteString CJS_PublicMethods::StrLTrim(const FX_CHAR* pStr)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700209{
210 while (*pStr && *pStr == ' ') pStr++;
211
Tom Sepez46773fd2014-07-23 10:50:06 -0700212 return pStr;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700213}
214
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700215CFX_ByteString CJS_PublicMethods::StrRTrim(const FX_CHAR* pStr)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700216{
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700217 const FX_CHAR* p = pStr;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700218 while (*p) p++;
Tom Sepez46773fd2014-07-23 10:50:06 -0700219 while (p > pStr && *(p - 1) == L' ') p--;
220
221 return CFX_ByteString(pStr,p-pStr);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700222}
223
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700224CFX_ByteString CJS_PublicMethods::StrTrim(const FX_CHAR* pStr)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700225{
226 return StrRTrim(StrLTrim(pStr));
227}
228
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700229double CJS_PublicMethods::ParseNumber(const FX_WCHAR* swSource, FX_BOOL& bAllDigits, FX_BOOL& bDot, FX_BOOL& bSign, FX_BOOL& bKXJS)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700230{
231 bDot = FALSE;
232 bSign = FALSE;
233 bKXJS = FALSE;
234
235 FX_BOOL bDigitExist = FALSE;
236
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700237 const FX_WCHAR* p = swSource;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700238 wchar_t c;
239
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700240 const FX_WCHAR* pStart = NULL;
241 const FX_WCHAR* pEnd = NULL;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700242
243 while ((c = *p))
244 {
245 if (!pStart && c != L' ')
246 {
247 pStart = p;
248 }
249
250 pEnd = p;
251 p++;
252 }
253
254 if (!pStart)
255 {
256 bAllDigits = FALSE;
257 return 0;
258 }
259
260 while (pEnd != pStart)
261 {
262 if (*pEnd == L' ')
263 pEnd --;
264 else
265 break;
266 }
267
268 double dRet = 0;
269 p = pStart;
270 bAllDigits = TRUE;
271 CFX_WideString swDigits;
272
273 while (p <= pEnd)
Lei Zhanga6d9f0e2015-06-13 00:48:38 -0700274 {
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700275 c = *p;
276
277 if (IsDigit(c))
278 {
279 swDigits += c;
280 bDigitExist = TRUE;
281 }
Lei Zhanga6d9f0e2015-06-13 00:48:38 -0700282 else
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700283 {
284 switch (c)
285 {
286 case L' ':
287 bAllDigits = FALSE;
288 break;
289 case L'.':
290 case L',':
291 if (!bDot)
292 {
293 if (bDigitExist)
294 {
295 swDigits += L'.';
296 }
297 else
298 {
299 swDigits += L'0';
300 swDigits += L'.';
301 bDigitExist = TRUE;
302 }
303
304 bDot = TRUE;
305 break;
306 }
307 case 'e':
308 case 'E':
309 if (!bKXJS)
310 {
311 p++;
312 c = *p;
313 if (c == '+' || c == '-')
314 {
315 bKXJS = TRUE;
316 swDigits += 'e';
317 swDigits += c;
318 }
319 break;
320 }
321 case L'-':
322 if (!bDigitExist && !bSign)
323 {
324 swDigits += c;
325 bSign = TRUE;
326 break;
327 }
328 default:
329 bAllDigits = FALSE;
330
331 if (p != pStart && !bDot && bDigitExist)
332 {
333 swDigits += L'.';
334 bDot = TRUE;
335 }
336 else
337 {
338 bDot = FALSE;
339 bDigitExist = FALSE;
340 swDigits = L"";
341 }
342 break;
343 }
344 }
345
346 p++;
347 }
348
349 if (swDigits.GetLength() > 0 && swDigits.GetLength() < 17)
350 {
351 CFX_ByteString sDigits = swDigits.UTF8Encode();
352
353 if (bKXJS)
354 {
355 dRet = atof(sDigits);
356 }
357 else
358 {
359 if (bDot)
360 {
361 char* pStopString;
362 dRet = ::strtod(sDigits, &pStopString);
363 }
364 else
365 {
366 dRet = atol(sDigits);
367 }
368 }
369
370 }
371
372 return dRet;
373}
374
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700375double CJS_PublicMethods::ParseStringToNumber(const FX_WCHAR* swSource)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700376{
377 FX_BOOL bAllDigits = FALSE;
378 FX_BOOL bDot = FALSE;
379 FX_BOOL bSign = FALSE;
380 FX_BOOL bKXJS = FALSE;
381
382 return ParseNumber(swSource, bAllDigits, bDot, bSign, bKXJS);
383}
384
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700385FX_BOOL CJS_PublicMethods::ConvertStringToNumber(const FX_WCHAR* swSource, double & dRet, FX_BOOL & bDot)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700386{
387 FX_BOOL bAllDigits = FALSE;
388 FX_BOOL bSign = FALSE;
389 FX_BOOL bKXJS = FALSE;
390
391 dRet = ParseNumber(swSource, bAllDigits, bDot, bSign, bKXJS);
392
393 return bAllDigits;
394}
395
396CJS_Array CJS_PublicMethods::AF_MakeArrayFromList(v8::Isolate* isolate, CJS_Value val)
397{
398 CJS_Array StrArray(isolate);
399 if(val.IsArrayObject())
400 {
401 val.ConvertToArray(StrArray);
402 return StrArray;
403 }
Tom Sepezf4ef3f92015-04-23 11:31:31 -0700404 CFX_WideString wsStr = val.ToCFXWideString();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700405 CFX_ByteString t = CFX_ByteString::FromUnicode(wsStr);
406 const char * p = (const char *)t;
407
408
409 int ch = ',' ;
410 int nIndex = 0;
411
412 while (*p)
413 {
414 const char * pTemp = strchr(p, ch);
415 if (pTemp == NULL)
416 {
Bo Xuc6164832014-12-30 16:56:12 -0800417 StrArray.SetElement(nIndex, CJS_Value(isolate, StrTrim(p).c_str()));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700418 break;
419 }
420 else
421 {
422 char * pSub = new char[pTemp - p + 1];
423 strncpy(pSub, p, pTemp - p);
424 *(pSub + (pTemp - p)) = '\0';
425
Bo Xuc6164832014-12-30 16:56:12 -0800426 StrArray.SetElement(nIndex, CJS_Value(isolate, StrTrim(pSub).c_str()));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700427 delete []pSub;
Lei Zhanga6d9f0e2015-06-13 00:48:38 -0700428
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700429 nIndex ++;
430 p = ++pTemp;
431 }
Lei Zhanga6d9f0e2015-06-13 00:48:38 -0700432
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700433 }
434 return StrArray;
435}
436
437int CJS_PublicMethods::ParseStringInteger(const CFX_WideString& string,int nStart,int& nSkip, int nMaxStep)
438{
439 int nRet = 0;
440 nSkip = 0;
441 for (int i=nStart, sz=string.GetLength(); i < sz; i++)
442 {
443 if (i-nStart > 10)
444 break;
445
446 FX_WCHAR c = string.GetAt(i);
447 if (IsDigit((wchar_t)c))
448 {
449 nRet = nRet * 10 + (c - '0');
450 nSkip = i - nStart + 1;
Lei Zhanga6d9f0e2015-06-13 00:48:38 -0700451 if (nSkip >= nMaxStep)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700452 break;
453 }
454 else
455 break;
456 }
457
458 return nRet;
459}
460
461CFX_WideString CJS_PublicMethods::ParseStringString(const CFX_WideString& string, int nStart, int& nSkip)
462{
463 CFX_WideString swRet;
464 nSkip = 0;
465 for (int i=nStart, sz=string.GetLength(); i < sz; i++)
466 {
467 FX_WCHAR c = string.GetAt(i);
468 if ((c >= L'a' && c <= L'z') || (c >= L'A' && c <= L'Z'))
469 {
470 swRet += c;
471 nSkip = i - nStart + 1;
472 }
473 else
474 break;
475 }
476
477 return swRet;
478}
479
480double CJS_PublicMethods::ParseNormalDate(const CFX_WideString & value, FX_BOOL& bWrongFormat)
481{
482 double dt = JS_GetDateTime();
483
484 int nYear = JS_GetYearFromTime(dt);
485 int nMonth = JS_GetMonthFromTime(dt) + 1;
486 int nDay = JS_GetDayFromTime(dt);
487 int nHour = JS_GetHourFromTime(dt);
488 int nMin = JS_GetMinFromTime(dt);
489 int nSec = JS_GetSecFromTime(dt);
490
491 int number[3];
492
493 int nSkip = 0;
494 int nLen = value.GetLength();
495 int nIndex = 0;
496 int i = 0;
497 while (i < nLen)
498 {
499 if (nIndex > 2) break;
500
501 FX_WCHAR c = value.GetAt(i);
502 if (IsDigit((wchar_t)c))
503 {
504 number[nIndex++] = ParseStringInteger(value, i, nSkip, 4);
Lei Zhanga6d9f0e2015-06-13 00:48:38 -0700505 i += nSkip;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700506 }
507 else
508 {
509 i ++;
510 }
511 }
512
513 if (nIndex == 2)
514 {
515 // case2: month/day
516 // case3: day/month
517 if ((number[0] >= 1 && number[0] <= 12) && (number[1] >= 1 && number[1] <= 31))
518 {
519 nMonth = number[0];
520 nDay = number[1];
521 }
522 else if ((number[0] >= 1 && number[0] <= 31) && (number[1] >= 1 && number[1] <= 12))
523 {
524 nDay = number[0];
525 nMonth = number[1];
526 }
527
528 bWrongFormat = FALSE;
529 }
530 else if (nIndex == 3)
531 {
532 // case1: year/month/day
533 // case2: month/day/year
534 // case3: day/month/year
535
536 if (number[0] > 12 && (number[1] >= 1 && number[1] <= 12) && (number[2] >= 1 && number[2] <= 31))
537 {
538 nYear = number[0];
539 nMonth = number[1];
540 nDay = number[2];
541 }
542 else if ((number[0] >= 1 && number[0] <= 12) && (number[1] >= 1 && number[1] <= 31) && number[2] > 31)
543 {
544 nMonth = number[0];
545 nDay = number[1];
546 nYear = number[2];
547 }
548 else if ((number[0] >= 1 && number[0] <= 31) && (number[1] >= 1 && number[1] <= 12) && number[2] > 31)
549 {
550 nDay = number[0];
551 nMonth = number[1];
552 nYear = number[2];
553 }
554
555 bWrongFormat = FALSE;
556 }
557 else
558 {
559 bWrongFormat = TRUE;
560 return dt;
561 }
562
563 CFX_WideString swTemp;
Bo Xuf13c1f32014-11-14 17:03:50 -0800564 swTemp.Format(L"%d/%d/%d %d:%d:%d",nMonth,nDay,nYear,nHour,nMin,nSec);
Tom Sepez4f7bc042015-04-27 12:06:58 -0700565 return JS_DateParse(swTemp.c_str());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700566}
567
568double CJS_PublicMethods::MakeRegularDate(const CFX_WideString & value, const CFX_WideString & format, FX_BOOL& bWrongFormat)
569{
570 double dt = JS_GetDateTime();
571
572 if (format.IsEmpty() || value.IsEmpty())
573 return dt;
574
575 int nYear = JS_GetYearFromTime(dt);
576 int nMonth = JS_GetMonthFromTime(dt) + 1;
577 int nDay = JS_GetDayFromTime(dt);
578 int nHour = JS_GetHourFromTime(dt);
579 int nMin = JS_GetMinFromTime(dt);
580 int nSec = JS_GetSecFromTime(dt);
581
582 int nYearSub = 99; //nYear - 2000;
583
584 FX_BOOL bPm = FALSE;
585 FX_BOOL bExit = FALSE;
586 bWrongFormat = FALSE;
Tom Sepez5ffacd62014-07-18 14:42:12 -0700587
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700588 int i=0;
589 int j=0;
590
591 while (i < format.GetLength())
592 {
593 if (bExit) break;
594
Tom Sepez5ffacd62014-07-18 14:42:12 -0700595 FX_WCHAR c = format.GetAt(i);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700596 switch (c)
597 {
598 case ':':
599 case '.':
600 case '-':
601 case '\\':
602 case '/':
603 i++;
604 j++;
605 break;
Tom Sepez5ffacd62014-07-18 14:42:12 -0700606
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700607 case 'y':
608 case 'm':
609 case 'd':
610 case 'H':
611 case 'h':
612 case 'M':
613 case 's':
614 case 't':
615 {
616 int oldj = j;
617 int nSkip = 0;
Tom Sepez5ffacd62014-07-18 14:42:12 -0700618 int remaining = format.GetLength() - i - 1;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700619
Tom Sepez5ffacd62014-07-18 14:42:12 -0700620 if (remaining == 0 || format.GetAt(i+1) != c)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700621 {
622 switch (c)
623 {
624 case 'y':
625 i++;
626 j++;
627 break;
628 case 'm':
629 nMonth = ParseStringInteger(value, j, nSkip, 2);
630 i++;
631 j += nSkip;
632 break;
633 case 'd':
634 nDay = ParseStringInteger(value, j, nSkip, 2);
635 i++;
636 j += nSkip;
637 break;
638 case 'H':
639 nHour = ParseStringInteger(value, j, nSkip, 2);
640 i++;
641 j += nSkip;
642 break;
643 case 'h':
644 nHour = ParseStringInteger(value, j, nSkip, 2);
645 i++;
646 j += nSkip;
647 break;
648 case 'M':
649 nMin = ParseStringInteger(value, j, nSkip, 2);
650 i++;
651 j += nSkip;
652 break;
653 case 's':
654 nSec = ParseStringInteger(value, j, nSkip, 2);
655 i++;
656 j += nSkip;
657 break;
658 case 't':
Tom Sepez5ffacd62014-07-18 14:42:12 -0700659 bPm = (j < value.GetLength() && value.GetAt(j) == 'p');
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700660 i++;
661 j++;
662 break;
Tom Sepez5ffacd62014-07-18 14:42:12 -0700663 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700664 }
Tom Sepez5ffacd62014-07-18 14:42:12 -0700665 else if (remaining == 1 || format.GetAt(i+2) != c)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700666 {
667 switch (c)
668 {
669 case 'y':
670 nYear = ParseStringInteger(value, j, nSkip, 4);
671 i += 2;
672 j += nSkip;
673 break;
674 case 'm':
675 nMonth = ParseStringInteger(value, j, nSkip, 2);
676 i += 2;
677 j += nSkip;
678 break;
679 case 'd':
680 nDay = ParseStringInteger(value, j, nSkip, 2);
681 i += 2;
682 j += nSkip;
683 break;
684 case 'H':
685 nHour = ParseStringInteger(value, j, nSkip, 2);
686 i += 2;
687 j += nSkip;
688 break;
689 case 'h':
690 nHour = ParseStringInteger(value, j, nSkip, 2);
691 i += 2;
692 j += nSkip;
693 break;
694 case 'M':
695 nMin = ParseStringInteger(value, j, nSkip, 2);
696 i += 2;
697 j += nSkip;
698 break;
699 case 's':
700 nSec = ParseStringInteger(value, j, nSkip, 2);
701 i += 2;
702 j += nSkip;
703 break;
704 case 't':
Tom Sepez5ffacd62014-07-18 14:42:12 -0700705 bPm = (j + 1 < value.GetLength() && value.GetAt(j) == 'p' && value.GetAt(j+1) == 'm');
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700706 i += 2;
707 j += 2;
708 break;
709 }
710 }
Tom Sepez5ffacd62014-07-18 14:42:12 -0700711 else if (remaining == 2 || format.GetAt(i+3) != c)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700712 {
713 switch (c)
714 {
715 case 'm':
716 {
717 CFX_WideString sMonth = ParseStringString(value, j, nSkip);
718 FX_BOOL bFind = FALSE;
719 for (int m = 0; m < 12; m++)
720 {
721 if (sMonth.CompareNoCase(months[m]) == 0)
722 {
723 nMonth = m + 1;
724 i+=3;
725 j+=nSkip;
726 bFind = TRUE;
727 break;
728 }
729 }
Tom Sepez5ffacd62014-07-18 14:42:12 -0700730
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700731 if (!bFind)
732 {
733 nMonth = ParseStringInteger(value, j, nSkip, 3);
734 i+=3;
735 j += nSkip;
736 }
737 }
738 break;
739 case 'y':
740 break;
741 default:
742 i+=3;
743 j+=3;
744 break;
745 }
746 }
Tom Sepez5ffacd62014-07-18 14:42:12 -0700747 else if (remaining == 3 || format.GetAt(i+4) != c)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700748 {
749 switch (c)
750 {
751
752
753 case 'y':
754 nYear = ParseStringInteger(value, j, nSkip, 4);
755 j += nSkip;
756 i += 4;
757 break;
758 case 'm':
759 {
760 FX_BOOL bFind = FALSE;
761
762 CFX_WideString sMonth = ParseStringString(value, j, nSkip);
763 sMonth.MakeLower();
764
765 for (int m = 0; m < 12; m++)
766 {
767 CFX_WideString sFullMonths = fullmonths[m];
768 sFullMonths.MakeLower();
769
Tom Sepez4f7bc042015-04-27 12:06:58 -0700770 if (sFullMonths.Find(sMonth.c_str(), 0) != -1)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700771 {
772 nMonth = m + 1;
773 i += 4;
774 j += nSkip;
775 bFind = TRUE;
776 break;
777 }
778 }
Tom Sepez5ffacd62014-07-18 14:42:12 -0700779
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700780 if (!bFind)
781 {
782 nMonth = ParseStringInteger(value, j, nSkip, 4);
783 i+=4;
784 j += nSkip;
785 }
786 }
787 break;
788 default:
789 i += 4;
790 j += 4;
791 break;
Tom Sepez5ffacd62014-07-18 14:42:12 -0700792 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700793 }
794 else
795 {
Tom Sepez5ffacd62014-07-18 14:42:12 -0700796 if (j >= value.GetLength() || format.GetAt(i) != value.GetAt(j))
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700797 {
798 bWrongFormat = TRUE;
799 bExit = TRUE;
800 }
801 i++;
802 j++;
803 }
Tom Sepez5ffacd62014-07-18 14:42:12 -0700804
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700805 if (oldj == j)
806 {
807 bWrongFormat = TRUE;
808 bExit = TRUE;
809 }
810 }
811
Tom Sepez5ffacd62014-07-18 14:42:12 -0700812 break;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700813 default:
814 if (value.GetLength() <= j)
815 {
816 bExit = TRUE;
817 }
818 else if (format.GetAt(i) != value.GetAt(j))
819 {
820 bWrongFormat = TRUE;
821 bExit = TRUE;
822 }
823
824 i++;
825 j++;
826 break;
Tom Sepez5ffacd62014-07-18 14:42:12 -0700827 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700828 }
829
830 if (bPm) nHour += 12;
831
832 if (nYear >= 0 && nYear <= nYearSub)
833 nYear += 2000;
834
835 if (nMonth < 1 || nMonth > 12)
836 bWrongFormat = TRUE;
837
838 if (nDay < 1 || nDay > 31)
839 bWrongFormat = TRUE;
840
841 if (nHour < 0 || nHour > 24)
842 bWrongFormat = TRUE;
843
844 if (nMin < 0 || nMin > 60)
845 bWrongFormat = TRUE;
846
847 if (nSec < 0 || nSec > 60)
848 bWrongFormat = TRUE;
849
850 double dRet = 0;
851
852 if (bWrongFormat)
853 {
854 dRet = ParseNormalDate(value, bWrongFormat);
855 }
856 else
857 {
858 dRet = JS_MakeDate(JS_MakeDay(nYear,nMonth - 1,nDay),JS_MakeTime(nHour, nMin, nSec, 0));
859
860 if (JS_PortIsNan(dRet))
861 {
Tom Sepez4f7bc042015-04-27 12:06:58 -0700862 dRet = JS_DateParse(value.c_str());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700863 }
864 }
865
866 if (JS_PortIsNan(dRet))
867 {
868 dRet = ParseNormalDate(value, bWrongFormat);
869 }
870
871 return dRet;
872
873}
874
875CFX_WideString CJS_PublicMethods::MakeFormatDate(double dDate, const CFX_WideString & format)
876{
877 CFX_WideString sRet = L"",sPart = L"";
878
879 int nYear = JS_GetYearFromTime(dDate);
880 int nMonth = JS_GetMonthFromTime(dDate) + 1;
881 int nDay = JS_GetDayFromTime(dDate);
882 int nHour = JS_GetHourFromTime(dDate);
883 int nMin = JS_GetMinFromTime(dDate);
884 int nSec = JS_GetSecFromTime(dDate);
885
886 int i = 0;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700887 while (i < format.GetLength())
888 {
Tom Sepez85386422014-07-23 10:28:37 -0700889 FX_WCHAR c = format.GetAt(i);
890 int remaining = format.GetLength() - i - 1;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700891 sPart = L"";
892 switch (c)
893 {
894 case 'y':
895 case 'm':
896 case 'd':
897 case 'H':
898 case 'h':
899 case 'M':
900 case 's':
901 case 't':
Tom Sepez85386422014-07-23 10:28:37 -0700902 if (remaining == 0 || format.GetAt(i+1) != c)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700903 {
904 switch (c)
905 {
906 case 'y':
907 sPart += c;
908 break;
909 case 'm':
Bo Xuf13c1f32014-11-14 17:03:50 -0800910 sPart.Format(L"%d",nMonth);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700911 break;
912 case 'd':
Bo Xuf13c1f32014-11-14 17:03:50 -0800913 sPart.Format(L"%d",nDay);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700914 break;
915 case 'H':
Bo Xuf13c1f32014-11-14 17:03:50 -0800916 sPart.Format(L"%d",nHour);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700917 break;
918 case 'h':
Bo Xuf13c1f32014-11-14 17:03:50 -0800919 sPart.Format(L"%d",nHour>12?nHour - 12:nHour);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700920 break;
921 case 'M':
Bo Xuf13c1f32014-11-14 17:03:50 -0800922 sPart.Format(L"%d",nMin);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700923 break;
924 case 's':
Bo Xuf13c1f32014-11-14 17:03:50 -0800925 sPart.Format(L"%d",nSec);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700926 break;
Tom Sepez85386422014-07-23 10:28:37 -0700927 case 't':
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700928 sPart += nHour>12?'p':'a';
929 break;
Tom Sepez85386422014-07-23 10:28:37 -0700930 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700931 i++;
932 }
Tom Sepez85386422014-07-23 10:28:37 -0700933 else if (remaining == 1 || format.GetAt(i+2) != c)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700934 {
935 switch (c)
936 {
937 case 'y':
Bo Xuf13c1f32014-11-14 17:03:50 -0800938 sPart.Format(L"%02d",nYear - (nYear / 100) * 100);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700939 break;
940 case 'm':
Bo Xuf13c1f32014-11-14 17:03:50 -0800941 sPart.Format(L"%02d",nMonth);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700942 break;
943 case 'd':
Bo Xuf13c1f32014-11-14 17:03:50 -0800944 sPart.Format(L"%02d",nDay);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700945 break;
946 case 'H':
Bo Xuf13c1f32014-11-14 17:03:50 -0800947 sPart.Format(L"%02d",nHour);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700948 break;
949 case 'h':
Bo Xuf13c1f32014-11-14 17:03:50 -0800950 sPart.Format(L"%02d",nHour>12?nHour - 12:nHour);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700951 break;
952 case 'M':
Bo Xuf13c1f32014-11-14 17:03:50 -0800953 sPart.Format(L"%02d",nMin);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700954 break;
955 case 's':
Bo Xuf13c1f32014-11-14 17:03:50 -0800956 sPart.Format(L"%02d",nSec);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700957 break;
Tom Sepez85386422014-07-23 10:28:37 -0700958 case 't':
Bo Xuf13c1f32014-11-14 17:03:50 -0800959 sPart = nHour>12? L"pm": L"am";
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700960 break;
Tom Sepez85386422014-07-23 10:28:37 -0700961 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700962 i+=2;
963 }
Tom Sepez85386422014-07-23 10:28:37 -0700964 else if (remaining == 2 || format.GetAt(i+3) != c)
965 {
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700966 switch (c)
967 {
968 case 'm':
969 i+=3;
970 if (nMonth > 0&&nMonth <= 12)
971 sPart += months[nMonth - 1];
972 break;
973 default:
974 i+=3;
975 sPart += c;
976 sPart += c;
977 sPart += c;
978 break;
Tom Sepez85386422014-07-23 10:28:37 -0700979 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700980 }
Tom Sepez85386422014-07-23 10:28:37 -0700981 else if (remaining == 3 || format.GetAt(i+4) != c)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700982 {
983 switch (c)
984 {
985 case 'y':
Bo Xuf13c1f32014-11-14 17:03:50 -0800986 sPart.Format(L"%04d",nYear);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700987 i += 4;
Tom Sepez85386422014-07-23 10:28:37 -0700988 break;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700989 case 'm':
990 i+=4;
991 if (nMonth > 0&&nMonth <= 12)
992 sPart += fullmonths[nMonth - 1];
993 break;
994 default:
995 i += 4;
996 sPart += c;
997 sPart += c;
998 sPart += c;
999 sPart += c;
1000 break;
Tom Sepez85386422014-07-23 10:28:37 -07001001 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001002 }
1003 else
1004 {
1005 i++;
1006 sPart += c;
1007 }
Tom Sepez85386422014-07-23 10:28:37 -07001008 break;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001009 default:
1010 i++;
1011 sPart += c;
1012 break;
1013 }
Tom Sepez85386422014-07-23 10:28:37 -07001014
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001015 sRet += sPart;
1016 }
1017
1018 return sRet;
1019}
1020
1021/* -------------------------------------------------------------------------- */
1022
1023//function AFNumber_Format(nDec, sepStyle, negStyle, currStyle, strCurrency, bCurrencyPrepend)
Tom Sepez2f3dfef2015-03-02 15:35:26 -08001024FX_BOOL CJS_PublicMethods::AFNumber_Format(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001025{
1026#if _FX_OS_ != _FX_ANDROID_
1027 v8::Isolate* isolate = ::GetIsolate(cc);
1028 CJS_Context* pContext = (CJS_Context *)cc;
1029 ASSERT(pContext != NULL);
1030 CJS_EventHandler* pEvent = pContext->GetEventHandler();
1031 ASSERT(pEvent != NULL);
1032
1033 if (params.size() != 6)
1034 {
1035 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
1036 return FALSE;
1037 }
1038 if(!pEvent->m_pValue)
1039 return FALSE;
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001040 CFX_WideString& Value = pEvent->Value();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001041 CFX_ByteString strValue = StrTrim(CFX_ByteString::FromUnicode(Value));
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001042
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001043 if (strValue.IsEmpty()) return TRUE;
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001044
Tom Sepezf4ef3f92015-04-23 11:31:31 -07001045 int iDec = params[0].ToInt();
1046 int iSepStyle = params[1].ToInt();
1047 int iNegStyle = params[2].ToInt();
Nico Weber55681f92014-07-30 19:00:31 -07001048 // params[3] is iCurrStyle, it's not used.
Tom Sepez4f7bc042015-04-27 12:06:58 -07001049 std::wstring wstrCurrency(params[4].ToCFXWideString().c_str());
Tom Sepezf4ef3f92015-04-23 11:31:31 -07001050 FX_BOOL bCurrencyPrepend = params[5].ToBool();
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001051
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001052 if (iDec < 0) iDec = -iDec;
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001053
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001054 if (iSepStyle < 0 || iSepStyle > 3)
1055 iSepStyle = 0;
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001056
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001057 if (iNegStyle < 0 || iNegStyle > 3)
1058 iNegStyle = 0;
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001059
1060
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001061 //////////////////////////////////////////////////////
1062 //for processing decimal places
1063 strValue.Replace(",", ".");
1064 double dValue = atof(strValue);
1065 if (iDec > 0)
1066 dValue += DOUBLE_CORRECT;//
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001067
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001068 int iDec2;
1069 FX_BOOL bNagative = FALSE;
1070
1071 strValue = fcvt(dValue,iDec,&iDec2,&bNagative);
1072 if (strValue.IsEmpty())
1073 {
1074 dValue = 0;
1075 strValue = fcvt(dValue,iDec,&iDec2,&bNagative);
1076 if (strValue.IsEmpty())
1077 {
1078 strValue = "0";
1079 iDec2 = 1;
1080 }
1081
1082 }
1083
1084 if (iDec2 < 0)
1085 {
1086 for (int iNum = 0;iNum < abs(iDec2);iNum++)
1087 {
1088 strValue = "0" + strValue;
1089 }
1090 iDec2 = 0;
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001091
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001092 }
1093 int iMax = strValue.GetLength();
1094 if (iDec2 > iMax)
1095 {
1096 for (int iNum = 0;iNum <= iDec2 - iMax ;iNum++)
1097 {
1098 strValue += "0";
1099 }
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001100 iMax = iDec2+1;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001101 }
1102 ///////////////////////////////////////////////////////
1103 //for processing seperator style
1104 if (iDec2 < iMax)
1105 {
1106 if (iSepStyle == 0 || iSepStyle == 1)
1107 {
1108 strValue.Insert(iDec2, '.');
1109 iMax++;
1110 }
1111 else if (iSepStyle == 2 || iSepStyle == 3)
1112 {
1113 strValue.Insert(iDec2, ',');
1114 iMax++;
1115 }
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001116
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001117 if (iDec2 == 0)
1118 strValue.Insert(iDec2, '0');
1119 }
1120 if (iSepStyle == 0 || iSepStyle == 2)
1121 {
1122 char cSeperator;
1123 if (iSepStyle == 0)
1124 cSeperator = ',';
1125 else
1126 cSeperator = '.';
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001127
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001128 int iDecPositive,iDecNagative;
1129 iDecPositive = iDec2;
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001130 iDecNagative = iDec2;
1131
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001132 for (iDecPositive = iDec2 -3; iDecPositive > 0;iDecPositive -= 3)
1133 {
1134 strValue.Insert(iDecPositive, cSeperator);
1135 iMax++;
1136 }
1137 }
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001138
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001139 //////////////////////////////////////////////////////////////////////
1140 //for processing currency string
1141
1142 Value = CFX_WideString::FromLocal(strValue);
Tom Sepez4f7bc042015-04-27 12:06:58 -07001143 std::wstring strValue2 = Value.c_str();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001144
1145 if (bCurrencyPrepend)
1146 strValue2 = wstrCurrency + strValue2;
1147 else
1148 strValue2 = strValue2 + wstrCurrency;
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001149
1150
1151
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001152 /////////////////////////////////////////////////////////////////////////
1153 //for processing negative style
1154 if (bNagative)
1155 {
1156 if (iNegStyle == 0)
1157 {
1158 strValue2.insert(0,L"-");
1159 }
1160 if (iNegStyle == 2 || iNegStyle == 3)
1161 {
1162 strValue2.insert(0,L"(");
1163 strValue2.insert(strValue2.length(),L")");
1164 }
1165 if (iNegStyle == 1 || iNegStyle == 3)
1166 {
1167 if (Field * fTarget = pEvent->Target_Field())
1168 {
1169 CJS_Array arColor(isolate);
1170 CJS_Value vColElm(isolate);
1171 vColElm = L"RGB";
1172 arColor.SetElement(0,vColElm);
1173 vColElm = 1;
1174 arColor.SetElement(1,vColElm);
1175 vColElm = 0;
1176 arColor.SetElement(2,vColElm);
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001177
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001178 arColor.SetElement(3,vColElm);
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001179
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001180 CJS_PropValue vProp(isolate);
1181 vProp.StartGetting();
1182 vProp<<arColor;
1183 vProp.StartSetting();
1184 fTarget->textColor(cc,vProp,sError);// red
1185 }
1186 }
1187 }
1188 else
1189 {
1190 if (iNegStyle == 1 || iNegStyle == 3)
1191 {
1192 if (Field *fTarget = pEvent->Target_Field())
1193 {
1194 CJS_Array arColor(isolate);
1195 CJS_Value vColElm(isolate);
1196 vColElm = L"RGB";
1197 arColor.SetElement(0,vColElm);
1198 vColElm = 0;
1199 arColor.SetElement(1,vColElm);
1200 arColor.SetElement(2,vColElm);
1201 arColor.SetElement(3,vColElm);
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001202
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001203 CJS_PropValue vProp(isolate);
1204 vProp.StartGetting();
1205 fTarget->textColor(cc,vProp,sError);
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001206
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001207 CJS_Array aProp(isolate);
1208 vProp.ConvertToArray(aProp);
1209
1210 CPWL_Color crProp;
1211 CPWL_Color crColor;
1212 color::ConvertArrayToPWLColor(aProp, crProp);
1213 color::ConvertArrayToPWLColor(arColor, crColor);
1214
1215 if (crColor != crProp)
1216 {
1217 CJS_PropValue vProp2(isolate);
1218 vProp2.StartGetting();
1219 vProp2<<arColor;
1220 vProp2.StartSetting();
1221 fTarget->textColor(cc,vProp2,sError);
1222 }
1223 }
1224 }
1225 }
1226 Value = strValue2.c_str();
1227#endif
1228 return TRUE;
1229}
1230
1231//function AFNumber_Keystroke(nDec, sepStyle, negStyle, currStyle, strCurrency, bCurrencyPrepend)
Tom Sepez2f3dfef2015-03-02 15:35:26 -08001232FX_BOOL CJS_PublicMethods::AFNumber_Keystroke(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001233{
1234 CJS_Context* pContext = (CJS_Context *)cc;
1235 ASSERT(pContext != NULL);
1236 CJS_EventHandler* pEvent = pContext->GetEventHandler();
1237 ASSERT(pEvent != NULL);
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001238
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001239 if(params.size() < 2)
1240 return FALSE;
Tom Sepezf4ef3f92015-04-23 11:31:31 -07001241 int iSepStyle = params[1].ToInt();
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001242
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001243 if (iSepStyle < 0 || iSepStyle > 3)
1244 iSepStyle = 0;
1245 if(!pEvent->m_pValue)
1246 return FALSE;
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001247 CFX_WideString & val = pEvent->Value();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001248 CFX_WideString & w_strChange = pEvent->Change();
1249 CFX_WideString w_strValue = val;
1250
1251 if (pEvent->WillCommit())
1252 {
1253 CFX_WideString wstrChange = w_strChange;
Tom Sepez4f7bc042015-04-27 12:06:58 -07001254 CFX_WideString wstrValue = StrLTrim(w_strValue.c_str());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001255 if (wstrValue.IsEmpty())
1256 return TRUE;
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001257
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001258 CFX_WideString swTemp = wstrValue;
Bo Xuf13c1f32014-11-14 17:03:50 -08001259 swTemp.Replace(L",", L".");
Tom Sepez4f7bc042015-04-27 12:06:58 -07001260 if (!IsNumber(swTemp.c_str()))
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001261 {
1262 pEvent->Rc() = FALSE;
1263 sError = JSGetStringFromID(pContext, IDS_STRING_JSAFNUMBER_KEYSTROKE);
Tom Sepez4f7bc042015-04-27 12:06:58 -07001264 Alert(pContext, sError.c_str());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001265 return TRUE;
1266 }
1267 return TRUE; // it happens after the last keystroke and before validating,
1268 }
Tom Sepez4f7bc042015-04-27 12:06:58 -07001269
1270 std::wstring w_strValue2 = w_strValue.c_str();
1271 std::wstring w_strChange2 = w_strChange.c_str();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001272 std::wstring w_strSelected;
1273 if(-1 != pEvent->SelStart())
1274 w_strSelected = w_strValue2.substr(pEvent->SelStart(),(pEvent->SelEnd() - pEvent->SelStart()));
1275 FX_BOOL bHasSign = (w_strValue2.find('-') != -1) && (w_strSelected.find('-') == -1);
1276 if (bHasSign)
1277 {
1278 //can't insert "change" in front to sign postion.
1279 if (pEvent->SelStart() == 0)
1280 {
1281 FX_BOOL &bRc = pEvent->Rc();
1282 bRc = FALSE;
1283 return TRUE;
1284 }
1285 }
1286
1287 char cSep = L'.';
1288
1289 switch (iSepStyle)
1290 {
1291 case 0:
1292 case 1:
1293 cSep = L'.';
1294 break;
1295 case 2:
1296 case 3:
1297 cSep = L',';
1298 break;
1299 }
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001300
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001301 FX_BOOL bHasSep = (w_strValue2.find(cSep) != -1);
1302 for (std::wstring::iterator it = w_strChange2.begin(); it != w_strChange2.end(); it++)
1303 {
1304 if (*it == cSep)
1305 {
1306 if (bHasSep)
1307 {
1308 FX_BOOL &bRc = pEvent->Rc();
1309 bRc = FALSE;
1310 return TRUE;
1311 }
1312 else
1313 {
1314 bHasSep = TRUE;
1315 continue;
1316 }
1317 }
1318 if (*it == L'-')
1319 {
1320 if (bHasSign)
1321 {
1322 FX_BOOL &bRc = pEvent->Rc();
1323 bRc = FALSE;
1324 return TRUE;
1325 }
1326 else if (it != w_strChange2.begin()) //sign's position is not correct
1327 {
1328 FX_BOOL &bRc = pEvent->Rc();
1329 bRc = FALSE;
1330 return TRUE;
1331 }
1332 else if (pEvent->SelStart() != 0)
1333 {
1334 FX_BOOL &bRc = pEvent->Rc();
1335 bRc = FALSE;
1336 return TRUE;
1337 }
1338 bHasSign = TRUE;
1339 continue;
1340 }
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001341
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001342 if (!IsDigit(*it))
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001343 {
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001344 FX_BOOL &bRc = pEvent->Rc();
1345 bRc = FALSE;
1346 return TRUE;
1347 }
1348 }
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001349
1350
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001351 std::wstring w_prefix = w_strValue2.substr(0,pEvent->SelStart());
1352 std::wstring w_postfix;
1353 if (pEvent->SelEnd()<(int)w_strValue2.length())
1354 w_postfix = w_strValue2.substr(pEvent->SelEnd());
1355 w_strValue2 = w_prefix + w_strChange2 + w_postfix;
1356 w_strValue = w_strValue2.c_str();
1357 val = w_strValue;
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001358 return TRUE;
1359
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001360}
1361
1362//function AFPercent_Format(nDec, sepStyle)
Tom Sepez2f3dfef2015-03-02 15:35:26 -08001363FX_BOOL CJS_PublicMethods::AFPercent_Format(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001364{
1365#if _FX_OS_ != _FX_ANDROID_
1366 CJS_Context* pContext = (CJS_Context *)cc;
1367 ASSERT(pContext != NULL);
1368 CJS_EventHandler* pEvent = pContext->GetEventHandler();
1369 ASSERT(pEvent != NULL);
1370
1371 if (params.size() != 2)
1372 {
1373 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
1374 return FALSE;
1375 }
1376 if(!pEvent->m_pValue)
1377 return FALSE;
Tom Sepezf4ef3f92015-04-23 11:31:31 -07001378
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001379 CFX_WideString& Value = pEvent->Value();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001380 CFX_ByteString strValue = StrTrim(CFX_ByteString::FromUnicode(Value));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001381 if (strValue.IsEmpty())
1382 return TRUE;
Tom Sepezf4ef3f92015-04-23 11:31:31 -07001383
1384 int iDec = params[0].ToInt();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001385 if (iDec < 0)
1386 iDec = -iDec;
Tom Sepezf4ef3f92015-04-23 11:31:31 -07001387
1388 int iSepStyle = params[1].ToInt();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001389 if (iSepStyle < 0 || iSepStyle > 3)
1390 iSepStyle = 0;
Tom Sepezf4ef3f92015-04-23 11:31:31 -07001391
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001392 //////////////////////////////////////////////////////
1393 //for processing decimal places
1394 double dValue = atof(strValue);
1395 dValue *= 100;
1396 if (iDec > 0)
1397 dValue += DOUBLE_CORRECT;//УÕý
1398
1399 int iDec2;
1400 FX_BOOL bNagative = FALSE;
1401 strValue = fcvt(dValue,iDec,&iDec2,&bNagative);
1402 if (strValue.IsEmpty())
1403 {
1404 dValue = 0;
1405 strValue = fcvt(dValue,iDec,&iDec2,&bNagative);
1406 }
1407
1408 if (iDec2 < 0)
1409 {
1410 for (int iNum = 0; iNum < abs(iDec2); iNum++)
1411 {
1412 strValue = "0" + strValue;
1413 }
1414 iDec2 = 0;
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001415
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001416 }
1417 int iMax = strValue.GetLength();
1418 if (iDec2 > iMax)
1419 {
1420 for (int iNum = 0; iNum <= iDec2 - iMax; iNum++)
1421 {
1422 strValue += "0";
1423 }
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001424 iMax = iDec2+1;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001425 }
1426 ///////////////////////////////////////////////////////
1427 //for processing seperator style
1428 if (iDec2 < iMax)
1429 {
1430 if (iSepStyle == 0 || iSepStyle == 1)
1431 {
1432 strValue.Insert(iDec2, '.');
1433 iMax++;
1434 }
1435 else if (iSepStyle == 2 || iSepStyle == 3)
1436 {
1437 strValue.Insert(iDec2, ',');
1438 iMax++;
1439 }
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001440
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001441 if (iDec2 == 0)
1442 strValue.Insert(iDec2, '0');
1443 }
1444 if (iSepStyle == 0 || iSepStyle == 2)
1445 {
1446 char cSeperator;
1447 if (iSepStyle == 0)
1448 cSeperator = ',';
1449 else
1450 cSeperator = '.';
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001451
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001452 int iDecPositive,iDecNagative;
1453 iDecPositive = iDec2;
1454 iDecNagative = iDec2;
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001455
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001456 for (iDecPositive = iDec2 -3; iDecPositive > 0; iDecPositive -= 3)
1457 {
1458 strValue.Insert(iDecPositive,cSeperator);
1459 iMax++;
1460 }
1461 }
1462 ////////////////////////////////////////////////////////////////////
1463 //nagative mark
1464 if(bNagative)
1465 strValue = "-" + strValue;
1466 strValue += "%";
1467 Value = CFX_WideString::FromLocal(strValue);
1468#endif
1469 return TRUE;
1470}
1471//AFPercent_Keystroke(nDec, sepStyle)
Tom Sepez2f3dfef2015-03-02 15:35:26 -08001472FX_BOOL CJS_PublicMethods::AFPercent_Keystroke(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001473{
1474 return AFNumber_Keystroke(cc,params,vRet,sError);
1475}
1476
1477//function AFDate_FormatEx(cFormat)
Tom Sepez2f3dfef2015-03-02 15:35:26 -08001478FX_BOOL CJS_PublicMethods::AFDate_FormatEx(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001479{
1480 CJS_Context* pContext = (CJS_Context *)cc;
1481 ASSERT(pContext != NULL);
1482 CJS_EventHandler* pEvent = pContext->GetEventHandler();
1483 ASSERT(pEvent != NULL);
1484
1485 if (params.size() != 1)
1486 {
1487 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
1488 return FALSE;
Tom Sepezf4ef3f92015-04-23 11:31:31 -07001489 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001490 if(!pEvent->m_pValue)
1491 return FALSE;
Tom Sepezf4ef3f92015-04-23 11:31:31 -07001492
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001493 CFX_WideString& val = pEvent->Value();
Tom Sepezf4ef3f92015-04-23 11:31:31 -07001494 CFX_WideString strValue = val;
1495 if (strValue.IsEmpty())
1496 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001497
Tom Sepezf4ef3f92015-04-23 11:31:31 -07001498 CFX_WideString sFormat = params[0].ToCFXWideString();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001499 FX_BOOL bWrongFormat = FALSE;
1500 double dDate = 0.0f;
1501
1502 if(strValue.Find(L"GMT") != -1)
1503 {
1504 //for GMT format time
1505 //such as "Tue Aug 11 14:24:16 GMT+08002009"
1506 dDate = MakeInterDate(strValue);
1507 }
1508 else
1509 {
1510 dDate = MakeRegularDate(strValue,sFormat,bWrongFormat);
1511 }
1512
1513 if (JS_PortIsNan(dDate))
1514 {
1515 CFX_WideString swMsg;
Tom Sepez4f7bc042015-04-27 12:06:58 -07001516 swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSPARSEDATE).c_str(), sFormat.c_str());
1517 Alert(pContext, swMsg.c_str());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001518 return FALSE;
1519 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001520
Tom Sepezf4ef3f92015-04-23 11:31:31 -07001521 val = MakeFormatDate(dDate,sFormat);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001522 return TRUE;
1523}
1524
1525double CJS_PublicMethods::MakeInterDate(CFX_WideString strValue)
1526{
1527 int nHour;
1528 int nMin;
1529 int nSec;
1530 int nYear;
1531 int nMonth;
1532 int nDay;
1533
1534 CFX_WideStringArray wsArray;
1535 CFX_WideString sMonth = L"";
1536 CFX_WideString sTemp = L"";
1537 int nSize = strValue.GetLength();
1538
1539 for(int i = 0; i < nSize; i++)
1540 {
1541 FX_WCHAR c = strValue.GetAt(i);
1542 if(c == L' ' || c == L':')
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001543 {
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001544 wsArray.Add(sTemp);
1545 sTemp = L"";
1546 continue;
1547 }
1548
1549 sTemp += c;
1550 }
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001551
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001552 wsArray.Add(sTemp);
1553 if(wsArray.GetSize() != 8)return 0;
1554
1555 sTemp = wsArray[1];
1556 if(sTemp.Compare(L"Jan") == 0) nMonth = 1;
1557 if(sTemp.Compare(L"Feb") == 0) nMonth = 2;
1558 if(sTemp.Compare(L"Mar") == 0) nMonth = 3;
1559 if(sTemp.Compare(L"Apr") == 0) nMonth = 4;
1560 if(sTemp.Compare(L"May") == 0) nMonth = 5;
1561 if(sTemp.Compare(L"Jun") == 0) nMonth = 6;
1562 if(sTemp.Compare(L"Jul") == 0) nMonth = 7;
1563 if(sTemp.Compare(L"Aug") == 0) nMonth = 8;
1564 if(sTemp.Compare(L"Sep") == 0) nMonth = 9;
1565 if(sTemp.Compare(L"Oct") == 0) nMonth = 10;
1566 if(sTemp.Compare(L"Nov") == 0) nMonth = 11;
1567 if(sTemp.Compare(L"Dec") == 0) nMonth = 12;
1568
Tom Sepez4f7bc042015-04-27 12:06:58 -07001569 nDay = (int)ParseStringToNumber(wsArray[2].c_str());
1570 nHour = (int)ParseStringToNumber(wsArray[3].c_str());
1571 nMin = (int)ParseStringToNumber(wsArray[4].c_str());
1572 nSec = (int)ParseStringToNumber(wsArray[5].c_str());
1573 nYear = (int)ParseStringToNumber(wsArray[7].c_str());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001574
1575 double dRet = JS_MakeDate(JS_MakeDay(nYear,nMonth - 1,nDay),JS_MakeTime(nHour, nMin, nSec, 0));
1576
1577 if (JS_PortIsNan(dRet))
1578 {
Tom Sepez4f7bc042015-04-27 12:06:58 -07001579 dRet = JS_DateParse(strValue.c_str());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001580 }
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001581
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001582 return dRet;
1583}
1584
1585//AFDate_KeystrokeEx(cFormat)
Tom Sepez2f3dfef2015-03-02 15:35:26 -08001586FX_BOOL CJS_PublicMethods::AFDate_KeystrokeEx(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001587{
1588 CJS_Context* pContext = (CJS_Context *)cc;
1589 ASSERT(pContext != NULL);
1590 CJS_EventHandler* pEvent = pContext->GetEventHandler();
1591 ASSERT(pEvent != NULL);
1592
1593 if (params.size() != 1)
1594 {
1595 sError = L"AFDate_KeystrokeEx's parameters' size r not correct";
1596 return FALSE;
Tom Sepezf4ef3f92015-04-23 11:31:31 -07001597 }
1598
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001599 if (pEvent->WillCommit())
1600 {
1601 if(!pEvent->m_pValue)
1602 return FALSE;
1603 CFX_WideString strValue = pEvent->Value();
Tom Sepezf4ef3f92015-04-23 11:31:31 -07001604 if (strValue.IsEmpty())
1605 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001606
Tom Sepezf4ef3f92015-04-23 11:31:31 -07001607 CFX_WideString sFormat = params[0].ToCFXWideString();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001608 FX_BOOL bWrongFormat = FALSE;
1609 double dRet = MakeRegularDate(strValue,sFormat,bWrongFormat);
1610 if (bWrongFormat || JS_PortIsNan(dRet))
1611 {
1612 CFX_WideString swMsg;
Tom Sepez4f7bc042015-04-27 12:06:58 -07001613 swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSPARSEDATE).c_str(), sFormat.c_str());
1614 Alert(pContext, swMsg.c_str());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001615 pEvent->Rc() = FALSE;
1616 return TRUE;
1617 }
1618 }
1619 return TRUE;
1620}
1621
Tom Sepez2f3dfef2015-03-02 15:35:26 -08001622FX_BOOL CJS_PublicMethods::AFDate_Format(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001623{
1624 v8::Isolate* isolate = ::GetIsolate(cc);
1625
1626 if (params.size() != 1)
1627 {
1628 CJS_Context* pContext = (CJS_Context*)cc;
1629 ASSERT(pContext != NULL);
1630
1631 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
1632 return FALSE;
1633 }
1634
Tom Sepezf4ef3f92015-04-23 11:31:31 -07001635 int iIndex = params[0].ToInt();
Tom Sepezd7e5cc72015-06-10 14:33:37 -07001636 const FX_WCHAR* cFormats[] = {L"m/d", L"m/d/yy", L"mm/dd/yy", L"mm/yy", L"d-mmm", L"d-mmm-yy", L"dd-mmm-yy",
Bo Xuf13c1f32014-11-14 17:03:50 -08001637 L"yy-mm-dd", L"mmm-yy", L"mmmm-yy", L"mmm d, yyyy", L"mmmm d, yyyy",
1638 L"m/d/yy h:MM tt", L"m/d/yy HH:MM" };
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001639
Bruce Dawson5c579332015-01-05 11:53:18 -08001640 ASSERT(iIndex < FX_ArraySize(cFormats));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001641
1642 if (iIndex < 0)
1643 iIndex = 0;
Bruce Dawson5c579332015-01-05 11:53:18 -08001644 if (iIndex >= FX_ArraySize(cFormats))
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001645 iIndex = 0;
1646 CJS_Parameters newParams;
1647 CJS_Value val(isolate,cFormats[iIndex]);
1648 newParams.push_back(val);
1649 return AFDate_FormatEx(cc,newParams,vRet,sError);
1650}
1651
1652//AFDate_KeystrokeEx(cFormat)
Tom Sepez2f3dfef2015-03-02 15:35:26 -08001653FX_BOOL CJS_PublicMethods::AFDate_Keystroke(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001654{
1655 v8::Isolate* isolate = ::GetIsolate(cc);
1656
1657 if (params.size() != 1)
1658 {
1659 CJS_Context* pContext = (CJS_Context*)cc;
1660 ASSERT(pContext != NULL);
1661
1662 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
1663 return FALSE;
1664 }
1665
Tom Sepezf4ef3f92015-04-23 11:31:31 -07001666 int iIndex = params[0].ToInt();
Tom Sepezd7e5cc72015-06-10 14:33:37 -07001667 const FX_WCHAR* cFormats[] = {L"m/d", L"m/d/yy", L"mm/dd/yy", L"mm/yy", L"d-mmm", L"d-mmm-yy", L"dd-mmm-yy",
Bo Xuf13c1f32014-11-14 17:03:50 -08001668 L"yy-mm-dd", L"mmm-yy", L"mmmm-yy", L"mmm d, yyyy", L"mmmm d, yyyy",
1669 L"m/d/yy h:MM tt", L"m/d/yy HH:MM" };
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001670
Bruce Dawson5c579332015-01-05 11:53:18 -08001671 ASSERT(iIndex<FX_ArraySize(cFormats));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001672
1673 if (iIndex < 0)
1674 iIndex = 0;
Bruce Dawson5c579332015-01-05 11:53:18 -08001675 if (iIndex >= FX_ArraySize(cFormats))
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001676 iIndex = 0;
1677 CJS_Parameters newParams;
1678 CJS_Value val(isolate,cFormats[iIndex]);
1679 newParams.push_back(val);
1680 return AFDate_KeystrokeEx(cc,newParams,vRet,sError);
1681}
1682
1683//function AFTime_Format(ptf)
Tom Sepez2f3dfef2015-03-02 15:35:26 -08001684FX_BOOL CJS_PublicMethods::AFTime_Format(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001685{
1686 v8::Isolate* isolate = ::GetIsolate(cc);
1687
1688 if (params.size() != 1)
1689 {
1690 CJS_Context* pContext = (CJS_Context*)cc;
1691 ASSERT(pContext != NULL);
1692 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
1693 return FALSE;
1694 }
1695
Tom Sepezf4ef3f92015-04-23 11:31:31 -07001696 int iIndex = params[0].ToInt();
Tom Sepezd7e5cc72015-06-10 14:33:37 -07001697 const FX_WCHAR* cFormats[] = {L"HH:MM", L"h:MM tt", L"HH:MM:ss", L"h:MM:ss tt"};
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001698
Bruce Dawson5c579332015-01-05 11:53:18 -08001699 ASSERT(iIndex<FX_ArraySize(cFormats));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001700
1701 if (iIndex < 0)
1702 iIndex = 0;
Bruce Dawson5c579332015-01-05 11:53:18 -08001703 if (iIndex >= FX_ArraySize(cFormats))
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001704 iIndex = 0;
1705 CJS_Parameters newParams;
1706 CJS_Value val(isolate,cFormats[iIndex]);
1707 newParams.push_back(val);
1708 return AFDate_FormatEx(cc,newParams,vRet,sError);
1709}
1710
Tom Sepez2f3dfef2015-03-02 15:35:26 -08001711FX_BOOL CJS_PublicMethods::AFTime_Keystroke(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001712{
1713 v8::Isolate* isolate = ::GetIsolate(cc);
1714 if (params.size() != 1)
1715 {
1716 CJS_Context* pContext = (CJS_Context*)cc;
1717 ASSERT(pContext != NULL);
1718 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
1719 return FALSE;
1720 }
1721
Tom Sepezf4ef3f92015-04-23 11:31:31 -07001722 int iIndex = params[0].ToInt();
Tom Sepezd7e5cc72015-06-10 14:33:37 -07001723 const FX_WCHAR* cFormats[] = {L"HH:MM", L"h:MM tt", L"HH:MM:ss", L"h:MM:ss tt"};
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001724
Bruce Dawson5c579332015-01-05 11:53:18 -08001725 ASSERT(iIndex<FX_ArraySize(cFormats));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001726
1727 if (iIndex < 0)
1728 iIndex = 0;
Bruce Dawson5c579332015-01-05 11:53:18 -08001729 if (iIndex >= FX_ArraySize(cFormats))
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001730 iIndex = 0;
1731 CJS_Parameters newParams;
1732 CJS_Value val(isolate,cFormats[iIndex]);
1733 newParams.push_back(val);
1734 return AFDate_KeystrokeEx(cc,newParams,vRet,sError);
1735}
1736
Tom Sepez2f3dfef2015-03-02 15:35:26 -08001737FX_BOOL CJS_PublicMethods::AFTime_FormatEx(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001738{
1739 return AFDate_FormatEx(cc,params,vRet,sError);
1740}
1741
Tom Sepez2f3dfef2015-03-02 15:35:26 -08001742FX_BOOL CJS_PublicMethods::AFTime_KeystrokeEx(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001743{
1744 return AFDate_KeystrokeEx(cc,params,vRet,sError);
1745}
1746
1747//function AFSpecial_Format(psf)
Tom Sepez2f3dfef2015-03-02 15:35:26 -08001748FX_BOOL CJS_PublicMethods::AFSpecial_Format(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001749{
1750 CJS_Context* pContext = (CJS_Context *)cc;
1751 ASSERT(pContext != NULL);
1752
1753 if (params.size() != 1)
1754 {
1755 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
1756 return FALSE;
1757 }
1758
1759 std::string cFormat;
Tom Sepezf4ef3f92015-04-23 11:31:31 -07001760 int iIndex = params[0].ToInt();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001761
1762 CJS_EventHandler* pEvent = pContext->GetEventHandler();
1763 ASSERT(pEvent != NULL);
1764
1765 if(!pEvent->m_pValue)
1766 return FALSE;
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001767 CFX_WideString& Value = pEvent->Value();
Bo Xuc6164832014-12-30 16:56:12 -08001768 std::string strSrc = CFX_ByteString::FromUnicode(Value).c_str();
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001769
1770 switch (iIndex)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001771 {
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001772 case 0:
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001773 cFormat = "99999";
1774 break;
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001775 case 1:
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001776 cFormat = "99999-9999";
1777 break;
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001778 case 2:
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001779 {
1780 std::string NumberStr;
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001781 util::printx("9999999999", strSrc,NumberStr);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001782 if (NumberStr.length() >= 10 )
1783 cFormat = "(999) 999-9999";
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001784 else
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001785 cFormat = "999-9999";
1786 break;
1787 }
1788 case 3:
1789 cFormat = "999-99-9999";
1790 break;
1791 }
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001792
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001793 std::string strDes;
1794 util::printx(cFormat,strSrc,strDes);
1795 Value = CFX_WideString::FromLocal(strDes.c_str());
1796 return TRUE;
1797}
1798
1799
1800//function AFSpecial_KeystrokeEx(mask)
Tom Sepez2f3dfef2015-03-02 15:35:26 -08001801FX_BOOL CJS_PublicMethods::AFSpecial_KeystrokeEx(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001802{
1803 CJS_Context* pContext = (CJS_Context *)cc;
1804 ASSERT(pContext != NULL);
1805 CJS_EventHandler* pEvent = pContext->GetEventHandler();
1806
1807 ASSERT(pEvent != NULL);
1808
1809 if (params.size() < 1)
1810 {
1811 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
1812 return FALSE;
1813 }
1814
1815 if(!pEvent->m_pValue)
1816 return FALSE;
1817 CFX_WideString& valEvent = pEvent->Value();
1818
Tom Sepezf4ef3f92015-04-23 11:31:31 -07001819 CFX_WideString wstrMask = params[0].ToCFXWideString();
1820 if (wstrMask.IsEmpty())
1821 return TRUE;
1822
Tom Sepez4f7bc042015-04-27 12:06:58 -07001823 std::wstring wstrValue = valEvent.c_str();
Tom Sepezf4ef3f92015-04-23 11:31:31 -07001824
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001825 if (pEvent->WillCommit())
1826 {
1827 if (wstrValue.empty())
1828 return TRUE;
1829 int iIndexMask = 0;
1830 for (std::wstring::iterator it = wstrValue.begin(); it != wstrValue.end(); it++)
1831 {
1832 wchar_t w_Value = *it;
Tom Sepezf4ef3f92015-04-23 11:31:31 -07001833 if (!maskSatisfied(w_Value,wstrMask[iIndexMask]))
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001834 break;
1835 iIndexMask++;
1836 }
1837
1838 if (iIndexMask != wstrMask.GetLength() || (iIndexMask != wstrValue.size() && wstrMask.GetLength() != 0))
1839 {
Tom Sepez4f7bc042015-04-27 12:06:58 -07001840 Alert(pContext, JSGetStringFromID(pContext, IDS_STRING_JSAFNUMBER_KEYSTROKE).c_str());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001841 pEvent->Rc() = FALSE;
1842 }
1843 return TRUE;
1844 }
1845
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001846 CFX_WideString &wideChange = pEvent->Change();
Tom Sepez4f7bc042015-04-27 12:06:58 -07001847 std::wstring wChange = wideChange.c_str();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001848 if (wChange.empty())
1849 return TRUE;
Tom Sepezf4ef3f92015-04-23 11:31:31 -07001850
1851 int iIndexMask = pEvent->SelStart();
1852
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001853 if (wstrValue.length() - (pEvent->SelEnd()-pEvent->SelStart()) + wChange.length() > (FX_DWORD)wstrMask.GetLength())
1854 {
Tom Sepez4f7bc042015-04-27 12:06:58 -07001855 Alert(pContext, JSGetStringFromID(pContext, IDS_STRING_JSPARAM_TOOLONG).c_str());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001856 pEvent->Rc() = FALSE;
1857 return TRUE;
1858 }
Tom Sepezf4ef3f92015-04-23 11:31:31 -07001859
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001860 if (iIndexMask >= wstrMask.GetLength() && (!wChange.empty()))
1861 {
Tom Sepez4f7bc042015-04-27 12:06:58 -07001862 Alert(pContext, JSGetStringFromID(pContext, IDS_STRING_JSPARAM_TOOLONG).c_str());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001863 pEvent->Rc() = FALSE;
1864 return TRUE;
1865 }
Tom Sepezf4ef3f92015-04-23 11:31:31 -07001866
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001867 for (std::wstring::iterator it = wChange.begin(); it != wChange.end(); it++)
1868 {
1869 if (iIndexMask >= wstrMask.GetLength())
1870 {
Tom Sepez4f7bc042015-04-27 12:06:58 -07001871 Alert(pContext, JSGetStringFromID(pContext, IDS_STRING_JSPARAM_TOOLONG).c_str());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001872 pEvent->Rc() = FALSE;
1873 return TRUE;
1874 }
1875 wchar_t w_Mask = wstrMask[iIndexMask];
1876 if (!isReservedMaskChar(w_Mask))
1877 {
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001878 *it = w_Mask;
1879 }
1880 wchar_t w_Change = *it;
Tom Sepezf4ef3f92015-04-23 11:31:31 -07001881 if (!maskSatisfied(w_Change,w_Mask))
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001882 {
1883 pEvent->Rc() = FALSE;
1884 return TRUE;
1885 }
1886 iIndexMask++;
1887 }
Tom Sepezf4ef3f92015-04-23 11:31:31 -07001888
1889 wideChange = wChange.c_str();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001890 return TRUE;
1891}
1892
1893
1894//function AFSpecial_Keystroke(psf)
Tom Sepez2f3dfef2015-03-02 15:35:26 -08001895FX_BOOL CJS_PublicMethods::AFSpecial_Keystroke(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001896{
1897 v8::Isolate* isolate = ::GetIsolate(cc);
1898
1899 CJS_Context* pContext = (CJS_Context *)cc;
1900 ASSERT(pContext != NULL);
1901 CJS_EventHandler* pEvent = pContext->GetEventHandler();
1902 ASSERT(pEvent != NULL);
1903
1904 if (params.size() != 1)
1905 {
1906 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
1907 return FALSE;
1908 }
1909
1910 std::string cFormat;
Tom Sepezf4ef3f92015-04-23 11:31:31 -07001911 int iIndex = params[0].ToInt();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001912
1913 if(!pEvent->m_pValue)
1914 return FALSE;
1915 //CJS_Value val = pEvent->Value();
1916 CFX_WideString& val = pEvent->Value();
Bo Xuc6164832014-12-30 16:56:12 -08001917 std::string strSrc = CFX_ByteString::FromUnicode(val).c_str();
Tom Sepez4f7bc042015-04-27 12:06:58 -07001918 std::wstring wstrChange = pEvent->Change().c_str();
1919
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001920 switch (iIndex)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001921 {
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001922 case 0:
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001923 cFormat = "99999";
1924 break;
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001925 case 1:
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001926 //cFormat = "99999-9999";
1927 cFormat = "999999999";
1928 break;
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001929 case 2:
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001930 {
1931 std::string NumberStr;
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001932 util::printx("9999999999", strSrc,NumberStr);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001933 if (strSrc.length() + wstrChange.length() > 7 )
1934 //cFormat = "(999) 999-9999";
1935 cFormat = "9999999999";
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001936 else
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001937 //cFormat = "999-9999";
1938 cFormat = "9999999";
1939 break;
1940 }
1941 case 3:
1942 //cFormat = "999-99-9999";
1943 cFormat = "999999999";
1944 break;
1945 }
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001946
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001947 CJS_Parameters params2;
1948 CJS_Value vMask(isolate, cFormat.c_str());
1949 params2.push_back(vMask);
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07001950
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001951 return AFSpecial_KeystrokeEx(cc,params2,vRet,sError);
1952}
1953
Tom Sepez2f3dfef2015-03-02 15:35:26 -08001954FX_BOOL CJS_PublicMethods::AFMergeChange(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001955{
1956 CJS_Context* pContext = (CJS_Context *)cc;
1957 ASSERT(pContext != NULL);
1958 CJS_EventHandler* pEventHandler = pContext->GetEventHandler();
1959 ASSERT(pEventHandler != NULL);
1960
1961 if (params.size() != 1)
1962 {
1963 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
1964 return FALSE;
1965 }
1966
1967 CFX_WideString swValue;
1968 if (pEventHandler->m_pValue != NULL)
1969 swValue = pEventHandler->Value();
1970
1971 if (pEventHandler->WillCommit())
1972 {
Tom Sepez4f7bc042015-04-27 12:06:58 -07001973 vRet = swValue.c_str();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001974 return TRUE;
1975 }
1976
1977 CFX_WideString prefix,postfix;
1978
1979 if (pEventHandler->SelStart() >= 0)
1980 prefix = swValue.Mid(0,pEventHandler->SelStart());
1981 else
1982 prefix = L"";
1983
1984
1985 if (pEventHandler->SelEnd() >= 0 && pEventHandler->SelEnd() <= swValue.GetLength())
1986 postfix = swValue.Mid(pEventHandler->SelEnd(), swValue.GetLength() - pEventHandler->SelEnd());
1987 else postfix = L"";
1988
Tom Sepez4f7bc042015-04-27 12:06:58 -07001989 vRet = (prefix + pEventHandler->Change() + postfix).c_str();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001990
1991 return TRUE;
1992}
1993
Tom Sepez2f3dfef2015-03-02 15:35:26 -08001994FX_BOOL CJS_PublicMethods::AFParseDateEx(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001995{
1996 CJS_Context* pContext = (CJS_Context *)cc;
1997 ASSERT(pContext != NULL);
1998
1999 if (params.size() != 2)
2000 {
2001 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
2002 return FALSE;
2003 }
2004
Tom Sepezf4ef3f92015-04-23 11:31:31 -07002005 CFX_WideString sValue = params[0].ToCFXWideString();
2006 CFX_WideString sFormat = params[1].ToCFXWideString();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002007
2008 FX_BOOL bWrongFormat = FALSE;
2009 double dDate = MakeRegularDate(sValue,sFormat,bWrongFormat);
2010
2011 if (JS_PortIsNan(dDate))
2012 {
2013 CFX_WideString swMsg;
Tom Sepez4f7bc042015-04-27 12:06:58 -07002014 swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSPARSEDATE).c_str(), sFormat.c_str());
2015 Alert((CJS_Context *)cc, swMsg.c_str());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002016 return FALSE;
2017 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002018
Tom Sepezf4ef3f92015-04-23 11:31:31 -07002019 vRet = dDate;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002020 return TRUE;
2021}
2022
Tom Sepez2f3dfef2015-03-02 15:35:26 -08002023FX_BOOL CJS_PublicMethods::AFSimple(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002024{
2025 if (params.size() != 3)
2026 {
2027 CJS_Context* pContext = (CJS_Context *)cc;
2028 ASSERT(pContext != NULL);
2029
2030 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
2031 return FALSE;
2032 }
2033
Tom Sepez4f7bc042015-04-27 12:06:58 -07002034 vRet = (double)AF_Simple(params[0].ToCFXWideString().c_str(), params[1].ToDouble(), params[2].ToDouble());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002035 return TRUE;
2036}
2037
Tom Sepez2f3dfef2015-03-02 15:35:26 -08002038FX_BOOL CJS_PublicMethods::AFMakeNumber(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002039{
2040 if (params.size() != 1)
2041 {
2042 CJS_Context* pContext = (CJS_Context *)cc;
2043 ASSERT(pContext != NULL);
2044
2045 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
2046 return FALSE;
2047 }
Tom Sepez4f7bc042015-04-27 12:06:58 -07002048 vRet = ParseStringToNumber(params[0].ToCFXWideString().c_str());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002049 return TRUE;
2050}
2051
Tom Sepez2f3dfef2015-03-02 15:35:26 -08002052FX_BOOL CJS_PublicMethods::AFSimple_Calculate(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002053{
2054 v8::Isolate* isolate = ::GetIsolate(cc);
2055
2056 CJS_Context* pContext = (CJS_Context *)cc;
2057 ASSERT(pContext != NULL);
2058
2059 if (params.size() != 2)
2060 {
2061 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
2062 return FALSE;
2063 }
2064
2065 CJS_Value params1 = params[1];
2066
2067 if (!params1.IsArrayObject() && params1.GetType() != VT_string)
2068 {
2069 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
2070 return FALSE;
2071 }
Tom Sepezf4ef3f92015-04-23 11:31:31 -07002072
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002073 CPDFSDK_Document* pReaderDoc = pContext->GetReaderDocument();
2074 ASSERT(pReaderDoc != NULL);
2075
2076 CPDFSDK_InterForm* pReaderInterForm = pReaderDoc->GetInterForm();
2077 ASSERT(pReaderInterForm != NULL);
2078
2079 CPDF_InterForm* pInterForm = pReaderInterForm->GetInterForm();
2080 ASSERT(pInterForm != NULL);
2081
2082 double dValue;
Tom Sepezf4ef3f92015-04-23 11:31:31 -07002083 CFX_WideString sFunction = params[0].ToCFXWideString();
Tom Sepez4f7bc042015-04-27 12:06:58 -07002084 if (wcscmp(sFunction.c_str(), L"PRD") == 0)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002085 dValue = 1.0;
2086 else
2087 dValue = 0.0;
2088
2089 CJS_Array FieldNameArray = AF_MakeArrayFromList(isolate,params1);
2090
2091 int nFieldsCount = 0;
2092
2093 for (int i=0,isz=FieldNameArray.GetLength(); i<isz; i++)
2094 {
2095 CJS_Value jsValue(isolate);
2096 FieldNameArray.GetElement(i,jsValue);
Tom Sepezf4ef3f92015-04-23 11:31:31 -07002097 CFX_WideString wsFieldName = jsValue.ToCFXWideString();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002098
2099 for (int j=0,jsz=pInterForm->CountFields(wsFieldName); j<jsz; j++)
2100 {
2101 if (CPDF_FormField* pFormField = pInterForm->GetField(j, wsFieldName))
2102 {
2103 double dTemp = 0.0;
2104
2105 switch (pFormField->GetFieldType())
2106 {
2107 case FIELDTYPE_TEXTFIELD:
2108 case FIELDTYPE_COMBOBOX:
2109 {
Tom Sepez4f7bc042015-04-27 12:06:58 -07002110 dTemp = ParseStringToNumber(pFormField->GetValue().c_str());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002111 break;
2112 }
2113 case FIELDTYPE_PUSHBUTTON:
2114 {
2115 dTemp = 0.0;
2116 break;
2117 }
2118 case FIELDTYPE_CHECKBOX:
2119 case FIELDTYPE_RADIOBUTTON:
2120 {
2121 dTemp = 0.0;
2122 for (int c=0,csz=pFormField->CountControls(); c<csz; c++)
2123 {
2124 if (CPDF_FormControl* pFormCtrl = pFormField->GetControl(c))
2125 {
2126 if (pFormCtrl->IsChecked())
2127 {
Tom Sepez4f7bc042015-04-27 12:06:58 -07002128 dTemp += ParseStringToNumber(pFormCtrl->GetExportValue().c_str());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002129 break;
2130 }
2131 else
2132 continue;
2133 }
2134 }
2135 break;
2136 }
2137 case FIELDTYPE_LISTBOX:
2138 {
2139 dTemp = 0.0;
2140 if (pFormField->CountSelectedItems() > 1)
2141 break;
2142 else
2143 {
Tom Sepez4f7bc042015-04-27 12:06:58 -07002144 dTemp = ParseStringToNumber(pFormField->GetValue().c_str());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002145 break;
2146 }
2147 }
2148 default:
2149 break;
2150 }
2151
Tom Sepez4f7bc042015-04-27 12:06:58 -07002152 if (i == 0 && j == 0 && (wcscmp(sFunction.c_str(), L"MIN") == 0 || wcscmp(sFunction.c_str(), L"MAX") == 0))
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002153 dValue = dTemp;
2154
Tom Sepez4f7bc042015-04-27 12:06:58 -07002155 dValue = AF_Simple(sFunction.c_str(), dValue, dTemp);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002156
2157 nFieldsCount++;
2158 }
2159 }
2160 }
2161
Tom Sepez4f7bc042015-04-27 12:06:58 -07002162 if (wcscmp(sFunction.c_str(), L"AVG") == 0 && nFieldsCount > 0)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002163 dValue /= nFieldsCount;
2164
2165 dValue = (double)floor(dValue * FXSYS_pow((double)10,(double)6) + 0.49) / FXSYS_pow((double)10,(double)6);
2166 CJS_Value jsValue(isolate,dValue);
2167 if((CJS_EventHandler*)pContext->GetEventHandler()->m_pValue)
Tom Sepezf4ef3f92015-04-23 11:31:31 -07002168 ((CJS_EventHandler*)pContext->GetEventHandler())->Value() = jsValue.ToCFXWideString();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002169
2170 return TRUE;
2171}
2172
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07002173/* This function validates the current event to ensure that its value is
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002174** within the specified range. */
2175
Tom Sepez2f3dfef2015-03-02 15:35:26 -08002176FX_BOOL CJS_PublicMethods::AFRange_Validate(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002177{
2178 CJS_Context* pContext = (CJS_Context *)cc;
2179 ASSERT(pContext != NULL);
2180 CJS_EventHandler* pEvent = pContext->GetEventHandler();
2181 ASSERT(pEvent != NULL);
2182
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07002183 if (params.size() != 4)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002184 {
2185 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
2186 return FALSE;
2187 }
2188
2189 if(!pEvent->m_pValue)
2190 return FALSE;
2191 if (pEvent->Value().IsEmpty() )
2192 return TRUE;
2193 double dEentValue = atof(CFX_ByteString::FromUnicode(pEvent->Value()));
Tom Sepezf4ef3f92015-04-23 11:31:31 -07002194 FX_BOOL bGreaterThan = params[0].ToBool();
2195 double dGreaterThan = params[1].ToDouble();
2196 FX_BOOL bLessThan = params[2].ToBool();
2197 double dLessThan = params[3].ToDouble();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002198 CFX_WideString swMsg;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002199
2200 if (bGreaterThan && bLessThan)
2201 {
2202 if (dEentValue < dGreaterThan || dEentValue > dLessThan)
Tom Sepez4f7bc042015-04-27 12:06:58 -07002203 swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE1).c_str(),
Tom Sepezf4ef3f92015-04-23 11:31:31 -07002204 params[1].ToCFXWideString().c_str(),
2205 params[3].ToCFXWideString().c_str());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002206 }
2207 else if (bGreaterThan)
2208 {
2209 if (dEentValue < dGreaterThan)
Tom Sepez4f7bc042015-04-27 12:06:58 -07002210 swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE2).c_str(),
Tom Sepezf4ef3f92015-04-23 11:31:31 -07002211 params[1].ToCFXWideString().c_str());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002212 }
2213 else if (bLessThan)
2214 {
2215 if (dEentValue > dLessThan)
Tom Sepez4f7bc042015-04-27 12:06:58 -07002216 swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE3).c_str(),
Tom Sepezf4ef3f92015-04-23 11:31:31 -07002217 params[3].ToCFXWideString().c_str());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002218 }
2219
2220 if (!swMsg.IsEmpty())
2221 {
Tom Sepez4f7bc042015-04-27 12:06:58 -07002222 Alert(pContext, swMsg.c_str());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002223 pEvent->Rc() = FALSE;
2224 }
2225 return TRUE;
2226}
2227
Tom Sepez2f3dfef2015-03-02 15:35:26 -08002228FX_BOOL CJS_PublicMethods::AFExtractNums(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002229{
2230 v8::Isolate* isolate = ::GetIsolate(cc);
2231 CJS_Context* pContext = (CJS_Context*)cc;
2232 ASSERT(pContext != NULL);
2233
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07002234 if (params.size() != 1)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002235 {
2236 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
2237 return FALSE;
2238 }
2239
2240 CJS_Array nums(isolate);
2241
Tom Sepezf4ef3f92015-04-23 11:31:31 -07002242 CFX_WideString str = params[0].ToCFXWideString();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002243 CFX_WideString sPart;
2244
2245 if (str.GetAt(0) == L'.' || str.GetAt(0) == L',')
2246 str = L"0" + str;
2247
2248 int nIndex = 0;
2249 for (int i=0, sz=str.GetLength(); i<sz; i++)
2250 {
2251 FX_WCHAR wc = str.GetAt(i);
2252 if (IsDigit((wchar_t)wc))
2253 {
2254 sPart += wc;
2255 }
2256 else
2257 {
2258 if (sPart.GetLength() > 0)
2259 {
Bruce Dawson0a476d22014-12-23 12:21:02 -08002260 nums.SetElement(nIndex,CJS_Value(isolate,sPart.c_str()));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002261 sPart = L"";
2262 nIndex ++;
2263 }
2264 }
2265 }
2266
2267 if (sPart.GetLength() > 0)
2268 {
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07002269 nums.SetElement(nIndex,CJS_Value(isolate,sPart.c_str()));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002270 }
2271
2272 if (nums.GetLength() > 0)
2273 vRet = nums;
2274 else
2275 vRet.SetNull();
2276
2277 return TRUE;
2278}