Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa / src / fxfa / src / fm2js / xfa_fm2jscontext.cpp
1 // Copyright 2014 PDFium Authors. All rights reserved.\r
2 // Use of this source code is governed by a BSD-style license that can be\r
3 // found in the LICENSE file.\r
4 \r
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\r
6 \r
7 #include "xfa_fm2js.h"\r
8 #include <time.h>\r
9 #define FINANCIAL_PRECISION             0.00000001\r
10 struct XFA_FMHtmlReserveCode {\r
11     FX_UINT32           m_uCode;\r
12     FX_LPCWSTR          m_htmlReserve;\r
13 };\r
14 struct XFA_FMHtmlHashedReserveCode {\r
15     FX_UINT32           m_uHash;\r
16     FX_LPCWSTR          m_htmlReserve;\r
17     FX_UINT32           m_uCode;\r
18 };\r
19 static XFA_FMHtmlHashedReserveCode reservesForDecode [] = {\r
20     {0x00018b62,        (FX_LPCWSTR)L"Mu",      924},\r
21     {0x00019083,        (FX_LPCWSTR)L"Nu",      925},\r
22     {0x00019ab9,        (FX_LPCWSTR)L"Pi",      928},\r
23     {0x0001c3c1,        (FX_LPCWSTR)L"Xi",      926},\r
24     {0x000210ac,        (FX_LPCWSTR)L"ge",      8805},\r
25     {0x000210bb,        (FX_LPCWSTR)L"gt",      62},\r
26     {0x00022a51,        (FX_LPCWSTR)L"le",      8804},\r
27     {0x00022a60,        (FX_LPCWSTR)L"lt",      60},\r
28     {0x00022f82,        (FX_LPCWSTR)L"mu",      956},\r
29     {0x00023493,        (FX_LPCWSTR)L"ne",      8800},\r
30     {0x00023497,        (FX_LPCWSTR)L"ni",      8715},\r
31     {0x000234a3,        (FX_LPCWSTR)L"nu",      957},\r
32     {0x000239c1,        (FX_LPCWSTR)L"or",      8744},\r
33     {0x00023ed9,        (FX_LPCWSTR)L"pi",      960},\r
34     {0x000267e1,        (FX_LPCWSTR)L"xi",      958},\r
35     {0x00c41789,        (FX_LPCWSTR)L"lceil",   8968},\r
36     {0x00eef34f,        (FX_LPCWSTR)L"thetasym",        977},\r
37     {0x012d7ead,        (FX_LPCWSTR)L"lcirc",   206},\r
38     {0x01637b56,        (FX_LPCWSTR)L"agrave",  224},\r
39     {0x020856da,        (FX_LPCWSTR)L"crarr",   8629},\r
40     {0x022188c3,        (FX_LPCWSTR)L"gamma",   947},\r
41     {0x033586d3,        (FX_LPCWSTR)L"nbsp",    160},\r
42     {0x04f4c358,        (FX_LPCWSTR)L"nsub",    8836},\r
43     {0x0581466a,        (FX_LPCWSTR)L"dagger",  8224},\r
44     {0x06b1f790,        (FX_LPCWSTR)L"oelig",   339},\r
45     {0x06e490d4,        (FX_LPCWSTR)L"Chi",     935},\r
46     {0x0718c6a1,        (FX_LPCWSTR)L"ETH",     208},\r
47     {0x07196ada,        (FX_LPCWSTR)L"Eta",     919},\r
48     {0x07f667ca,        (FX_LPCWSTR)L"Ugrave",  217},\r
49     {0x083a8a21,        (FX_LPCWSTR)L"Phi",     934},\r
50     {0x083ac28c,        (FX_LPCWSTR)L"Psi",     936},\r
51     {0x086f26a9,        (FX_LPCWSTR)L"Rho",     929},\r
52     {0x089b5b51,        (FX_LPCWSTR)L"aring",   229},\r
53     {0x08a39f4a,        (FX_LPCWSTR)L"Tau",     932},\r
54     {0x08b6188b,        (FX_LPCWSTR)L"THORN",   222},\r
55     {0x09ce792a,        (FX_LPCWSTR)L"icirc",   238},\r
56     {0x09f9d61e,        (FX_LPCWSTR)L"amp",     38},\r
57     {0x09f9db33,        (FX_LPCWSTR)L"and",     8743},\r
58     {0x09f9db36,        (FX_LPCWSTR)L"ang",     8736},\r
59     {0x0a2e3514,        (FX_LPCWSTR)L"cap",     8745},\r
60     {0x0a2e58f4,        (FX_LPCWSTR)L"chi",     967},\r
61     {0x0a2e9ba8,        (FX_LPCWSTR)L"cup",     8746},\r
62     {0x0a4897d0,        (FX_LPCWSTR)L"deg",     176},\r
63     {0x0a6332fa,        (FX_LPCWSTR)L"eta",     951},\r
64     {0x0a633301,        (FX_LPCWSTR)L"eth",     240},\r
65     {0x0acc4d4b,        (FX_LPCWSTR)L"int",     8747},\r
66     {0x0b1b3d35,        (FX_LPCWSTR)L"loz",     9674},\r
67     {0x0b1b4c8b,        (FX_LPCWSTR)L"lrm",     8206},\r
68     {0x0b4fd9b1,        (FX_LPCWSTR)L"not",     172},\r
69     {0x0b845241,        (FX_LPCWSTR)L"phi",     966},\r
70     {0x0b84576f,        (FX_LPCWSTR)L"piv",     982},\r
71     {0x0b848aac,        (FX_LPCWSTR)L"psi",     968},\r
72     {0x0bb8df5e,        (FX_LPCWSTR)L"reg",     174},\r
73     {0x0bb8eec9,        (FX_LPCWSTR)L"rho",     961},\r
74     {0x0bb9034b,        (FX_LPCWSTR)L"rlm",     8207},\r
75     {0x0bd33d14,        (FX_LPCWSTR)L"shy",     173},\r
76     {0x0bd34229,        (FX_LPCWSTR)L"sim",     8764},\r
77     {0x0bd37faa,        (FX_LPCWSTR)L"sub",     8834},\r
78     {0x0bd37fb5,        (FX_LPCWSTR)L"sum",     8721},\r
79     {0x0bd37fb8,        (FX_LPCWSTR)L"sup",     8835},\r
80     {0x0bed676a,        (FX_LPCWSTR)L"tau",     964},\r
81     {0x0c07f32e,        (FX_LPCWSTR)L"uml",     168},\r
82     {0x0c71032c,        (FX_LPCWSTR)L"yen",     165},\r
83     {0x0c7f2889,        (FX_LPCWSTR)L"szlig",   223},\r
84     {0x0c8badbb,        (FX_LPCWSTR)L"zwj",     8205},\r
85     {0x10ba4dba,        (FX_LPCWSTR)L"Egrave",  200},\r
86     {0x10f1ea24,        (FX_LPCWSTR)L"para",    182},\r
87     {0x10f1ea37,        (FX_LPCWSTR)L"part",    8706},\r
88     {0x115b2337,        (FX_LPCWSTR)L"perp",    8869},\r
89     {0x12b10d15,        (FX_LPCWSTR)L"prod",    8719},\r
90     {0x12b10d21,        (FX_LPCWSTR)L"prop",    8733},\r
91     {0x12dfa9f4,        (FX_LPCWSTR)L"rfloor",  8971},\r
92     {0x12eb4736,        (FX_LPCWSTR)L"Agrave",  192},\r
93     {0x12fff2b7,        (FX_LPCWSTR)L"pund",    163},\r
94     {0x13fda9f2,        (FX_LPCWSTR)L"tilde",   732},\r
95     {0x1417fd62,        (FX_LPCWSTR)L"times",   215},\r
96     {0x154fc726,        (FX_LPCWSTR)L"ecirc",   234},\r
97     {0x165aa451,        (FX_LPCWSTR)L"sigma",   963},\r
98     {0x1709124a,        (FX_LPCWSTR)L"Dagger",  8225},\r
99     {0x192f78d5,        (FX_LPCWSTR)L"iexcl",   161},\r
100     {0x1b7ed8d7,        (FX_LPCWSTR)L"rArr",    8658},\r
101     {0x1ec88c68,        (FX_LPCWSTR)L"rang",    9002},\r
102     {0x1ec8a0f7,        (FX_LPCWSTR)L"rarr",    8594},\r
103     {0x1eda07f3,        (FX_LPCWSTR)L"atilde",  227},\r
104     {0x1f3182c4,        (FX_LPCWSTR)L"real",    8476},\r
105     {0x1fc34f8b,        (FX_LPCWSTR)L"yacute",  253},\r
106     {0x20d11522,        (FX_LPCWSTR)L"acirc",   226},\r
107     {0x21933a9b,        (FX_LPCWSTR)L"rsaquo",  8250},\r
108     {0x21f44907,        (FX_LPCWSTR)L"uacute",  250},\r
109     {0x220cca72,        (FX_LPCWSTR)L"acute",   180},\r
110     {0x242cded1,        (FX_LPCWSTR)L"alefsym", 8501},\r
111     {0x2655c66a,        (FX_LPCWSTR)L"delta",   948},\r
112     {0x269e4b4d,        (FX_LPCWSTR)L"exist",   8707},\r
113     {0x273379fa,        (FX_LPCWSTR)L"micro",   181},\r
114     {0x27a37440,        (FX_LPCWSTR)L"forall",  8704},\r
115     {0x2854e62c,        (FX_LPCWSTR)L"minus",   8722},\r
116     {0x28636f81,        (FX_LPCWSTR)L"cedil",   184},\r
117     {0x2887357b,        (FX_LPCWSTR)L"iacute",  237},\r
118     {0x2994d5ff,        (FX_LPCWSTR)L"frac12",  189},\r
119     {0x2994d601,        (FX_LPCWSTR)L"frac14",  188},\r
120     {0x2994e043,        (FX_LPCWSTR)L"frac34",  190},\r
121     {0x2a1feb41,        (FX_LPCWSTR)L"lambda",  955},\r
122     {0x2ab215f3,        (FX_LPCWSTR)L"apos",    39},\r
123     {0x2ab82ef7,        (FX_LPCWSTR)L"eacute",  233},\r
124     {0x2b3592ef,        (FX_LPCWSTR)L"auml",    228},\r
125     {0x2ce92873,        (FX_LPCWSTR)L"aacute",  225},\r
126     {0x2daff48a,        (FX_LPCWSTR)L"oslash",  248},\r
127     {0x2ef68882,        (FX_LPCWSTR)L"aelig",   230},\r
128     {0x3061d3d3,        (FX_LPCWSTR)L"Atilde",  195},\r
129     {0x314b1b6b,        (FX_LPCWSTR)L"Yacute",  221},\r
130     {0x337c14e7,        (FX_LPCWSTR)L"Uacute",  218},\r
131     {0x37676aca,        (FX_LPCWSTR)L"cent",    162},\r
132     {0x37d0b841,        (FX_LPCWSTR)L"circ",    710},\r
133     {0x386e7947,        (FX_LPCWSTR)L"cong",    8773},\r
134     {0x386e839b,        (FX_LPCWSTR)L"copy",    169},\r
135     {0x3a0e225a,        (FX_LPCWSTR)L"Epsilon", 917},\r
136     {0x3ba7b721,        (FX_LPCWSTR)L"Lambda",  923},\r
137     {0x3bd9abe6,        (FX_LPCWSTR)L"Alpha",   913},\r
138     {0x3c3ffad7,        (FX_LPCWSTR)L"Eacute",  201},\r
139     {0x3cfaf69f,        (FX_LPCWSTR)L"brvbar",  166},\r
140     {0x3d54a489,        (FX_LPCWSTR)L"omega",   969},\r
141     {0x3e70f453,        (FX_LPCWSTR)L"Aacute",  193},\r
142     {0x3f37c06a,        (FX_LPCWSTR)L"Oslash",  216},\r
143     {0x40e1b34e,        (FX_LPCWSTR)L"diams",   9830},\r
144     {0x416596df,        (FX_LPCWSTR)L"plusmn",  177},\r
145     {0x4354ff16,        (FX_LPCWSTR)L"Ucirc",   219},\r
146     {0x454fce6a,        (FX_LPCWSTR)L"Upsilon", 933},\r
147     {0x4610ad35,        (FX_LPCWSTR)L"emsp",    8195},\r
148     {0x462afb76,        (FX_LPCWSTR)L"ensp",    8194},\r
149     {0x46e30073,        (FX_LPCWSTR)L"euml",    235},\r
150     {0x46e31a1b,        (FX_LPCWSTR)L"euro",    8364},\r
151     {0x46f2eada,        (FX_LPCWSTR)L"lowast",  8727},\r
152     {0x4dca26cf,        (FX_LPCWSTR)L"Auml",    196},\r
153     {0x4e2d6083,        (FX_LPCWSTR)L"image",   8465},\r
154     {0x4f964ee8,        (FX_LPCWSTR)L"notin",   8713},\r
155     {0x50917a7a,        (FX_LPCWSTR)L"epsilon", 949},\r
156     {0x52f9a4cd,        (FX_LPCWSTR)L"Kappa",   922},\r
157     {0x5496f410,        (FX_LPCWSTR)L"Ocirc",   212},\r
158     {0x568cbf34,        (FX_LPCWSTR)L"zeta",    950},\r
159     {0x57badd20,        (FX_LPCWSTR)L"ntilde",  241},\r
160     {0x58662109,        (FX_LPCWSTR)L"zwnj",    8204},\r
161     {0x5b39870f,        (FX_LPCWSTR)L"empty",   8709},\r
162     {0x5bd3268a,        (FX_LPCWSTR)L"upsilon", 965},\r
163     {0x5e2bf8a3,        (FX_LPCWSTR)L"Gamma",   915},\r
164     {0x5f73c13a,        (FX_LPCWSTR)L"rsquo",   8217},\r
165     {0x61f2bc4d,        (FX_LPCWSTR)L"iota",    953},\r
166     {0x625bbcf3,        (FX_LPCWSTR)L"isin",    8712},\r
167     {0x62906df7,        (FX_LPCWSTR)L"iuml",    239},\r
168     {0x64a5cb31,        (FX_LPCWSTR)L"Aring",   197},\r
169     {0x66f25c4a,        (FX_LPCWSTR)L"sbquo",   8218},\r
170     {0x6851ab60,        (FX_LPCWSTR)L"spades",  9824},\r
171     {0x6942a900,        (FX_LPCWSTR)L"Ntilde",  209},\r
172     {0x69779453,        (FX_LPCWSTR)L"Euml",    203},\r
173     {0x6cda6e23,        (FX_LPCWSTR)L"current", 164},\r
174     {0x70b5b634,        (FX_LPCWSTR)L"lsquo",   8216},\r
175     {0x715a3706,        (FX_LPCWSTR)L"Ecirc",   202},\r
176     {0x71e8bf8d,        (FX_LPCWSTR)L"tdquo",   8221},\r
177     {0x72651431,        (FX_LPCWSTR)L"Sigma",   931},\r
178     {0x7569813b,        (FX_LPCWSTR)L"iquest",  191},\r
179     {0x776a436a,        (FX_LPCWSTR)L"equiv",   8801},\r
180     {0x79215314,        (FX_LPCWSTR)L"Zeta",    918},\r
181     {0x79b81224,        (FX_LPCWSTR)L"ograve",  242},\r
182     {0x7c2f8b23,        (FX_LPCWSTR)L"macr",    175},\r
183     {0x7cdb8502,        (FX_LPCWSTR)L"Acirc",   194},\r
184     {0x8185c62e,        (FX_LPCWSTR)L"ndash",   8211},\r
185     {0x8260364a,        (FX_LPCWSTR)L"Delta",   916},\r
186     {0x846619ad,        (FX_LPCWSTR)L"mdash",   8212},\r
187     {0x8550fb50,        (FX_LPCWSTR)L"OElig",   338},\r
188     {0x88eb5b85,        (FX_LPCWSTR)L"ldquo",   8220},\r
189     {0x8b3fde04,        (FX_LPCWSTR)L"Ograve",  210},\r
190     {0x8bc5794b,        (FX_LPCWSTR)L"ordf",    170},\r
191     {0x8bc57952,        (FX_LPCWSTR)L"ordm",    186},\r
192     {0x8c14923d,        (FX_LPCWSTR)L"ouml",    246},\r
193     {0x8c5a7cd6,        (FX_LPCWSTR)L"theta",   952},\r
194     {0x8d61812b,        (FX_LPCWSTR)L"thorn",   254},\r
195     {0x912b95aa,        (FX_LPCWSTR)L"asymp",   8776},\r
196     {0x947faf81,        (FX_LPCWSTR)L"middot",  183},\r
197     {0x9629202e,        (FX_LPCWSTR)L"lfloor",  8970},\r
198     {0x972e9ec1,        (FX_LPCWSTR)L"otilde",  245},\r
199     {0x9748f231,        (FX_LPCWSTR)L"otimes",  8855},\r
200     {0x995f1469,        (FX_LPCWSTR)L"Omega",   937},\r
201     {0x99eb5349,        (FX_LPCWSTR)L"quot",    34},\r
202     {0x9aeb639e,        (FX_LPCWSTR)L"hellip",  8230},\r
203     {0xa0ae2f86,        (FX_LPCWSTR)L"Scaron",  352},\r
204     {0xa4dcb0d5,        (FX_LPCWSTR)L"lsaquo",  8249},\r
205     {0xa53dbf41,        (FX_LPCWSTR)L"oacute",  243},\r
206     {0xa5ae9e7b,        (FX_LPCWSTR)L"bdquo",   8222},\r
207     {0xa602d7ba,        (FX_LPCWSTR)L"sdot",    8901},\r
208     {0xa61ce86f,        (FX_LPCWSTR)L"sect",    167},\r
209     {0xa6e4c3d7,        (FX_LPCWSTR)L"sigmaf",  962},\r
210     {0xa7c1c74f,        (FX_LPCWSTR)L"sube",    8838},\r
211     {0xa7c20ee9,        (FX_LPCWSTR)L"sup1",    185},\r
212     {0xa7c20eea,        (FX_LPCWSTR)L"sup2",    178},\r
213     {0xa7c20eeb,        (FX_LPCWSTR)L"sup3",    179},\r
214     {0xa7c20f1d,        (FX_LPCWSTR)L"supe",    8839},\r
215     {0xa8b66aa1,        (FX_LPCWSTR)L"Otilde",  213},\r
216     {0xad958c42,        (FX_LPCWSTR)L"AElig",   198},\r
217     {0xaea9261d,        (FX_LPCWSTR)L"Ouml",    214},\r
218     {0xb040eafa,        (FX_LPCWSTR)L"uArr",    8657},\r
219     {0xb07c2e1c,        (FX_LPCWSTR)L"beta",    946},\r
220     {0xb220e92f,        (FX_LPCWSTR)L"bull",    8226},\r
221     {0xb22750c4,        (FX_LPCWSTR)L"ccedil",  231},\r
222     {0xb38ab31a,        (FX_LPCWSTR)L"uarr",    8593},\r
223     {0xb598b683,        (FX_LPCWSTR)L"uuml",    252},\r
224     {0xb6c58b21,        (FX_LPCWSTR)L"Oacute",  211},\r
225     {0xb6d2a617,        (FX_LPCWSTR)L"oline",   8254},\r
226     {0xba9fd989,        (FX_LPCWSTR)L"dArr",    8659},\r
227     {0xbb5ccd41,        (FX_LPCWSTR)L"lgrave",  204},\r
228     {0xbd39b44c,        (FX_LPCWSTR)L"weierp",  8472},\r
229     {0xbde9a1a9,        (FX_LPCWSTR)L"darr",    8595},\r
230     {0xc027e329,        (FX_LPCWSTR)L"permil",  8240},\r
231     {0xc2451389,        (FX_LPCWSTR)L"upsih",   978},\r
232     {0xc3af1ca4,        (FX_LPCWSTR)L"Ccedil",  199},\r
233     {0xcd164249,        (FX_LPCWSTR)L"fnof",    402},\r
234     {0xcf6c8467,        (FX_LPCWSTR)L"hearts",  9829},\r
235     {0xd1228390,        (FX_LPCWSTR)L"trade",   8482},\r
236     {0xd1462407,        (FX_LPCWSTR)L"yuml",    255},\r
237     {0xd2cf2253,        (FX_LPCWSTR)L"oplus",   8853},\r
238     {0xd310c1fc,        (FX_LPCWSTR)L"Beta",    914},\r
239     {0xd59c4d74,        (FX_LPCWSTR)L"infin",   8734},\r
240     {0xd64d470d,        (FX_LPCWSTR)L"hArr",    8660},\r
241     {0xd67d9c75,        (FX_LPCWSTR)L"divide",  247},\r
242     {0xd698dd37,        (FX_LPCWSTR)L"Omicron", 927},\r
243     {0xd82d4a63,        (FX_LPCWSTR)L"Uuml",    220},\r
244     {0xd9970f2d,        (FX_LPCWSTR)L"harr",    8596},\r
245     {0xda91fd99,        (FX_LPCWSTR)L"clubs",   9827},\r
246     {0xdbe5bdcc,        (FX_LPCWSTR)L"there4",  8756},\r
247     {0xdd7671bd,        (FX_LPCWSTR)L"prime",   8242},\r
248     {0xdfcf3c06,        (FX_LPCWSTR)L"alpha",   945},\r
249     {0xe0213063,        (FX_LPCWSTR)L"saron",   353},\r
250     {0xe1911d83,        (FX_LPCWSTR)L"radic",   8730},\r
251     {0xe2e75468,        (FX_LPCWSTR)L"raquo",   187},\r
252     {0xe6e27a5e,        (FX_LPCWSTR)L"lacute",  205},\r
253     {0xe74a8f36,        (FX_LPCWSTR)L"ucirc",   251},\r
254     {0xe864ecb6,        (FX_LPCWSTR)L"Theta",   920},\r
255     {0xecddde5e,        (FX_LPCWSTR)L"nabla",   8711},\r
256     {0xed1c3557,        (FX_LPCWSTR)L"omicron", 959},\r
257     {0xef82228f,        (FX_LPCWSTR)L"rceil",   8969},\r
258     {0xf1fab491,        (FX_LPCWSTR)L"lArr",    8656},\r
259     {0xf3dab7e7,        (FX_LPCWSTR)L"Yuml",    376},\r
260     {0xf4294962,        (FX_LPCWSTR)L"laquo",   171},\r
261     {0xf5446822,        (FX_LPCWSTR)L"lang",    9001},\r
262     {0xf5447cb1,        (FX_LPCWSTR)L"larr",    8592},\r
263     {0xf66e9bea,        (FX_LPCWSTR)L"ugrave",  249},\r
264     {0xf6b4ce70,        (FX_LPCWSTR)L"lota",    921},\r
265     {0xf6ef34ed,        (FX_LPCWSTR)L"kappa",   954},\r
266     {0xf72a3a56,        (FX_LPCWSTR)L"thinsp",  8201},\r
267     {0xf752801a,        (FX_LPCWSTR)L"luml",    207},\r
268     {0xf88c8430,        (FX_LPCWSTR)L"ocirc",   244},\r
269     {0xf9676178,        (FX_LPCWSTR)L"frasl",   8260},\r
270     {0xfd01885e,        (FX_LPCWSTR)L"igrave",  236},\r
271     {0xff3281da,        (FX_LPCWSTR)L"egrave",  232},\r
272 };\r
273 static XFA_FMHtmlReserveCode reservesForEncode [] = {\r
274     {34,        (FX_LPCWSTR)(L"quot")},\r
275     {38,        (FX_LPCWSTR)(L"amp")},\r
276     {39,        (FX_LPCWSTR)(L"apos")},\r
277     {60,        (FX_LPCWSTR)(L"lt")},\r
278     {62,        (FX_LPCWSTR)(L"gt")},\r
279     {160,       (FX_LPCWSTR)(L"nbsp")},\r
280     {161,       (FX_LPCWSTR)(L"iexcl")},\r
281     {162,       (FX_LPCWSTR)(L"cent")},\r
282     {163,       (FX_LPCWSTR)(L"pund")},\r
283     {164,       (FX_LPCWSTR)(L"current")},\r
284     {165,       (FX_LPCWSTR)(L"yen")},\r
285     {166,       (FX_LPCWSTR)(L"brvbar")},\r
286     {167,       (FX_LPCWSTR)(L"sect")},\r
287     {168,       (FX_LPCWSTR)(L"uml")},\r
288     {169,       (FX_LPCWSTR)(L"copy")},\r
289     {170,       (FX_LPCWSTR)(L"ordf")},\r
290     {171,       (FX_LPCWSTR)(L"laquo")},\r
291     {172,       (FX_LPCWSTR)(L"not")},\r
292     {173,       (FX_LPCWSTR)(L"shy")},\r
293     {174,       (FX_LPCWSTR)(L"reg")},\r
294     {175,       (FX_LPCWSTR)(L"macr")},\r
295     {176,       (FX_LPCWSTR)(L"deg")},\r
296     {177,       (FX_LPCWSTR)(L"plusmn")},\r
297     {178,       (FX_LPCWSTR)(L"sup2")},\r
298     {179,       (FX_LPCWSTR)(L"sup3")},\r
299     {180,       (FX_LPCWSTR)(L"acute")},\r
300     {181,       (FX_LPCWSTR)(L"micro")},\r
301     {182,       (FX_LPCWSTR)(L"para")},\r
302     {183,       (FX_LPCWSTR)(L"middot")},\r
303     {184,       (FX_LPCWSTR)(L"cedil")},\r
304     {185,       (FX_LPCWSTR)(L"sup1")},\r
305     {186,       (FX_LPCWSTR)(L"ordm")},\r
306     {187,       (FX_LPCWSTR)(L"raquo")},\r
307     {188,       (FX_LPCWSTR)(L"frac14")},\r
308     {189,       (FX_LPCWSTR)(L"frac12")},\r
309     {190,       (FX_LPCWSTR)(L"frac34")},\r
310     {191,       (FX_LPCWSTR)(L"iquest")},\r
311     {192,       (FX_LPCWSTR)(L"Agrave")},\r
312     {193,       (FX_LPCWSTR)(L"Aacute")},\r
313     {194,       (FX_LPCWSTR)(L"Acirc")},\r
314     {195,       (FX_LPCWSTR)(L"Atilde")},\r
315     {196,       (FX_LPCWSTR)(L"Auml")},\r
316     {197,       (FX_LPCWSTR)(L"Aring")},\r
317     {198,       (FX_LPCWSTR)(L"AElig")},\r
318     {199,       (FX_LPCWSTR)(L"Ccedil")},\r
319     {200,       (FX_LPCWSTR)(L"Egrave")},\r
320     {201,       (FX_LPCWSTR)(L"Eacute")},\r
321     {202,       (FX_LPCWSTR)(L"Ecirc")},\r
322     {203,       (FX_LPCWSTR)(L"Euml")},\r
323     {204,       (FX_LPCWSTR)(L"lgrave")},\r
324     {205,       (FX_LPCWSTR)(L"lacute")},\r
325     {206,       (FX_LPCWSTR)(L"lcirc")},\r
326     {207,       (FX_LPCWSTR)(L"luml")},\r
327     {208,       (FX_LPCWSTR)(L"ETH")},\r
328     {209,       (FX_LPCWSTR)(L"Ntilde")},\r
329     {210,       (FX_LPCWSTR)(L"Ograve")},\r
330     {211,       (FX_LPCWSTR)(L"Oacute")},\r
331     {212,       (FX_LPCWSTR)(L"Ocirc")},\r
332     {213,       (FX_LPCWSTR)(L"Otilde")},\r
333     {214,       (FX_LPCWSTR)(L"Ouml")},\r
334     {215,       (FX_LPCWSTR)(L"times")},\r
335     {216,       (FX_LPCWSTR)(L"Oslash")},\r
336     {217,       (FX_LPCWSTR)(L"Ugrave")},\r
337     {218,       (FX_LPCWSTR)(L"Uacute")},\r
338     {219,       (FX_LPCWSTR)(L"Ucirc")},\r
339     {220,       (FX_LPCWSTR)(L"Uuml")},\r
340     {221,       (FX_LPCWSTR)(L"Yacute")},\r
341     {222,       (FX_LPCWSTR)(L"THORN")},\r
342     {223,       (FX_LPCWSTR)(L"szlig")},\r
343     {224,       (FX_LPCWSTR)(L"agrave")},\r
344     {225,       (FX_LPCWSTR)(L"aacute")},\r
345     {226,       (FX_LPCWSTR)(L"acirc")},\r
346     {227,       (FX_LPCWSTR)(L"atilde")},\r
347     {228,       (FX_LPCWSTR)(L"auml")},\r
348     {229,       (FX_LPCWSTR)(L"aring")},\r
349     {230,       (FX_LPCWSTR)(L"aelig")          },\r
350     {231,       (FX_LPCWSTR)(L"ccedil")         },\r
351     {232,       (FX_LPCWSTR)(L"egrave")         },\r
352     {233,       (FX_LPCWSTR)(L"eacute")         },\r
353     {234,       (FX_LPCWSTR)(L"ecirc")          },\r
354     {235,       (FX_LPCWSTR)(L"euml")           },\r
355     {236,       (FX_LPCWSTR)(L"igrave")         },\r
356     {237,       (FX_LPCWSTR)(L"iacute")         },\r
357     {238,       (FX_LPCWSTR)(L"icirc")          },\r
358     {239,       (FX_LPCWSTR)(L"iuml")           },\r
359     {240,       (FX_LPCWSTR)(L"eth")            },\r
360     {241,       (FX_LPCWSTR)(L"ntilde")         },\r
361     {242,       (FX_LPCWSTR)(L"ograve")         },\r
362     {243,       (FX_LPCWSTR)(L"oacute")         },\r
363     {244,       (FX_LPCWSTR)(L"ocirc")          },\r
364     {245,       (FX_LPCWSTR)(L"otilde")         },\r
365     {246,       (FX_LPCWSTR)(L"ouml")           },\r
366     {247,       (FX_LPCWSTR)(L"divide")         },\r
367     {248,       (FX_LPCWSTR)(L"oslash")         },\r
368     {249,       (FX_LPCWSTR)(L"ugrave")         },\r
369     {250,       (FX_LPCWSTR)(L"uacute")         },\r
370     {251,       (FX_LPCWSTR)(L"ucirc")          },\r
371     {252,       (FX_LPCWSTR)(L"uuml")           },\r
372     {253,       (FX_LPCWSTR)(L"yacute")         },\r
373     {254,       (FX_LPCWSTR)(L"thorn")          },\r
374     {255,       (FX_LPCWSTR)(L"yuml")           },\r
375     {338,       (FX_LPCWSTR)(L"OElig")          },\r
376     {339,       (FX_LPCWSTR)(L"oelig")          },\r
377     {352,       (FX_LPCWSTR)(L"Scaron")         },\r
378     {353,       (FX_LPCWSTR)(L"saron")          },\r
379     {376,       (FX_LPCWSTR)(L"Yuml")           },\r
380     {402,       (FX_LPCWSTR)(L"fnof")           },\r
381     {710,       (FX_LPCWSTR)(L"circ")           },\r
382     {732,       (FX_LPCWSTR)(L"tilde")          },\r
383     {913,       (FX_LPCWSTR)(L"Alpha")          },\r
384     {914,       (FX_LPCWSTR)(L"Beta")           },\r
385     {915,       (FX_LPCWSTR)(L"Gamma")          },\r
386     {916,       (FX_LPCWSTR)(L"Delta")          },\r
387     {917,       (FX_LPCWSTR)(L"Epsilon")        },\r
388     {918,       (FX_LPCWSTR)(L"Zeta")           },\r
389     {919,       (FX_LPCWSTR)(L"Eta")            },\r
390     {920,       (FX_LPCWSTR)(L"Theta")          },\r
391     {921,       (FX_LPCWSTR)(L"lota")           },\r
392     {922,       (FX_LPCWSTR)(L"Kappa")          },\r
393     {923,       (FX_LPCWSTR)(L"Lambda")         },\r
394     {924,       (FX_LPCWSTR)(L"Mu")                     },\r
395     {925,       (FX_LPCWSTR)(L"Nu")                     },\r
396     {926,       (FX_LPCWSTR)(L"Xi")                     },\r
397     {927,       (FX_LPCWSTR)(L"Omicron")        },\r
398     {928,       (FX_LPCWSTR)(L"Pi")                     },\r
399     {929,       (FX_LPCWSTR)(L"Rho")            },\r
400     {931,       (FX_LPCWSTR)(L"Sigma")          },\r
401     {932,       (FX_LPCWSTR)(L"Tau")            },\r
402     {933,       (FX_LPCWSTR)(L"Upsilon")        },\r
403     {934,       (FX_LPCWSTR)(L"Phi")            },\r
404     {935,       (FX_LPCWSTR)(L"Chi")            },\r
405     {936,       (FX_LPCWSTR)(L"Psi")            },\r
406     {937,       (FX_LPCWSTR)(L"Omega")          },\r
407     {945,       (FX_LPCWSTR)(L"alpha")          },\r
408     {946,       (FX_LPCWSTR)(L"beta")           },\r
409     {947,       (FX_LPCWSTR)(L"gamma")          },\r
410     {948,       (FX_LPCWSTR)(L"delta")          },\r
411     {949,       (FX_LPCWSTR)(L"epsilon")        },\r
412     {950,       (FX_LPCWSTR)(L"zeta")           },\r
413     {951,       (FX_LPCWSTR)(L"eta")            },\r
414     {952,       (FX_LPCWSTR)(L"theta")          },\r
415     {953,       (FX_LPCWSTR)(L"iota")           },\r
416     {954,       (FX_LPCWSTR)(L"kappa")          },\r
417     {955,       (FX_LPCWSTR)(L"lambda")         },\r
418     {956,       (FX_LPCWSTR)(L"mu")                     },\r
419     {957,       (FX_LPCWSTR)(L"nu")                     },\r
420     {958,       (FX_LPCWSTR)(L"xi")                     },\r
421     {959,       (FX_LPCWSTR)(L"omicron")        },\r
422     {960,       (FX_LPCWSTR)(L"pi")                     },\r
423     {961,       (FX_LPCWSTR)(L"rho")            },\r
424     {962,       (FX_LPCWSTR)(L"sigmaf")         },\r
425     {963,       (FX_LPCWSTR)(L"sigma")          },\r
426     {964,       (FX_LPCWSTR)(L"tau")            },\r
427     {965,       (FX_LPCWSTR)(L"upsilon")        },\r
428     {966,       (FX_LPCWSTR)(L"phi")            },\r
429     {967,       (FX_LPCWSTR)(L"chi")            },\r
430     {968,       (FX_LPCWSTR)(L"psi")            },\r
431     {969,       (FX_LPCWSTR)(L"omega")          },\r
432     {977,       (FX_LPCWSTR)(L"thetasym")       },\r
433     {978,       (FX_LPCWSTR)(L"upsih")          },\r
434     {982,       (FX_LPCWSTR)(L"piv")            },\r
435     {8194,      (FX_LPCWSTR)(L"ensp")           },\r
436     {8195,      (FX_LPCWSTR)(L"emsp")           },\r
437     {8201,      (FX_LPCWSTR)(L"thinsp")         },\r
438     {8204,      (FX_LPCWSTR)(L"zwnj")           },\r
439     {8205,      (FX_LPCWSTR)(L"zwj")            },\r
440     {8206,      (FX_LPCWSTR)(L"lrm")            },\r
441     {8207,      (FX_LPCWSTR)(L"rlm")            },\r
442     {8211,      (FX_LPCWSTR)(L"ndash")          },\r
443     {8212,      (FX_LPCWSTR)(L"mdash")          },\r
444     {8216,      (FX_LPCWSTR)(L"lsquo")          },\r
445     {8217,      (FX_LPCWSTR)(L"rsquo")          },\r
446     {8218,      (FX_LPCWSTR)(L"sbquo")          },\r
447     {8220,      (FX_LPCWSTR)(L"ldquo")          },\r
448     {8221,      (FX_LPCWSTR)(L"tdquo")          },\r
449     {8222,      (FX_LPCWSTR)(L"bdquo")          },\r
450     {8224,      (FX_LPCWSTR)(L"dagger")         },\r
451     {8225,      (FX_LPCWSTR)(L"Dagger")         },\r
452     {8226,      (FX_LPCWSTR)(L"bull")           },\r
453     {8230,      (FX_LPCWSTR)(L"hellip")         },\r
454     {8240,      (FX_LPCWSTR)(L"permil")         },\r
455     {8242,      (FX_LPCWSTR)(L"prime")          },\r
456     {8249,      (FX_LPCWSTR)(L"lsaquo")         },\r
457     {8250,      (FX_LPCWSTR)(L"rsaquo")         },\r
458     {8254,      (FX_LPCWSTR)(L"oline")          },\r
459     {8260,      (FX_LPCWSTR)(L"frasl")          },\r
460     {8364,      (FX_LPCWSTR)(L"euro")           },\r
461     {8465,      (FX_LPCWSTR)(L"image")          },\r
462     {8472,      (FX_LPCWSTR)(L"weierp")         },\r
463     {8476,      (FX_LPCWSTR)(L"real")           },\r
464     {8482,      (FX_LPCWSTR)(L"trade")          },\r
465     {8501,      (FX_LPCWSTR)(L"alefsym")        },\r
466     {8592,      (FX_LPCWSTR)(L"larr")           },\r
467     {8593,      (FX_LPCWSTR)(L"uarr")           },\r
468     {8594,      (FX_LPCWSTR)(L"rarr")           },\r
469     {8595,      (FX_LPCWSTR)(L"darr")           },\r
470     {8596,      (FX_LPCWSTR)(L"harr")           },\r
471     {8629,      (FX_LPCWSTR)(L"crarr")          },\r
472     {8656,      (FX_LPCWSTR)(L"lArr")           },\r
473     {8657,      (FX_LPCWSTR)(L"uArr")           },\r
474     {8658,      (FX_LPCWSTR)(L"rArr")           },\r
475     {8659,      (FX_LPCWSTR)(L"dArr")           },\r
476     {8660,      (FX_LPCWSTR)(L"hArr")           },\r
477     {8704,      (FX_LPCWSTR)(L"forall")         },\r
478     {8706,      (FX_LPCWSTR)(L"part")           },\r
479     {8707,      (FX_LPCWSTR)(L"exist")          },\r
480     {8709,      (FX_LPCWSTR)(L"empty")          },\r
481     {8711,      (FX_LPCWSTR)(L"nabla")          },\r
482     {8712,      (FX_LPCWSTR)(L"isin")           },\r
483     {8713,      (FX_LPCWSTR)(L"notin")          },\r
484     {8715,      (FX_LPCWSTR)(L"ni")             },\r
485     {8719,      (FX_LPCWSTR)(L"prod")   },\r
486     {8721,      (FX_LPCWSTR)(L"sum")    },\r
487     {8722,      (FX_LPCWSTR)(L"minus")  },\r
488     {8727,      (FX_LPCWSTR)(L"lowast") },\r
489     {8730,      (FX_LPCWSTR)(L"radic")  },\r
490     {8733,      (FX_LPCWSTR)(L"prop")   },\r
491     {8734,      (FX_LPCWSTR)(L"infin")  },\r
492     {8736,      (FX_LPCWSTR)(L"ang")    },\r
493     {8743,      (FX_LPCWSTR)(L"and")    },\r
494     {8744,      (FX_LPCWSTR)(L"or")             },\r
495     {8745,      (FX_LPCWSTR)(L"cap")    },\r
496     {8746,      (FX_LPCWSTR)(L"cup")    },\r
497     {8747,      (FX_LPCWSTR)(L"int")    },\r
498     {8756,      (FX_LPCWSTR)(L"there4") },\r
499     {8764,      (FX_LPCWSTR)(L"sim")    },\r
500     {8773,      (FX_LPCWSTR)(L"cong")   },\r
501     {8776,      (FX_LPCWSTR)(L"asymp")  },\r
502     {8800,      (FX_LPCWSTR)(L"ne")             },\r
503     {8801,      (FX_LPCWSTR)(L"equiv")  },\r
504     {8804,      (FX_LPCWSTR)(L"le")             },\r
505     {8805,      (FX_LPCWSTR)(L"ge")             },\r
506     {8834,      (FX_LPCWSTR)(L"sub")    },\r
507     {8835,      (FX_LPCWSTR)(L"sup")    },\r
508     {8836,      (FX_LPCWSTR)(L"nsub")   },\r
509     {8838,      (FX_LPCWSTR)(L"sube")   },\r
510     {8839,      (FX_LPCWSTR)(L"supe")   },\r
511     {8853,      (FX_LPCWSTR)(L"oplus")  },\r
512     {8855,      (FX_LPCWSTR)(L"otimes") },\r
513     {8869,      (FX_LPCWSTR)(L"perp")   },\r
514     {8901,      (FX_LPCWSTR)(L"sdot")   },\r
515     {8968,      (FX_LPCWSTR)(L"lceil")  },\r
516     {8969,      (FX_LPCWSTR)(L"rceil")  },\r
517     {8970,      (FX_LPCWSTR)(L"lfloor") },\r
518     {8971,      (FX_LPCWSTR)(L"rfloor") },\r
519     {9001,      (FX_LPCWSTR)(L"lang")   },\r
520     {9002,      (FX_LPCWSTR)(L"rang")   },\r
521     {9674,      (FX_LPCWSTR)(L"loz")    },\r
522     {9824,      (FX_LPCWSTR)(L"spades") },\r
523     {9827,      (FX_LPCWSTR)(L"clubs")  },\r
524     {9829,      (FX_LPCWSTR)(L"hearts") },\r
525     {9830,      (FX_LPCWSTR)(L"diams")  },\r
526 };\r
527 void CXFA_FM2JSContext::Abs(FXJSE_HOBJECT hThis,        FX_BSTR szFuncName, CFXJSE_Arguments &args)\r
528 {\r
529     if(args.GetLength() == 1) {\r
530         FXJSE_HVALUE argOne = args.GetValue(0);\r
531         if(HValueIsNull(hThis, argOne)) {\r
532             FXJSE_Value_SetNull(args.GetReturnValue());\r
533         } else {\r
534             FX_DOUBLE dValue = HValueToDouble(hThis, argOne);\r
535             if(dValue < 0) {\r
536                 dValue = -dValue;\r
537             }\r
538             FXJSE_Value_SetDouble(args.GetReturnValue(), dValue);\r
539         }\r
540         FXJSE_Value_Release(argOne);\r
541     } else {\r
542         CXFA_FM2JSContext* pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);\r
543         pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Abs"));\r
544     }\r
545 }\r
546 void CXFA_FM2JSContext::Avg(FXJSE_HOBJECT hThis,        FX_BSTR szFuncName, CFXJSE_Arguments &args)\r
547 {\r
548     CXFA_FM2JSContext*  pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);\r
549     FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();\r
550     FX_INT32 argc = args.GetLength();\r
551     FX_UINT32 uCount = 0;\r
552     FX_DOUBLE dSum = 0.0;\r
553     if(argc >= 1) {\r
554         FXJSE_HVALUE argValue = 0;\r
555         for(FX_INT32 i = 0; i < argc; i++) {\r
556             argValue = args.GetValue(i);\r
557             if(FXJSE_Value_IsNull(argValue)) {\r
558                 FXJSE_Value_Release(argValue);\r
559                 continue;\r
560             } else if(FXJSE_Value_IsArray(argValue)) {\r
561                 FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);\r
562                 FXJSE_Value_GetObjectProp(argValue, FX_BSTRC("length"), lengthValue);\r
563                 FX_INT32 iLength = FXJSE_Value_ToInteger(lengthValue);\r
564                 FXJSE_Value_Release(lengthValue);\r
565                 if(iLength > 2) {\r
566                     FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);\r
567                     FXJSE_Value_GetObjectPropByIdx(argValue, 1, propertyValue);\r
568                     FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);\r
569                     if(FXJSE_Value_IsNull(propertyValue)) {\r
570                         for(FX_INT32 j = 2; j < iLength; j++) {\r
571                             FXJSE_Value_GetObjectPropByIdx(argValue, j, jsObjectValue);\r
572                             FXJSE_HVALUE defaultPropValue = FXJSE_Value_Create(hruntime);\r
573                             GetObjectDefaultValue(jsObjectValue, defaultPropValue);\r
574                             if (!FXJSE_Value_IsNull(defaultPropValue)) {\r
575                                 dSum += HValueToDouble(hThis, defaultPropValue);\r
576                                 uCount++;\r
577                             }\r
578                             FXJSE_Value_Release(defaultPropValue);\r
579                         }\r
580                     } else {\r
581                         CFX_ByteString propertyStr;\r
582                         FXJSE_Value_ToUTF8String(propertyValue, propertyStr);\r
583                         FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);\r
584                         for(FX_INT32 j = 2; j < iLength; j++) {\r
585                             FXJSE_Value_GetObjectPropByIdx(argValue, j, jsObjectValue);\r
586                             FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr, newPropertyValue);\r
587                             if (!FXJSE_Value_IsNull(newPropertyValue)) {\r
588                                 dSum += HValueToDouble(hThis, newPropertyValue);\r
589                                 uCount++;\r
590                             }\r
591                         }\r
592                         FXJSE_Value_Release(newPropertyValue);\r
593                     }\r
594                     FXJSE_Value_Release(jsObjectValue);\r
595                     FXJSE_Value_Release(propertyValue);\r
596                 }\r
597             } else {\r
598                 dSum += HValueToDouble(hThis, argValue);\r
599                 uCount++;\r
600             }\r
601             FXJSE_Value_Release(argValue);\r
602         }\r
603         argValue = 0;\r
604     }\r
605     if(0 == uCount) {\r
606         FXJSE_Value_SetNull(args.GetReturnValue());\r
607     } else {\r
608         FXJSE_Value_SetDouble(args.GetReturnValue(), dSum / uCount);\r
609     }\r
610 }\r
611 void CXFA_FM2JSContext::Ceil(FXJSE_HOBJECT hThis,       FX_BSTR szFuncName, CFXJSE_Arguments &args)\r
612 {\r
613     CXFA_FM2JSContext*  pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);\r
614     FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();\r
615     if(args.GetLength() == 1) {\r
616         FXJSE_HVALUE argValue = GetSimpleHValue(hThis, args, 0);\r
617         if (HValueIsNull(hThis, argValue)) {\r
618             FXJSE_Value_SetNull(args.GetReturnValue());\r
619         } else {\r
620             FXJSE_Value_SetFloat(args.GetReturnValue(), FXSYS_ceil(HValueToFloat(hThis, argValue)));\r
621         }\r
622         FXJSE_Value_Release(argValue);\r
623     } else {\r
624         pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Ceil"));\r
625     }\r
626 }\r
627 void CXFA_FM2JSContext::Count(FXJSE_HOBJECT hThis,      FX_BSTR szFuncName, CFXJSE_Arguments &args)\r
628 {\r
629     CXFA_FM2JSContext*  pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);\r
630     FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();\r
631     FX_INT32 argc = args.GetLength();\r
632     FX_UINT32 uCount = 0;\r
633     FXJSE_HVALUE argValue = 0;\r
634     for(FX_INT32 i = 0; i < argc; i++) {\r
635         argValue = args.GetValue(i);\r
636         if(FXJSE_Value_IsNull(argValue)) {\r
637             FXJSE_Value_Release(argValue);\r
638             continue;\r
639         } else if(FXJSE_Value_IsArray(argValue)) {\r
640             FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);\r
641             FXJSE_Value_GetObjectProp(argValue, FX_BSTRC("length"), lengthValue);\r
642             FX_INT32 iLength = FXJSE_Value_ToInteger(lengthValue);\r
643             FXJSE_Value_Release(lengthValue);\r
644             if(iLength > 2) {\r
645                 FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);\r
646                 FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);\r
647                 FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);\r
648                 FXJSE_Value_GetObjectPropByIdx(argValue, 1, propertyValue);\r
649                 FXJSE_Value_GetObjectPropByIdx(argValue, 2, jsObjectValue);\r
650                 if(FXJSE_Value_IsNull(propertyValue)) {\r
651                     for(FX_INT32 i = 2; i < iLength; i++) {\r
652                         FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue);\r
653                         GetObjectDefaultValue(jsObjectValue, newPropertyValue);\r
654                         if (!FXJSE_Value_IsNull(newPropertyValue)) {\r
655                             uCount++;\r
656                         }\r
657                     }\r
658                 } else {\r
659                     CFX_ByteString propertyStr;\r
660                     FXJSE_Value_ToUTF8String(propertyValue, propertyStr);\r
661                     for(FX_INT32 i = 2; i < iLength; i++) {\r
662                         FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue);\r
663                         FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr, newPropertyValue);\r
664                         uCount += (FXJSE_Value_IsNull(newPropertyValue) ? 0 : 1);\r
665                     }\r
666                 }\r
667                 FXJSE_Value_Release(propertyValue);\r
668                 FXJSE_Value_Release(jsObjectValue);\r
669                 FXJSE_Value_Release(newPropertyValue);\r
670             } else {\r
671                 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);\r
672             }\r
673         } else if(FXJSE_Value_IsObject(argValue)) {\r
674             FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);\r
675             GetObjectDefaultValue(argValue, newPropertyValue);\r
676             if (!FXJSE_Value_IsNull(newPropertyValue)) {\r
677                 uCount++;\r
678             }\r
679             FXJSE_Value_Release(newPropertyValue);\r
680         } else {\r
681             uCount++;\r
682         }\r
683         FXJSE_Value_Release(argValue);\r
684     }\r
685     argValue = 0;\r
686     FXJSE_Value_SetInteger(args.GetReturnValue(), (FX_INT32)uCount);\r
687 }\r
688 void CXFA_FM2JSContext::Floor(FXJSE_HOBJECT hThis,      FX_BSTR szFuncName, CFXJSE_Arguments &args)\r
689 {\r
690     CXFA_FM2JSContext*  pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);\r
691     FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();\r
692     if(args.GetLength() == 1) {\r
693         FXJSE_HVALUE argValue = GetSimpleHValue(hThis, args, 0);\r
694         if (HValueIsNull(hThis, argValue)) {\r
695             FXJSE_Value_SetNull(args.GetReturnValue());\r
696         } else {\r
697             FXJSE_Value_SetFloat(args.GetReturnValue(), FXSYS_floor(HValueToFloat(hThis, argValue)));\r
698         }\r
699         FXJSE_Value_Release(argValue);\r
700     } else {\r
701         pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Floor"));\r
702     }\r
703 }\r
704 void CXFA_FM2JSContext::Max(FXJSE_HOBJECT hThis,        FX_BSTR szFuncName, CFXJSE_Arguments &args)\r
705 {\r
706     CXFA_FM2JSContext*  pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);\r
707     FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();\r
708     FX_INT32 argc = args.GetLength();\r
709     FX_UINT32 uCount = 0;\r
710     FX_DOUBLE dMaxValue = 0.0;\r
711     FXJSE_HVALUE argValue = 0;\r
712     for(FX_INT32 i = 0; i < argc; i++) {\r
713         argValue = args.GetValue(i);\r
714         if(FXJSE_Value_IsNull(argValue)) {\r
715             FXJSE_Value_Release(argValue);\r
716             continue;\r
717         } else if(FXJSE_Value_IsArray(argValue)) {\r
718             FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);\r
719             FXJSE_Value_GetObjectProp(argValue, FX_BSTRC("length"), lengthValue);\r
720             FX_INT32 iLength = FXJSE_Value_ToInteger(lengthValue);\r
721             FXJSE_Value_Release(lengthValue);\r
722             if(iLength > 2) {\r
723                 FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);\r
724                 FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);\r
725                 FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);\r
726                 FXJSE_Value_GetObjectPropByIdx(argValue, 1, propertyValue);\r
727                 FXJSE_Value_GetObjectPropByIdx(argValue, 2, jsObjectValue);\r
728                 if(FXJSE_Value_IsNull(propertyValue)) {\r
729                     for(FX_INT32 i = 2; i < iLength; i++) {\r
730                         FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue);\r
731                         GetObjectDefaultValue(jsObjectValue, newPropertyValue);\r
732                         if(!FXJSE_Value_IsNull(newPropertyValue)) {\r
733                             uCount++;\r
734                             if(uCount == 1) {\r
735                                 dMaxValue = HValueToDouble(hThis, newPropertyValue);\r
736                             } else {\r
737                                 FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue);\r
738                                 if(dMaxValue < dValue) {\r
739                                     dMaxValue = dValue;\r
740                                 }\r
741                             }\r
742                         }\r
743                     }\r
744                 } else {\r
745                     CFX_ByteString propertyStr;\r
746                     FXJSE_Value_ToUTF8String(propertyValue, propertyStr);\r
747                     for(FX_INT32 i = 2; i < iLength; i++) {\r
748                         FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue);\r
749                         FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr, newPropertyValue);\r
750                         if(!FXJSE_Value_IsNull(newPropertyValue)) {\r
751                             uCount++;\r
752                             if(uCount == 1) {\r
753                                 dMaxValue = HValueToDouble(hThis, newPropertyValue);\r
754                             } else {\r
755                                 FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue);\r
756                                 if(dMaxValue < dValue) {\r
757                                     dMaxValue = dValue;\r
758                                 }\r
759                             }\r
760                         }\r
761                     }\r
762                 }\r
763                 FXJSE_Value_Release(propertyValue);\r
764                 FXJSE_Value_Release(jsObjectValue);\r
765                 FXJSE_Value_Release(newPropertyValue);\r
766             } else {\r
767                 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);\r
768             }\r
769         } else if(FXJSE_Value_IsObject(argValue)) {\r
770             FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);\r
771             GetObjectDefaultValue(argValue, newPropertyValue);\r
772             if(!FXJSE_Value_IsNull(newPropertyValue)) {\r
773                 uCount++;\r
774                 if(uCount == 1) {\r
775                     dMaxValue = HValueToDouble(hThis, newPropertyValue);\r
776                 } else {\r
777                     FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue);\r
778                     if(dMaxValue < dValue) {\r
779                         dMaxValue = dValue;\r
780                     }\r
781                 }\r
782             }\r
783             FXJSE_Value_Release(newPropertyValue);\r
784         } else {\r
785             uCount++;\r
786             if(uCount == 1) {\r
787                 dMaxValue = HValueToDouble(hThis, argValue);\r
788             } else {\r
789                 FX_DOUBLE dValue = HValueToDouble(hThis, argValue);\r
790                 if(dMaxValue < dValue) {\r
791                     dMaxValue = dValue;\r
792                 }\r
793             }\r
794         }\r
795         FXJSE_Value_Release(argValue);\r
796     }\r
797     argValue = 0;\r
798     if(uCount) {\r
799         FXJSE_Value_SetDouble(args.GetReturnValue(), dMaxValue);\r
800     } else {\r
801         FXJSE_Value_SetNull(args.GetReturnValue());\r
802     }\r
803 }\r
804 void CXFA_FM2JSContext::Min(FXJSE_HOBJECT hThis,        FX_BSTR szFuncName, CFXJSE_Arguments &args)\r
805 {\r
806     CXFA_FM2JSContext*  pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);\r
807     FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();\r
808     FX_INT32 argc = args.GetLength();\r
809     FX_UINT32 uCount = 0;\r
810     FX_DOUBLE dMinValue = 0.0;\r
811     FXJSE_HVALUE argValue = 0;\r
812     for(FX_INT32 i = 0; i < argc; i++) {\r
813         argValue = args.GetValue(i);\r
814         if(FXJSE_Value_IsNull(argValue)) {\r
815             FXJSE_Value_Release(argValue);\r
816             continue;\r
817         } else if(FXJSE_Value_IsArray(argValue)) {\r
818             FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);\r
819             FXJSE_Value_GetObjectProp(argValue, FX_BSTRC("length"), lengthValue);\r
820             FX_INT32 iLength = FXJSE_Value_ToInteger(lengthValue);\r
821             FXJSE_Value_Release(lengthValue);\r
822             if(iLength > 2) {\r
823                 FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);\r
824                 FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);\r
825                 FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);\r
826                 FXJSE_Value_GetObjectPropByIdx(argValue, 1, propertyValue);\r
827                 FXJSE_Value_GetObjectPropByIdx(argValue, 2, jsObjectValue);\r
828                 if(FXJSE_Value_IsNull(propertyValue)) {\r
829                     for(FX_INT32 i = 2; i < iLength; i++) {\r
830                         FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue);\r
831                         GetObjectDefaultValue(jsObjectValue, newPropertyValue);\r
832                         if(!FXJSE_Value_IsNull(newPropertyValue)) {\r
833                             uCount++;\r
834                             if(uCount == 1) {\r
835                                 dMinValue = HValueToDouble(hThis, newPropertyValue);\r
836                             } else {\r
837                                 FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue);\r
838                                 if(dMinValue > dValue) {\r
839                                     dMinValue = dValue;\r
840                                 }\r
841                             }\r
842                         }\r
843                     }\r
844                 } else {\r
845                     CFX_ByteString propertyStr;\r
846                     FXJSE_Value_ToUTF8String(propertyValue, propertyStr);\r
847                     for(FX_INT32 i = 2; i < iLength; i++) {\r
848                         FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue);\r
849                         FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr, newPropertyValue);\r
850                         if(!FXJSE_Value_IsNull(newPropertyValue)) {\r
851                             uCount++;\r
852                             if(uCount == 1) {\r
853                                 dMinValue = HValueToDouble(hThis, newPropertyValue);\r
854                             } else {\r
855                                 FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue);\r
856                                 if(dMinValue > dValue) {\r
857                                     dMinValue = dValue;\r
858                                 }\r
859                             }\r
860                         }\r
861                     }\r
862                 }\r
863                 FXJSE_Value_Release(propertyValue);\r
864                 FXJSE_Value_Release(jsObjectValue);\r
865                 FXJSE_Value_Release(newPropertyValue);\r
866             } else {\r
867                 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);\r
868             }\r
869         } else if(FXJSE_Value_IsObject(argValue)) {\r
870             FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);\r
871             GetObjectDefaultValue(argValue, newPropertyValue);\r
872             if(!FXJSE_Value_IsNull(newPropertyValue)) {\r
873                 uCount++;\r
874                 if(uCount == 1) {\r
875                     dMinValue = HValueToDouble(hThis, newPropertyValue);\r
876                 } else {\r
877                     FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue);\r
878                     if(dMinValue > dValue) {\r
879                         dMinValue = dValue;\r
880                     }\r
881                 }\r
882             }\r
883             FXJSE_Value_Release(newPropertyValue);\r
884         } else {\r
885             uCount++;\r
886             if(uCount == 1) {\r
887                 dMinValue = HValueToDouble(hThis, argValue);\r
888             } else {\r
889                 FX_DOUBLE dValue = HValueToDouble(hThis, argValue);\r
890                 if(dMinValue > dValue) {\r
891                     dMinValue = dValue;\r
892                 }\r
893             }\r
894         }\r
895         FXJSE_Value_Release(argValue);\r
896     }\r
897     argValue = 0;\r
898     if(uCount) {\r
899         FXJSE_Value_SetDouble(args.GetReturnValue(), dMinValue);\r
900     } else {\r
901         FXJSE_Value_SetNull(args.GetReturnValue());\r
902     }\r
903 }\r
904 void CXFA_FM2JSContext::Mod(FXJSE_HOBJECT hThis,        FX_BSTR szFuncName, CFXJSE_Arguments &args)\r
905 {\r
906     CXFA_FM2JSContext*  pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);\r
907     FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();\r
908     if(args.GetLength() == 2) {\r
909         FXJSE_HVALUE argOne = args.GetValue(0);\r
910         FXJSE_HVALUE argTwo = args.GetValue(1);\r
911         if(FXJSE_Value_IsNull(argOne) || FXJSE_Value_IsNull(argTwo)) {\r
912             FXJSE_Value_SetNull(args.GetReturnValue());\r
913         } else {\r
914             FX_DOUBLE dDividend = 0.0;\r
915             FX_DOUBLE dDividor = 0.0;\r
916             if(FXJSE_Value_IsArray(argOne)) {\r
917                 FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);\r
918                 FXJSE_Value_GetObjectProp(argOne, FX_BSTRC("length"), lengthValue);\r
919                 FX_INT32 iLength = FXJSE_Value_ToInteger(lengthValue);\r
920                 FXJSE_Value_Release(lengthValue);\r
921                 if(iLength > 2) {\r
922                     FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);\r
923                     FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);\r
924                     FXJSE_Value_GetObjectPropByIdx(argOne, 1, propertyValue);\r
925                     FXJSE_Value_GetObjectPropByIdx(argOne, 2, jsObjectValue);\r
926                     if(FXJSE_Value_IsNull(propertyValue)) {\r
927                         dDividend = HValueToDouble(hThis, jsObjectValue);\r
928                     } else {\r
929                         CFX_ByteString propertyStr;\r
930                         FXJSE_Value_ToUTF8String(propertyValue, propertyStr);\r
931                         FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);\r
932                         FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr, newPropertyValue);\r
933                         dDividend = HValueToDouble(hThis, newPropertyValue);\r
934                         FXJSE_Value_Release(newPropertyValue);\r
935                     }\r
936                     FXJSE_Value_Release(propertyValue);\r
937                     FXJSE_Value_Release(jsObjectValue);\r
938                 } else {\r
939                     pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);\r
940                 }\r
941             } else {\r
942                 dDividend = HValueToDouble(hThis, argOne);\r
943             }\r
944             if(FXJSE_Value_IsArray(argTwo)) {\r
945                 FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);\r
946                 FXJSE_Value_GetObjectProp(argTwo, FX_BSTRC("length"), lengthValue);\r
947                 FX_INT32 iLength = FXJSE_Value_ToInteger(lengthValue);\r
948                 FXJSE_Value_Release(lengthValue);\r
949                 if(iLength > 2) {\r
950                     FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);\r
951                     FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);\r
952                     FXJSE_Value_GetObjectPropByIdx(argTwo, 1, propertyValue);\r
953                     FXJSE_Value_GetObjectPropByIdx(argTwo, 2, jsObjectValue);\r
954                     if(FXJSE_Value_IsNull(propertyValue)) {\r
955                         dDividor = HValueToDouble(hThis, jsObjectValue);\r
956                     } else {\r
957                         CFX_ByteString propertyStr;\r
958                         FXJSE_Value_ToUTF8String(propertyValue, propertyStr);\r
959                         FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);\r
960                         FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr, newPropertyValue);\r
961                         dDividor = HValueToDouble(hThis, newPropertyValue);\r
962                         FXJSE_Value_Release(newPropertyValue);\r
963                     }\r
964                     FXJSE_Value_Release(propertyValue);\r
965                     FXJSE_Value_Release(jsObjectValue);\r
966                 } else {\r
967                     pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);\r
968                 }\r
969             } else {\r
970                 dDividor = HValueToDouble(hThis, argTwo);\r
971             }\r
972             if(dDividor) {\r
973                 FXJSE_Value_SetDouble(args.GetReturnValue(), dDividend - dDividor * (FX_INT32)(dDividend / dDividor));\r
974             } else {\r
975                 pContext->ThrowScriptErrorMessage(XFA_IDS_DIVIDE_ZERO);\r
976             }\r
977         }\r
978         FXJSE_Value_Release(argOne);\r
979         FXJSE_Value_Release(argTwo);\r
980     } else {\r
981         pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Mod"));\r
982     }\r
983 }\r
984 void CXFA_FM2JSContext::Round(FXJSE_HOBJECT hThis,      FX_BSTR szFuncName, CFXJSE_Arguments &args)\r
985 {\r
986     CXFA_FM2JSContext*  pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);\r
987     FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();\r
988     FX_INT32 argc = args.GetLength();\r
989     FX_UINT8 uPrecision = 0;\r
990     if(argc == 1) {\r
991         FXJSE_HVALUE argOne = args.GetValue(0);\r
992         if(FXJSE_Value_IsNull(argOne)) {\r
993             FXJSE_Value_SetNull(args.GetReturnValue());\r
994         } else {\r
995             FX_DOUBLE dValue = 0.0;\r
996             if(FXJSE_Value_IsArray(argOne)) {\r
997                 FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);\r
998                 FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);\r
999                 FXJSE_Value_GetObjectPropByIdx(argOne, 1, propertyValue);\r
1000                 FXJSE_Value_GetObjectPropByIdx(argOne, 2, jsObjectValue);\r
1001                 if(FXJSE_Value_IsNull(propertyValue)) {\r
1002                     dValue = HValueToDouble(hThis, jsObjectValue);\r
1003                 } else {\r
1004                     CFX_ByteString propertyStr;\r
1005                     FXJSE_Value_ToUTF8String(propertyValue, propertyStr);\r
1006                     FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);\r
1007                     FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr, newPropertyValue);\r
1008                     dValue = HValueToDouble(hThis, newPropertyValue);\r
1009                     FXJSE_Value_Release(newPropertyValue);\r
1010                 }\r
1011                 FXJSE_Value_Release(propertyValue);\r
1012                 FXJSE_Value_Release(jsObjectValue);\r
1013             } else {\r
1014                 dValue = HValueToDouble(hThis, argOne);\r
1015             }\r
1016             CFX_Decimal decimalValue((FX_FLOAT)dValue, uPrecision);\r
1017             CFX_WideString wsValue = decimalValue;\r
1018             FXJSE_Value_SetUTF8String(args.GetReturnValue(), wsValue.UTF8Encode());\r
1019         }\r
1020         FXJSE_Value_Release(argOne);\r
1021     } else if(argc == 2) {\r
1022         FXJSE_HVALUE argOne = args.GetValue(0);\r
1023         FXJSE_HVALUE argTwo = args.GetValue(1);\r
1024         if(FXJSE_Value_IsNull(argOne) || FXJSE_Value_IsNull(argTwo)) {\r
1025             FXJSE_Value_SetNull(args.GetReturnValue());\r
1026         } else {\r
1027             FX_DOUBLE dValue = 0.0;\r
1028             if(FXJSE_Value_IsArray(argOne)) {\r
1029                 FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);\r
1030                 FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);\r
1031                 FXJSE_Value_GetObjectPropByIdx(argOne, 1, propertyValue);\r
1032                 FXJSE_Value_GetObjectPropByIdx(argOne, 2, jsObjectValue);\r
1033                 if(FXJSE_Value_IsNull(propertyValue)) {\r
1034                     dValue = HValueToDouble(hThis, jsObjectValue);\r
1035                 } else {\r
1036                     CFX_ByteString propertyStr;\r
1037                     FXJSE_Value_ToUTF8String(propertyValue, propertyStr);\r
1038                     FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);\r
1039                     FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr, newPropertyValue);\r
1040                     dValue = HValueToDouble(hThis, newPropertyValue);\r
1041                     FXJSE_Value_Release(newPropertyValue);\r
1042                 }\r
1043                 FXJSE_Value_Release(propertyValue);\r
1044                 FXJSE_Value_Release(jsObjectValue);\r
1045             } else {\r
1046                 dValue = HValueToDouble(hThis, argOne);\r
1047             }\r
1048             FX_DOUBLE  dPrecision = 0.0;\r
1049             if(FXJSE_Value_IsArray(argTwo)) {\r
1050                 FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);\r
1051                 FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);\r
1052                 FXJSE_Value_GetObjectPropByIdx(argTwo, 1, propertyValue);\r
1053                 FXJSE_Value_GetObjectPropByIdx(argTwo, 2, jsObjectValue);\r
1054                 if(FXJSE_Value_IsNull(propertyValue)) {\r
1055                     dPrecision = HValueToDouble(hThis, jsObjectValue);\r
1056                 } else {\r
1057                     CFX_ByteString propertyStr;\r
1058                     FXJSE_Value_ToUTF8String(propertyValue, propertyStr);\r
1059                     FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);\r
1060                     FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr, newPropertyValue);\r
1061                     dPrecision = HValueToDouble(hThis, newPropertyValue);\r
1062                     FXJSE_Value_Release(newPropertyValue);\r
1063                 }\r
1064                 FXJSE_Value_Release(propertyValue);\r
1065                 FXJSE_Value_Release(jsObjectValue);\r
1066             } else {\r
1067                 dPrecision = HValueToDouble(hThis, argTwo);\r
1068             }\r
1069             if(dPrecision < 0) {\r
1070                 uPrecision = 0;\r
1071             } else if(dPrecision > 12.0) {\r
1072                 uPrecision = 12;\r
1073             } else {\r
1074                 uPrecision = (FX_UINT8)dPrecision;\r
1075             }\r
1076             CFX_Decimal decimalValue((FX_FLOAT)dValue, uPrecision);\r
1077             CFX_WideString wsValue = decimalValue;\r
1078             FXJSE_Value_SetUTF8String(args.GetReturnValue(), wsValue.UTF8Encode());\r
1079         }\r
1080         FXJSE_Value_Release(argOne);\r
1081         FXJSE_Value_Release(argTwo);\r
1082     } else {\r
1083         pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Round"));\r
1084     }\r
1085 }\r
1086 void CXFA_FM2JSContext::Sum(FXJSE_HOBJECT hThis,        FX_BSTR szFuncName, CFXJSE_Arguments &args)\r
1087 {\r
1088     CXFA_FM2JSContext*  pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);\r
1089     FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();\r
1090     FX_INT32 argc = args.GetLength();\r
1091     FX_UINT32 uCount = 0;\r
1092     FX_DOUBLE dSum = 0.0;\r
1093     if(argc) {\r
1094         FXJSE_HVALUE argValue = 0;\r
1095         for(FX_INT32 i = 0; i < argc; i++) {\r
1096             argValue = args.GetValue(i);\r
1097             if(FXJSE_Value_IsNull(argValue)) {\r
1098                 FXJSE_Value_Release(argValue);\r
1099                 continue;\r
1100             } else if(FXJSE_Value_IsArray(argValue)) {\r
1101                 FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);\r
1102                 FXJSE_Value_GetObjectProp(argValue, FX_BSTRC("length"), lengthValue);\r
1103                 FX_INT32 iLength = FXJSE_Value_ToInteger(lengthValue);\r
1104                 FXJSE_Value_Release(lengthValue);\r
1105                 if(iLength > 2) {\r
1106                     FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);\r
1107                     FXJSE_Value_GetObjectPropByIdx(argValue, 1, propertyValue);\r
1108                     FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);\r
1109                     FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);\r
1110                     if(FXJSE_Value_IsNull(propertyValue)) {\r
1111                         for(FX_INT32 j = 2; j < iLength; j++) {\r
1112                             FXJSE_Value_GetObjectPropByIdx(argValue, j, jsObjectValue);\r
1113                             GetObjectDefaultValue(jsObjectValue, newPropertyValue);\r
1114                             if (!FXJSE_Value_IsNull(newPropertyValue)) {\r
1115                                 dSum += HValueToDouble(hThis, jsObjectValue);\r
1116                                 uCount++;\r
1117                             }\r
1118                         }\r
1119                     } else {\r
1120                         CFX_ByteString propertyStr;\r
1121                         FXJSE_Value_ToUTF8String(propertyValue, propertyStr);\r
1122                         for(FX_INT32 j = 2; j < iLength; j++) {\r
1123                             FXJSE_Value_GetObjectPropByIdx(argValue, j, jsObjectValue);\r
1124                             FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr, newPropertyValue);\r
1125                             if (!FXJSE_Value_IsNull(newPropertyValue)) {\r
1126                                 dSum += HValueToDouble(hThis, newPropertyValue);\r
1127                                 uCount++;\r
1128                             }\r
1129                         }\r
1130                     }\r
1131                     FXJSE_Value_Release(newPropertyValue);\r
1132                     FXJSE_Value_Release(jsObjectValue);\r
1133                     FXJSE_Value_Release(propertyValue);\r
1134                 } else {\r
1135                     pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);\r
1136                 }\r
1137             } else if (FXJSE_Value_IsObject(argValue)) {\r
1138                 FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);\r
1139                 GetObjectDefaultValue(argValue, newPropertyValue);\r
1140                 if (!FXJSE_Value_IsNull(newPropertyValue)) {\r
1141                     dSum += HValueToDouble(hThis, argValue);\r
1142                     uCount++;\r
1143                 }\r
1144                 FXJSE_Value_Release(newPropertyValue);\r
1145             } else {\r
1146                 dSum += HValueToDouble(hThis, argValue);\r
1147                 uCount++;\r
1148             }\r
1149             FXJSE_Value_Release(argValue);\r
1150         }\r
1151         argValue = 0;\r
1152     }\r
1153     if(uCount < 1) {\r
1154         FXJSE_Value_SetNull(args.GetReturnValue());\r
1155     } else {\r
1156         FXJSE_Value_SetDouble(args.GetReturnValue(), dSum);\r
1157     }\r
1158 }\r
1159 void CXFA_FM2JSContext::Date(FXJSE_HOBJECT hThis,       FX_BSTR szFuncName, CFXJSE_Arguments &args)\r
1160 {\r
1161     if (args.GetLength() == 0) {\r
1162         struct tm *pTmStruct = 0;\r
1163         time_t currentTime;\r
1164         time(&currentTime);\r
1165         pTmStruct = gmtime(&currentTime);\r
1166         CFX_ByteString bufferYear;\r
1167         CFX_ByteString bufferMon;\r
1168         CFX_ByteString bufferDay;\r
1169         bufferYear.Format("%d", pTmStruct->tm_year + 1900);\r
1170         bufferMon.Format("%02d", pTmStruct->tm_mon + 1);\r
1171         bufferDay.Format("%02d", pTmStruct->tm_mday);\r
1172         CFX_ByteString bufferCurrent = bufferYear + bufferMon + bufferDay;\r
1173         FX_INT32 dDays = DateString2Num(bufferCurrent);\r
1174         FXJSE_Value_SetInteger(args.GetReturnValue(), dDays);\r
1175     } else {\r
1176         CXFA_FM2JSContext*      pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);\r
1177         pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Date"));\r
1178     }\r
1179 }\r
1180 void CXFA_FM2JSContext::Date2Num(FXJSE_HOBJECT hThis,   FX_BSTR szFuncName, CFXJSE_Arguments &args)\r
1181 {\r
1182     FX_INT32 argc = args.GetLength();\r
1183     if ((argc > 0) && (argc < 4)) {\r
1184         FX_BOOL bFlags = FALSE;\r
1185         CFX_ByteString dateString;\r
1186         CFX_ByteString formatString;\r
1187         CFX_ByteString localString;\r
1188         FXJSE_HVALUE dateValue = GetSimpleHValue(hThis, args, 0);\r
1189         FXJSE_HVALUE formatValue = 0;\r
1190         FXJSE_HVALUE localValue = 0;\r
1191         if(HValueIsNull(hThis, dateValue)) {\r
1192             bFlags = TRUE;\r
1193         } else {\r
1194             HValueToUTF8String(dateValue, dateString);\r
1195         }\r
1196         if(argc > 1) {\r
1197             formatValue = GetSimpleHValue(hThis, args, 1);\r
1198             if (HValueIsNull(hThis, formatValue)) {\r
1199                 bFlags = TRUE;\r
1200             } else {\r
1201                 HValueToUTF8String(formatValue, formatString);\r
1202             }\r
1203         }\r
1204         if (argc == 3) {\r
1205             localValue = GetSimpleHValue(hThis, args, 2);\r
1206             if (HValueIsNull(hThis, localValue)) {\r
1207                 bFlags = TRUE;\r
1208             } else {\r
1209                 HValueToUTF8String(localValue, localString);\r
1210             }\r
1211         }\r
1212         if (!bFlags) {\r
1213             CFX_ByteString szIsoDateString;\r
1214             FX_BOOL bRet = Local2IsoDate(hThis, dateString, formatString, localString, szIsoDateString);\r
1215             if (bRet) {\r
1216                 FXJSE_Value_SetInteger(args.GetReturnValue(), DateString2Num(szIsoDateString));\r
1217             } else {\r
1218                 FXJSE_Value_SetInteger(args.GetReturnValue(), 0);\r
1219             }\r
1220         } else {\r
1221             FXJSE_Value_SetNull(args.GetReturnValue());\r
1222         }\r
1223         FXJSE_Value_Release(dateValue);\r
1224         if (argc > 1) {\r
1225             FXJSE_Value_Release(formatValue);\r
1226             if (argc == 3) {\r
1227                 FXJSE_Value_Release(localValue);\r
1228             }\r
1229         }\r
1230     } else {\r
1231         CXFA_FM2JSContext*      pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);\r
1232         pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Date2Num"));\r
1233     }\r
1234 }\r
1235 void CXFA_FM2JSContext::DateFmt(FXJSE_HOBJECT hThis,    FX_BSTR szFuncName, CFXJSE_Arguments &args)\r
1236 {\r
1237     FX_INT32 argc = args.GetLength();\r
1238     if (argc < 3) {\r
1239         FX_BOOL bFlags = FALSE;\r
1240         FX_INT32 iStyle = 0;\r
1241         CFX_ByteString szLocal;\r
1242         FXJSE_HVALUE argStyle = 0;\r
1243         FXJSE_HVALUE argLocal = 0;\r
1244         if (argc > 0) {\r
1245             argStyle = GetSimpleHValue(hThis, args, 0);\r
1246             if (FXJSE_Value_IsNull(argStyle)) {\r
1247                 bFlags = TRUE;\r
1248             }\r
1249             iStyle = (FX_INT32)HValueToFloat(hThis, argStyle);\r
1250             if (iStyle > 4 || iStyle < 0) {\r
1251                 iStyle = 0;\r
1252             }\r
1253         }\r
1254         if (argc == 2) {\r
1255             argLocal = GetSimpleHValue(hThis, args, 1);\r
1256             if (FXJSE_Value_IsNull(argLocal)) {\r
1257                 bFlags = TRUE;\r
1258             } else {\r
1259                 HValueToUTF8String(argLocal, szLocal);\r
1260             }\r
1261         }\r
1262         if (!bFlags) {\r
1263             CFX_ByteString formatStr;\r
1264             GetStandardDateFormat(hThis, iStyle, szLocal, formatStr);\r
1265             if (formatStr.IsEmpty()) {\r
1266                 formatStr = FX_BSTRC("");\r
1267             }\r
1268             FXJSE_Value_SetUTF8String(args.GetReturnValue(), formatStr);\r
1269         } else {\r
1270             FXJSE_Value_SetNull(args.GetReturnValue());\r
1271         }\r
1272         if (argc > 0) {\r
1273             FXJSE_Value_Release(argStyle);\r
1274             if (argc == 2) {\r
1275                 FXJSE_Value_Release(argLocal);\r
1276             }\r
1277         }\r
1278     } else {\r
1279         CXFA_FM2JSContext*      pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);\r
1280         pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Date2Num"));\r
1281     }\r
1282 }\r
1283 void CXFA_FM2JSContext::IsoDate2Num(FXJSE_HOBJECT hThis,        FX_BSTR szFuncName, CFXJSE_Arguments &args)\r
1284 {\r
1285     if(args.GetLength() == 1) {\r
1286         FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);\r
1287         if(FXJSE_Value_IsNull(argOne)) {\r
1288             FXJSE_Value_SetNull(args.GetReturnValue());\r
1289         } else {\r
1290             CFX_ByteString szArgString;\r
1291             HValueToUTF8String(argOne, szArgString);\r
1292             FX_INT32 dDays = DateString2Num(szArgString);\r
1293             FXJSE_Value_SetInteger(args.GetReturnValue(), (FX_INT32)dDays);\r
1294         }\r
1295         FXJSE_Value_Release(argOne);\r
1296     } else {\r
1297         CXFA_FM2JSContext*      pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);\r
1298         pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"IsoDate2Num"));\r
1299     }\r
1300 }\r
1301 void CXFA_FM2JSContext::IsoTime2Num(FXJSE_HOBJECT hThis,        FX_BSTR szFuncName, CFXJSE_Arguments &args)\r
1302 {\r
1303     CXFA_FM2JSContext*  pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);\r
1304     if(args.GetLength() == 1) {\r
1305         FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);\r
1306         if(HValueIsNull(hThis, argOne)) {\r
1307             FXJSE_Value_SetNull(args.GetReturnValue());\r
1308         } else {\r
1309             CXFA_Document *pDoc = pContext->GetDocument();\r
1310             FXSYS_assert(pDoc);\r
1311             IFX_LocaleMgr *pMgr = (IFX_LocaleMgr *)pDoc->GetLocalMgr();\r
1312             CFX_ByteString szArgString;\r
1313             HValueToUTF8String(argOne, szArgString);\r
1314             szArgString  = szArgString.Mid(szArgString.Find('T', 0) + 1);\r
1315             if (szArgString.IsEmpty()) {\r
1316                 FXJSE_Value_SetInteger(args.GetReturnValue(), 0);\r
1317                 FXJSE_Value_Release(argOne);\r
1318                 return;\r
1319             }\r
1320             CXFA_LocaleValue timeValue(XFA_VT_TIME, CFX_WideString::FromUTF8(szArgString, szArgString.GetLength()), (CXFA_LocaleMgr*)pMgr);\r
1321             if (timeValue.IsValid()) {\r
1322                 CFX_Unitime uniTime = timeValue.GetTime();\r
1323                 FX_INT32 hour = uniTime.GetHour();\r
1324                 FX_INT32 min = uniTime.GetMinute();\r
1325                 FX_INT32 second = uniTime.GetSecond();\r
1326                 FX_INT32 milSecond = uniTime.GetMillisecond();\r
1327                 IFX_Locale* pDefLocale = pMgr->GetDefLocale();\r
1328                 FXSYS_assert(pDefLocale);\r
1329                 FX_TIMEZONE tzLocale;\r
1330                 pDefLocale->GetTimeZone(tzLocale);\r
1331                 FX_INT32 mins = hour * 60 + min;\r
1332                 mins -= (tzLocale.tzHour * 60);\r
1333                 while (mins > 1440) {\r
1334                     mins -= 1440;\r
1335                 }\r
1336                 while (mins < 0) {\r
1337                     mins += 1440;\r
1338                 }\r
1339                 hour = mins / 60;\r
1340                 min = mins % 60;\r
1341                 FX_INT32 iResult = hour * 3600000 + min * 60000 + second * 1000 + milSecond + 1;\r
1342                 FXJSE_Value_SetInteger(args.GetReturnValue(), iResult);\r
1343             } else {\r
1344                 FXJSE_Value_SetInteger(args.GetReturnValue(), 0);\r
1345             }\r
1346         }\r
1347         FXJSE_Value_Release(argOne);\r
1348     } else {\r
1349         pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"IsoTime2Num"));\r
1350     }\r
1351 }\r
1352 void CXFA_FM2JSContext::LocalDateFmt(FXJSE_HOBJECT hThis,       FX_BSTR szFuncName, CFXJSE_Arguments &args)\r
1353 {\r
1354     FX_INT32 argc = args.GetLength();\r
1355     if (argc < 3) {\r
1356         FX_BOOL bFlags = FALSE;\r
1357         FX_INT32 iStyle = 0;\r
1358         CFX_ByteString szLocal;\r
1359         FXJSE_HVALUE argStyle = 0;\r
1360         FXJSE_HVALUE argLocal = 0;\r
1361         if (argc > 0) {\r
1362             argStyle = GetSimpleHValue(hThis, args, 0);\r
1363             if (FXJSE_Value_IsNull(argStyle)) {\r
1364                 bFlags = TRUE;\r
1365             }\r
1366             iStyle = (FX_INT32)HValueToFloat(hThis, argStyle);\r
1367             if (iStyle > 4 || iStyle < 0) {\r
1368                 iStyle = 0;\r
1369             }\r
1370         }\r
1371         if (argc == 2) {\r
1372             argLocal = GetSimpleHValue(hThis, args, 1);\r
1373             if (FXJSE_Value_IsNull(argLocal)) {\r
1374                 bFlags = TRUE;\r
1375             } else {\r
1376                 HValueToUTF8String(argLocal, szLocal);\r
1377             }\r
1378         }\r
1379         if (!bFlags) {\r
1380             CFX_ByteString formatStr;\r
1381             GetLocalDateFormat(hThis, iStyle, szLocal, formatStr, FALSE);\r
1382             if (formatStr.IsEmpty()) {\r
1383                 formatStr = FX_BSTRC("");\r
1384             }\r
1385             FXJSE_Value_SetUTF8String(args.GetReturnValue(), formatStr);\r
1386         } else {\r
1387             FXJSE_Value_SetNull(args.GetReturnValue());\r
1388         }\r
1389         if (argc > 0) {\r
1390             FXJSE_Value_Release(argStyle);\r
1391             if (argc == 2) {\r
1392                 FXJSE_Value_Release(argLocal);\r
1393             }\r
1394         }\r
1395     } else {\r
1396         CXFA_FM2JSContext*      pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);\r
1397         pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"LocalDateFmt"));\r
1398     }\r
1399 }\r
1400 void CXFA_FM2JSContext::LocalTimeFmt(FXJSE_HOBJECT hThis,       FX_BSTR szFuncName, CFXJSE_Arguments &args)\r
1401 {\r
1402     FX_INT32 argc = args.GetLength();\r
1403     if (argc < 3) {\r
1404         FX_BOOL bFlags = FALSE;\r
1405         FX_INT32 iStyle = 0;\r
1406         CFX_ByteString szLocal;\r
1407         FXJSE_HVALUE argStyle = 0;\r
1408         FXJSE_HVALUE argLocal = 0;\r
1409         if (argc > 0) {\r
1410             argStyle = GetSimpleHValue(hThis, args, 0);\r
1411             if (FXJSE_Value_IsNull(argStyle)) {\r
1412                 bFlags = TRUE;\r
1413             }\r
1414             iStyle = (FX_INT32)HValueToFloat(hThis, argStyle);\r
1415             if (iStyle > 4 || iStyle < 0) {\r
1416                 iStyle = 0;\r
1417             }\r
1418         }\r
1419         if (argc == 2) {\r
1420             argLocal = GetSimpleHValue(hThis, args, 1);\r
1421             if (FXJSE_Value_IsNull(argLocal)) {\r
1422                 bFlags = TRUE;\r
1423             } else {\r
1424                 HValueToUTF8String(argLocal, szLocal);\r
1425             }\r
1426         }\r
1427         if (!bFlags) {\r
1428             CFX_ByteString formatStr;\r
1429             GetLocalTimeFormat(hThis, iStyle, szLocal, formatStr, FALSE);\r
1430             if (formatStr.IsEmpty()) {\r
1431                 formatStr = FX_BSTRC("");\r
1432             }\r
1433             FXJSE_Value_SetUTF8String(args.GetReturnValue(), formatStr);\r
1434         } else {\r
1435             FXJSE_Value_SetNull(args.GetReturnValue());\r
1436         }\r
1437         if (argc > 0) {\r
1438             FXJSE_Value_Release(argStyle);\r
1439             if (argc == 2) {\r
1440                 FXJSE_Value_Release(argLocal);\r
1441             }\r
1442         }\r
1443     } else {\r
1444         CXFA_FM2JSContext*      pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);\r
1445         pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"LocalTimeFmt"));\r
1446     }\r
1447 }\r
1448 void CXFA_FM2JSContext::Num2Date(FXJSE_HOBJECT hThis,   FX_BSTR szFuncName, CFXJSE_Arguments &args)\r
1449 {\r
1450     FX_INT32 argc = args.GetLength();\r
1451     if ((argc > 0) && (argc < 4)) {\r
1452         FX_BOOL bFlags = FALSE;\r
1453         FX_INT32 dDate;\r
1454         CFX_ByteString formatString;\r
1455         CFX_ByteString localString;\r
1456         FXJSE_HVALUE dateValue = GetSimpleHValue(hThis, args, 0);\r
1457         FXJSE_HVALUE formatValue = 0;\r
1458         FXJSE_HVALUE localValue = 0;\r
1459         if(HValueIsNull(hThis, dateValue)) {\r
1460             bFlags = TRUE;\r
1461         } else {\r
1462             dDate = (FX_INT32)HValueToFloat(hThis, dateValue);\r
1463             bFlags = dDate < 1;\r
1464         }\r
1465         if(argc > 1) {\r
1466             formatValue = GetSimpleHValue(hThis, args, 1);\r
1467             if (HValueIsNull(hThis, formatValue)) {\r
1468                 bFlags = TRUE;\r
1469             } else {\r
1470                 HValueToUTF8String(formatValue, formatString);\r
1471             }\r
1472         }\r
1473         if (argc == 3) {\r
1474             localValue = GetSimpleHValue(hThis, args, 2);\r
1475             if (HValueIsNull(hThis, localValue)) {\r
1476                 bFlags = TRUE;\r
1477             } else {\r
1478                 HValueToUTF8String(localValue, localString);\r
1479             }\r
1480         }\r
1481         if (!bFlags) {\r
1482             FX_INT32 iYear = 1900;\r
1483             FX_INT32 iMonth = 1;\r
1484             FX_INT32 iDay = 1;\r
1485             FX_INT32 i = 0;\r
1486             while (dDate > 0) {\r
1487                 if (iMonth == 2) {\r
1488                     if ((!((iYear + i) % 4) && ((iYear + i) % 100)) || !((iYear + i) % 400)) {\r
1489                         if (dDate > 29) {\r
1490                             ++iMonth;\r
1491                             if (iMonth > 12) {\r
1492                                 iMonth = 1;\r
1493                                 ++i;\r
1494                             }\r
1495                             iDay = 1;\r
1496                             dDate -= 29;\r
1497                         } else {\r
1498                             iDay += static_cast<FX_INT32>(dDate) - 1;\r
1499                             dDate = 0;\r
1500                         }\r
1501                     } else {\r
1502                         if (dDate > 28) {\r
1503                             ++iMonth;\r
1504                             if (iMonth > 12) {\r
1505                                 iMonth = 1;\r
1506                                 ++i;\r
1507                             }\r
1508                             iDay = 1;\r
1509                             dDate -= 28;\r
1510                         } else {\r
1511                             iDay += static_cast<FX_INT32>(dDate) - 1;\r
1512                             dDate = 0;\r
1513                         }\r
1514                     }\r
1515                 } else if (iMonth < 8) {\r
1516                     if ((iMonth % 2 == 0)) {\r
1517                         if (dDate > 30) {\r
1518                             ++iMonth;\r
1519                             if (iMonth > 12) {\r
1520                                 iMonth = 1;\r
1521                                 ++i;\r
1522                             }\r
1523                             iDay = 1;\r
1524                             dDate -= 30;\r
1525                         } else {\r
1526                             iDay += static_cast<FX_INT32>(dDate) - 1;\r
1527                             dDate = 0;\r
1528                         }\r
1529                     } else {\r
1530                         if (dDate > 31) {\r
1531                             ++iMonth;\r
1532                             if (iMonth > 12) {\r
1533                                 iMonth = 1;\r
1534                                 ++i;\r
1535                             }\r
1536                             iDay = 1;\r
1537                             dDate -= 31;\r
1538                         } else {\r
1539                             iDay += static_cast<FX_INT32>(dDate) - 1;\r
1540                             dDate = 0;\r
1541                         }\r
1542                     }\r
1543                 } else {\r
1544                     if (iMonth % 2 != 0) {\r
1545                         if (dDate > 30) {\r
1546                             ++iMonth;\r
1547                             if (iMonth > 12) {\r
1548                                 iMonth = 1;\r
1549                                 ++i;\r
1550                             }\r
1551                             iDay = 1;\r
1552                             dDate -= 30;\r
1553                         } else {\r
1554                             iDay += static_cast<FX_INT32>(dDate) - 1;\r
1555                             dDate = 0;\r
1556                         }\r
1557                     } else {\r
1558                         if (dDate > 31) {\r
1559                             ++iMonth;\r
1560                             if (iMonth > 12) {\r
1561                                 iMonth = 1;\r
1562                                 ++i;\r
1563                             }\r
1564                             iDay = 1;\r
1565                             dDate -= 31;\r
1566                         } else {\r
1567                             iDay += static_cast<FX_INT32>(dDate) - 1;\r
1568                             dDate = 0;\r
1569                         }\r
1570                     }\r
1571                 }\r
1572             }\r
1573             CFX_ByteString szIsoDateString;\r
1574             szIsoDateString.Format("%d%02d%02d", iYear + i, iMonth, iDay);\r
1575             CFX_ByteString szLocalDateString;\r
1576             FX_BOOL bRet = IsoDate2Local(hThis, szIsoDateString, formatString, localString, szLocalDateString);\r
1577             if (szLocalDateString.IsEmpty()) {\r
1578                 szLocalDateString = FX_BSTRC("");\r
1579             }\r
1580             FXJSE_Value_SetUTF8String(args.GetReturnValue(), szLocalDateString);\r
1581         } else {\r
1582             FXJSE_Value_SetNull(args.GetReturnValue());\r
1583         }\r
1584         FXJSE_Value_Release(dateValue);\r
1585         if (argc > 1) {\r
1586             FXJSE_Value_Release(formatValue);\r
1587             if (argc == 3) {\r
1588                 FXJSE_Value_Release(localValue);\r
1589             }\r
1590         }\r
1591     } else {\r
1592         CXFA_FM2JSContext*      pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);\r
1593         pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Num2Date"));\r
1594     }\r
1595 }\r
1596 void CXFA_FM2JSContext::Num2GMTime(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args)\r
1597 {\r
1598     FX_INT32 argc = args.GetLength();\r
1599     if ((argc > 0) && (argc < 4)) {\r
1600         FX_BOOL bFlags = FALSE;\r
1601         FX_INT32 iTime;\r
1602         CFX_ByteString formatString;\r
1603         CFX_ByteString localString;\r
1604         FXJSE_HVALUE timeValue = GetSimpleHValue(hThis, args, 0);\r
1605         FXJSE_HVALUE formatValue = 0;\r
1606         FXJSE_HVALUE localValue = 0;\r
1607         if(FXJSE_Value_IsNull(timeValue)) {\r
1608             bFlags = TRUE;\r
1609         } else {\r
1610             iTime = (FX_INT32)HValueToFloat(hThis, timeValue);\r
1611             if (FXSYS_abs(iTime) < 1.0) {\r
1612                 bFlags = TRUE;\r
1613             }\r
1614         }\r
1615         if(argc > 1) {\r
1616             formatValue = GetSimpleHValue(hThis, args, 1);\r
1617             if (FXJSE_Value_IsNull(formatValue)) {\r
1618                 bFlags = TRUE;\r
1619             } else {\r
1620                 HValueToUTF8String(formatValue, formatString);\r
1621             }\r
1622         }\r
1623         if (argc == 3) {\r
1624             localValue = GetSimpleHValue(hThis, args, 2);\r
1625             if (FXJSE_Value_IsNull(localValue)) {\r
1626                 bFlags = TRUE;\r
1627             } else {\r
1628                 HValueToUTF8String(localValue, localString);\r
1629             }\r
1630         }\r
1631         if (!bFlags) {\r
1632             CFX_ByteString szGMTTimeString;\r
1633             Num2AllTime(hThis, iTime, formatString, localString, TRUE, szGMTTimeString);\r
1634             if (szGMTTimeString.IsEmpty()) {\r
1635                 szGMTTimeString = FX_BSTRC("");\r
1636             }\r
1637             FXJSE_Value_SetUTF8String(args.GetReturnValue(), szGMTTimeString);\r
1638         } else {\r
1639             FXJSE_Value_SetNull(args.GetReturnValue());\r
1640         }\r
1641         FXJSE_Value_Release(timeValue);\r
1642         if (argc > 1) {\r
1643             FXJSE_Value_Release(formatValue);\r
1644             if (argc == 3) {\r
1645                 FXJSE_Value_Release(localValue);\r
1646             }\r
1647         }\r
1648     } else {\r
1649         CXFA_FM2JSContext*      pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);\r
1650         pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Num2GMTime"));\r
1651     }\r
1652 }\r
1653 void CXFA_FM2JSContext::Num2Time(FXJSE_HOBJECT hThis,   FX_BSTR szFuncName, CFXJSE_Arguments &args)\r
1654 {\r
1655     FX_INT32 argc = args.GetLength();\r
1656     if ((argc > 0) && (argc < 4)) {\r
1657         FX_BOOL bFlags = FALSE;\r
1658         FX_FLOAT fTime;\r
1659         CFX_ByteString formatString;\r
1660         CFX_ByteString localString;\r
1661         FXJSE_HVALUE timeValue = GetSimpleHValue(hThis, args, 0);\r
1662         FXJSE_HVALUE formatValue = 0;\r
1663         FXJSE_HVALUE localValue = 0;\r
1664         if(FXJSE_Value_IsNull(timeValue)) {\r
1665             bFlags = TRUE;\r
1666         } else {\r
1667             fTime = HValueToFloat(hThis, timeValue);\r
1668             if (FXSYS_fabs(fTime) < 1.0) {\r
1669                 bFlags = TRUE;\r
1670             }\r
1671         }\r
1672         if(argc > 1) {\r
1673             formatValue = GetSimpleHValue(hThis, args, 1);\r
1674             if (FXJSE_Value_IsNull(formatValue)) {\r
1675                 bFlags = TRUE;\r
1676             } else {\r
1677                 HValueToUTF8String(formatValue, formatString);\r
1678             }\r
1679         }\r
1680         if (argc == 3) {\r
1681             localValue = GetSimpleHValue(hThis, args, 2);\r
1682             if (FXJSE_Value_IsNull(localValue)) {\r
1683                 bFlags = TRUE;\r
1684             } else {\r
1685                 HValueToUTF8String(localValue, localString);\r
1686             }\r
1687         }\r
1688         if (!bFlags) {\r
1689             CFX_ByteString szLocalTimeString;\r
1690             Num2AllTime(hThis, (FX_INT32)fTime, formatString, localString, FALSE, szLocalTimeString);\r
1691             if (szLocalTimeString.IsEmpty()) {\r
1692                 szLocalTimeString = FX_BSTRC("");\r
1693             }\r
1694             FXJSE_Value_SetUTF8String(args.GetReturnValue(), szLocalTimeString);\r
1695         } else {\r
1696             FXJSE_Value_SetNull(args.GetReturnValue());\r
1697         }\r
1698         FXJSE_Value_Release(timeValue);\r
1699         if (argc > 1) {\r
1700             FXJSE_Value_Release(formatValue);\r
1701             if (argc == 3) {\r
1702                 FXJSE_Value_Release(localValue);\r
1703             }\r
1704         }\r
1705     } else {\r
1706         CXFA_FM2JSContext*      pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);\r
1707         pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Num2Time"));\r
1708     }\r
1709 }\r
1710 void CXFA_FM2JSContext::Time(FXJSE_HOBJECT hThis,       FX_BSTR szFuncName, CFXJSE_Arguments &args)\r
1711 {\r
1712     if (args.GetLength() == 0) {\r
1713         time_t now;\r
1714         time(&now);\r
1715         struct tm *pGmt = gmtime(&now);\r
1716         FX_INT32 iGMHour = pGmt->tm_hour;\r
1717         FX_INT32 iGMMin = pGmt->tm_min;\r
1718         FX_INT32 iGMSec = pGmt->tm_sec;\r
1719         FXJSE_Value_SetInteger(args.GetReturnValue(), ((iGMHour * 3600 + iGMMin * 60 + iGMSec) * 1000));\r
1720     } else {\r
1721         CXFA_FM2JSContext*      pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);\r
1722         pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Time"));\r
1723     }\r
1724 }\r
1725 void CXFA_FM2JSContext::Time2Num(FXJSE_HOBJECT hThis,   FX_BSTR szFuncName, CFXJSE_Arguments &args)\r
1726 {\r
1727     FX_INT32 argc = args.GetLength();\r
1728     if ((argc > 0) && (argc < 4)) {\r
1729         FX_BOOL bFlags = FALSE;\r
1730         CFX_ByteString timeString;\r
1731         CFX_ByteString formatString;\r
1732         CFX_ByteString localString;\r
1733         FXJSE_HVALUE timeValue = GetSimpleHValue(hThis, args, 0);\r
1734         FXJSE_HVALUE formatValue = 0;\r
1735         FXJSE_HVALUE localValue = 0;\r
1736         if(HValueIsNull(hThis, timeValue)) {\r
1737             bFlags = TRUE;\r
1738         } else {\r
1739             HValueToUTF8String(timeValue, timeString);\r
1740         }\r
1741         if(argc > 1) {\r
1742             formatValue = GetSimpleHValue(hThis, args, 1);\r
1743             if (HValueIsNull(hThis, formatValue)) {\r
1744                 bFlags = TRUE;\r
1745             } else {\r
1746                 HValueToUTF8String(formatValue, formatString);\r
1747             }\r
1748         }\r
1749         if (argc == 3) {\r
1750             localValue = GetSimpleHValue(hThis, args, 2);\r
1751             if (HValueIsNull(hThis, localValue)) {\r
1752                 bFlags = TRUE;\r
1753             } else {\r
1754                 HValueToUTF8String(localValue, localString);\r
1755             }\r
1756         }\r
1757         if (!bFlags) {\r
1758             CXFA_FM2JSContext*  pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);\r
1759             CXFA_Document *pDoc = pContext->GetDocument();\r
1760             IFX_LocaleMgr *pMgr = (IFX_LocaleMgr *)pDoc->GetLocalMgr();\r
1761             IFX_Locale *pLocale = NULL;\r
1762             if (localString.IsEmpty()) {\r
1763                 CXFA_Object * pThisNode = pDoc->GetScriptContext()->GetThisObject();\r
1764                 FXSYS_assert(pThisNode->IsNode());\r
1765                 CXFA_WidgetData widgetData((CXFA_Node *)pThisNode);\r
1766                 pLocale = widgetData.GetLocal();\r
1767             } else {\r
1768                 pLocale = pMgr->GetLocaleByName(CFX_WideString::FromUTF8(localString, localString.GetLength()));\r
1769             }\r
1770             CFX_WideString wsFormat;\r
1771             if (formatString.IsEmpty()) {\r
1772                 pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat);\r
1773             } else {\r
1774                 wsFormat = CFX_WideString::FromUTF8(formatString, formatString.GetLength());\r
1775             }\r
1776             wsFormat = FX_WSTRC(L"time{") + wsFormat;\r
1777             wsFormat += FX_WSTRC(L"}");\r
1778             CXFA_LocaleValue timeValue(XFA_VT_TIME, CFX_WideString::FromUTF8(timeString, timeString.GetLength()),\r
1779                                        wsFormat, pLocale, (CXFA_LocaleMgr*)pMgr);\r
1780             if (timeValue.IsValid()) {\r
1781                 CFX_Unitime uniTime = timeValue.GetTime();\r
1782                 FX_INT32 hour = uniTime.GetHour();\r
1783                 FX_INT32 min = uniTime.GetMinute();\r
1784                 FX_INT32 second = uniTime.GetSecond();\r
1785                 FX_INT32 milSecond = uniTime.GetMillisecond();\r
1786                 FX_INT32 mins = hour * 60 + min;\r
1787                 IXFA_TimeZoneProvider* pProvider = IXFA_TimeZoneProvider::Get();\r
1788                 if (pProvider != NULL) {\r
1789                     FX_TIMEZONE tz;\r
1790                     pProvider->GetTimeZone(tz);\r
1791                     mins -= (tz.tzHour * 60);\r
1792                     while (mins > 1440) {\r
1793                         mins -= 1440;\r
1794                     }\r
1795                     while (mins < 0) {\r
1796                         mins += 1440;\r
1797                     }\r
1798                     hour = mins / 60;\r
1799                     min = mins % 60;\r
1800                 }\r
1801                 FX_INT32 iResult = hour * 3600000 + min * 60000 + second * 1000 + milSecond + 1;\r
1802                 FXJSE_Value_SetInteger(args.GetReturnValue(), iResult);\r
1803             } else {\r
1804                 FXJSE_Value_SetInteger(args.GetReturnValue(), 0);\r
1805             }\r
1806         } else {\r
1807             FXJSE_Value_SetNull(args.GetReturnValue());\r
1808         }\r
1809         FXJSE_Value_Release(timeValue);\r
1810         if (argc > 1) {\r
1811             FXJSE_Value_Release(formatValue);\r
1812             if (argc == 3) {\r
1813                 FXJSE_Value_Release(localValue);\r
1814             }\r
1815         }\r
1816     } else {\r
1817         CXFA_FM2JSContext*      pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);\r
1818         pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Time2Num"));\r
1819     }\r
1820 }\r
1821 void CXFA_FM2JSContext::TimeFmt(FXJSE_HOBJECT hThis,    FX_BSTR szFuncName, CFXJSE_Arguments &args)\r
1822 {\r
1823     FX_INT32 argc = args.GetLength();\r
1824     if (argc < 3) {\r
1825         FX_BOOL bFlags = FALSE;\r
1826         FX_INT32 iStyle = 0;\r
1827         CFX_ByteString szLocal;\r
1828         FXJSE_HVALUE argStyle = 0;\r
1829         FXJSE_HVALUE argLocal = 0;\r
1830         if (argc > 0) {\r
1831             argStyle = GetSimpleHValue(hThis, args, 0);\r
1832             if (FXJSE_Value_IsNull(argStyle)) {\r
1833                 bFlags = TRUE;\r
1834             }\r
1835             iStyle = (FX_INT32)HValueToFloat(hThis, argStyle);\r
1836             if (iStyle > 4 || iStyle < 0) {\r
1837                 iStyle = 0;\r
1838             }\r
1839         }\r
1840         if (argc == 2) {\r
1841             argLocal = GetSimpleHValue(hThis, args, 1);\r
1842             if (FXJSE_Value_IsNull(argLocal)) {\r
1843                 bFlags = TRUE;\r
1844             } else {\r
1845                 HValueToUTF8String(argLocal, szLocal);\r
1846             }\r
1847         }\r
1848         if (!bFlags) {\r
1849             CFX_ByteString formatStr;\r
1850             GetStandardTimeFormat(hThis, iStyle, szLocal, formatStr);\r
1851             if (formatStr.IsEmpty()) {\r
1852                 formatStr = FX_BSTRC("");\r
1853             }\r
1854             FXJSE_Value_SetUTF8String(args.GetReturnValue(), formatStr);\r
1855         } else {\r
1856             FXJSE_Value_SetNull(args.GetReturnValue());\r
1857         }\r
1858         if (argc > 0) {\r
1859             FXJSE_Value_Release(argStyle);\r
1860             if (argc == 2) {\r
1861                 FXJSE_Value_Release(argLocal);\r
1862             }\r
1863         }\r
1864     } else {\r
1865         CXFA_FM2JSContext*      pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);\r
1866         pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"TimeFmt"));\r
1867     }\r
1868 }\r
1869 FX_BOOL CXFA_FM2JSContext::IsIsoDateFormat(FX_LPCSTR pData, FX_INT32 iLength, FX_INT32 &iStyle, FX_INT32 &iYear, FX_INT32 &iMonth, FX_INT32 &iDay)\r
1870 {\r
1871     iYear = 0;\r
1872     iMonth = 1;\r
1873     iDay = 1;\r
1874     FX_BOOL iRet = FALSE;\r
1875     if (iLength < 4) {\r
1876         return iRet;\r
1877     }\r
1878     FX_CHAR strYear[5];\r
1879     strYear[4] = '\0';\r
1880     for (FX_INT32 i = 0; i < 4; ++i) {\r
1881         if (*(pData + i) <= '9' && *(pData + i) >= '0') {\r
1882             strYear[i] = *(pData + i);\r
1883         } else {\r
1884             return iRet;\r
1885         }\r
1886     }\r
1887     iYear = FXSYS_atoi(strYear);\r
1888     iStyle = 0;\r
1889     if (iLength > 4) {\r
1890         if (*(pData + 4) == '-') {\r
1891             iStyle = 1;\r
1892         } else {\r
1893             iStyle = 0;\r
1894         }\r
1895     } else {\r
1896         iRet = TRUE;\r
1897         return iRet;\r
1898     }\r
1899     FX_CHAR strTemp[3];\r
1900     strTemp[2] = '\0';\r
1901     FX_INT32 iPosOff = 0;\r
1902     if (iStyle == 0) {\r
1903         iPosOff = 4;\r
1904         if (iLength == 4) {\r
1905             iRet = TRUE;\r
1906             return iRet;\r
1907         }\r
1908     } else {\r
1909         iPosOff = 5;\r
1910         if (iLength == 4) {\r
1911             iRet = TRUE;\r
1912             return iRet;\r
1913         }\r
1914     }\r
1915     if ((*(pData + iPosOff) > '9' || *(pData + iPosOff) < '0') || (*(pData + iPosOff + 1) > '9' || *(pData + iPosOff + 1) < '0')) {\r
1916         return iRet;\r
1917     }\r
1918     strTemp[0] = *(pData + iPosOff);\r
1919     strTemp[1] = *(pData + iPosOff + 1);\r
1920     iMonth = FXSYS_atoi(strTemp);\r
1921     if (iMonth > 12 || iMonth < 1) {\r
1922         return iRet;\r
1923     }\r
1924     if (iStyle == 0) {\r
1925         iPosOff += 2;\r
1926         if (iLength == 6) {\r
1927             iRet = 1;\r
1928             return iRet;\r
1929         }\r
1930     } else {\r
1931         iPosOff += 3;\r
1932         if (iLength == 7) {\r
1933             iRet = 1;\r
1934             return iRet;\r
1935         }\r
1936     }\r
1937     if ((*(pData + iPosOff) > '9' || *(pData + iPosOff) < '0') || (*(pData + iPosOff + 1) > '9' || *(pData + iPosOff + 1) < '0')) {\r
1938         return iRet;\r
1939     }\r
1940     strTemp[0] = *(pData + iPosOff);\r
1941     strTemp[1] = *(pData + iPosOff + 1);\r
1942     iDay = FXSYS_atoi(strTemp);\r
1943     if (iPosOff + 2 < iLength) {\r
1944         return iRet;\r
1945     }\r
1946     if ((!(iYear % 4) && (iYear % 100)) || !(iYear % 400)) {\r
1947         if (iMonth == 2) {\r
1948             if (iDay > 29) {\r
1949                 return iRet;\r
1950             }\r
1951         } else {\r
1952             if (iMonth < 8) {\r
1953                 if (iDay > (iMonth % 2 == 0 ? 30 : 31)) {\r
1954                     return iRet;\r
1955                 }\r
1956             } else {\r
1957                 if (iDay > (iMonth % 2 == 0 ? 31 : 30)) {\r
1958                     return iRet;\r
1959                 }\r
1960             }\r
1961         }\r
1962     } else {\r
1963         if (iMonth == 2) {\r
1964             if (iDay > 28) {\r
1965                 return iRet;\r
1966             }\r
1967         } else {\r
1968             if (iMonth < 8) {\r
1969                 if (iDay > (iMonth % 2 == 0 ? 30 : 31)) {\r
1970                     return iRet;\r
1971                 }\r
1972             } else {\r
1973                 if (iDay > (iMonth % 2 == 0 ? 31 : 30)) {\r
1974                     return iRet;\r
1975                 }\r
1976             }\r
1977         }\r
1978     }\r
1979     iRet = TRUE;\r
1980     return iRet;\r
1981 }\r
1982 FX_BOOL CXFA_FM2JSContext::IsIsoTimeFormat(FX_LPCSTR pData, FX_INT32 iLength, FX_INT32 &iHour, FX_INT32 &iMinute, FX_INT32 &iSecond, FX_INT32 &iMilliSecond, FX_INT32 &iZoneHour, FX_INT32 &iZoneMinute)\r
1983 {\r
1984     iHour = 0;\r
1985     iMinute = 0;\r
1986     iSecond = 0;\r
1987     iMilliSecond = 0;\r
1988     iZoneHour = 0;\r
1989     iZoneMinute = 0;\r
1990     if (!pData) {\r
1991         return FALSE;\r
1992     }\r
1993     FX_INT32 iRet = FALSE;\r
1994     FX_CHAR strTemp[3];\r
1995     strTemp[2] = '\0';\r
1996     FX_INT32 iIndex = 0;\r
1997     FX_INT32 iZone = 0;\r
1998     FX_INT32 i = iIndex;\r
1999     while (i < iLength) {\r
2000         if ((*(pData + i) > '9' || *(pData + i) < '0') && *(pData + i) != ':' ) {\r
2001             iZone = i;\r
2002             break;\r
2003         }\r
2004         ++i;\r
2005     }\r
2006     if (i == iLength) {\r
2007         iZone = iLength;\r
2008     }\r
2009     FX_INT32 iPos = 0;\r
2010     while (iIndex < iZone) {\r
2011         if (iIndex >= iZone) {\r
2012             break;\r
2013         }\r
2014         if (*(pData + iIndex) > '9' || *(pData + iIndex) < '0') {\r
2015             return iRet;\r
2016         }\r
2017         strTemp[0] = *(pData + iIndex);\r
2018         if (*(pData + iIndex + 1) > '9' || *(pData + iIndex + 1) < '0') {\r
2019             return iRet;\r
2020         }\r
2021         strTemp[1] = *(pData + iIndex + 1);\r
2022         if (FXSYS_atoi(strTemp) > 60) {\r
2023             return iRet;\r
2024         }\r
2025         if (*(pData + 2) == ':') {\r
2026             if (iPos == 0) {\r
2027                 iHour = FXSYS_atoi(strTemp);\r
2028                 ++iPos;\r
2029             } else if (iPos == 1) {\r
2030                 iMinute = FXSYS_atoi(strTemp);\r
2031                 ++iPos;\r
2032             } else {\r
2033                 iSecond = FXSYS_atoi(strTemp);\r
2034             }\r
2035             iIndex += 3;\r
2036         } else {\r
2037             if (iPos == 0) {\r
2038                 iHour = FXSYS_atoi(strTemp);\r
2039                 ++iPos;\r
2040             } else if (iPos == 1) {\r
2041                 iMinute = FXSYS_atoi(strTemp);\r
2042                 ++iPos;\r
2043             } else if (iPos == 2) {\r
2044                 iSecond = FXSYS_atoi(strTemp);\r
2045                 ++iPos;\r
2046             }\r
2047             iIndex += 2;\r
2048         }\r
2049     }\r
2050     if (*(pData + iIndex) == '.') {\r
2051         ++iIndex;\r
2052         FX_CHAR strTemp[4];\r
2053         strTemp[3] = '\0';\r
2054         if (*(pData + iIndex) > '9' || *(pData + iIndex) < '0') {\r
2055             return iRet;\r
2056         }\r
2057         strTemp[0] = *(pData + iIndex);\r
2058         if (*(pData + iIndex + 1) > '9' || *(pData + iIndex + 1) < '0') {\r
2059             return iRet;\r
2060         }\r
2061         strTemp[1] = *(pData + iIndex + 1);\r
2062         if (*(pData + iIndex + 2) > '9' || *(pData + iIndex + 2) < '0') {\r
2063             return iRet;\r
2064         }\r
2065         strTemp[2] = *(pData + iIndex + 2);\r
2066         iMilliSecond = FXSYS_atoi(strTemp);\r
2067         if (iMilliSecond > 100) {\r
2068             iMilliSecond = 0;\r
2069             return iRet;\r
2070         }\r
2071         iIndex += 3;\r
2072     }\r
2073     FX_INT32 iSign = 1;\r
2074     if (*(pData + iIndex) == 'z' || *(pData + iIndex) == 'Z') {\r
2075         iRet = 1;\r
2076         return iRet;\r
2077     } else if (*(pData + iIndex) == '+') {\r
2078         ++iIndex;\r
2079     } else if (*(pData + iIndex) == '-') {\r
2080         iSign = -1;\r
2081         ++iIndex;\r
2082     }\r
2083     iPos = 0;\r
2084     while (iIndex < iLength) {\r
2085         if (iIndex >= iLength) {\r
2086             return iRet;\r
2087         }\r
2088         if (*(pData + iIndex) > '9' || *(pData + iIndex) < '0') {\r
2089             return iRet;\r
2090         }\r
2091         strTemp[0] = *(pData + iIndex);\r
2092         if (*(pData + iIndex + 1) > '9' || *(pData + iIndex + 1) < '0') {\r
2093             return iRet;\r
2094         }\r
2095         strTemp[1] = *(pData + iIndex + 1);\r
2096         if (FXSYS_atoi(strTemp) > 60) {\r
2097             return iRet;\r
2098         }\r
2099         if (*(pData + 2) == ':') {\r
2100             if (iPos == 0) {\r
2101                 iZoneHour = FXSYS_atoi(strTemp);\r
2102             } else if (iPos == 1) {\r
2103                 iZoneMinute = FXSYS_atoi(strTemp);\r
2104             }\r
2105             iIndex += 3;\r
2106         } else {\r
2107             if (!iPos) {\r
2108                 iZoneHour = FXSYS_atoi(strTemp);\r
2109                 ++iPos;\r
2110             } else if (iPos == 1) {\r
2111                 iZoneMinute = FXSYS_atoi(strTemp);\r
2112                 ++iPos;\r
2113             }\r
2114             iIndex += 2;\r
2115         }\r
2116     }\r
2117     if (iIndex < iLength) {\r
2118         return iRet;\r
2119     }\r
2120     iZoneHour *= iSign;\r
2121     iRet = TRUE;\r
2122     return iRet;\r
2123 }\r
2124 FX_BOOL CXFA_FM2JSContext::IsIsoDateTimeFormat(FX_LPCSTR pData, FX_INT32 iLength, FX_INT32 &iYear, FX_INT32 &iMonth, FX_INT32 &iDay, FX_INT32 &iHour, FX_INT32 &iMinute, FX_INT32 &iSecond, FX_INT32 &iMillionSecond, FX_INT32 &iZoneHour, FX_INT32 &iZoneMinute)\r
2125 {\r
2126     iYear = 0;\r
2127     iMonth = 0;\r
2128     iDay = 0;\r
2129     iHour = 0;\r
2130     iMinute = 0;\r
2131     iSecond = 0;\r
2132     if (!pData) {\r
2133         return FALSE;\r
2134     }\r
2135     FX_INT32 iRet = FALSE;\r
2136     FX_INT32 iIndex = 0;\r
2137     while (*(pData + iIndex) != 'T' && *(pData + iIndex) != 't') {\r
2138         if (iIndex >= iLength) {\r
2139             return iRet;\r
2140         }\r
2141         ++iIndex;\r
2142     }\r
2143     if (iIndex != 8 && iIndex != 10) {\r
2144         return iRet;\r
2145     }\r
2146     FX_INT32 iStyle = -1;\r
2147     iRet = IsIsoDateFormat(pData, iIndex , iStyle, iYear, iMonth, iDay);\r
2148     if (!iRet) {\r
2149         return iRet;\r
2150     }\r
2151     if (*(pData + iIndex) != 'T' && *(pData + iIndex) != 't') {\r
2152         return iRet;\r
2153     }\r
2154     ++iIndex;\r
2155     if (((iLength - iIndex > 13) && (iLength - iIndex < 6)) && (iLength - iIndex != 15)) {\r
2156         return iRet;\r
2157     }\r
2158     iRet = IsIsoTimeFormat(pData + iIndex, iLength - iIndex, iHour, iMinute, iSecond, iMillionSecond, iZoneHour, iZoneMinute);\r
2159     if (!iRet) {\r
2160         return iRet;\r
2161     }\r
2162     iRet = TRUE;\r
2163     return iRet;\r
2164 }\r
2165 FX_BOOL CXFA_FM2JSContext::Local2IsoDate(FXJSE_HOBJECT hThis, FX_BSTR szDate, FX_BSTR szFormat, FX_BSTR szLocale, CFX_ByteString &strIsoDate)\r
2166 {\r
2167     CXFA_FM2JSContext*  pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);\r
2168     CXFA_Document *pDoc = pContext->GetDocument();\r
2169     if(!pDoc) {\r
2170         return FALSE;\r
2171     }\r
2172     IFX_LocaleMgr *pMgr = (IFX_LocaleMgr *)pDoc->GetLocalMgr();\r
2173     IFX_Locale *pLocale = NULL;\r
2174     if (szLocale.IsEmpty()) {\r
2175         CXFA_Object * pThisNode = pDoc->GetScriptContext()->GetThisObject();\r
2176         FXSYS_assert(pThisNode->IsNode());\r
2177         CXFA_WidgetData widgetData((CXFA_Node *)pThisNode);\r
2178         pLocale = widgetData.GetLocal();\r
2179     } else {\r
2180         pLocale = pMgr->GetLocaleByName(CFX_WideString::FromUTF8(szLocale.GetCStr(), szLocale.GetLength()));\r
2181     }\r
2182     if (!pLocale) {\r
2183         return FALSE;\r
2184     }\r
2185     CFX_WideString wsFormat;\r
2186     if (szFormat.IsEmpty()) {\r
2187         pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat);\r
2188     } else {\r
2189         wsFormat = CFX_WideString::FromUTF8(szFormat.GetCStr(), szFormat.GetLength());\r
2190     }\r
2191     CXFA_LocaleValue widgetValue(XFA_VT_DATE, CFX_WideString::FromUTF8(szDate.GetCStr(), szDate.GetLength()),\r
2192                                  wsFormat, pLocale, (CXFA_LocaleMgr*)pMgr);\r
2193     CFX_Unitime dt = widgetValue.GetDate();\r
2194     strIsoDate.Format("%4d-%02d-%02d", dt.GetYear(), dt.GetMonth(), dt.GetDay());\r
2195     return TRUE;\r
2196 }\r
2197 FX_BOOL CXFA_FM2JSContext::Local2IsoTime(FXJSE_HOBJECT hThis, FX_BSTR szTime, FX_BSTR szFormat, FX_BSTR szLocale, CFX_ByteString &strIsoTime)\r
2198 {\r
2199     CXFA_FM2JSContext*  pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);\r
2200     CXFA_Document *pDoc = pContext->GetDocument();\r
2201     if(!pDoc) {\r
2202         return FALSE;\r
2203     }\r
2204     IFX_LocaleMgr *pMgr = (IFX_LocaleMgr *)pDoc->GetLocalMgr();\r
2205     IFX_Locale *pLocale = NULL;\r
2206     if (szLocale.IsEmpty()) {\r
2207         CXFA_Object * pThisNode = pDoc->GetScriptContext()->GetThisObject();\r
2208         FXSYS_assert(pThisNode->IsNode());\r
2209         CXFA_WidgetData widgetData((CXFA_Node *)pThisNode);\r
2210         pLocale = widgetData.GetLocal();\r
2211     } else {\r
2212         pLocale = pMgr->GetLocaleByName(CFX_WideString::FromUTF8(szLocale.GetCStr(), szLocale.GetLength()));\r
2213     }\r
2214     if (!pLocale) {\r
2215         return FALSE;\r
2216     }\r
2217     CFX_WideString wsFormat;\r
2218     if (szFormat.IsEmpty()) {\r
2219         pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat);\r
2220     } else {\r
2221         wsFormat = CFX_WideString::FromUTF8(szFormat.GetCStr(), szFormat.GetLength());\r
2222     }\r
2223     wsFormat = FX_WSTRC(L"time{") + wsFormat;\r
2224     wsFormat += FX_WSTRC(L"}");\r
2225     CXFA_LocaleValue widgetValue(XFA_VT_TIME, CFX_WideString::FromUTF8(szTime.GetCStr(), szTime.GetLength()),\r
2226                                  wsFormat, pLocale, (CXFA_LocaleMgr*)pMgr);\r
2227     CFX_Unitime utime = widgetValue.GetTime();\r
2228     strIsoTime.Format("%02d:%02d:%02d.%03d", utime.GetHour(), utime.GetMinute(), utime.GetSecond(), utime.GetMillisecond());\r
2229     return TRUE;\r
2230 }\r
2231 FX_BOOL CXFA_FM2JSContext::IsoDate2Local(FXJSE_HOBJECT hThis, FX_BSTR szDate, FX_BSTR szFormat, FX_BSTR szLocale, CFX_ByteString &strLocalDate)\r
2232 {\r
2233     CXFA_FM2JSContext*  pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);\r
2234     CXFA_Document *pDoc = pContext->GetDocument();\r
2235     if(!pDoc) {\r
2236         return FALSE;\r
2237     }\r
2238     IFX_LocaleMgr *pMgr = (IFX_LocaleMgr *)pDoc->GetLocalMgr();\r
2239     IFX_Locale *pLocale = NULL;\r
2240     if (szLocale.IsEmpty()) {\r
2241         CXFA_Object * pThisNode = pDoc->GetScriptContext()->GetThisObject();\r
2242         FXSYS_assert(pThisNode->IsNode());\r
2243         CXFA_WidgetData widgetData((CXFA_Node *)pThisNode);\r
2244         pLocale = widgetData.GetLocal();\r
2245     } else {\r
2246         pLocale = pMgr->GetLocaleByName(CFX_WideString::FromUTF8(szLocale.GetCStr(), szLocale.GetLength()));\r
2247     }\r
2248     if (!pLocale) {\r
2249         return FALSE;\r
2250     }\r
2251     CFX_WideString wsFormat;\r
2252     if (szFormat.IsEmpty()) {\r
2253         pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat);\r
2254     } else {\r
2255         wsFormat = CFX_WideString::FromUTF8(szFormat.GetCStr(), szFormat.GetLength());\r
2256     }\r
2257     CXFA_LocaleValue widgetValue(XFA_VT_DATE, CFX_WideString::FromUTF8(szDate.GetCStr(), szDate.GetLength()), (CXFA_LocaleMgr*)pMgr);\r
2258     CFX_WideString wsRet;\r
2259     widgetValue.FormatPatterns(wsRet, wsFormat, pLocale, XFA_VALUEPICTURE_Display);\r
2260     strLocalDate = FX_UTF8Encode(wsRet, wsRet.GetLength());\r
2261     return TRUE;\r
2262 }\r
2263 FX_BOOL CXFA_FM2JSContext::IsoTime2Local(FXJSE_HOBJECT hThis, FX_BSTR szTime, FX_BSTR szFormat, FX_BSTR szLocale, CFX_ByteString &strLocalTime)\r
2264 {\r
2265     CXFA_FM2JSContext*  pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);\r
2266     CXFA_Document *pDoc = pContext->GetDocument();\r
2267     if(!pDoc) {\r
2268         return FALSE;\r
2269     }\r
2270     IFX_LocaleMgr *pMgr = (IFX_LocaleMgr *)pDoc->GetLocalMgr();\r
2271     IFX_Locale *pLocale = NULL;\r
2272     if (szLocale.IsEmpty()) {\r
2273         CXFA_Object * pThisNode = pDoc->GetScriptContext()->GetThisObject();\r
2274         FXSYS_assert(pThisNode->IsNode());\r
2275         CXFA_WidgetData widgetData((CXFA_Node *)pThisNode);\r
2276         pLocale = widgetData.GetLocal();\r
2277     } else {\r
2278         pLocale = pMgr->GetLocaleByName(CFX_WideString::FromUTF8(szLocale.GetCStr(), szLocale.GetLength()));\r
2279     }\r
2280     if (!pLocale) {\r
2281         return FALSE;\r
2282     }\r
2283     CFX_WideString wsFormat;\r
2284     if (szFormat.IsEmpty()) {\r
2285         pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat);\r
2286     } else {\r
2287         wsFormat = CFX_WideString::FromUTF8(szFormat.GetCStr(), szFormat.GetLength());\r
2288     }\r
2289     wsFormat = FX_WSTRC(L"time{") + wsFormat;\r
2290     wsFormat += FX_WSTRC(L"}");\r
2291     CXFA_LocaleValue widgetValue(XFA_VT_TIME, CFX_WideString::FromUTF8(szTime.GetCStr(), szTime.GetLength()), (CXFA_LocaleMgr*)pMgr);\r
2292     CFX_WideString wsRet;\r
2293     widgetValue.FormatPatterns(wsRet, wsFormat, pLocale, XFA_VALUEPICTURE_Display);\r
2294     strLocalTime = FX_UTF8Encode(wsRet, wsRet.GetLength());\r
2295     return TRUE;\r
2296 }\r
2297 FX_BOOL CXFA_FM2JSContext::GetGMTTime(FXJSE_HOBJECT hThis, FX_BSTR szTime, FX_BSTR szFormat, FX_BSTR szLocale, CFX_ByteString &strGMTTime)\r
2298 {\r
2299     CXFA_FM2JSContext*  pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);\r
2300     CXFA_Document *pDoc = pContext->GetDocument();\r
2301     if(!pDoc) {\r
2302         return FALSE;\r
2303     }\r
2304     IFX_LocaleMgr *pMgr = (IFX_LocaleMgr *)pDoc->GetLocalMgr();\r
2305     IFX_Locale *pLocale = NULL;\r
2306     if (szLocale.IsEmpty()) {\r
2307         CXFA_Object * pThisNode = pDoc->GetScriptContext()->GetThisObject();\r
2308         FXSYS_assert(pThisNode->IsNode());\r
2309         CXFA_WidgetData widgetData((CXFA_Node *)pThisNode);\r
2310         pLocale = widgetData.GetLocal();\r
2311     } else {\r
2312         pLocale = pMgr->GetLocaleByName(CFX_WideString::FromUTF8(szLocale.GetCStr(), szLocale.GetLength()));\r
2313     }\r
2314     if (!pLocale) {\r
2315         return FALSE;\r
2316     }\r
2317     CFX_WideString wsFormat;\r
2318     if (szFormat.IsEmpty()) {\r
2319         pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat);\r
2320     } else {\r
2321         wsFormat = CFX_WideString::FromUTF8(szFormat.GetCStr(), szFormat.GetLength());\r
2322     }\r
2323     wsFormat = FX_WSTRC(L"time{") + wsFormat;\r
2324     wsFormat += FX_WSTRC(L"}");\r
2325     CXFA_LocaleValue widgetValue(XFA_VT_TIME, CFX_WideString::FromUTF8(szTime.GetCStr(), szTime.GetLength()), (CXFA_LocaleMgr*)pMgr);\r
2326     CFX_WideString wsRet;\r
2327     widgetValue.FormatPatterns(wsRet, wsFormat, pLocale, XFA_VALUEPICTURE_Display);\r
2328     strGMTTime = FX_UTF8Encode(wsRet, wsRet.GetLength());\r
2329     return TRUE;\r
2330 }\r
2331 FX_INT32  CXFA_FM2JSContext::DateString2Num(FX_BSTR szDateString)\r
2332 {\r
2333     FX_BOOL bFlags = FALSE;\r
2334     FX_INT32 iLength = szDateString.GetLength();\r
2335     FX_BOOL iRet = FALSE;\r
2336     FX_INT32 iStyle = -1;\r
2337     FX_INT32 iYear = 0;\r
2338     FX_INT32 iMonth = 0;\r
2339     FX_INT32 iDay = 0;\r
2340     FX_INT32 iHour = 0;\r
2341     FX_INT32 iMinute = 0;\r
2342     FX_INT32 iSecond = 0;\r
2343     FX_INT32 iMillionSecond = 0;\r
2344     FX_INT32 iZoneHour = 0;\r
2345     FX_INT32 iZoneMinute = 0;\r
2346     if (iLength <= 10) {\r
2347         iRet = IsIsoDateFormat(szDateString.GetCStr(), iLength, iStyle, iYear, iMonth, iDay);\r
2348     } else {\r
2349         iRet = IsIsoDateTimeFormat(szDateString.GetCStr(), iLength, iYear, iMonth, iDay, iHour, iMinute, iSecond, iMillionSecond, iZoneHour, iZoneMinute);\r
2350     }\r
2351     if (!iRet) {\r
2352         bFlags = TRUE;\r
2353     }\r
2354     FX_FLOAT dDays = 0;\r
2355     FX_INT32 i = 1;\r
2356     if (iYear < 1900) {\r
2357         bFlags = TRUE;\r
2358     }\r
2359     if(!bFlags) {\r
2360         while (iYear - i >= 1900) {\r
2361             if ((!((iYear - i) % 4) && ((iYear - i) % 100)) || !((iYear - i) % 400)) {\r
2362                 dDays += 366;\r
2363             } else {\r
2364                 dDays += 365;\r
2365             }\r
2366             ++i;\r
2367         }\r
2368         i = 1;\r
2369         while (i < iMonth) {\r
2370             if (i == 2) {\r
2371                 if ((!(iYear % 4) && (iYear % 100)) || !(iYear % 400)) {\r
2372                     dDays += 29;\r
2373                 } else {\r
2374                     dDays += 28;\r
2375                 }\r
2376             } else if (i <= 7) {\r
2377                 if (i % 2 == 0) {\r
2378                     dDays += 30;\r
2379                 } else {\r
2380                     dDays += 31;\r
2381                 }\r
2382             } else {\r
2383                 if (i % 2 == 0) {\r
2384                     dDays += 31;\r
2385                 } else {\r
2386                     dDays += 30;\r
2387                 }\r
2388             }\r
2389             ++i;\r
2390         }\r
2391         i = 0;\r
2392         while (iDay - i > 0) {\r
2393             dDays += 1;\r
2394             ++i;\r
2395         }\r
2396     } else {\r
2397         dDays = 0;\r
2398     }\r
2399     return (FX_INT32)dDays;\r
2400 }\r
2401 #define XFA_N 19\r
2402 static FX_BYTE g_sAltTable_Date[] = {\r
2403     XFA_N, XFA_N, XFA_N,   3,     9,   XFA_N, XFA_N, XFA_N,\r
2404     XFA_N, XFA_N, XFA_N, XFA_N,   2,   XFA_N, XFA_N, XFA_N,\r
2405     XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,\r
2406     1,   XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,\r
2407     XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,\r
2408     XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,\r
2409     XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,\r
2410     XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,\r
2411 };\r
2412 static FX_BYTE g_sAltTable_Time[] = {\r
2413     14,  XFA_N, XFA_N,   3,     9,   XFA_N, XFA_N,    15,\r
2414     XFA_N, XFA_N, XFA_N, XFA_N,   6,   XFA_N, XFA_N, XFA_N,\r
2415     XFA_N, XFA_N,   7,   XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,\r
2416     1,   17,    XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,\r
2417     XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,    15,\r
2418     XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,\r
2419     XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,\r
2420     XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,\r
2421 };\r
2422 static void XFA_FM_AlternateDateTimeSymbols(CFX_WideString &wsPattern, const CFX_WideString &wsAltSymbols, FX_BYTE *pAltTable)\r
2423 {\r
2424     FX_INT32    nLength                 = wsPattern.GetLength();\r
2425     FX_BOOL             bInConstRange   = FALSE;\r
2426     FX_BOOL             bEscape                 = FALSE;\r
2427     FX_INT32 i = 0, n = 0;\r
2428     while (i < nLength) {\r
2429         FX_WCHAR wc = wsPattern[i];\r
2430         if (wc == L'\'') {\r
2431             bInConstRange       = !bInConstRange;\r
2432             if (bEscape) {\r
2433                 i ++;\r
2434             } else {\r
2435                 wsPattern.Delete(i);\r
2436                 nLength --;\r
2437             }\r
2438             bEscape = !bEscape;\r
2439             continue;\r
2440         }\r
2441         if (!bInConstRange && (n = wc - L'A') >= 0 && n <= (L'a' - L'A')) {\r
2442             FX_INT32 nAlt = (FX_INT32)pAltTable[n];\r
2443             if (nAlt != XFA_N) {\r
2444                 wsPattern.SetAt(i, wsAltSymbols[nAlt]);\r
2445             }\r
2446         }\r
2447         i ++;\r
2448         bEscape = FALSE;\r
2449     }\r
2450 }\r
2451 #undef XFA_N\r
2452 void CXFA_FM2JSContext::GetLocalDateFormat(FXJSE_HOBJECT hThis, FX_INT32 iStyle, FX_BSTR szLocalStr, CFX_ByteString &strFormat, FX_BOOL bStandard)\r
2453 {\r
2454     FX_LOCALEDATETIMESUBCATEGORY strStyle;\r
2455     switch (iStyle) {\r
2456         case 0:\r
2457             strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium;\r
2458             break;\r
2459         case 1:\r
2460             strStyle = FX_LOCALEDATETIMESUBCATEGORY_Short;\r
2461             break;\r
2462         case 2:\r
2463             strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium;\r
2464             break;\r
2465         case 3:\r
2466             strStyle = FX_LOCALEDATETIMESUBCATEGORY_Long;\r
2467             break;\r
2468         case 4:\r
2469             strStyle = FX_LOCALEDATETIMESUBCATEGORY_Full;\r
2470             break;\r
2471         default:\r
2472             strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium;\r
2473             break;\r
2474     }\r
2475     CXFA_FM2JSContext*  pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);\r
2476     CXFA_Document *pDoc = pContext->GetDocument();\r
2477     if(!pDoc) {\r
2478         return;\r
2479     }\r
2480     IFX_LocaleMgr *pMgr = (IFX_LocaleMgr *)pDoc->GetLocalMgr();\r
2481     IFX_Locale *pLocale = NULL;\r
2482     if (szLocalStr.IsEmpty()) {\r
2483         CXFA_Object* pThisNode = pDoc->GetScriptContext()->GetThisObject();\r
2484         FXSYS_assert(pThisNode->IsNode());\r
2485         CXFA_WidgetData widgetData((CXFA_Node*)pThisNode);\r
2486         pLocale = widgetData.GetLocal();\r
2487     } else {\r
2488         pLocale = pMgr->GetLocaleByName(CFX_WideString::FromUTF8(szLocalStr.GetCStr(), szLocalStr.GetLength()));\r
2489     }\r
2490     if (!pLocale) {\r
2491         return;\r
2492     }\r
2493     CFX_WideString strRet;\r
2494     pLocale->GetDatePattern(strStyle, strRet);\r
2495     if (!bStandard) {\r
2496         CFX_WideString wsSymbols;\r
2497         pLocale->GetDateTimeSymbols(wsSymbols);\r
2498         XFA_FM_AlternateDateTimeSymbols(strRet, wsSymbols, g_sAltTable_Date);\r
2499     }\r
2500     strFormat = FX_UTF8Encode(strRet, strRet.GetLength());\r
2501 }\r
2502 void CXFA_FM2JSContext::GetLocalTimeFormat(FXJSE_HOBJECT hThis, FX_INT32 iStyle, FX_BSTR szLocalStr, CFX_ByteString &strFormat, FX_BOOL bStandard)\r
2503 {\r
2504     FX_LOCALEDATETIMESUBCATEGORY strStyle;\r
2505     switch (iStyle) {\r
2506         case 0:\r
2507             strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium;\r
2508             break;\r
2509         case 1:\r
2510             strStyle = FX_LOCALEDATETIMESUBCATEGORY_Short;\r
2511             break;\r
2512         case 2:\r
2513             strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium;\r
2514             break;\r
2515         case 3:\r
2516             strStyle = FX_LOCALEDATETIMESUBCATEGORY_Long;\r
2517             break;\r
2518         case 4:\r
2519             strStyle = FX_LOCALEDATETIMESUBCATEGORY_Full;\r
2520             break;\r
2521         default:\r
2522             strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium;\r
2523             break;\r
2524     }\r
2525     CXFA_FM2JSContext*  pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);\r
2526     CXFA_Document *pDoc = pContext->GetDocument();\r
2527     if(!pDoc) {\r
2528         return;\r
2529     }\r
2530     IFX_LocaleMgr *pMgr = (IFX_LocaleMgr *)pDoc->GetLocalMgr();\r
2531     IFX_Locale *pLocale = NULL;\r
2532     if (szLocalStr.IsEmpty()) {\r
2533         CXFA_Object *pThisObject = pDoc->GetScriptContext()->GetThisObject();\r
2534         FXSYS_assert(pThisObject->IsNode());\r
2535         CXFA_Node* pThisNode = (CXFA_Node *)pThisObject;\r
2536         CXFA_WidgetData widgetData(pThisNode);\r
2537         pLocale = widgetData.GetLocal();\r
2538     } else {\r
2539         pLocale = pMgr->GetLocaleByName(CFX_WideString::FromUTF8(szLocalStr.GetCStr(), szLocalStr.GetLength()));\r
2540     }\r
2541     if (!pLocale) {\r
2542         return;\r
2543     }\r
2544     CFX_WideString strRet;\r
2545     pLocale->GetTimePattern(strStyle, strRet);\r
2546     if (!bStandard) {\r
2547         CFX_WideString wsSymbols;\r
2548         pLocale->GetDateTimeSymbols(wsSymbols);\r
2549         XFA_FM_AlternateDateTimeSymbols(strRet, wsSymbols, g_sAltTable_Time);\r
2550     }\r
2551     strFormat = FX_UTF8Encode(strRet, strRet.GetLength());\r
2552 }\r
2553 void CXFA_FM2JSContext::GetStandardDateFormat(FXJSE_HOBJECT hThis, FX_INT32 iStyle, FX_BSTR szLocalStr, CFX_ByteString &strFormat)\r
2554 {\r
2555     GetLocalDateFormat(hThis, iStyle, szLocalStr, strFormat, TRUE);\r
2556 }\r
2557 void CXFA_FM2JSContext::GetStandardTimeFormat(FXJSE_HOBJECT hThis, FX_INT32 iStyle, FX_BSTR szLocalStr, CFX_ByteString &strFormat)\r
2558 {\r
2559     GetLocalTimeFormat(hThis, iStyle, szLocalStr, strFormat, TRUE);\r
2560 }\r
2561 void CXFA_FM2JSContext::Num2AllTime(FXJSE_HOBJECT hThis, FX_INT32 iTime, FX_BSTR szFormat, FX_BSTR szLocale, FX_BOOL bGM, CFX_ByteString &strTime)\r
2562 {\r
2563     FX_INT32 iHour = 0;\r
2564     FX_INT32 iMin = 0;\r
2565     FX_INT32 iSec = 0;\r
2566     FX_INT32 iZoneHour = 0;\r
2567     FX_INT32 iZoneMin = 0;\r
2568     FX_INT32 iZoneSec = 0;\r
2569     iHour = static_cast<int>(iTime) / 3600000;\r
2570     iMin = (static_cast<int>(iTime) - iHour * 3600000) / 60000;\r
2571     iSec = (static_cast<int>(iTime) - iHour * 3600000 - iMin * 60000) / 1000;\r
2572     if (!bGM) {\r
2573         GetLocalTimeZone(iZoneHour, iZoneMin, iZoneSec);\r
2574         iHour += iZoneHour;\r
2575         iMin += iZoneMin;\r
2576         iSec += iZoneSec;\r
2577     }\r
2578     FX_INT32 iRet = 0;\r
2579     CFX_ByteString strIsoTime;\r
2580     strIsoTime.Format("%02d:%02d:%02d", iHour, iMin, iSec);\r
2581     if (bGM) {\r
2582         iRet = GetGMTTime(hThis, strIsoTime, szFormat, szLocale, strTime);\r
2583     } else {\r
2584         iRet = IsoTime2Local(hThis, strIsoTime, szFormat, szLocale, strTime);\r
2585     }\r
2586     if (!iRet) {\r
2587         strTime = FX_BSTRC("");\r
2588     }\r
2589     return;\r
2590 }\r
2591 void CXFA_FM2JSContext::GetLocalTimeZone(FX_INT32 &iHour, FX_INT32 &iMin, FX_INT32 &iSec)\r
2592 {\r
2593     time_t now;\r
2594     time(&now);\r
2595     struct tm *pGmt = gmtime(&now);\r
2596     FX_INT32 iGMHour = pGmt->tm_hour;\r
2597     FX_INT32 iGMMin = pGmt->tm_min;\r
2598     FX_INT32 iGMSec = pGmt->tm_sec;\r
2599     struct tm *pLocal = localtime(&now);\r
2600     FX_INT32 iLocalHour = pLocal->tm_hour;\r
2601     FX_INT32 iLocalMin = pLocal->tm_min;\r
2602     FX_INT32 iLocalSec = pLocal->tm_sec;\r
2603     iHour = iLocalHour - iGMHour;\r
2604     iMin = iLocalMin - iGMMin;\r
2605     iSec = iLocalSec - iGMSec;\r
2606 }\r
2607 void CXFA_FM2JSContext::Apr(FXJSE_HOBJECT hThis,        FX_BSTR szFuncName, CFXJSE_Arguments &args)\r
2608 {\r
2609     CXFA_FM2JSContext*  pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);\r
2610     if(args.GetLength() == 3) {\r
2611         FX_BOOL bFlags = FALSE;\r
2612         FX_DOUBLE nPrincipal = 0;\r
2613         FX_DOUBLE nPayment = 0;\r
2614         FX_DOUBLE nPeriods = 0;\r
2615         FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);\r
2616         FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);\r
2617         FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2);\r
2618         bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) || HValueIsNull(hThis, argThree));\r
2619         if(bFlags) {\r
2620             FXJSE_Value_SetNull(args.GetReturnValue());\r
2621         } else {\r
2622             nPrincipal = HValueToDouble(hThis, argOne);\r
2623             nPayment = HValueToDouble(hThis, argTwo);\r
2624             nPeriods = HValueToDouble(hThis, argThree);\r
2625             bFlags = ((nPrincipal <= 0) || (nPayment <= 0) || (nPeriods <= 0));\r
2626             if(bFlags) {\r
2627                 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);\r
2628             } else {\r
2629                 FX_DOUBLE r = 2 * (nPeriods * nPayment - nPrincipal) / (nPeriods * nPrincipal);\r
2630                 FX_DOUBLE nTemp = 1;\r
2631                 for (FX_INT32 i = 0; i < nPeriods; ++i) {\r
2632                     nTemp *= (1 + r);\r
2633                 }\r
2634                 FX_DOUBLE nRet = r * nTemp / (nTemp - 1) - nPayment / nPrincipal;\r
2635                 while ( (nRet > FINANCIAL_PRECISION || nRet < -FINANCIAL_PRECISION) && (!bFlags) ) {\r
2636                     FX_DOUBLE nDerivative = 0;\r
2637                     nDerivative = ((nTemp + r * nPeriods * (nTemp / (1 + r))) * (nTemp - 1) - (r * nTemp * nPeriods * (nTemp / (1 + r)))) / ((nTemp - 1) * (nTemp - 1));\r
2638                     if (nDerivative == 0) {\r
2639                         bFlags = TRUE;\r
2640                         continue;\r
2641                     }\r
2642                     r = r - nRet / nDerivative;\r
2643                     nTemp = 1;\r
2644                     for (FX_INT32 i = 0; i < nPeriods; ++i) {\r
2645                         nTemp *= (1 + r);\r
2646                     }\r
2647                     nRet = r * nTemp / (nTemp - 1) - nPayment / nPrincipal;\r
2648                 }\r
2649                 if(bFlags) {\r
2650                     FXJSE_Value_SetNull(args.GetReturnValue());\r
2651                 } else {\r
2652                     r = r * 12;\r
2653                     FXJSE_Value_SetDouble(args.GetReturnValue(), r);\r
2654                 }\r
2655             }\r
2656         }\r
2657         FXJSE_Value_Release(argOne);\r
2658         FXJSE_Value_Release(argTwo);\r
2659         FXJSE_Value_Release(argThree);\r
2660     } else {\r
2661         pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"Apr"));\r
2662     }\r
2663 }\r
2664 void CXFA_FM2JSContext::CTerm(FXJSE_HOBJECT hThis,      FX_BSTR szFuncName, CFXJSE_Arguments &args)\r
2665 {\r
2666     CXFA_FM2JSContext*  pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);\r
2667     if(args.GetLength() == 3) {\r
2668         FX_BOOL bFlags = FALSE;\r
2669         FX_FLOAT nRate = 0;\r
2670         FX_FLOAT nFutureValue = 0;\r
2671         FX_FLOAT nInitAmount = 0;\r
2672         FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);\r
2673         FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);\r
2674         FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2);\r
2675         bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) || HValueIsNull(hThis, argThree));\r
2676         if(bFlags) {\r
2677             FXJSE_Value_SetNull(args.GetReturnValue());\r
2678         } else {\r
2679             nRate = HValueToFloat(hThis, argOne);\r
2680             nFutureValue = HValueToFloat(hThis, argTwo);\r
2681             nInitAmount = HValueToFloat(hThis, argThree);\r
2682             bFlags = ((nRate <= 0) || (nFutureValue <= 0) || (nInitAmount <= 0));\r
2683             if(bFlags) {\r
2684                 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);\r
2685             } else {\r
2686                 FXJSE_Value_SetFloat(args.GetReturnValue(), FXSYS_log((FX_FLOAT)(nFutureValue / nInitAmount)) / FXSYS_log((FX_FLOAT)(1 + nRate)) );\r
2687             }\r
2688         }\r
2689         FXJSE_Value_Release(argOne);\r
2690         FXJSE_Value_Release(argTwo);\r
2691         FXJSE_Value_Release(argThree);\r
2692     } else {\r
2693         pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"CTerm"));\r
2694     }\r
2695 }\r
2696 void CXFA_FM2JSContext::FV(FXJSE_HOBJECT hThis, FX_BSTR szFuncName, CFXJSE_Arguments &args)\r
2697 {\r
2698     CXFA_FM2JSContext*  pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);\r
2699     if(args.GetLength() == 3) {\r
2700         FX_BOOL bFlags = FALSE;\r
2701         FX_DOUBLE nAmount = 0;\r
2702         FX_DOUBLE nRate = 0;\r
2703         FX_DOUBLE nPeriod = 0;\r
2704         FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);\r
2705         FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);\r
2706         FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2);\r
2707         bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) || HValueIsNull(hThis, argThree));\r
2708         if(bFlags) {\r
2709             FXJSE_Value_SetNull(args.GetReturnValue());\r
2710         } else {\r
2711             nAmount = HValueToDouble(hThis, argOne);\r
2712             nRate = HValueToDouble(hThis, argTwo);\r
2713             nPeriod = HValueToDouble(hThis, argThree);\r
2714             bFlags = ((nRate < 0) || (nPeriod <= 0) || (nAmount <= 0));\r
2715             if(bFlags) {\r
2716                 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);\r
2717             } else {\r
2718                 FX_DOUBLE dResult = 0;\r
2719                 if (!nRate) {\r
2720                     dResult = nAmount * nPeriod;\r
2721                 } else {\r
2722                     FX_DOUBLE nTemp = 1;\r
2723                     for (int i = 0; i < nPeriod; ++i) {\r
2724                         nTemp *= 1 + nRate;\r
2725                     }\r
2726                     dResult = nAmount * (nTemp - 1) / nRate;\r
2727                 }\r
2728                 FXJSE_Value_SetDouble(args.GetReturnValue(), dResult);\r
2729             }\r
2730         }\r
2731         FXJSE_Value_Release(argOne);\r
2732         FXJSE_Value_Release(argTwo);\r
2733         FXJSE_Value_Release(argThree);\r
2734     } else {\r
2735         pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, (FX_LPCWSTR)(L"FV"));\r
2736     }\r
2737 }\r
2738 void CXFA_FM2JSContext::IPmt(FXJSE_HOBJECT hThis,       FX_BSTR szFuncName, CFXJSE_Arguments &args)\r
2739 {\r
2740     CXFA_FM2JSContext*  pContext = (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);\r
2741     if(args.GetLength() == 5) {\r
2742         FX_BOOL bFlags = FALSE;\r
2743         FX_FLOAT nPrincpalAmount = 0;\r
2744         FX_FLOAT nRate = 0;\r
2745         FX_FLOAT nPayment = 0;\r
2746         FX_FLOAT nFirstMonth = 0;\r
2747         FX_FLOAT nNumberOfMonths = 0;\r
2748         FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);\r
2749         FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);\r
2750         FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2);\r
2751         FXJSE_HVALUE argFour = GetSimpleHValue(hThis, args, 3);\r
2752         FXJSE_HVALUE argFive = GetSimpleHValue(hThis, args, 4);\r
2753         bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) || HValueIsNull(hThis, argThree) ||\r
2754                   HValueIsNull(hThis, argFour) || HValueIsNull(hThis, argFive));\r
2755         if(bFlags) {\r
2756             FXJSE_Value_SetNull(args.GetReturnValue());\r
2757         } else {\r
2758             nPrincpalAmount = HValueToFloat(hThis, argOne);\r
2759             nRate = HValueToFloat(hThis, argTwo);\r
2760             nPayment = HValueToFloat(hThis, argThree);\r
2761             nFirstMonth = HValueToFloat(hThis, argFour);\r
2762             nNumberOfMonths = HValueToFloat(hThis, argFive);\r
2763             bFlags = ((nPrincpalAmount <= 0) || (nRate <= 0) || (nPayment <= 0) || (nFirstMonth < 0) || (nNumberOfMonths < 0));\r
2764             if(bFlags) {\r
2765                 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);\r
2766             } else {\r
2767                 FX_FLOAT fResult = 0;\r
2768                 FX_FLOAT nRateOfMonth = nRate / 12;\r
2769                 FX_INT32 iNums = (FX_INT32)((FXSYS_log10((FX_FLOAT)(nPayment / nPrincpalAmount)) - FXSYS_log10((FX_FLOAT)(nPayment / nPrincpalAmount - nRateOfMonth))) / FXSYS_log10((FX_FLOAT)(1 + nRateOfMonth)));\r
2770                 FX_INT32 iEnd = (FX_INT32)(nFirstMonth + nNumberOfMonths - 1);\r
2771                 if (iEnd > iNums) {\r
2772                     iEnd = iNums;\r
2773                 }\r
2774                 FX_FLOAT nSum = 0;\r
2775                 if (nPayment < nPrincpalAmount * nRateOfMonth) {\r
2776                     bFlags = TRUE;\r
2777                     fResult = 0;\r