• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // 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.
4 
5 // 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 
GetIsolate(IFXJS_Context * cc)22 static 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 
38 BEGIN_JS_STATIC_GLOBAL_FUN(CJS_PublicMethods)
39 	JS_STATIC_GLOBAL_FUN_ENTRY(AFNumber_Format,6)
40 	JS_STATIC_GLOBAL_FUN_ENTRY(AFNumber_Keystroke,6)
41 	JS_STATIC_GLOBAL_FUN_ENTRY(AFPercent_Format,2)
42 	JS_STATIC_GLOBAL_FUN_ENTRY(AFPercent_Keystroke,2)
43 	JS_STATIC_GLOBAL_FUN_ENTRY(AFDate_FormatEx,1)
44 	JS_STATIC_GLOBAL_FUN_ENTRY(AFDate_KeystrokeEx,1)
45 	JS_STATIC_GLOBAL_FUN_ENTRY(AFDate_Format,1)
46 	JS_STATIC_GLOBAL_FUN_ENTRY(AFDate_Keystroke,1)
47 	JS_STATIC_GLOBAL_FUN_ENTRY(AFTime_FormatEx,1)
48 	JS_STATIC_GLOBAL_FUN_ENTRY(AFTime_KeystrokeEx,1)
49 	JS_STATIC_GLOBAL_FUN_ENTRY(AFTime_Format,1)
50 	JS_STATIC_GLOBAL_FUN_ENTRY(AFTime_Keystroke,1)
51 	JS_STATIC_GLOBAL_FUN_ENTRY(AFSpecial_Format,1)
52 	JS_STATIC_GLOBAL_FUN_ENTRY(AFSpecial_Keystroke,1)
53 	JS_STATIC_GLOBAL_FUN_ENTRY(AFSpecial_KeystrokeEx,1)
54 	JS_STATIC_GLOBAL_FUN_ENTRY(AFSimple,3)
55 	JS_STATIC_GLOBAL_FUN_ENTRY(AFMakeNumber,1)
56 	JS_STATIC_GLOBAL_FUN_ENTRY(AFSimple_Calculate,2)
57 	JS_STATIC_GLOBAL_FUN_ENTRY(AFRange_Validate,4)
58 	JS_STATIC_GLOBAL_FUN_ENTRY(AFMergeChange,1)
59 	JS_STATIC_GLOBAL_FUN_ENTRY(AFParseDateEx,2)
60 	JS_STATIC_GLOBAL_FUN_ENTRY(AFExtractNums,1)
61 END_JS_STATIC_GLOBAL_FUN()
62 
63 IMPLEMENT_JS_STATIC_GLOBAL_FUN(CJS_PublicMethods)
64 
65 struct stru_TbConvert
66 {
67 	FX_LPCSTR lpszJSMark;
68 	FX_LPCSTR lpszCppMark;
69 };
70 
71 static const stru_TbConvert fcTable[] = {"mmmm","%B",
72 	"mmm", "%b",
73 	"mm",  "%m",
74 	//"m"
75 	"dddd","%A",
76 	"ddd", "%a",
77 	"dd",  "%d",
78 	//"d",   "%w",
79 	"yyyy","%Y",
80 	"yy",  "%y",
81 	"HH",  "%H",
82 	//"H"
83 	"hh",  "%I",
84 	//"h"
85 	"MM",  "%M",
86 	//"M"
87 	"ss",  "%S",
88 	//"s
89 	"tt",  "%p"
90 	//"t"
91 };
92 
93 static FX_LPCWSTR months[] =
94 {
95 	(FX_LPCWSTR)L"Jan", (FX_LPCWSTR)L"Feb", (FX_LPCWSTR)L"Mar", (FX_LPCWSTR)L"Apr", (FX_LPCWSTR)L"May", (FX_LPCWSTR)L"Jun", (FX_LPCWSTR)L"Jul", (FX_LPCWSTR)L"Aug", (FX_LPCWSTR)L"Sep", (FX_LPCWSTR)L"Oct", (FX_LPCWSTR)L"Nov", (FX_LPCWSTR)L"Dec"
96 };
97 
98 static FX_LPCWSTR fullmonths[] =
99 {
100 	(FX_LPCWSTR)L"January", (FX_LPCWSTR)L"February", (FX_LPCWSTR)L"March", (FX_LPCWSTR)L"April", (FX_LPCWSTR)L"May", (FX_LPCWSTR)L"June", (FX_LPCWSTR)L"July", (FX_LPCWSTR)L"August", (FX_LPCWSTR)L"September", (FX_LPCWSTR)L"October", (FX_LPCWSTR)L"November", (FX_LPCWSTR)L"December"
101 };
102 
IsNumber(FX_LPCWSTR string)103 FX_BOOL CJS_PublicMethods::IsNumber(FX_LPCWSTR string)
104 {
105 	CFX_WideString sTrim = StrTrim(string);
106 	FX_LPCWSTR pTrim = sTrim;
107 	FX_LPCWSTR p = pTrim;
108 
109 
110 	FX_BOOL bDot = FALSE;
111 	FX_BOOL bKXJS = FALSE;
112 
113 	wchar_t c;
114 	while ((c = *p))
115 	{
116 		if (c == '.' || c == ',')
117 		{
118 			if (bDot) return FALSE;
119 			bDot = TRUE;
120 		}
121 		else if (c == '-' || c == '+')
122 		{
123 			if (p != pTrim)
124 				return FALSE;
125 		}
126 		else if (c == 'e' || c == 'E')
127 		{
128 			if (bKXJS) return FALSE;
129 
130 			p++;
131 			c = *p;
132 			if (c == '+' || c == '-')
133 			{
134 				bKXJS = TRUE;
135 			}
136 			else
137 			{
138 				return FALSE;
139 			}
140 		}
141 		else if (!IsDigit(c))
142 		{
143 			return FALSE;
144 		}
145 		p++;
146 	}
147 
148 	return TRUE;
149 }
150 
IsDigit(wchar_t ch)151 FX_BOOL CJS_PublicMethods::IsDigit(wchar_t ch)
152 {
153 	return (ch >= L'0' && ch <= L'9');
154 }
155 
IsDigit(char ch)156 FX_BOOL CJS_PublicMethods::IsDigit(char ch)
157 {
158 	return (ch >= '0' && ch <= '9');
159 }
160 
IsAlphabetic(wchar_t ch)161 FX_BOOL CJS_PublicMethods::IsAlphabetic(wchar_t ch)
162 {
163 	return ((ch >= L'a' && ch <= L'z') || (ch >= L'A' && ch <= L'Z'));
164 }
165 
IsAlphaNumeric(wchar_t ch)166 FX_BOOL CJS_PublicMethods::IsAlphaNumeric(wchar_t ch)
167 {
168 	return (IsDigit(ch) || IsAlphabetic(ch));
169 }
170 
maskSatisfied(wchar_t c_Change,wchar_t c_Mask)171 FX_BOOL CJS_PublicMethods::maskSatisfied(wchar_t c_Change,wchar_t c_Mask)
172 {
173 	switch (c_Mask)
174 	{
175 	case L'9':
176         return IsDigit(c_Change);
177     case L'A':
178         return IsAlphabetic(c_Change);
179     case L'O':
180         return IsAlphaNumeric(c_Change);
181     case L'X':
182         return TRUE;
183 	default:
184         return (c_Change == c_Mask);
185 	}
186 }
187 
isReservedMaskChar(wchar_t ch)188 FX_BOOL CJS_PublicMethods::isReservedMaskChar(wchar_t ch)
189 {
190 	return ch == L'9' || ch == L'A' || ch == L'O' || ch == L'X';
191 }
192 
AF_Simple(FX_LPCWSTR sFuction,double dValue1,double dValue2)193 double CJS_PublicMethods::AF_Simple(FX_LPCWSTR sFuction, double dValue1, double dValue2)
194 {
195 	if (FXSYS_wcsicmp(sFuction,(FX_LPCWSTR)L"AVG") == 0 || FXSYS_wcsicmp(sFuction,(FX_LPCWSTR)L"SUM") == 0)
196 	{
197 		return dValue1 + dValue2;
198 	}
199 	else if (FXSYS_wcsicmp(sFuction, (FX_LPCWSTR)L"PRD") == 0)
200 	{
201 		return dValue1 * dValue2;
202 	}
203 	else if (FXSYS_wcsicmp(sFuction,(FX_LPCWSTR)L"MIN") == 0)
204 	{
205 		return FX_MIN(dValue1, dValue2);
206 	}
207 	else if (FXSYS_wcsicmp(sFuction,(FX_LPCWSTR)L"MAX") == 0)
208 	{
209 		return FX_MAX(dValue1, dValue2);
210 	}
211 
212 	return dValue1;
213 }
214 
StrLTrim(FX_LPCWSTR pStr)215 CFX_WideString CJS_PublicMethods::StrLTrim(FX_LPCWSTR pStr)
216 {
217 	while (*pStr && *pStr == L' ') pStr++;
218 
219 	return pStr;
220 }
221 
StrRTrim(FX_LPCWSTR pStr)222 CFX_WideString CJS_PublicMethods::StrRTrim(FX_LPCWSTR pStr)
223 {
224 	FX_LPCWSTR p = pStr;
225 
226 	while (*p) p++;
227 	p--;
228 	if (p >= pStr)
229 	{
230 		while (*p && *p == L' ') p--;
231 		p++;
232 		return CFX_WideString(pStr,p-pStr);
233 	}
234 	return L"";
235 }
236 
StrTrim(FX_LPCWSTR pStr)237 CFX_WideString CJS_PublicMethods::StrTrim(FX_LPCWSTR pStr)
238 {
239 	return StrRTrim(StrLTrim(pStr));
240 }
241 
StrLTrim(FX_LPCSTR pStr)242 CFX_ByteString CJS_PublicMethods::StrLTrim(FX_LPCSTR pStr)
243 {
244 	while (*pStr && *pStr == ' ') pStr++;
245 
246     return pStr;
247 }
248 
StrRTrim(FX_LPCSTR pStr)249 CFX_ByteString CJS_PublicMethods::StrRTrim(FX_LPCSTR pStr)
250 {
251 	FX_LPCSTR p = pStr;
252 
253 	while (*p) p++;
254 	p--;
255 	if (p >= pStr)
256 	{
257 		while (*p && *p == ' ') p--;
258 		p++;
259 		return CFX_ByteString(pStr,p-pStr);
260 	}
261 	return "";
262 }
263 
StrTrim(FX_LPCSTR pStr)264 CFX_ByteString CJS_PublicMethods::StrTrim(FX_LPCSTR pStr)
265 {
266 	return StrRTrim(StrLTrim(pStr));
267 }
268 
ParseNumber(FX_LPCWSTR swSource,FX_BOOL & bAllDigits,FX_BOOL & bDot,FX_BOOL & bSign,FX_BOOL & bKXJS)269 double CJS_PublicMethods::ParseNumber(FX_LPCWSTR swSource, FX_BOOL& bAllDigits, FX_BOOL& bDot, FX_BOOL& bSign, FX_BOOL& bKXJS)
270 {
271 	bDot = FALSE;
272 	bSign = FALSE;
273 	bKXJS = FALSE;
274 
275 	FX_BOOL bDigitExist = FALSE;
276 
277 	FX_LPCWSTR p = swSource;
278 	wchar_t c;
279 
280 	FX_LPCWSTR pStart = NULL;
281 	FX_LPCWSTR pEnd = NULL;
282 
283 	while ((c = *p))
284 	{
285 		if (!pStart && c != L' ')
286 		{
287 			pStart = p;
288 		}
289 
290 		pEnd = p;
291 		p++;
292 	}
293 
294 	if (!pStart)
295 	{
296 		bAllDigits = FALSE;
297 		return 0;
298 	}
299 
300 	while (pEnd != pStart)
301 	{
302 		if (*pEnd == L' ')
303 			pEnd --;
304 		else
305 			break;
306 	}
307 
308 	double dRet = 0;
309 	p = pStart;
310 	bAllDigits = TRUE;
311 	CFX_WideString swDigits;
312 
313 	while (p <= pEnd)
314 	{
315 		c = *p;
316 
317 		if (IsDigit(c))
318 		{
319 			swDigits += c;
320 			bDigitExist = TRUE;
321 		}
322 		else
323 		{
324 			switch (c)
325 			{
326 			case L' ':
327 				bAllDigits = FALSE;
328 				break;
329 			case L'.':
330 			case L',':
331 				if (!bDot)
332 				{
333 					if (bDigitExist)
334 					{
335 						swDigits += L'.';
336 					}
337 					else
338 					{
339 						swDigits += L'0';
340 						swDigits += L'.';
341 						bDigitExist = TRUE;
342 					}
343 
344 					bDot = TRUE;
345 					break;
346 				}
347 			case 'e':
348 			case 'E':
349 				if (!bKXJS)
350 				{
351 					p++;
352 					c = *p;
353 					if (c == '+' || c == '-')
354 					{
355 						bKXJS = TRUE;
356 						swDigits += 'e';
357 						swDigits += c;
358 					}
359 					break;
360 				}
361 			case L'-':
362 				if (!bDigitExist && !bSign)
363 				{
364 					swDigits += c;
365 					bSign = TRUE;
366 					break;
367 				}
368 			default:
369 				bAllDigits = FALSE;
370 
371 				if (p != pStart && !bDot && bDigitExist)
372 				{
373 					swDigits += L'.';
374 					bDot = TRUE;
375 				}
376 				else
377 				{
378 					bDot = FALSE;
379 					bDigitExist = FALSE;
380 					swDigits = L"";
381 				}
382 				break;
383 			}
384 		}
385 
386 		p++;
387 	}
388 
389 	if (swDigits.GetLength() > 0 && swDigits.GetLength() < 17)
390 	{
391 		CFX_ByteString sDigits = swDigits.UTF8Encode();
392 
393 		if (bKXJS)
394 		{
395 			dRet = atof(sDigits);
396 		}
397 		else
398 		{
399 			if (bDot)
400 			{
401 				char* pStopString;
402 				dRet = ::strtod(sDigits, &pStopString);
403 			}
404 			else
405 			{
406 				dRet = atol(sDigits);
407 			}
408 		}
409 
410 	}
411 
412 	return dRet;
413 }
414 
ParseStringToNumber(FX_LPCWSTR swSource)415 double CJS_PublicMethods::ParseStringToNumber(FX_LPCWSTR swSource)
416 {
417 	FX_BOOL bAllDigits = FALSE;
418 	FX_BOOL bDot = FALSE;
419 	FX_BOOL bSign = FALSE;
420 	FX_BOOL bKXJS = FALSE;
421 
422 	return ParseNumber(swSource, bAllDigits, bDot, bSign, bKXJS);
423 }
424 
ConvertStringToNumber(FX_LPCWSTR swSource,double & dRet,FX_BOOL & bDot)425 FX_BOOL	CJS_PublicMethods::ConvertStringToNumber(FX_LPCWSTR swSource, double & dRet, FX_BOOL & bDot)
426 {
427 	FX_BOOL bAllDigits = FALSE;
428 	FX_BOOL bSign = FALSE;
429 	FX_BOOL bKXJS = FALSE;
430 
431 	dRet = ParseNumber(swSource, bAllDigits, bDot, bSign, bKXJS);
432 
433 	return bAllDigits;
434 }
435 
AF_MakeArrayFromList(v8::Isolate * isolate,CJS_Value val)436 CJS_Array CJS_PublicMethods::AF_MakeArrayFromList(v8::Isolate* isolate, CJS_Value val)
437 {
438 	CJS_Array StrArray(isolate);
439 	if(val.IsArrayObject())
440 	{
441 		val.ConvertToArray(StrArray);
442 		return StrArray;
443 	}
444 	CFX_WideString wsStr = val.operator CFX_WideString();
445 	CFX_ByteString t = CFX_ByteString::FromUnicode(wsStr);
446 	const char * p = (const char *)t;
447 
448 
449 	int ch = ',' ;
450 	int nIndex = 0;
451 
452 	while (*p)
453 	{
454 		const char * pTemp = strchr(p, ch);
455 		if (pTemp == NULL)
456 		{
457 			StrArray.SetElement(nIndex, CJS_Value(isolate,(FX_LPCSTR)StrTrim(p)));
458 			break;
459 		}
460 		else
461 		{
462 			char * pSub = new char[pTemp - p + 1];
463 			strncpy(pSub, p, pTemp - p);
464 			*(pSub + (pTemp - p)) = '\0';
465 
466 			StrArray.SetElement(nIndex, CJS_Value(isolate,(FX_LPCSTR)StrTrim(pSub)));
467 			delete []pSub;
468 
469 			nIndex ++;
470 			p = ++pTemp;
471 		}
472 
473 	}
474 	return StrArray;
475 }
476 
ParseStringInteger(const CFX_WideString & string,int nStart,int & nSkip,int nMaxStep)477 int CJS_PublicMethods::ParseStringInteger(const CFX_WideString& string,int nStart,int& nSkip, int nMaxStep)
478 {
479 	int nRet = 0;
480 	nSkip = 0;
481 	for (int i=nStart, sz=string.GetLength(); i < sz; i++)
482 	{
483 		if (i-nStart > 10)
484 			break;
485 
486 		FX_WCHAR c = string.GetAt(i);
487 		if (IsDigit((wchar_t)c))
488 		{
489 			nRet = nRet * 10 + (c - '0');
490 			nSkip = i - nStart + 1;
491 			if (nSkip >= nMaxStep)
492 				break;
493 		}
494 		else
495 			break;
496 	}
497 
498 	return nRet;
499 }
500 
ParseStringString(const CFX_WideString & string,int nStart,int & nSkip)501 CFX_WideString CJS_PublicMethods::ParseStringString(const CFX_WideString& string, int nStart, int& nSkip)
502 {
503 	CFX_WideString swRet;
504 	nSkip = 0;
505 	for (int i=nStart, sz=string.GetLength(); i < sz; i++)
506 	{
507 		FX_WCHAR c = string.GetAt(i);
508 		if ((c >= L'a' && c <= L'z') || (c >= L'A' && c <= L'Z'))
509 		{
510 			swRet += c;
511 			nSkip = i - nStart + 1;
512 		}
513 		else
514 			break;
515 	}
516 
517 	return swRet;
518 }
519 
ParseNormalDate(const CFX_WideString & value,FX_BOOL & bWrongFormat)520 double CJS_PublicMethods::ParseNormalDate(const CFX_WideString & value, FX_BOOL& bWrongFormat)
521 {
522 	double dt = JS_GetDateTime();
523 
524 	int nYear = JS_GetYearFromTime(dt);
525 	int nMonth = JS_GetMonthFromTime(dt) + 1;
526 	int nDay = JS_GetDayFromTime(dt);
527 	int nHour = JS_GetHourFromTime(dt);
528 	int nMin = JS_GetMinFromTime(dt);
529 	int nSec = JS_GetSecFromTime(dt);
530 
531 	int number[3];
532 
533 	int nSkip = 0;
534 	int nLen = value.GetLength();
535 	int nIndex = 0;
536 	int i = 0;
537 	while (i < nLen)
538 	{
539 		if (nIndex > 2) break;
540 
541 		FX_WCHAR c = value.GetAt(i);
542 		if (IsDigit((wchar_t)c))
543 		{
544 			number[nIndex++] = ParseStringInteger(value, i, nSkip, 4);
545 			i += nSkip;
546 		}
547 		else
548 		{
549 			i ++;
550 		}
551 	}
552 
553 	if (nIndex == 2)
554 	{
555 		// case2: month/day
556 		// case3: day/month
557 		if ((number[0] >= 1 && number[0] <= 12) && (number[1] >= 1 && number[1] <= 31))
558 		{
559 			nMonth = number[0];
560 			nDay = number[1];
561 		}
562 		else if ((number[0] >= 1 && number[0] <= 31) && (number[1] >= 1 && number[1] <= 12))
563 		{
564 			nDay = number[0];
565 			nMonth = number[1];
566 		}
567 
568 		bWrongFormat = FALSE;
569 	}
570 	else if (nIndex == 3)
571 	{
572 		// case1: year/month/day
573 		// case2: month/day/year
574 		// case3: day/month/year
575 
576 		if (number[0] > 12 && (number[1] >= 1 && number[1] <= 12) && (number[2] >= 1 && number[2] <= 31))
577 		{
578 			nYear = number[0];
579 			nMonth = number[1];
580 			nDay = number[2];
581 		}
582 		else if ((number[0] >= 1 && number[0] <= 12) && (number[1] >= 1 && number[1] <= 31) && number[2] > 31)
583 		{
584 			nMonth = number[0];
585 			nDay = number[1];
586 			nYear = number[2];
587 		}
588 		else if ((number[0] >= 1 && number[0] <= 31) && (number[1] >= 1 && number[1] <= 12) && number[2] > 31)
589 		{
590 			nDay = number[0];
591 			nMonth = number[1];
592 			nYear = number[2];
593 		}
594 
595 		bWrongFormat = FALSE;
596 	}
597 	else
598 	{
599 		bWrongFormat = TRUE;
600 		return dt;
601 	}
602 
603 	CFX_WideString swTemp;
604 	swTemp.Format((FX_LPCWSTR)L"%d/%d/%d %d:%d:%d",nMonth,nDay,nYear,nHour,nMin,nSec);
605 	return JS_DateParse(swTemp);
606 }
607 
MakeRegularDate(const CFX_WideString & value,const CFX_WideString & format,FX_BOOL & bWrongFormat)608 double CJS_PublicMethods::MakeRegularDate(const CFX_WideString & value, const CFX_WideString & format, FX_BOOL& bWrongFormat)
609 {
610 	double dt = JS_GetDateTime();
611 
612 	if (format.IsEmpty() || value.IsEmpty())
613 		return dt;
614 
615 	int nYear = JS_GetYearFromTime(dt);
616 	int nMonth = JS_GetMonthFromTime(dt) + 1;
617 	int nDay = JS_GetDayFromTime(dt);
618 	int nHour = JS_GetHourFromTime(dt);
619 	int nMin = JS_GetMinFromTime(dt);
620 	int nSec = JS_GetSecFromTime(dt);
621 
622 	int nYearSub = 99; //nYear - 2000;
623 
624 	FX_BOOL bPm = FALSE;
625 	FX_BOOL bExit = FALSE;
626 	bWrongFormat = FALSE;
627 
628 	int i=0;
629 	int j=0;
630 
631 	while (i < format.GetLength())
632 	{
633 		if (bExit) break;
634 
635 		FX_WCHAR c = format.GetAt(i);
636 		switch (c)
637 		{
638 			case ':':
639 			case '.':
640 			case '-':
641 			case '\\':
642 			case '/':
643 				i++;
644 				j++;
645 				break;
646 
647 			case 'y':
648 			case 'm':
649 			case 'd':
650 			case 'H':
651 			case 'h':
652 			case 'M':
653 			case 's':
654 			case 't':
655 				{
656 					int oldj = j;
657 					int nSkip = 0;
658 
659 					if (format.GetAt(i+1) != c)
660 					{
661 						switch (c)
662 						{
663 							case 'y':
664 								i++;
665 								j++;
666 								break;
667 							case 'm':
668 								nMonth = ParseStringInteger(value, j, nSkip, 2);
669 								i++;
670 								j += nSkip;
671 								break;
672 							case 'd':
673 								nDay = ParseStringInteger(value, j, nSkip, 2);
674 								i++;
675 								j += nSkip;
676 								break;
677 							case 'H':
678 								nHour = ParseStringInteger(value, j, nSkip, 2);
679 								i++;
680 								j += nSkip;
681 								break;
682 							case 'h':
683 								nHour = ParseStringInteger(value, j, nSkip, 2);
684 								i++;
685 								j += nSkip;
686 								break;
687 							case 'M':
688 								nMin = ParseStringInteger(value, j, nSkip, 2);
689 								i++;
690 								j += nSkip;
691 								break;
692 							case 's':
693 								nSec = ParseStringInteger(value, j, nSkip, 2);
694 								i++;
695 								j += nSkip;
696 								break;
697 							case 't':
698 								bPm = value.GetAt(i) == 'p';
699 								i++;
700 								j++;
701 								break;
702 						}
703 					}
704 					else if (format.GetAt(i+1) == c && format.GetAt(i+2) != c)
705 					{
706 						switch (c)
707 						{
708 							case 'y':
709 								nYear = ParseStringInteger(value, j, nSkip, 4);
710 								i += 2;
711 								j += nSkip;
712 								break;
713 							case 'm':
714 								nMonth = ParseStringInteger(value, j, nSkip, 2);
715 								i += 2;
716 								j += nSkip;
717 								break;
718 							case 'd':
719 								nDay = ParseStringInteger(value, j, nSkip, 2);
720 								i += 2;
721 								j += nSkip;
722 								break;
723 							case 'H':
724 								nHour = ParseStringInteger(value, j, nSkip, 2);
725 								i += 2;
726 								j += nSkip;
727 								break;
728 							case 'h':
729 								nHour = ParseStringInteger(value, j, nSkip, 2);
730 								i += 2;
731 								j += nSkip;
732 								break;
733 							case 'M':
734 								nMin = ParseStringInteger(value, j, nSkip, 2);
735 								i += 2;
736 								j += nSkip;
737 								break;
738 							case 's':
739 								nSec = ParseStringInteger(value, j, nSkip, 2);
740 								i += 2;
741 								j += nSkip;
742 								break;
743 							case 't':
744 								bPm = (value.GetAt(j) == 'p' && value.GetAt(j+1) == 'm');
745 								i += 2;
746 								j += 2;
747 								break;
748 						}
749 					}
750 					else if (format.GetAt(i+1) == c && format.GetAt(i+2) == c && format.GetAt(i+3) != c)
751 					{
752 						switch (c)
753 						{
754 							case 'm':
755 								{
756 									CFX_WideString sMonth = ParseStringString(value, j, nSkip);
757 									FX_BOOL bFind = FALSE;
758 									for (int m = 0; m < 12; m++)
759 									{
760 										if (sMonth.CompareNoCase(months[m]) == 0)
761 										{
762 											nMonth = m + 1;
763 											i+=3;
764 											j+=nSkip;
765 											bFind = TRUE;
766 											break;
767 										}
768 									}
769 
770 									if (!bFind)
771 									{
772 										nMonth = ParseStringInteger(value, j, nSkip, 3);
773 										i+=3;
774 										j += nSkip;
775 									}
776 								}
777 								break;
778 							case 'y':
779 								break;
780 							default:
781 								i+=3;
782 								j+=3;
783 								break;
784 						}
785 					}
786 					else if (format.GetAt(i+1) == c && format.GetAt(i+2) == c && format.GetAt(i+3) == c && format.GetAt(i+4) != c)
787 					{
788 						switch (c)
789 						{
790 
791 
792 							case 'y':
793 								nYear = ParseStringInteger(value, j, nSkip, 4);
794 								j += nSkip;
795 								i += 4;
796 								break;
797 							case 'm':
798 								{
799 									FX_BOOL bFind = FALSE;
800 
801 									CFX_WideString sMonth = ParseStringString(value, j, nSkip);
802 									sMonth.MakeLower();
803 
804 									for (int m = 0; m < 12; m++)
805 									{
806 										CFX_WideString sFullMonths = fullmonths[m];
807 										sFullMonths.MakeLower();
808 
809 										if (sFullMonths.Find(sMonth, 0) != -1)
810 										{
811 											nMonth = m + 1;
812 											i += 4;
813 											j += nSkip;
814 											bFind = TRUE;
815 											break;
816 										}
817 									}
818 
819 									if (!bFind)
820 									{
821 										nMonth = ParseStringInteger(value, j, nSkip, 4);
822 										i+=4;
823 										j += nSkip;
824 									}
825 								}
826 								break;
827 							default:
828 								i += 4;
829 								j += 4;
830 								break;
831 						}
832 					}
833 					else
834 					{
835 						if (format.GetAt(i) != value.GetAt(j))
836 						{
837 							bWrongFormat = TRUE;
838 							bExit = TRUE;
839 						}
840 						i++;
841 						j++;
842 					}
843 
844 					if (oldj == j)
845 					{
846 						bWrongFormat = TRUE;
847 						bExit = TRUE;
848 					}
849 				}
850 
851 				break;
852 			default:
853 				if (value.GetLength() <= j)
854 				{
855 					bExit = TRUE;
856 				}
857 				else if (format.GetAt(i) != value.GetAt(j))
858 				{
859 					bWrongFormat = TRUE;
860 					bExit = TRUE;
861 				}
862 
863 				i++;
864 				j++;
865 				break;
866 		}
867 	}
868 
869 	if (bPm) nHour += 12;
870 
871 	if (nYear >= 0 && nYear <= nYearSub)
872 		nYear += 2000;
873 
874 	if (nMonth < 1 || nMonth > 12)
875 		bWrongFormat = TRUE;
876 
877 	if (nDay < 1 || nDay > 31)
878 		bWrongFormat = TRUE;
879 
880 	if (nHour < 0 || nHour > 24)
881 		bWrongFormat = TRUE;
882 
883 	if (nMin < 0 || nMin > 60)
884 		bWrongFormat = TRUE;
885 
886 	if (nSec < 0 || nSec > 60)
887 		bWrongFormat = TRUE;
888 
889 	double dRet = 0;
890 
891 	if (bWrongFormat)
892 	{
893 		dRet = ParseNormalDate(value, bWrongFormat);
894 	}
895 	else
896 	{
897 		dRet = JS_MakeDate(JS_MakeDay(nYear,nMonth - 1,nDay),JS_MakeTime(nHour, nMin, nSec, 0));
898 
899 		if (JS_PortIsNan(dRet))
900 		{
901 			dRet = JS_DateParse(value);
902 		}
903 	}
904 
905 	if (JS_PortIsNan(dRet))
906 	{
907 		dRet = ParseNormalDate(value, bWrongFormat);
908 	}
909 
910 	return dRet;
911 
912 }
913 
MakeFormatDate(double dDate,const CFX_WideString & format)914 CFX_WideString CJS_PublicMethods::MakeFormatDate(double dDate, const CFX_WideString & format)
915 {
916 	CFX_WideString sRet = L"",sPart = L"";
917 
918 	int nYear = JS_GetYearFromTime(dDate);
919 	int nMonth = JS_GetMonthFromTime(dDate) + 1;
920 	int nDay = JS_GetDayFromTime(dDate);
921 	int nHour = JS_GetHourFromTime(dDate);
922 	int nMin = JS_GetMinFromTime(dDate);
923 	int nSec = JS_GetSecFromTime(dDate);
924 
925 	int i = 0;
926 	FX_WCHAR c;
927 	while (i < format.GetLength())
928 	{
929 		c = format.GetAt(i);
930 		sPart = L"";
931 		switch (c)
932 		{
933 			case 'y':
934 			case 'm':
935 			case 'd':
936 			case 'H':
937 			case 'h':
938 			case 'M':
939 			case 's':
940 			case 't':
941 				if (format.GetAt(i+1) != c)
942 				{
943 					switch (c)
944 					{
945 						case 'y':
946 							sPart += c;
947 							break;
948 						case 'm':
949 							sPart.Format((FX_LPCWSTR)L"%d",nMonth);
950 							break;
951 						case 'd':
952 							sPart.Format((FX_LPCWSTR)L"%d",nDay);
953 							break;
954 						case 'H':
955 							sPart.Format((FX_LPCWSTR)L"%d",nHour);
956 							break;
957 						case 'h':
958 							sPart.Format((FX_LPCWSTR)L"%d",nHour>12?nHour - 12:nHour);
959 							break;
960 						case 'M':
961 							sPart.Format((FX_LPCWSTR)L"%d",nMin);
962 							break;
963 						case 's':
964 							sPart.Format((FX_LPCWSTR)L"%d",nSec);
965 							break;
966 						case 't':
967 							sPart += nHour>12?'p':'a';
968 							break;
969 					}
970 					i++;
971 				}
972 				else if (format.GetAt(i+1) == c && format.GetAt(i+2) != c)
973 				{
974 					switch (c)
975 					{
976 						case 'y':
977 							sPart.Format((FX_LPCWSTR)L"%02d",nYear - (nYear / 100) * 100);
978 							break;
979 						case 'm':
980 							sPart.Format((FX_LPCWSTR)L"%02d",nMonth);
981 							break;
982 						case 'd':
983 							sPart.Format((FX_LPCWSTR)L"%02d",nDay);
984 							break;
985 						case 'H':
986 							sPart.Format((FX_LPCWSTR)L"%02d",nHour);
987 							break;
988 						case 'h':
989 							sPart.Format((FX_LPCWSTR)L"%02d",nHour>12?nHour - 12:nHour);
990 							break;
991 						case 'M':
992 							sPart.Format((FX_LPCWSTR)L"%02d",nMin);
993 							break;
994 						case 's':
995 							sPart.Format((FX_LPCWSTR)L"%02d",nSec);
996 							break;
997 						case 't':
998 							sPart = nHour>12? (FX_LPCWSTR)L"pm": (FX_LPCWSTR)L"am";
999 							break;
1000 					}
1001 					i+=2;
1002 				}
1003 				else if (format.GetAt(i+1) == c && format.GetAt(i+2) == c && format.GetAt(i+3) != c)
1004 				{
1005 					switch (c)
1006 					{
1007 						case 'm':
1008 							i+=3;
1009 							if (nMonth > 0&&nMonth <= 12)
1010 								sPart += months[nMonth - 1];
1011 							break;
1012 						default:
1013 							i+=3;
1014 							sPart += c;
1015 							sPart += c;
1016 							sPart += c;
1017 							break;
1018 					}
1019 				}
1020 				else if (format.GetAt(i+1) == c && format.GetAt(i+2) == c && format.GetAt(i+3) == c && format.GetAt(i+4) != c)
1021 				{
1022 					switch (c)
1023 					{
1024 						case 'y':
1025 							sPart.Format((FX_LPCWSTR)L"%04d",nYear);
1026 							i += 4;
1027 							break;
1028 						case 'm':
1029 							i+=4;
1030 							if (nMonth > 0&&nMonth <= 12)
1031 								sPart += fullmonths[nMonth - 1];
1032 							break;
1033 						default:
1034 							i += 4;
1035 							sPart += c;
1036 							sPart += c;
1037 							sPart += c;
1038 							sPart += c;
1039 							break;
1040 					}
1041 				}
1042 				else
1043 				{
1044 					i++;
1045 					sPart += c;
1046 				}
1047 				break;
1048 			default:
1049 				i++;
1050 				sPart += c;
1051 				break;
1052 		}
1053 
1054 		sRet += sPart;
1055 	}
1056 
1057 	return sRet;
1058 }
1059 
1060 /* -------------------------------------------------------------------------- */
1061 
1062 //function AFNumber_Format(nDec, sepStyle, negStyle, currStyle, strCurrency, bCurrencyPrepend)
AFNumber_Format(OBJ_METHOD_PARAMS)1063 FX_BOOL CJS_PublicMethods::AFNumber_Format(OBJ_METHOD_PARAMS)
1064 {
1065 #if _FX_OS_ != _FX_ANDROID_
1066 	v8::Isolate* isolate = ::GetIsolate(cc);
1067 	CJS_Context* pContext = (CJS_Context *)cc;
1068 	ASSERT(pContext != NULL);
1069 	CJS_EventHandler* pEvent = pContext->GetEventHandler();
1070 	ASSERT(pEvent != NULL);
1071 
1072 	if (params.size() != 6)
1073 	{
1074 		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
1075 		return FALSE;
1076 	}
1077 	if(!pEvent->m_pValue)
1078 		return FALSE;
1079 	CFX_WideString& Value = pEvent->Value();
1080 	CFX_ByteString strValue = StrTrim(CFX_ByteString::FromUnicode(Value));
1081 
1082 	if (strValue.IsEmpty()) return TRUE;
1083 
1084 	int iDec = params[0];
1085 	int iSepStyle = params[1];
1086 	int iNegStyle = params[2];
1087 	int icurrStyle = params[3]; //it's no use!
1088 	std::wstring wstrCurrency(params[4].operator CFX_WideString());
1089 	FX_BOOL bCurrencyPrepend = params[5];
1090 
1091 	if (iDec < 0) iDec = -iDec;
1092 
1093 	if (iSepStyle < 0 || iSepStyle > 3)
1094 		iSepStyle = 0;
1095 
1096 	if (iNegStyle < 0 || iNegStyle > 3)
1097 		iNegStyle = 0;
1098 
1099 
1100 	//////////////////////////////////////////////////////
1101 	//for processing decimal places
1102 	strValue.Replace(",", ".");
1103 	double dValue = atof(strValue);
1104 	if (iDec > 0)
1105 		dValue += DOUBLE_CORRECT;//
1106 
1107 	int iDec2;
1108 	FX_BOOL bNagative = FALSE;
1109 
1110 	strValue = fcvt(dValue,iDec,&iDec2,&bNagative);
1111 	if (strValue.IsEmpty())
1112 	{
1113 		dValue = 0;
1114 		strValue = fcvt(dValue,iDec,&iDec2,&bNagative);
1115 		if (strValue.IsEmpty())
1116 		{
1117 			strValue = "0";
1118 			iDec2 = 1;
1119 		}
1120 
1121 	}
1122 
1123 	if (iDec2 < 0)
1124 	{
1125 		for (int iNum = 0;iNum < abs(iDec2);iNum++)
1126 		{
1127 			strValue = "0" + strValue;
1128 		}
1129 		iDec2 = 0;
1130 
1131 	}
1132 	int iMax = strValue.GetLength();
1133 	if (iDec2 > iMax)
1134 	{
1135 		for (int iNum = 0;iNum <= iDec2 - iMax ;iNum++)
1136 		{
1137 			strValue += "0";
1138 		}
1139 		iMax = iDec2+1;
1140 	}
1141 	///////////////////////////////////////////////////////
1142     //for processing seperator style
1143 	if (iDec2 < iMax)
1144 	{
1145 		if (iSepStyle == 0 || iSepStyle == 1)
1146 		{
1147 			strValue.Insert(iDec2, '.');
1148 			iMax++;
1149 		}
1150 		else if (iSepStyle == 2 || iSepStyle == 3)
1151 		{
1152 			strValue.Insert(iDec2, ',');
1153 			iMax++;
1154 		}
1155 
1156 		if (iDec2 == 0)
1157 			strValue.Insert(iDec2, '0');
1158 	}
1159 	if (iSepStyle == 0 || iSepStyle == 2)
1160 	{
1161 		char cSeperator;
1162 		if (iSepStyle == 0)
1163 			cSeperator = ',';
1164 		else
1165 			cSeperator = '.';
1166 
1167 		int iDecPositive,iDecNagative;
1168 		iDecPositive = iDec2;
1169 		iDecNagative = iDec2;
1170 
1171 		for (iDecPositive = iDec2 -3; iDecPositive > 0;iDecPositive -= 3)
1172 		{
1173 			strValue.Insert(iDecPositive, cSeperator);
1174 			iMax++;
1175 		}
1176 	}
1177 
1178 	//////////////////////////////////////////////////////////////////////
1179     //for processing currency string
1180 
1181 	Value = CFX_WideString::FromLocal(strValue);
1182 
1183 	std::wstring strValue2(Value);
1184 
1185 	if (bCurrencyPrepend)
1186 		strValue2 = wstrCurrency + strValue2;
1187 	else
1188 		strValue2 = strValue2 + wstrCurrency;
1189 
1190 
1191 
1192 	/////////////////////////////////////////////////////////////////////////
1193 	//for processing negative style
1194 	if (bNagative)
1195 	{
1196 		if (iNegStyle == 0)
1197 		{
1198 			strValue2.insert(0,L"-");
1199 		}
1200 		if (iNegStyle == 2 || iNegStyle == 3)
1201 		{
1202 			strValue2.insert(0,L"(");
1203 			strValue2.insert(strValue2.length(),L")");
1204 		}
1205 		if (iNegStyle == 1 || iNegStyle == 3)
1206 		{
1207 			if (Field * fTarget = pEvent->Target_Field())
1208 			{
1209 				CJS_Array arColor(isolate);
1210 				CJS_Value vColElm(isolate);
1211 				vColElm = L"RGB";
1212 				arColor.SetElement(0,vColElm);
1213 				vColElm = 1;
1214 				arColor.SetElement(1,vColElm);
1215 				vColElm = 0;
1216 				arColor.SetElement(2,vColElm);
1217 
1218 				arColor.SetElement(3,vColElm);
1219 
1220 				CJS_PropValue vProp(isolate);
1221 				vProp.StartGetting();
1222 				vProp<<arColor;
1223 				vProp.StartSetting();
1224 				fTarget->textColor(cc,vProp,sError);// red
1225 			}
1226 		}
1227 	}
1228 	else
1229 	{
1230 		if (iNegStyle == 1 || iNegStyle == 3)
1231 		{
1232 			if (Field *fTarget = pEvent->Target_Field())
1233 			{
1234 				CJS_Array arColor(isolate);
1235 				CJS_Value vColElm(isolate);
1236 				vColElm = L"RGB";
1237 				arColor.SetElement(0,vColElm);
1238 				vColElm = 0;
1239 				arColor.SetElement(1,vColElm);
1240 				arColor.SetElement(2,vColElm);
1241 				arColor.SetElement(3,vColElm);
1242 
1243 				CJS_PropValue vProp(isolate);
1244 				vProp.StartGetting();
1245 				fTarget->textColor(cc,vProp,sError);
1246 
1247 				CJS_Array aProp(isolate);
1248 				vProp.ConvertToArray(aProp);
1249 
1250 				CPWL_Color crProp;
1251 				CPWL_Color crColor;
1252 				color::ConvertArrayToPWLColor(aProp, crProp);
1253 				color::ConvertArrayToPWLColor(arColor, crColor);
1254 
1255 				if (crColor != crProp)
1256 				{
1257 					CJS_PropValue vProp2(isolate);
1258 					vProp2.StartGetting();
1259 					vProp2<<arColor;
1260 					vProp2.StartSetting();
1261      				fTarget->textColor(cc,vProp2,sError);
1262 				}
1263 			}
1264 		}
1265 	}
1266 	Value = strValue2.c_str();
1267 #endif
1268 	return TRUE;
1269 }
1270 
1271 //function AFNumber_Keystroke(nDec, sepStyle, negStyle, currStyle, strCurrency, bCurrencyPrepend)
AFNumber_Keystroke(OBJ_METHOD_PARAMS)1272 FX_BOOL CJS_PublicMethods::AFNumber_Keystroke(OBJ_METHOD_PARAMS)
1273 {
1274 	CJS_Context* pContext = (CJS_Context *)cc;
1275 	ASSERT(pContext != NULL);
1276 	CJS_EventHandler* pEvent = pContext->GetEventHandler();
1277 	ASSERT(pEvent != NULL);
1278 
1279 	if(params.size() < 2)
1280 		return FALSE;
1281 	int iSepStyle = params[1];
1282 
1283 	if (iSepStyle < 0 || iSepStyle > 3)
1284 		iSepStyle = 0;
1285 	if(!pEvent->m_pValue)
1286 		return FALSE;
1287 	CFX_WideString & val = pEvent->Value();
1288 	CFX_WideString & w_strChange = pEvent->Change();
1289     CFX_WideString w_strValue = val;
1290 
1291 	if (pEvent->WillCommit())
1292 	{
1293 		CFX_WideString wstrChange = w_strChange;
1294 		CFX_WideString wstrValue = StrLTrim(w_strValue);
1295 		if (wstrValue.IsEmpty())
1296 			return TRUE;
1297 
1298 		CFX_WideString swTemp = wstrValue;
1299 		swTemp.Replace((FX_LPCWSTR)L",", (FX_LPCWSTR)L".");
1300 		if (!IsNumber(swTemp)) //!(IsNumber(wstrChange) &&
1301 		{
1302 			pEvent->Rc() = FALSE;
1303 			sError = JSGetStringFromID(pContext, IDS_STRING_JSAFNUMBER_KEYSTROKE);
1304 			Alert(pContext, sError);
1305 			return TRUE;
1306 		}
1307 		return TRUE; // it happens after the last keystroke and before validating,
1308 	}
1309 
1310 	std::wstring w_strValue2 (w_strValue);
1311 	std::wstring w_strChange2(w_strChange);
1312 
1313 	std::wstring w_strSelected;
1314 	if(-1 != pEvent->SelStart())
1315 		w_strSelected = w_strValue2.substr(pEvent->SelStart(),(pEvent->SelEnd() - pEvent->SelStart()));
1316 	FX_BOOL bHasSign = (w_strValue2.find('-') != -1) && (w_strSelected.find('-') == -1);
1317 	if (bHasSign)
1318 	{
1319 		//can't insert "change" in front to sign postion.
1320 		if (pEvent->SelStart() == 0)
1321 		{
1322             FX_BOOL &bRc = pEvent->Rc();
1323 			bRc = FALSE;
1324 			return TRUE;
1325 		}
1326 	}
1327 
1328 	char cSep = L'.';
1329 
1330 	switch (iSepStyle)
1331 	{
1332 	case 0:
1333 	case 1:
1334 		cSep = L'.';
1335 		break;
1336 	case 2:
1337 	case 3:
1338 		cSep = L',';
1339 		break;
1340 	}
1341 
1342 	FX_BOOL bHasSep = (w_strValue2.find(cSep) != -1);
1343 	for (std::wstring::iterator it = w_strChange2.begin(); it != w_strChange2.end(); it++)
1344 	{
1345 		if (*it == cSep)
1346 		{
1347 			if (bHasSep)
1348 			{
1349 				FX_BOOL &bRc = pEvent->Rc();
1350 				bRc = FALSE;
1351 				return TRUE;
1352 			}
1353 			else
1354 			{
1355 				bHasSep = TRUE;
1356 				continue;
1357 			}
1358 		}
1359 		if (*it == L'-')
1360 		{
1361 			if (bHasSign)
1362 			{
1363 				FX_BOOL &bRc = pEvent->Rc();
1364 				bRc = FALSE;
1365 				return TRUE;
1366 			}
1367 			else if (it != w_strChange2.begin()) //sign's position is not correct
1368 			{
1369 				FX_BOOL &bRc = pEvent->Rc();
1370 				bRc = FALSE;
1371 				return TRUE;
1372 			}
1373 			else if (pEvent->SelStart() != 0)
1374 			{
1375 				FX_BOOL &bRc = pEvent->Rc();
1376 				bRc = FALSE;
1377 				return TRUE;
1378 			}
1379 			bHasSign = TRUE;
1380 			continue;
1381 		}
1382 
1383 		if (!IsDigit(*it))
1384 		{
1385 			FX_BOOL &bRc = pEvent->Rc();
1386 			bRc = FALSE;
1387 			return TRUE;
1388 		}
1389 	}
1390 
1391 
1392 	std::wstring w_prefix = w_strValue2.substr(0,pEvent->SelStart());
1393 	std::wstring w_postfix;
1394 	if (pEvent->SelEnd()<(int)w_strValue2.length())
1395 		w_postfix  = w_strValue2.substr(pEvent->SelEnd());
1396 	w_strValue2 = w_prefix + w_strChange2 + w_postfix;
1397 	w_strValue = w_strValue2.c_str();
1398 	val = w_strValue;
1399 	return TRUE;
1400 
1401 }
1402 
1403 //function AFPercent_Format(nDec, sepStyle)
AFPercent_Format(OBJ_METHOD_PARAMS)1404 FX_BOOL CJS_PublicMethods::AFPercent_Format(OBJ_METHOD_PARAMS)
1405 {
1406 #if _FX_OS_ != _FX_ANDROID_
1407 	CJS_Context* pContext = (CJS_Context *)cc;
1408 	ASSERT(pContext != NULL);
1409 	CJS_EventHandler* pEvent = pContext->GetEventHandler();
1410 	ASSERT(pEvent != NULL);
1411 
1412     if (params.size() != 2)
1413 	{
1414 		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
1415 		return FALSE;
1416 	}
1417 	if(!pEvent->m_pValue)
1418 		return FALSE;
1419 	CFX_WideString& Value = pEvent->Value();
1420 
1421 //     HWND hMainFrame = NULL;
1422 //
1423 // 	CPDFSDK_FormFillApp *pApp = pContext->GetReaderApp();
1424 // 	ASSERT(pApp);
1425 // 	hMainFrame = pApp->GetMainFrameWnd();
1426 
1427 	CFX_ByteString strValue = StrTrim(CFX_ByteString::FromUnicode(Value));
1428 
1429 	if (strValue.IsEmpty())
1430 		return TRUE;
1431 
1432 	int iDec = params[0];
1433 	int iSepStyle = params[1];
1434 
1435 	//ASSERT(iDec > 0);
1436 	if (iDec < 0)
1437 		iDec = -iDec;
1438 
1439 	if (iSepStyle < 0 || iSepStyle > 3)
1440 		iSepStyle = 0;
1441 
1442 
1443 	//////////////////////////////////////////////////////
1444 	//for processing decimal places
1445 	double dValue = atof(strValue);
1446 	dValue *= 100;
1447 	if (iDec > 0)
1448 		dValue += DOUBLE_CORRECT;//��
1449 
1450 	int iDec2;
1451 	FX_BOOL bNagative = FALSE;
1452 	strValue = fcvt(dValue,iDec,&iDec2,&bNagative);
1453     if (strValue.IsEmpty())
1454 	{
1455 		dValue = 0;
1456 		strValue = fcvt(dValue,iDec,&iDec2,&bNagative);
1457 	}
1458 
1459 	if (iDec2 < 0)
1460 	{
1461 		for (int iNum = 0; iNum < abs(iDec2); iNum++)
1462 		{
1463 			strValue = "0" + strValue;
1464 		}
1465 		iDec2 = 0;
1466 
1467 	}
1468 	int iMax = strValue.GetLength();
1469 	if (iDec2 > iMax)
1470 	{
1471 		for (int iNum = 0; iNum <= iDec2 - iMax; iNum++)
1472 		{
1473 			strValue += "0";
1474 		}
1475 		iMax = iDec2+1;
1476 	}
1477 	///////////////////////////////////////////////////////
1478     //for processing seperator style
1479 	if (iDec2 < iMax)
1480 	{
1481 		if (iSepStyle == 0 || iSepStyle == 1)
1482 		{
1483 			strValue.Insert(iDec2, '.');
1484 			iMax++;
1485 		}
1486 		else if (iSepStyle == 2 || iSepStyle == 3)
1487 		{
1488 			strValue.Insert(iDec2, ',');
1489 			iMax++;
1490 		}
1491 
1492 		if (iDec2 == 0)
1493 			strValue.Insert(iDec2, '0');
1494 	}
1495 	if (iSepStyle == 0 || iSepStyle == 2)
1496 	{
1497 		char cSeperator;
1498 		if (iSepStyle == 0)
1499 			cSeperator = ',';
1500 		else
1501 			cSeperator = '.';
1502 
1503 		int iDecPositive,iDecNagative;
1504 		iDecPositive = iDec2;
1505 		iDecNagative = iDec2;
1506 
1507 		for (iDecPositive = iDec2 -3; iDecPositive > 0; iDecPositive -= 3)
1508 		{
1509 			strValue.Insert(iDecPositive,cSeperator);
1510 			iMax++;
1511 		}
1512 	}
1513 	////////////////////////////////////////////////////////////////////
1514 	//nagative mark
1515 	if(bNagative)
1516 		strValue = "-" + strValue;
1517 	strValue += "%";
1518 	Value = CFX_WideString::FromLocal(strValue);
1519 #endif
1520 	return TRUE;
1521 }
1522 //AFPercent_Keystroke(nDec, sepStyle)
AFPercent_Keystroke(OBJ_METHOD_PARAMS)1523 FX_BOOL CJS_PublicMethods::AFPercent_Keystroke(OBJ_METHOD_PARAMS)
1524 {
1525 	return AFNumber_Keystroke(cc,params,vRet,sError);
1526 }
1527 
1528 //function AFDate_FormatEx(cFormat)
AFDate_FormatEx(OBJ_METHOD_PARAMS)1529 FX_BOOL CJS_PublicMethods::AFDate_FormatEx(OBJ_METHOD_PARAMS)
1530 {
1531 	CJS_Context* pContext = (CJS_Context *)cc;
1532 	ASSERT(pContext != NULL);
1533 	CJS_EventHandler* pEvent = pContext->GetEventHandler();
1534 	ASSERT(pEvent != NULL);
1535 
1536 	if (params.size() != 1)
1537 	{
1538 		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
1539 		return FALSE;
1540 	}
1541 	if(!pEvent->m_pValue)
1542 		return FALSE;
1543 	CFX_WideString& val = pEvent->Value();
1544 
1545 	CFX_WideString strValue = val;
1546 	if (strValue.IsEmpty()) return TRUE;
1547 
1548 	CFX_WideString sFormat = params[0].operator CFX_WideString();
1549 
1550 	FX_BOOL bWrongFormat = FALSE;
1551 	double dDate = 0.0f;
1552 
1553 	if(strValue.Find(L"GMT") != -1)
1554 	{
1555 		//for GMT format time
1556 		//such as "Tue Aug 11 14:24:16 GMT+08002009"
1557 		dDate = MakeInterDate(strValue);
1558 	}
1559 	else
1560 	{
1561 		dDate = MakeRegularDate(strValue,sFormat,bWrongFormat);
1562 	}
1563 
1564 	if (JS_PortIsNan(dDate))
1565 	{
1566 		CFX_WideString swMsg;
1567 		swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSPARSEDATE), (FX_LPCWSTR)sFormat);
1568 		Alert(pContext, swMsg);
1569 		return FALSE;
1570 	}
1571 
1572 	val =  MakeFormatDate(dDate,sFormat);
1573 
1574 	return TRUE;
1575 }
1576 
MakeInterDate(CFX_WideString strValue)1577 double CJS_PublicMethods::MakeInterDate(CFX_WideString strValue)
1578 {
1579 	int nHour;
1580 	int nMin;
1581 	int nSec;
1582 	int nYear;
1583 	int nMonth;
1584 	int nDay;
1585 
1586 	CFX_WideStringArray wsArray;
1587 	CFX_WideString sMonth = L"";
1588 	CFX_WideString sTemp = L"";
1589 	int nSize = strValue.GetLength();
1590 
1591 	for(int i = 0; i < nSize; i++)
1592 	{
1593 		FX_WCHAR c = strValue.GetAt(i);
1594 		if(c == L' ' || c == L':')
1595 		{
1596 			wsArray.Add(sTemp);
1597 			sTemp = L"";
1598 			continue;
1599 		}
1600 
1601 		sTemp += c;
1602 	}
1603 
1604 	wsArray.Add(sTemp);
1605 	if(wsArray.GetSize() != 8)return 0;
1606 
1607 	sTemp = wsArray[1];
1608 	if(sTemp.Compare(L"Jan") == 0) nMonth = 1;
1609 	if(sTemp.Compare(L"Feb") == 0) nMonth = 2;
1610 	if(sTemp.Compare(L"Mar") == 0) nMonth = 3;
1611 	if(sTemp.Compare(L"Apr") == 0) nMonth = 4;
1612 	if(sTemp.Compare(L"May") == 0) nMonth = 5;
1613 	if(sTemp.Compare(L"Jun") == 0) nMonth = 6;
1614 	if(sTemp.Compare(L"Jul") == 0) nMonth = 7;
1615 	if(sTemp.Compare(L"Aug") == 0) nMonth = 8;
1616 	if(sTemp.Compare(L"Sep") == 0) nMonth = 9;
1617 	if(sTemp.Compare(L"Oct") == 0) nMonth = 10;
1618 	if(sTemp.Compare(L"Nov") == 0) nMonth = 11;
1619 	if(sTemp.Compare(L"Dec") == 0) nMonth = 12;
1620 
1621 	nDay = (int)ParseStringToNumber(wsArray[2]);
1622 	nHour = (int)ParseStringToNumber(wsArray[3]);
1623 	nMin = (int)ParseStringToNumber(wsArray[4]);
1624 	nSec = (int)ParseStringToNumber(wsArray[5]);
1625 	nYear = (int)ParseStringToNumber(wsArray[7]);
1626 
1627 	double dRet = JS_MakeDate(JS_MakeDay(nYear,nMonth - 1,nDay),JS_MakeTime(nHour, nMin, nSec, 0));
1628 
1629 	if (JS_PortIsNan(dRet))
1630 	{
1631 		dRet = JS_DateParse(strValue);
1632 	}
1633 
1634 	return dRet;
1635 }
1636 
1637 //AFDate_KeystrokeEx(cFormat)
AFDate_KeystrokeEx(OBJ_METHOD_PARAMS)1638 FX_BOOL CJS_PublicMethods::AFDate_KeystrokeEx(OBJ_METHOD_PARAMS)
1639 {
1640 	CJS_Context* pContext = (CJS_Context *)cc;
1641 	ASSERT(pContext != NULL);
1642 	CJS_EventHandler* pEvent = pContext->GetEventHandler();
1643 	ASSERT(pEvent != NULL);
1644 
1645 	if (params.size() != 1)
1646 	{
1647 		sError = L"AFDate_KeystrokeEx's parameters' size r not correct";
1648 		return FALSE;
1649 	}
1650 
1651 	if (pEvent->WillCommit())
1652 	{
1653 		if(!pEvent->m_pValue)
1654 			return FALSE;
1655 		CFX_WideString strValue = pEvent->Value();
1656 		if (strValue.IsEmpty()) return TRUE;
1657 
1658 		CFX_WideString sFormat = params[0].operator CFX_WideString();
1659 
1660 		FX_BOOL bWrongFormat = FALSE;
1661 		double dRet = MakeRegularDate(strValue,sFormat,bWrongFormat);
1662 		if (bWrongFormat || JS_PortIsNan(dRet))
1663 		{
1664 			CFX_WideString swMsg;
1665 			swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSPARSEDATE), (FX_LPCWSTR)sFormat);
1666 			Alert(pContext, swMsg);
1667 			pEvent->Rc() = FALSE;
1668 			return TRUE;
1669 		}
1670 	}
1671 	return TRUE;
1672 }
1673 
AFDate_Format(OBJ_METHOD_PARAMS)1674 FX_BOOL CJS_PublicMethods::AFDate_Format(OBJ_METHOD_PARAMS)
1675 {
1676 	v8::Isolate* isolate = ::GetIsolate(cc);
1677 
1678 	if (params.size() != 1)
1679 	{
1680 		CJS_Context* pContext = (CJS_Context*)cc;
1681 		ASSERT(pContext != NULL);
1682 
1683 		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
1684 		return FALSE;
1685 	}
1686 
1687 	int iIndex = params[0];
1688 	FX_LPCWSTR cFormats[] =  {(FX_LPCWSTR)L"m/d", (FX_LPCWSTR)L"m/d/yy", (FX_LPCWSTR)L"mm/dd/yy", (FX_LPCWSTR)L"mm/yy", (FX_LPCWSTR)L"d-mmm", (FX_LPCWSTR)L"d-mmm-yy", (FX_LPCWSTR)L"dd-mmm-yy",
1689 		(FX_LPCWSTR)L"yy-mm-dd", (FX_LPCWSTR)L"mmm-yy", (FX_LPCWSTR)L"mmmm-yy", (FX_LPCWSTR)L"mmm d, yyyy", (FX_LPCWSTR)L"mmmm d, yyyy",
1690 		(FX_LPCWSTR)L"m/d/yy h:MM tt", (FX_LPCWSTR)L"m/d/yy HH:MM" };
1691 
1692 	ASSERT(iIndex < sizeof(cFormats)/sizeof(FX_LPCWSTR));
1693 
1694 	if (iIndex < 0)
1695 		iIndex = 0;
1696 	if (iIndex >= sizeof(cFormats)/sizeof(FX_LPCWSTR))
1697 		iIndex = 0;
1698 	CJS_Parameters newParams;
1699 	CJS_Value val(isolate,cFormats[iIndex]);
1700 	newParams.push_back(val);
1701 	return AFDate_FormatEx(cc,newParams,vRet,sError);
1702 }
1703 
1704 //AFDate_KeystrokeEx(cFormat)
AFDate_Keystroke(OBJ_METHOD_PARAMS)1705 FX_BOOL CJS_PublicMethods::AFDate_Keystroke(OBJ_METHOD_PARAMS)
1706 {
1707 	v8::Isolate* isolate = ::GetIsolate(cc);
1708 
1709 	if (params.size() != 1)
1710 	{
1711 		CJS_Context* pContext = (CJS_Context*)cc;
1712 		ASSERT(pContext != NULL);
1713 
1714 		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
1715 		return FALSE;
1716 	}
1717 
1718 	int iIndex = params[0];
1719 	FX_LPCWSTR cFormats[] =  {(FX_LPCWSTR)L"m/d", (FX_LPCWSTR)L"m/d/yy", (FX_LPCWSTR)L"mm/dd/yy", (FX_LPCWSTR)L"mm/yy", (FX_LPCWSTR)L"d-mmm", (FX_LPCWSTR)L"d-mmm-yy", (FX_LPCWSTR)L"dd-mmm-yy",
1720 		(FX_LPCWSTR)L"yy-mm-dd", (FX_LPCWSTR)L"mmm-yy", (FX_LPCWSTR)L"mmmm-yy", (FX_LPCWSTR)L"mmm d, yyyy", (FX_LPCWSTR)L"mmmm d, yyyy",
1721 		(FX_LPCWSTR)L"m/d/yy h:MM tt", (FX_LPCWSTR)L"m/d/yy HH:MM" };
1722 
1723 	ASSERT(iIndex<sizeof(cFormats)/sizeof(FX_LPCWSTR));
1724 
1725 	if (iIndex < 0)
1726 		iIndex = 0;
1727 	if (iIndex >= sizeof(cFormats)/sizeof(FX_LPCWSTR))
1728 		iIndex = 0;
1729 	CJS_Parameters newParams;
1730 	CJS_Value val(isolate,cFormats[iIndex]);
1731 	newParams.push_back(val);
1732 	return AFDate_KeystrokeEx(cc,newParams,vRet,sError);
1733 }
1734 
1735 //function AFTime_Format(ptf)
AFTime_Format(OBJ_METHOD_PARAMS)1736 FX_BOOL CJS_PublicMethods::AFTime_Format(OBJ_METHOD_PARAMS)
1737 {
1738 	v8::Isolate* isolate = ::GetIsolate(cc);
1739 
1740 	if (params.size() != 1)
1741 	{
1742 		CJS_Context* pContext = (CJS_Context*)cc;
1743 		ASSERT(pContext != NULL);
1744 		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
1745 		return FALSE;
1746 	}
1747 
1748 	int iIndex = params[0];
1749 	FX_LPCWSTR cFormats[] = {(FX_LPCWSTR)L"HH:MM", (FX_LPCWSTR)L"h:MM tt", (FX_LPCWSTR)L"HH:MM:ss", (FX_LPCWSTR)L"h:MM:ss tt"};
1750 
1751 	ASSERT(iIndex<sizeof(cFormats)/sizeof(FX_LPCWSTR));
1752 
1753 	if (iIndex < 0)
1754 		iIndex = 0;
1755 	if (iIndex >= sizeof(cFormats)/sizeof(FX_LPCWSTR))
1756 		iIndex = 0;
1757 	CJS_Parameters newParams;
1758 	CJS_Value val(isolate,cFormats[iIndex]);
1759 	newParams.push_back(val);
1760 	return AFDate_FormatEx(cc,newParams,vRet,sError);
1761 }
1762 
AFTime_Keystroke(OBJ_METHOD_PARAMS)1763 FX_BOOL CJS_PublicMethods::AFTime_Keystroke(OBJ_METHOD_PARAMS)
1764 {
1765 	v8::Isolate* isolate = ::GetIsolate(cc);
1766 	if (params.size() != 1)
1767 	{
1768 		CJS_Context* pContext = (CJS_Context*)cc;
1769 		ASSERT(pContext != NULL);
1770 		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
1771 		return FALSE;
1772 	}
1773 
1774 	int iIndex = params[0];
1775 	FX_LPCWSTR cFormats[] = {(FX_LPCWSTR)L"HH:MM", (FX_LPCWSTR)L"h:MM tt", (FX_LPCWSTR)L"HH:MM:ss", (FX_LPCWSTR)L"h:MM:ss tt"};
1776 
1777 	ASSERT(iIndex<sizeof(cFormats)/sizeof(FX_LPCWSTR));
1778 
1779 	if (iIndex < 0)
1780 		iIndex = 0;
1781 	if (iIndex >= sizeof(cFormats)/sizeof(FX_LPCWSTR))
1782 		iIndex = 0;
1783 	CJS_Parameters newParams;
1784 	CJS_Value val(isolate,cFormats[iIndex]);
1785 	newParams.push_back(val);
1786 	return AFDate_KeystrokeEx(cc,newParams,vRet,sError);
1787 }
1788 
AFTime_FormatEx(OBJ_METHOD_PARAMS)1789 FX_BOOL CJS_PublicMethods::AFTime_FormatEx(OBJ_METHOD_PARAMS)
1790 {
1791 	return AFDate_FormatEx(cc,params,vRet,sError);
1792 }
1793 
AFTime_KeystrokeEx(OBJ_METHOD_PARAMS)1794 FX_BOOL CJS_PublicMethods::AFTime_KeystrokeEx(OBJ_METHOD_PARAMS)
1795 {
1796 	return AFDate_KeystrokeEx(cc,params,vRet,sError);
1797 }
1798 
1799 //function AFSpecial_Format(psf)
AFSpecial_Format(OBJ_METHOD_PARAMS)1800 FX_BOOL CJS_PublicMethods::AFSpecial_Format(OBJ_METHOD_PARAMS)
1801 {
1802 	CJS_Context* pContext = (CJS_Context *)cc;
1803 	ASSERT(pContext != NULL);
1804 
1805 	if (params.size() != 1)
1806 	{
1807 		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
1808 		return FALSE;
1809 	}
1810 
1811 	std::string cFormat;
1812 	int iIndex = params[0];
1813 
1814 	CJS_EventHandler* pEvent = pContext->GetEventHandler();
1815 	ASSERT(pEvent != NULL);
1816 
1817 	if(!pEvent->m_pValue)
1818 		return FALSE;
1819 	CFX_WideString& Value = pEvent->Value();
1820 	std::string strSrc = (FX_LPCSTR)CFX_ByteString::FromUnicode(Value);
1821 
1822 	switch (iIndex)
1823 	{
1824 	case 0:
1825 		cFormat = "99999";
1826 		break;
1827 	case 1:
1828 		cFormat = "99999-9999";
1829 		break;
1830 	case 2:
1831 		{
1832 			std::string NumberStr;
1833 			util::printx("9999999999", strSrc,NumberStr);
1834 			if (NumberStr.length() >= 10 )
1835 				cFormat = "(999) 999-9999";
1836 			else
1837 				cFormat = "999-9999";
1838 			break;
1839 		}
1840 	case 3:
1841 		cFormat = "999-99-9999";
1842 		break;
1843 	}
1844 
1845 	std::string strDes;
1846 	util::printx(cFormat,strSrc,strDes);
1847 	Value = CFX_WideString::FromLocal(strDes.c_str());
1848 	return TRUE;
1849 }
1850 
1851 
1852 //function AFSpecial_KeystrokeEx(mask)
AFSpecial_KeystrokeEx(OBJ_METHOD_PARAMS)1853 FX_BOOL CJS_PublicMethods::AFSpecial_KeystrokeEx(OBJ_METHOD_PARAMS)
1854 {
1855 	CJS_Context* pContext = (CJS_Context *)cc;
1856 	ASSERT(pContext != NULL);
1857 	CJS_EventHandler* pEvent = pContext->GetEventHandler();
1858 
1859 	ASSERT(pEvent != NULL);
1860 
1861 	if (params.size() < 1)
1862 	{
1863 		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
1864 		return FALSE;
1865 	}
1866 
1867 	if(!pEvent->m_pValue)
1868 		return FALSE;
1869 	CFX_WideString& valEvent = pEvent->Value();
1870 
1871 	CFX_WideString wstrMask = params[0].operator CFX_WideString();
1872 	if (wstrMask.IsEmpty()) return TRUE;
1873 
1874 	std::wstring wstrValue(valEvent);
1875 
1876 	if (pEvent->WillCommit())
1877 	{
1878 		if (wstrValue.empty())
1879 			return TRUE;
1880 		int iIndexMask = 0;
1881 		for (std::wstring::iterator it = wstrValue.begin(); it != wstrValue.end(); it++)
1882 		{
1883 			wchar_t w_Value = *it;
1884             if (!maskSatisfied(w_Value,wstrMask[iIndexMask]))
1885 				break;
1886 			iIndexMask++;
1887 		}
1888 
1889 		if (iIndexMask != wstrMask.GetLength() || (iIndexMask != wstrValue.size() && wstrMask.GetLength() != 0))
1890 		{
1891 			Alert(pContext, JSGetStringFromID(pContext, IDS_STRING_JSAFNUMBER_KEYSTROKE));
1892 			pEvent->Rc() = FALSE;
1893 		}
1894 		return TRUE;
1895 	}
1896 
1897 
1898 	CFX_WideString &wideChange = pEvent->Change();
1899 	std::wstring wChange(wideChange);
1900 
1901 	if (wChange.empty())
1902 		return TRUE;
1903     int iIndexMask = pEvent->SelStart();
1904 	//iIndexMask++;
1905 
1906 
1907 	if (wstrValue.length() - (pEvent->SelEnd()-pEvent->SelStart()) + wChange.length() > (FX_DWORD)wstrMask.GetLength())
1908 	{
1909 		Alert(pContext, JSGetStringFromID(pContext, IDS_STRING_JSPARAM_TOOLONG));
1910 		pEvent->Rc() = FALSE;
1911 		return TRUE;
1912 	}
1913 
1914 
1915 	if (iIndexMask >= wstrMask.GetLength() && (!wChange.empty()))
1916 	{
1917 		Alert(pContext, JSGetStringFromID(pContext, IDS_STRING_JSPARAM_TOOLONG));
1918 		pEvent->Rc() = FALSE;
1919 		return TRUE;
1920 	}
1921 
1922 	for (std::wstring::iterator it = wChange.begin(); it != wChange.end(); it++)
1923 	{
1924 		if (iIndexMask >= wstrMask.GetLength())
1925 		{
1926 			Alert(pContext, JSGetStringFromID(pContext, IDS_STRING_JSPARAM_TOOLONG));
1927 			pEvent->Rc() = FALSE;
1928 			return TRUE;
1929 		}
1930 		wchar_t w_Mask = wstrMask[iIndexMask];
1931 		if (!isReservedMaskChar(w_Mask))
1932 		{
1933 			//wChange.insert(it,w_Mask);
1934 			*it = w_Mask;
1935 		}
1936 		wchar_t w_Change = *it;
1937 
1938         if (!maskSatisfied(w_Change,w_Mask))
1939 		{
1940 			pEvent->Rc() = FALSE;
1941 			return TRUE;
1942 		}
1943 		iIndexMask++;
1944 	}
1945 
1946 	wideChange = wChange.c_str();
1947 
1948 	return TRUE;
1949 }
1950 
1951 
1952 //function AFSpecial_Keystroke(psf)
AFSpecial_Keystroke(OBJ_METHOD_PARAMS)1953 FX_BOOL CJS_PublicMethods::AFSpecial_Keystroke(OBJ_METHOD_PARAMS)
1954 {
1955 	v8::Isolate* isolate = ::GetIsolate(cc);
1956 
1957 	CJS_Context* pContext = (CJS_Context *)cc;
1958 	ASSERT(pContext != NULL);
1959 	CJS_EventHandler* pEvent = pContext->GetEventHandler();
1960 	ASSERT(pEvent != NULL);
1961 
1962 	if (params.size() != 1)
1963 	{
1964 		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
1965 		return FALSE;
1966 	}
1967 
1968 	std::string cFormat;
1969 	int iIndex = (int)params[0];
1970 
1971 	if(!pEvent->m_pValue)
1972 		return FALSE;
1973 	//CJS_Value val = pEvent->Value();
1974 	CFX_WideString& val = pEvent->Value();
1975 	std::string strSrc = (FX_LPCSTR)CFX_ByteString::FromUnicode(val);
1976 	std::wstring wstrChange(pEvent->Change());
1977 
1978 	switch (iIndex)
1979 	{
1980 	case 0:
1981 		cFormat = "99999";
1982 		break;
1983 	case 1:
1984 		//cFormat = "99999-9999";
1985 		cFormat = "999999999";
1986 		break;
1987 	case 2:
1988 		{
1989 			std::string NumberStr;
1990 			util::printx("9999999999", strSrc,NumberStr);
1991 			if (strSrc.length() + wstrChange.length() > 7 )
1992 				//cFormat = "(999) 999-9999";
1993 				cFormat = "9999999999";
1994 			else
1995 				//cFormat = "999-9999";
1996 				cFormat = "9999999";
1997 			break;
1998 		}
1999 	case 3:
2000 		//cFormat = "999-99-9999";
2001 		cFormat = "999999999";
2002 		break;
2003 	}
2004 
2005 	CJS_Parameters params2;
2006 	CJS_Value vMask(isolate, cFormat.c_str());
2007 	params2.push_back(vMask);
2008 
2009     return AFSpecial_KeystrokeEx(cc,params2,vRet,sError);
2010 }
2011 
AFMergeChange(OBJ_METHOD_PARAMS)2012 FX_BOOL CJS_PublicMethods::AFMergeChange(OBJ_METHOD_PARAMS)
2013 {
2014 	CJS_Context* pContext = (CJS_Context *)cc;
2015 	ASSERT(pContext != NULL);
2016 	CJS_EventHandler* pEventHandler = pContext->GetEventHandler();
2017 	ASSERT(pEventHandler != NULL);
2018 
2019 	if (params.size() != 1)
2020 	{
2021 		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
2022 		return FALSE;
2023 	}
2024 
2025 	CFX_WideString swValue;
2026 	if (pEventHandler->m_pValue != NULL)
2027 		swValue = pEventHandler->Value();
2028 
2029 	if (pEventHandler->WillCommit())
2030 	{
2031 		vRet = swValue;
2032 		return TRUE;
2033 	}
2034 
2035 	CFX_WideString prefix,postfix;
2036 
2037 	if (pEventHandler->SelStart() >= 0)
2038 		prefix = swValue.Mid(0,pEventHandler->SelStart());
2039 	else
2040 		prefix = L"";
2041 
2042 
2043 	if (pEventHandler->SelEnd() >= 0 && pEventHandler->SelEnd() <= swValue.GetLength())
2044 		postfix = swValue.Mid(pEventHandler->SelEnd(), swValue.GetLength() - pEventHandler->SelEnd());
2045 	else postfix = L"";
2046 
2047 	vRet = prefix + pEventHandler->Change() + postfix;
2048 
2049 	return TRUE;
2050 }
2051 
AFParseDateEx(OBJ_METHOD_PARAMS)2052 FX_BOOL CJS_PublicMethods::AFParseDateEx(OBJ_METHOD_PARAMS)
2053 {
2054 	CJS_Context* pContext = (CJS_Context *)cc;
2055 	ASSERT(pContext != NULL);
2056 
2057 	if (params.size() != 2)
2058 	{
2059 		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
2060 		return FALSE;
2061 	}
2062 
2063 	CFX_WideString sValue = params[0].operator CFX_WideString();
2064 	CFX_WideString sFormat = params[1].operator CFX_WideString();
2065 
2066 	FX_BOOL bWrongFormat = FALSE;
2067 	double dDate = MakeRegularDate(sValue,sFormat,bWrongFormat);
2068 
2069 	if (JS_PortIsNan(dDate))
2070 	{
2071 		CFX_WideString swMsg;
2072 		swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSPARSEDATE), (FX_LPCWSTR)sFormat);
2073 		Alert((CJS_Context *)cc, swMsg);
2074 		return FALSE;
2075 	}
2076 
2077 	vRet = dDate;
2078 
2079 	return TRUE;
2080 }
2081 
AFSimple(OBJ_METHOD_PARAMS)2082 FX_BOOL CJS_PublicMethods::AFSimple(OBJ_METHOD_PARAMS)
2083 {
2084 	if (params.size() != 3)
2085 	{
2086 		CJS_Context* pContext = (CJS_Context *)cc;
2087 		ASSERT(pContext != NULL);
2088 
2089 		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
2090 		return FALSE;
2091 	}
2092 
2093 	vRet = (double)AF_Simple(params[0].operator CFX_WideString(), (double)params[1], (double)params[2]);
2094 	return TRUE;
2095 }
2096 
AFMakeNumber(OBJ_METHOD_PARAMS)2097 FX_BOOL CJS_PublicMethods::AFMakeNumber(OBJ_METHOD_PARAMS)
2098 {
2099 	if (params.size() != 1)
2100 	{
2101 		CJS_Context* pContext = (CJS_Context *)cc;
2102 		ASSERT(pContext != NULL);
2103 
2104 		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
2105 		return FALSE;
2106 	}
2107     vRet = ParseStringToNumber(params[0].operator CFX_WideString());
2108 	return TRUE;
2109 }
2110 
AFSimple_Calculate(OBJ_METHOD_PARAMS)2111 FX_BOOL CJS_PublicMethods::AFSimple_Calculate(OBJ_METHOD_PARAMS)
2112 {
2113 	v8::Isolate* isolate = ::GetIsolate(cc);
2114 
2115 	CJS_Context* pContext = (CJS_Context *)cc;
2116 	ASSERT(pContext != NULL);
2117 
2118 	if (params.size() != 2)
2119 	{
2120 		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
2121 		return FALSE;
2122 	}
2123 
2124 	CJS_Value params1 = params[1];
2125 
2126 	if (!params1.IsArrayObject() && params1.GetType() != VT_string)
2127 	{
2128 		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
2129 		return FALSE;
2130 	}
2131 
2132 	CPDFSDK_Document* pReaderDoc = pContext->GetReaderDocument();
2133     ASSERT(pReaderDoc != NULL);
2134 
2135 	CPDFSDK_InterForm* pReaderInterForm = pReaderDoc->GetInterForm();
2136 	ASSERT(pReaderInterForm != NULL);
2137 
2138 	CPDF_InterForm* pInterForm = pReaderInterForm->GetInterForm();
2139 	ASSERT(pInterForm != NULL);
2140 
2141 	double dValue;
2142 	CFX_WideString sFunction = params[0].operator CFX_WideString();
2143 	if (wcscmp(sFunction, L"PRD") == 0)
2144     	dValue = 1.0;
2145 	else
2146 		dValue = 0.0;
2147 
2148 	CJS_Array FieldNameArray = AF_MakeArrayFromList(isolate,params1);
2149 
2150 	int nFieldsCount = 0;
2151 
2152 	for (int i=0,isz=FieldNameArray.GetLength(); i<isz; i++)
2153 	{
2154 		CJS_Value jsValue(isolate);
2155 		FieldNameArray.GetElement(i,jsValue);
2156         CFX_WideString wsFieldName = jsValue.operator CFX_WideString();
2157 
2158         for (int j=0,jsz=pInterForm->CountFields(wsFieldName); j<jsz; j++)
2159 		{
2160 			if (CPDF_FormField* pFormField = pInterForm->GetField(j, wsFieldName))
2161 			{
2162 				double dTemp = 0.0;
2163 
2164 				switch (pFormField->GetFieldType())
2165 				{
2166 				case FIELDTYPE_TEXTFIELD:
2167 				case FIELDTYPE_COMBOBOX:
2168 					{
2169 						dTemp = ParseStringToNumber(pFormField->GetValue());
2170 						break;
2171 					}
2172 				case FIELDTYPE_PUSHBUTTON:
2173 					{
2174 						dTemp = 0.0;
2175 						break;
2176 					}
2177 				case FIELDTYPE_CHECKBOX:
2178 				case FIELDTYPE_RADIOBUTTON:
2179 					{
2180 						dTemp = 0.0;
2181 						for (int c=0,csz=pFormField->CountControls(); c<csz; c++)
2182 						{
2183 							if (CPDF_FormControl* pFormCtrl = pFormField->GetControl(c))
2184 							{
2185 								if (pFormCtrl->IsChecked())
2186 								{
2187 									dTemp += ParseStringToNumber(pFormCtrl->GetExportValue());
2188 									break;
2189 								}
2190 								else
2191 									continue;
2192 							}
2193 						}
2194 						break;
2195 					}
2196 				case FIELDTYPE_LISTBOX:
2197 					{
2198 						dTemp = 0.0;
2199 						if (pFormField->CountSelectedItems() > 1)
2200 							break;
2201 						else
2202 						{
2203 							dTemp = ParseStringToNumber(pFormField->GetValue());
2204 							break;
2205 						}
2206 					}
2207 				default:
2208 					break;
2209 				}
2210 
2211 				if (i == 0 && j == 0 && (wcscmp(sFunction,L"MIN") == 0 || wcscmp(sFunction, L"MAX") == 0))
2212 					dValue = dTemp;
2213 
2214 				dValue = AF_Simple(sFunction, dValue, dTemp);
2215 
2216 				nFieldsCount++;
2217 			}
2218 		}
2219 	}
2220 
2221 	if (wcscmp(sFunction, L"AVG") == 0 && nFieldsCount > 0)
2222 		dValue /= nFieldsCount;
2223 
2224 	dValue = (double)floor(dValue * FXSYS_pow((double)10,(double)6) + 0.49) / FXSYS_pow((double)10,(double)6);
2225 	CJS_Value jsValue(isolate,dValue);
2226 	if((CJS_EventHandler*)pContext->GetEventHandler()->m_pValue)
2227 		((CJS_EventHandler*)pContext->GetEventHandler())->Value() = jsValue;
2228 
2229 	return TRUE;
2230 }
2231 
2232 /* This function validates the current event to ensure that its value is
2233 ** within the specified range. */
2234 
AFRange_Validate(OBJ_METHOD_PARAMS)2235 FX_BOOL CJS_PublicMethods::AFRange_Validate(OBJ_METHOD_PARAMS)
2236 {
2237 	CJS_Context* pContext = (CJS_Context *)cc;
2238 	ASSERT(pContext != NULL);
2239 	CJS_EventHandler* pEvent = pContext->GetEventHandler();
2240 	ASSERT(pEvent != NULL);
2241 
2242 	if (params.size() != 4)
2243 	{
2244 		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
2245 		return FALSE;
2246 	}
2247 
2248 	if(!pEvent->m_pValue)
2249 		return FALSE;
2250 	if (pEvent->Value().IsEmpty() )
2251 		return TRUE;
2252 	double dEentValue = atof(CFX_ByteString::FromUnicode(pEvent->Value()));
2253 	FX_BOOL bGreaterThan, bLessThan;
2254 	double  dGreaterThan, dLessThan;
2255     bGreaterThan = (FX_BOOL)params[0];
2256 	CFX_WideString swMsg;
2257 	dGreaterThan = (double)params[1];
2258 	bLessThan = (FX_BOOL)params[2];
2259 	dLessThan = (double)params[3];
2260 
2261 	if (bGreaterThan && bLessThan)
2262 	{
2263 		if (dEentValue < dGreaterThan || dEentValue > dLessThan)
2264 			swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE1),(FX_LPCWSTR)params[1].operator CFX_WideString(), (FX_LPCWSTR)params[3].operator CFX_WideString());
2265 	}
2266 	else if (bGreaterThan)
2267 	{
2268 		if (dEentValue < dGreaterThan)
2269 			swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE2), (FX_LPCWSTR)params[1].operator CFX_WideString());
2270 	}
2271 	else if (bLessThan)
2272 	{
2273 		if (dEentValue > dLessThan)
2274 			swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE3), (FX_LPCWSTR)params[3].operator CFX_WideString());
2275 	}
2276 
2277 	if (!swMsg.IsEmpty())
2278 	{
2279 		Alert(pContext, swMsg);
2280 		pEvent->Rc() = FALSE;
2281 	}
2282 	return TRUE;
2283 }
2284 
AFExtractNums(OBJ_METHOD_PARAMS)2285 FX_BOOL CJS_PublicMethods::AFExtractNums(OBJ_METHOD_PARAMS)
2286 {
2287 	v8::Isolate* isolate = ::GetIsolate(cc);
2288 	CJS_Context* pContext = (CJS_Context*)cc;
2289 	ASSERT(pContext != NULL);
2290 
2291 	if (params.size() != 1)
2292 	{
2293 		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
2294 		return FALSE;
2295 	}
2296 
2297 	CJS_Array nums(isolate);
2298 
2299 	CFX_WideString str = params[0].operator CFX_WideString();
2300 	CFX_WideString sPart;
2301 
2302 	if (str.GetAt(0) == L'.' || str.GetAt(0) == L',')
2303 		str = L"0" + str;
2304 
2305 	int nIndex = 0;
2306 	for (int i=0, sz=str.GetLength(); i<sz; i++)
2307 	{
2308 		FX_WCHAR wc = str.GetAt(i);
2309 		if (IsDigit((wchar_t)wc))
2310 		{
2311 			sPart += wc;
2312 		}
2313 		else
2314 		{
2315 			if (sPart.GetLength() > 0)
2316 			{
2317 				nums.SetElement(nIndex,CJS_Value(isolate,(FX_LPCWSTR)sPart));
2318 				sPart = L"";
2319 				nIndex ++;
2320 			}
2321 		}
2322 	}
2323 
2324 	if (sPart.GetLength() > 0)
2325 	{
2326 		nums.SetElement(nIndex,CJS_Value(isolate,(FX_LPCWSTR)sPart));
2327 	}
2328 
2329 	if (nums.GetLength() > 0)
2330 		vRet = nums;
2331 	else
2332 		vRet.SetNull();
2333 
2334 	return TRUE;
2335 }
2336