// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#include "xfa/fxfa/fm2js/xfa_fm2jscontext.h"

#include <time.h>

#include "core/fxcrt/include/fx_ext.h"
#include "xfa/fgas/localization/fgas_locale.h"
#include "xfa/fxfa/app/xfa_ffnotify.h"
#include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
#include "xfa/fxfa/parser/xfa_document.h"
#include "xfa/fxfa/parser/xfa_localevalue.h"
#include "xfa/fxfa/parser/xfa_parser.h"
#include "xfa/fxfa/parser/xfa_parser_imp.h"
#include "xfa/fxfa/parser/xfa_script_imp.h"
#include "xfa/fxjse/cfxjse_arguments.h"

#define FINANCIAL_PRECISION 0.00000001

namespace {

struct XFA_FMHtmlReserveCode {
  uint32_t m_uCode;
  const FX_WCHAR* m_htmlReserve;
};
struct XFA_FMHtmlHashedReserveCode {
  uint32_t m_uHash;
  const FX_WCHAR* m_htmlReserve;
  uint32_t m_uCode;
};

const XFA_FMHtmlHashedReserveCode reservesForDecode[] = {
    {0x00018b62, L"Mu", 924},       {0x00019083, L"Nu", 925},
    {0x00019ab9, L"Pi", 928},       {0x0001c3c1, L"Xi", 926},
    {0x000210ac, L"ge", 8805},      {0x000210bb, L"gt", 62},
    {0x00022a51, L"le", 8804},      {0x00022a60, L"lt", 60},
    {0x00022f82, L"mu", 956},       {0x00023493, L"ne", 8800},
    {0x00023497, L"ni", 8715},      {0x000234a3, L"nu", 957},
    {0x000239c1, L"or", 8744},      {0x00023ed9, L"pi", 960},
    {0x000267e1, L"xi", 958},       {0x00c41789, L"lceil", 8968},
    {0x00eef34f, L"thetasym", 977}, {0x012d7ead, L"lcirc", 206},
    {0x01637b56, L"agrave", 224},   {0x020856da, L"crarr", 8629},
    {0x022188c3, L"gamma", 947},    {0x033586d3, L"nbsp", 160},
    {0x04f4c358, L"nsub", 8836},    {0x0581466a, L"dagger", 8224},
    {0x06b1f790, L"oelig", 339},    {0x06e490d4, L"Chi", 935},
    {0x0718c6a1, L"ETH", 208},      {0x07196ada, L"Eta", 919},
    {0x07f667ca, L"Ugrave", 217},   {0x083a8a21, L"Phi", 934},
    {0x083ac28c, L"Psi", 936},      {0x086f26a9, L"Rho", 929},
    {0x089b5b51, L"aring", 229},    {0x08a39f4a, L"Tau", 932},
    {0x08b6188b, L"THORN", 222},    {0x09ce792a, L"icirc", 238},
    {0x09f9d61e, L"amp", 38},       {0x09f9db33, L"and", 8743},
    {0x09f9db36, L"ang", 8736},     {0x0a2e3514, L"cap", 8745},
    {0x0a2e58f4, L"chi", 967},      {0x0a2e9ba8, L"cup", 8746},
    {0x0a4897d0, L"deg", 176},      {0x0a6332fa, L"eta", 951},
    {0x0a633301, L"eth", 240},      {0x0acc4d4b, L"int", 8747},
    {0x0b1b3d35, L"loz", 9674},     {0x0b1b4c8b, L"lrm", 8206},
    {0x0b4fd9b1, L"not", 172},      {0x0b845241, L"phi", 966},
    {0x0b84576f, L"piv", 982},      {0x0b848aac, L"psi", 968},
    {0x0bb8df5e, L"reg", 174},      {0x0bb8eec9, L"rho", 961},
    {0x0bb9034b, L"rlm", 8207},     {0x0bd33d14, L"shy", 173},
    {0x0bd34229, L"sim", 8764},     {0x0bd37faa, L"sub", 8834},
    {0x0bd37fb5, L"sum", 8721},     {0x0bd37fb8, L"sup", 8835},
    {0x0bed676a, L"tau", 964},      {0x0c07f32e, L"uml", 168},
    {0x0c71032c, L"yen", 165},      {0x0c7f2889, L"szlig", 223},
    {0x0c8badbb, L"zwj", 8205},     {0x10ba4dba, L"Egrave", 200},
    {0x10f1ea24, L"para", 182},     {0x10f1ea37, L"part", 8706},
    {0x115b2337, L"perp", 8869},    {0x12b10d15, L"prod", 8719},
    {0x12b10d21, L"prop", 8733},    {0x12dfa9f4, L"rfloor", 8971},
    {0x12eb4736, L"Agrave", 192},   {0x12fff2b7, L"pund", 163},
    {0x13fda9f2, L"tilde", 732},    {0x1417fd62, L"times", 215},
    {0x154fc726, L"ecirc", 234},    {0x165aa451, L"sigma", 963},
    {0x1709124a, L"Dagger", 8225},  {0x192f78d5, L"iexcl", 161},
    {0x1b7ed8d7, L"rArr", 8658},    {0x1ec88c68, L"rang", 9002},
    {0x1ec8a0f7, L"rarr", 8594},    {0x1eda07f3, L"atilde", 227},
    {0x1f3182c4, L"real", 8476},    {0x1fc34f8b, L"yacute", 253},
    {0x20d11522, L"acirc", 226},    {0x21933a9b, L"rsaquo", 8250},
    {0x21f44907, L"uacute", 250},   {0x220cca72, L"acute", 180},
    {0x242cded1, L"alefsym", 8501}, {0x2655c66a, L"delta", 948},
    {0x269e4b4d, L"exist", 8707},   {0x273379fa, L"micro", 181},
    {0x27a37440, L"forall", 8704},  {0x2854e62c, L"minus", 8722},
    {0x28636f81, L"cedil", 184},    {0x2887357b, L"iacute", 237},
    {0x2994d5ff, L"frac12", 189},   {0x2994d601, L"frac14", 188},
    {0x2994e043, L"frac34", 190},   {0x2a1feb41, L"lambda", 955},
    {0x2ab215f3, L"apos", 39},      {0x2ab82ef7, L"eacute", 233},
    {0x2b3592ef, L"auml", 228},     {0x2ce92873, L"aacute", 225},
    {0x2daff48a, L"oslash", 248},   {0x2ef68882, L"aelig", 230},
    {0x3061d3d3, L"Atilde", 195},   {0x314b1b6b, L"Yacute", 221},
    {0x337c14e7, L"Uacute", 218},   {0x37676aca, L"cent", 162},
    {0x37d0b841, L"circ", 710},     {0x386e7947, L"cong", 8773},
    {0x386e839b, L"copy", 169},     {0x3a0e225a, L"Epsilon", 917},
    {0x3ba7b721, L"Lambda", 923},   {0x3bd9abe6, L"Alpha", 913},
    {0x3c3ffad7, L"Eacute", 201},   {0x3cfaf69f, L"brvbar", 166},
    {0x3d54a489, L"omega", 969},    {0x3e70f453, L"Aacute", 193},
    {0x3f37c06a, L"Oslash", 216},   {0x40e1b34e, L"diams", 9830},
    {0x416596df, L"plusmn", 177},   {0x4354ff16, L"Ucirc", 219},
    {0x454fce6a, L"Upsilon", 933},  {0x4610ad35, L"emsp", 8195},
    {0x462afb76, L"ensp", 8194},    {0x46e30073, L"euml", 235},
    {0x46e31a1b, L"euro", 8364},    {0x46f2eada, L"lowast", 8727},
    {0x4dca26cf, L"Auml", 196},     {0x4e2d6083, L"image", 8465},
    {0x4f964ee8, L"notin", 8713},   {0x50917a7a, L"epsilon", 949},
    {0x52f9a4cd, L"Kappa", 922},    {0x5496f410, L"Ocirc", 212},
    {0x568cbf34, L"zeta", 950},     {0x57badd20, L"ntilde", 241},
    {0x58662109, L"zwnj", 8204},    {0x5b39870f, L"empty", 8709},
    {0x5bd3268a, L"upsilon", 965},  {0x5e2bf8a3, L"Gamma", 915},
    {0x5f73c13a, L"rsquo", 8217},   {0x61f2bc4d, L"iota", 953},
    {0x625bbcf3, L"isin", 8712},    {0x62906df7, L"iuml", 239},
    {0x64a5cb31, L"Aring", 197},    {0x66f25c4a, L"sbquo", 8218},
    {0x6851ab60, L"spades", 9824},  {0x6942a900, L"Ntilde", 209},
    {0x69779453, L"Euml", 203},     {0x6cda6e23, L"current", 164},
    {0x70b5b634, L"lsquo", 8216},   {0x715a3706, L"Ecirc", 202},
    {0x71e8bf8d, L"tdquo", 8221},   {0x72651431, L"Sigma", 931},
    {0x7569813b, L"iquest", 191},   {0x776a436a, L"equiv", 8801},
    {0x79215314, L"Zeta", 918},     {0x79b81224, L"ograve", 242},
    {0x7c2f8b23, L"macr", 175},     {0x7cdb8502, L"Acirc", 194},
    {0x8185c62e, L"ndash", 8211},   {0x8260364a, L"Delta", 916},
    {0x846619ad, L"mdash", 8212},   {0x8550fb50, L"OElig", 338},
    {0x88eb5b85, L"ldquo", 8220},   {0x8b3fde04, L"Ograve", 210},
    {0x8bc5794b, L"ordf", 170},     {0x8bc57952, L"ordm", 186},
    {0x8c14923d, L"ouml", 246},     {0x8c5a7cd6, L"theta", 952},
    {0x8d61812b, L"thorn", 254},    {0x912b95aa, L"asymp", 8776},
    {0x947faf81, L"middot", 183},   {0x9629202e, L"lfloor", 8970},
    {0x972e9ec1, L"otilde", 245},   {0x9748f231, L"otimes", 8855},
    {0x995f1469, L"Omega", 937},    {0x99eb5349, L"quot", 34},
    {0x9aeb639e, L"hellip", 8230},  {0xa0ae2f86, L"Scaron", 352},
    {0xa4dcb0d5, L"lsaquo", 8249},  {0xa53dbf41, L"oacute", 243},
    {0xa5ae9e7b, L"bdquo", 8222},   {0xa602d7ba, L"sdot", 8901},
    {0xa61ce86f, L"sect", 167},     {0xa6e4c3d7, L"sigmaf", 962},
    {0xa7c1c74f, L"sube", 8838},    {0xa7c20ee9, L"sup1", 185},
    {0xa7c20eea, L"sup2", 178},     {0xa7c20eeb, L"sup3", 179},
    {0xa7c20f1d, L"supe", 8839},    {0xa8b66aa1, L"Otilde", 213},
    {0xad958c42, L"AElig", 198},    {0xaea9261d, L"Ouml", 214},
    {0xb040eafa, L"uArr", 8657},    {0xb07c2e1c, L"beta", 946},
    {0xb220e92f, L"bull", 8226},    {0xb22750c4, L"ccedil", 231},
    {0xb38ab31a, L"uarr", 8593},    {0xb598b683, L"uuml", 252},
    {0xb6c58b21, L"Oacute", 211},   {0xb6d2a617, L"oline", 8254},
    {0xba9fd989, L"dArr", 8659},    {0xbb5ccd41, L"lgrave", 204},
    {0xbd39b44c, L"weierp", 8472},  {0xbde9a1a9, L"darr", 8595},
    {0xc027e329, L"permil", 8240},  {0xc2451389, L"upsih", 978},
    {0xc3af1ca4, L"Ccedil", 199},   {0xcd164249, L"fnof", 402},
    {0xcf6c8467, L"hearts", 9829},  {0xd1228390, L"trade", 8482},
    {0xd1462407, L"yuml", 255},     {0xd2cf2253, L"oplus", 8853},
    {0xd310c1fc, L"Beta", 914},     {0xd59c4d74, L"infin", 8734},
    {0xd64d470d, L"hArr", 8660},    {0xd67d9c75, L"divide", 247},
    {0xd698dd37, L"Omicron", 927},  {0xd82d4a63, L"Uuml", 220},
    {0xd9970f2d, L"harr", 8596},    {0xda91fd99, L"clubs", 9827},
    {0xdbe5bdcc, L"there4", 8756},  {0xdd7671bd, L"prime", 8242},
    {0xdfcf3c06, L"alpha", 945},    {0xe0213063, L"saron", 353},
    {0xe1911d83, L"radic", 8730},   {0xe2e75468, L"raquo", 187},
    {0xe6e27a5e, L"lacute", 205},   {0xe74a8f36, L"ucirc", 251},
    {0xe864ecb6, L"Theta", 920},    {0xecddde5e, L"nabla", 8711},
    {0xed1c3557, L"omicron", 959},  {0xef82228f, L"rceil", 8969},
    {0xf1fab491, L"lArr", 8656},    {0xf3dab7e7, L"Yuml", 376},
    {0xf4294962, L"laquo", 171},    {0xf5446822, L"lang", 9001},
    {0xf5447cb1, L"larr", 8592},    {0xf66e9bea, L"ugrave", 249},
    {0xf6b4ce70, L"lota", 921},     {0xf6ef34ed, L"kappa", 954},
    {0xf72a3a56, L"thinsp", 8201},  {0xf752801a, L"luml", 207},
    {0xf88c8430, L"ocirc", 244},    {0xf9676178, L"frasl", 8260},
    {0xfd01885e, L"igrave", 236},   {0xff3281da, L"egrave", 232},
};

const XFA_FMHtmlReserveCode reservesForEncode[] = {
    {34, L"quot"},     {38, L"amp"},      {39, L"apos"},
    {60, L"lt"},       {62, L"gt"},       {160, L"nbsp"},
    {161, L"iexcl"},   {162, L"cent"},    {163, L"pund"},
    {164, L"current"}, {165, L"yen"},     {166, L"brvbar"},
    {167, L"sect"},    {168, L"uml"},     {169, L"copy"},
    {170, L"ordf"},    {171, L"laquo"},   {172, L"not"},
    {173, L"shy"},     {174, L"reg"},     {175, L"macr"},
    {176, L"deg"},     {177, L"plusmn"},  {178, L"sup2"},
    {179, L"sup3"},    {180, L"acute"},   {181, L"micro"},
    {182, L"para"},    {183, L"middot"},  {184, L"cedil"},
    {185, L"sup1"},    {186, L"ordm"},    {187, L"raquo"},
    {188, L"frac14"},  {189, L"frac12"},  {190, L"frac34"},
    {191, L"iquest"},  {192, L"Agrave"},  {193, L"Aacute"},
    {194, L"Acirc"},   {195, L"Atilde"},  {196, L"Auml"},
    {197, L"Aring"},   {198, L"AElig"},   {199, L"Ccedil"},
    {200, L"Egrave"},  {201, L"Eacute"},  {202, L"Ecirc"},
    {203, L"Euml"},    {204, L"lgrave"},  {205, L"lacute"},
    {206, L"lcirc"},   {207, L"luml"},    {208, L"ETH"},
    {209, L"Ntilde"},  {210, L"Ograve"},  {211, L"Oacute"},
    {212, L"Ocirc"},   {213, L"Otilde"},  {214, L"Ouml"},
    {215, L"times"},   {216, L"Oslash"},  {217, L"Ugrave"},
    {218, L"Uacute"},  {219, L"Ucirc"},   {220, L"Uuml"},
    {221, L"Yacute"},  {222, L"THORN"},   {223, L"szlig"},
    {224, L"agrave"},  {225, L"aacute"},  {226, L"acirc"},
    {227, L"atilde"},  {228, L"auml"},    {229, L"aring"},
    {230, L"aelig"},   {231, L"ccedil"},  {232, L"egrave"},
    {233, L"eacute"},  {234, L"ecirc"},   {235, L"euml"},
    {236, L"igrave"},  {237, L"iacute"},  {238, L"icirc"},
    {239, L"iuml"},    {240, L"eth"},     {241, L"ntilde"},
    {242, L"ograve"},  {243, L"oacute"},  {244, L"ocirc"},
    {245, L"otilde"},  {246, L"ouml"},    {247, L"divide"},
    {248, L"oslash"},  {249, L"ugrave"},  {250, L"uacute"},
    {251, L"ucirc"},   {252, L"uuml"},    {253, L"yacute"},
    {254, L"thorn"},   {255, L"yuml"},    {338, L"OElig"},
    {339, L"oelig"},   {352, L"Scaron"},  {353, L"saron"},
    {376, L"Yuml"},    {402, L"fnof"},    {710, L"circ"},
    {732, L"tilde"},   {913, L"Alpha"},   {914, L"Beta"},
    {915, L"Gamma"},   {916, L"Delta"},   {917, L"Epsilon"},
    {918, L"Zeta"},    {919, L"Eta"},     {920, L"Theta"},
    {921, L"lota"},    {922, L"Kappa"},   {923, L"Lambda"},
    {924, L"Mu"},      {925, L"Nu"},      {926, L"Xi"},
    {927, L"Omicron"}, {928, L"Pi"},      {929, L"Rho"},
    {931, L"Sigma"},   {932, L"Tau"},     {933, L"Upsilon"},
    {934, L"Phi"},     {935, L"Chi"},     {936, L"Psi"},
    {937, L"Omega"},   {945, L"alpha"},   {946, L"beta"},
    {947, L"gamma"},   {948, L"delta"},   {949, L"epsilon"},
    {950, L"zeta"},    {951, L"eta"},     {952, L"theta"},
    {953, L"iota"},    {954, L"kappa"},   {955, L"lambda"},
    {956, L"mu"},      {957, L"nu"},      {958, L"xi"},
    {959, L"omicron"}, {960, L"pi"},      {961, L"rho"},
    {962, L"sigmaf"},  {963, L"sigma"},   {964, L"tau"},
    {965, L"upsilon"}, {966, L"phi"},     {967, L"chi"},
    {968, L"psi"},     {969, L"omega"},   {977, L"thetasym"},
    {978, L"upsih"},   {982, L"piv"},     {8194, L"ensp"},
    {8195, L"emsp"},   {8201, L"thinsp"}, {8204, L"zwnj"},
    {8205, L"zwj"},    {8206, L"lrm"},    {8207, L"rlm"},
    {8211, L"ndash"},  {8212, L"mdash"},  {8216, L"lsquo"},
    {8217, L"rsquo"},  {8218, L"sbquo"},  {8220, L"ldquo"},
    {8221, L"tdquo"},  {8222, L"bdquo"},  {8224, L"dagger"},
    {8225, L"Dagger"}, {8226, L"bull"},   {8230, L"hellip"},
    {8240, L"permil"}, {8242, L"prime"},  {8249, L"lsaquo"},
    {8250, L"rsaquo"}, {8254, L"oline"},  {8260, L"frasl"},
    {8364, L"euro"},   {8465, L"image"},  {8472, L"weierp"},
    {8476, L"real"},   {8482, L"trade"},  {8501, L"alefsym"},
    {8592, L"larr"},   {8593, L"uarr"},   {8594, L"rarr"},
    {8595, L"darr"},   {8596, L"harr"},   {8629, L"crarr"},
    {8656, L"lArr"},   {8657, L"uArr"},   {8658, L"rArr"},
    {8659, L"dArr"},   {8660, L"hArr"},   {8704, L"forall"},
    {8706, L"part"},   {8707, L"exist"},  {8709, L"empty"},
    {8711, L"nabla"},  {8712, L"isin"},   {8713, L"notin"},
    {8715, L"ni"},     {8719, L"prod"},   {8721, L"sum"},
    {8722, L"minus"},  {8727, L"lowast"}, {8730, L"radic"},
    {8733, L"prop"},   {8734, L"infin"},  {8736, L"ang"},
    {8743, L"and"},    {8744, L"or"},     {8745, L"cap"},
    {8746, L"cup"},    {8747, L"int"},    {8756, L"there4"},
    {8764, L"sim"},    {8773, L"cong"},   {8776, L"asymp"},
    {8800, L"ne"},     {8801, L"equiv"},  {8804, L"le"},
    {8805, L"ge"},     {8834, L"sub"},    {8835, L"sup"},
    {8836, L"nsub"},   {8838, L"sube"},   {8839, L"supe"},
    {8853, L"oplus"},  {8855, L"otimes"}, {8869, L"perp"},
    {8901, L"sdot"},   {8968, L"lceil"},  {8969, L"rceil"},
    {8970, L"lfloor"}, {8971, L"rfloor"}, {9001, L"lang"},
    {9002, L"rang"},   {9674, L"loz"},    {9824, L"spades"},
    {9827, L"clubs"},  {9829, L"hearts"}, {9830, L"diams"},
};

}  // namespace

void CXFA_FM2JSContext::Abs(FXJSE_HOBJECT hThis,
                            const CFX_ByteStringC& szFuncName,
                            CFXJSE_Arguments& args) {
  if (args.GetLength() == 1) {
    FXJSE_HVALUE argOne = args.GetValue(0);
    if (HValueIsNull(hThis, argOne)) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      FX_DOUBLE dValue = HValueToDouble(hThis, argOne);
      if (dValue < 0) {
        dValue = -dValue;
      }
      FXJSE_Value_SetDouble(args.GetReturnValue(), dValue);
    }
    FXJSE_Value_Release(argOne);
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Abs");
  }
}
void CXFA_FM2JSContext::Avg(FXJSE_HOBJECT hThis,
                            const CFX_ByteStringC& szFuncName,
                            CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
  int32_t argc = args.GetLength();
  uint32_t uCount = 0;
  FX_DOUBLE dSum = 0.0;
  if (argc >= 1) {
    FXJSE_HVALUE argValue = 0;
    for (int32_t i = 0; i < argc; i++) {
      argValue = args.GetValue(i);
      if (FXJSE_Value_IsNull(argValue)) {
        FXJSE_Value_Release(argValue);
        continue;
      } else if (FXJSE_Value_IsArray(argValue)) {
        FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
        FXJSE_Value_GetObjectProp(argValue, "length", lengthValue);
        int32_t iLength = FXJSE_Value_ToInteger(lengthValue);
        FXJSE_Value_Release(lengthValue);
        if (iLength > 2) {
          FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
          FXJSE_Value_GetObjectPropByIdx(argValue, 1, propertyValue);
          FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
          if (FXJSE_Value_IsNull(propertyValue)) {
            for (int32_t j = 2; j < iLength; j++) {
              FXJSE_Value_GetObjectPropByIdx(argValue, j, jsObjectValue);
              FXJSE_HVALUE defaultPropValue = FXJSE_Value_Create(hruntime);
              GetObjectDefaultValue(jsObjectValue, defaultPropValue);
              if (!FXJSE_Value_IsNull(defaultPropValue)) {
                dSum += HValueToDouble(hThis, defaultPropValue);
                uCount++;
              }
              FXJSE_Value_Release(defaultPropValue);
            }
          } else {
            CFX_ByteString propertyStr;
            FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
            FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
            for (int32_t j = 2; j < iLength; j++) {
              FXJSE_Value_GetObjectPropByIdx(argValue, j, jsObjectValue);
              FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr.AsStringC(),
                                        newPropertyValue);
              if (!FXJSE_Value_IsNull(newPropertyValue)) {
                dSum += HValueToDouble(hThis, newPropertyValue);
                uCount++;
              }
            }
            FXJSE_Value_Release(newPropertyValue);
          }
          FXJSE_Value_Release(jsObjectValue);
          FXJSE_Value_Release(propertyValue);
        }
      } else {
        dSum += HValueToDouble(hThis, argValue);
        uCount++;
      }
      FXJSE_Value_Release(argValue);
    }
    argValue = 0;
  }
  if (0 == uCount) {
    FXJSE_Value_SetNull(args.GetReturnValue());
  } else {
    FXJSE_Value_SetDouble(args.GetReturnValue(), dSum / uCount);
  }
}
void CXFA_FM2JSContext::Ceil(FXJSE_HOBJECT hThis,
                             const CFX_ByteStringC& szFuncName,
                             CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  if (args.GetLength() == 1) {
    FXJSE_HVALUE argValue = GetSimpleHValue(hThis, args, 0);
    if (HValueIsNull(hThis, argValue)) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      FXJSE_Value_SetFloat(args.GetReturnValue(),
                           FXSYS_ceil(HValueToFloat(hThis, argValue)));
    }
    FXJSE_Value_Release(argValue);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Ceil");
  }
}
void CXFA_FM2JSContext::Count(FXJSE_HOBJECT hThis,
                              const CFX_ByteStringC& szFuncName,
                              CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
  int32_t argc = args.GetLength();
  uint32_t uCount = 0;
  FXJSE_HVALUE argValue = 0;
  for (int32_t i = 0; i < argc; i++) {
    argValue = args.GetValue(i);
    if (FXJSE_Value_IsNull(argValue)) {
      FXJSE_Value_Release(argValue);
      continue;
    } else if (FXJSE_Value_IsArray(argValue)) {
      FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
      FXJSE_Value_GetObjectProp(argValue, "length", lengthValue);
      int32_t iLength = FXJSE_Value_ToInteger(lengthValue);
      FXJSE_Value_Release(lengthValue);
      if (iLength > 2) {
        FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
        FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
        FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
        FXJSE_Value_GetObjectPropByIdx(argValue, 1, propertyValue);
        FXJSE_Value_GetObjectPropByIdx(argValue, 2, jsObjectValue);
        if (FXJSE_Value_IsNull(propertyValue)) {
          for (int32_t i = 2; i < iLength; i++) {
            FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue);
            GetObjectDefaultValue(jsObjectValue, newPropertyValue);
            if (!FXJSE_Value_IsNull(newPropertyValue)) {
              uCount++;
            }
          }
        } else {
          CFX_ByteString propertyStr;
          FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
          for (int32_t i = 2; i < iLength; i++) {
            FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue);
            FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr.AsStringC(),
                                      newPropertyValue);
            uCount += (FXJSE_Value_IsNull(newPropertyValue) ? 0 : 1);
          }
        }
        FXJSE_Value_Release(propertyValue);
        FXJSE_Value_Release(jsObjectValue);
        FXJSE_Value_Release(newPropertyValue);
      } else {
        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
      }
    } else if (FXJSE_Value_IsObject(argValue)) {
      FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
      GetObjectDefaultValue(argValue, newPropertyValue);
      if (!FXJSE_Value_IsNull(newPropertyValue)) {
        uCount++;
      }
      FXJSE_Value_Release(newPropertyValue);
    } else {
      uCount++;
    }
    FXJSE_Value_Release(argValue);
  }
  argValue = 0;
  FXJSE_Value_SetInteger(args.GetReturnValue(), (int32_t)uCount);
}
void CXFA_FM2JSContext::Floor(FXJSE_HOBJECT hThis,
                              const CFX_ByteStringC& szFuncName,
                              CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  if (args.GetLength() == 1) {
    FXJSE_HVALUE argValue = GetSimpleHValue(hThis, args, 0);
    if (HValueIsNull(hThis, argValue)) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      FXJSE_Value_SetFloat(args.GetReturnValue(),
                           FXSYS_floor(HValueToFloat(hThis, argValue)));
    }
    FXJSE_Value_Release(argValue);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Floor");
  }
}
void CXFA_FM2JSContext::Max(FXJSE_HOBJECT hThis,
                            const CFX_ByteStringC& szFuncName,
                            CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
  int32_t argc = args.GetLength();
  uint32_t uCount = 0;
  FX_DOUBLE dMaxValue = 0.0;
  FXJSE_HVALUE argValue = 0;
  for (int32_t i = 0; i < argc; i++) {
    argValue = args.GetValue(i);
    if (FXJSE_Value_IsNull(argValue)) {
      FXJSE_Value_Release(argValue);
      continue;
    } else if (FXJSE_Value_IsArray(argValue)) {
      FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
      FXJSE_Value_GetObjectProp(argValue, "length", lengthValue);
      int32_t iLength = FXJSE_Value_ToInteger(lengthValue);
      FXJSE_Value_Release(lengthValue);
      if (iLength > 2) {
        FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
        FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
        FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
        FXJSE_Value_GetObjectPropByIdx(argValue, 1, propertyValue);
        FXJSE_Value_GetObjectPropByIdx(argValue, 2, jsObjectValue);
        if (FXJSE_Value_IsNull(propertyValue)) {
          for (int32_t i = 2; i < iLength; i++) {
            FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue);
            GetObjectDefaultValue(jsObjectValue, newPropertyValue);
            if (!FXJSE_Value_IsNull(newPropertyValue)) {
              uCount++;
              if (uCount == 1) {
                dMaxValue = HValueToDouble(hThis, newPropertyValue);
              } else {
                FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue);
                if (dMaxValue < dValue) {
                  dMaxValue = dValue;
                }
              }
            }
          }
        } else {
          CFX_ByteString propertyStr;
          FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
          for (int32_t i = 2; i < iLength; i++) {
            FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue);
            FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr.AsStringC(),
                                      newPropertyValue);
            if (!FXJSE_Value_IsNull(newPropertyValue)) {
              uCount++;
              if (uCount == 1) {
                dMaxValue = HValueToDouble(hThis, newPropertyValue);
              } else {
                FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue);
                if (dMaxValue < dValue) {
                  dMaxValue = dValue;
                }
              }
            }
          }
        }
        FXJSE_Value_Release(propertyValue);
        FXJSE_Value_Release(jsObjectValue);
        FXJSE_Value_Release(newPropertyValue);
      } else {
        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
      }
    } else if (FXJSE_Value_IsObject(argValue)) {
      FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
      GetObjectDefaultValue(argValue, newPropertyValue);
      if (!FXJSE_Value_IsNull(newPropertyValue)) {
        uCount++;
        if (uCount == 1) {
          dMaxValue = HValueToDouble(hThis, newPropertyValue);
        } else {
          FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue);
          if (dMaxValue < dValue) {
            dMaxValue = dValue;
          }
        }
      }
      FXJSE_Value_Release(newPropertyValue);
    } else {
      uCount++;
      if (uCount == 1) {
        dMaxValue = HValueToDouble(hThis, argValue);
      } else {
        FX_DOUBLE dValue = HValueToDouble(hThis, argValue);
        if (dMaxValue < dValue) {
          dMaxValue = dValue;
        }
      }
    }
    FXJSE_Value_Release(argValue);
  }
  argValue = 0;
  if (uCount) {
    FXJSE_Value_SetDouble(args.GetReturnValue(), dMaxValue);
  } else {
    FXJSE_Value_SetNull(args.GetReturnValue());
  }
}
void CXFA_FM2JSContext::Min(FXJSE_HOBJECT hThis,
                            const CFX_ByteStringC& szFuncName,
                            CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
  int32_t argc = args.GetLength();
  uint32_t uCount = 0;
  FX_DOUBLE dMinValue = 0.0;
  FXJSE_HVALUE argValue = 0;
  for (int32_t i = 0; i < argc; i++) {
    argValue = args.GetValue(i);
    if (FXJSE_Value_IsNull(argValue)) {
      FXJSE_Value_Release(argValue);
      continue;
    } else if (FXJSE_Value_IsArray(argValue)) {
      FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
      FXJSE_Value_GetObjectProp(argValue, "length", lengthValue);
      int32_t iLength = FXJSE_Value_ToInteger(lengthValue);
      FXJSE_Value_Release(lengthValue);
      if (iLength > 2) {
        FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
        FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
        FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
        FXJSE_Value_GetObjectPropByIdx(argValue, 1, propertyValue);
        FXJSE_Value_GetObjectPropByIdx(argValue, 2, jsObjectValue);
        if (FXJSE_Value_IsNull(propertyValue)) {
          for (int32_t i = 2; i < iLength; i++) {
            FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue);
            GetObjectDefaultValue(jsObjectValue, newPropertyValue);
            if (!FXJSE_Value_IsNull(newPropertyValue)) {
              uCount++;
              if (uCount == 1) {
                dMinValue = HValueToDouble(hThis, newPropertyValue);
              } else {
                FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue);
                if (dMinValue > dValue) {
                  dMinValue = dValue;
                }
              }
            }
          }
        } else {
          CFX_ByteString propertyStr;
          FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
          for (int32_t i = 2; i < iLength; i++) {
            FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue);
            FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr.AsStringC(),
                                      newPropertyValue);
            if (!FXJSE_Value_IsNull(newPropertyValue)) {
              uCount++;
              if (uCount == 1) {
                dMinValue = HValueToDouble(hThis, newPropertyValue);
              } else {
                FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue);
                if (dMinValue > dValue) {
                  dMinValue = dValue;
                }
              }
            }
          }
        }
        FXJSE_Value_Release(propertyValue);
        FXJSE_Value_Release(jsObjectValue);
        FXJSE_Value_Release(newPropertyValue);
      } else {
        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
      }
    } else if (FXJSE_Value_IsObject(argValue)) {
      FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
      GetObjectDefaultValue(argValue, newPropertyValue);
      if (!FXJSE_Value_IsNull(newPropertyValue)) {
        uCount++;
        if (uCount == 1) {
          dMinValue = HValueToDouble(hThis, newPropertyValue);
        } else {
          FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue);
          if (dMinValue > dValue) {
            dMinValue = dValue;
          }
        }
      }
      FXJSE_Value_Release(newPropertyValue);
    } else {
      uCount++;
      if (uCount == 1) {
        dMinValue = HValueToDouble(hThis, argValue);
      } else {
        FX_DOUBLE dValue = HValueToDouble(hThis, argValue);
        if (dMinValue > dValue) {
          dMinValue = dValue;
        }
      }
    }
    FXJSE_Value_Release(argValue);
  }
  argValue = 0;
  if (uCount) {
    FXJSE_Value_SetDouble(args.GetReturnValue(), dMinValue);
  } else {
    FXJSE_Value_SetNull(args.GetReturnValue());
  }
}
void CXFA_FM2JSContext::Mod(FXJSE_HOBJECT hThis,
                            const CFX_ByteStringC& szFuncName,
                            CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
  if (args.GetLength() == 2) {
    FXJSE_HVALUE argOne = args.GetValue(0);
    FXJSE_HVALUE argTwo = args.GetValue(1);
    if (FXJSE_Value_IsNull(argOne) || FXJSE_Value_IsNull(argTwo)) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      FX_DOUBLE dDividend = 0.0;
      FX_DOUBLE dDividor = 0.0;
      if (FXJSE_Value_IsArray(argOne)) {
        FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
        FXJSE_Value_GetObjectProp(argOne, "length", lengthValue);
        int32_t iLength = FXJSE_Value_ToInteger(lengthValue);
        FXJSE_Value_Release(lengthValue);
        if (iLength > 2) {
          FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
          FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
          FXJSE_Value_GetObjectPropByIdx(argOne, 1, propertyValue);
          FXJSE_Value_GetObjectPropByIdx(argOne, 2, jsObjectValue);
          if (FXJSE_Value_IsNull(propertyValue)) {
            dDividend = HValueToDouble(hThis, jsObjectValue);
          } else {
            CFX_ByteString propertyStr;
            FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
            FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
            FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr.AsStringC(),
                                      newPropertyValue);
            dDividend = HValueToDouble(hThis, newPropertyValue);
            FXJSE_Value_Release(newPropertyValue);
          }
          FXJSE_Value_Release(propertyValue);
          FXJSE_Value_Release(jsObjectValue);
        } else {
          pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
        }
      } else {
        dDividend = HValueToDouble(hThis, argOne);
      }
      if (FXJSE_Value_IsArray(argTwo)) {
        FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
        FXJSE_Value_GetObjectProp(argTwo, "length", lengthValue);
        int32_t iLength = FXJSE_Value_ToInteger(lengthValue);
        FXJSE_Value_Release(lengthValue);
        if (iLength > 2) {
          FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
          FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
          FXJSE_Value_GetObjectPropByIdx(argTwo, 1, propertyValue);
          FXJSE_Value_GetObjectPropByIdx(argTwo, 2, jsObjectValue);
          if (FXJSE_Value_IsNull(propertyValue)) {
            dDividor = HValueToDouble(hThis, jsObjectValue);
          } else {
            CFX_ByteString propertyStr;
            FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
            FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
            FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr.AsStringC(),
                                      newPropertyValue);
            dDividor = HValueToDouble(hThis, newPropertyValue);
            FXJSE_Value_Release(newPropertyValue);
          }
          FXJSE_Value_Release(propertyValue);
          FXJSE_Value_Release(jsObjectValue);
        } else {
          pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
        }
      } else {
        dDividor = HValueToDouble(hThis, argTwo);
      }
      if (dDividor) {
        FXJSE_Value_SetDouble(
            args.GetReturnValue(),
            dDividend - dDividor * (int32_t)(dDividend / dDividor));
      } else {
        pContext->ThrowScriptErrorMessage(XFA_IDS_DIVIDE_ZERO);
      }
    }
    FXJSE_Value_Release(argOne);
    FXJSE_Value_Release(argTwo);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Mod");
  }
}
void CXFA_FM2JSContext::Round(FXJSE_HOBJECT hThis,
                              const CFX_ByteStringC& szFuncName,
                              CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
  int32_t argc = args.GetLength();
  uint8_t uPrecision = 0;
  if (argc == 1) {
    FXJSE_HVALUE argOne = args.GetValue(0);
    if (FXJSE_Value_IsNull(argOne)) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      FX_DOUBLE dValue = 0.0;
      if (FXJSE_Value_IsArray(argOne)) {
        FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
        FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
        FXJSE_Value_GetObjectPropByIdx(argOne, 1, propertyValue);
        FXJSE_Value_GetObjectPropByIdx(argOne, 2, jsObjectValue);
        if (FXJSE_Value_IsNull(propertyValue)) {
          dValue = HValueToDouble(hThis, jsObjectValue);
        } else {
          CFX_ByteString propertyStr;
          FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
          FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
          FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr.AsStringC(),
                                    newPropertyValue);
          dValue = HValueToDouble(hThis, newPropertyValue);
          FXJSE_Value_Release(newPropertyValue);
        }
        FXJSE_Value_Release(propertyValue);
        FXJSE_Value_Release(jsObjectValue);
      } else {
        dValue = HValueToDouble(hThis, argOne);
      }
      CFX_Decimal decimalValue((FX_FLOAT)dValue, uPrecision);
      CFX_WideString wsValue = decimalValue;
      FXJSE_Value_SetUTF8String(args.GetReturnValue(),
                                wsValue.UTF8Encode().AsStringC());
    }
    FXJSE_Value_Release(argOne);
  } else if (argc == 2) {
    FXJSE_HVALUE argOne = args.GetValue(0);
    FXJSE_HVALUE argTwo = args.GetValue(1);
    if (FXJSE_Value_IsNull(argOne) || FXJSE_Value_IsNull(argTwo)) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      FX_DOUBLE dValue = 0.0;
      if (FXJSE_Value_IsArray(argOne)) {
        FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
        FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
        FXJSE_Value_GetObjectPropByIdx(argOne, 1, propertyValue);
        FXJSE_Value_GetObjectPropByIdx(argOne, 2, jsObjectValue);
        if (FXJSE_Value_IsNull(propertyValue)) {
          dValue = HValueToDouble(hThis, jsObjectValue);
        } else {
          CFX_ByteString propertyStr;
          FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
          FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
          FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr.AsStringC(),
                                    newPropertyValue);
          dValue = HValueToDouble(hThis, newPropertyValue);
          FXJSE_Value_Release(newPropertyValue);
        }
        FXJSE_Value_Release(propertyValue);
        FXJSE_Value_Release(jsObjectValue);
      } else {
        dValue = HValueToDouble(hThis, argOne);
      }
      FX_DOUBLE dPrecision = 0.0;
      if (FXJSE_Value_IsArray(argTwo)) {
        FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
        FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
        FXJSE_Value_GetObjectPropByIdx(argTwo, 1, propertyValue);
        FXJSE_Value_GetObjectPropByIdx(argTwo, 2, jsObjectValue);
        if (FXJSE_Value_IsNull(propertyValue)) {
          dPrecision = HValueToDouble(hThis, jsObjectValue);
        } else {
          CFX_ByteString propertyStr;
          FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
          FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
          FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr.AsStringC(),
                                    newPropertyValue);
          dPrecision = HValueToDouble(hThis, newPropertyValue);
          FXJSE_Value_Release(newPropertyValue);
        }
        FXJSE_Value_Release(propertyValue);
        FXJSE_Value_Release(jsObjectValue);
      } else {
        dPrecision = HValueToDouble(hThis, argTwo);
      }
      if (dPrecision < 0) {
        uPrecision = 0;
      } else if (dPrecision > 12.0) {
        uPrecision = 12;
      } else {
        uPrecision = (uint8_t)dPrecision;
      }
      CFX_Decimal decimalValue((FX_FLOAT)dValue, uPrecision);
      CFX_WideString wsValue = decimalValue;
      FXJSE_Value_SetUTF8String(args.GetReturnValue(),
                                wsValue.UTF8Encode().AsStringC());
    }
    FXJSE_Value_Release(argOne);
    FXJSE_Value_Release(argTwo);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Round");
  }
}
void CXFA_FM2JSContext::Sum(FXJSE_HOBJECT hThis,
                            const CFX_ByteStringC& szFuncName,
                            CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
  int32_t argc = args.GetLength();
  uint32_t uCount = 0;
  FX_DOUBLE dSum = 0.0;
  if (argc) {
    FXJSE_HVALUE argValue = 0;
    for (int32_t i = 0; i < argc; i++) {
      argValue = args.GetValue(i);
      if (FXJSE_Value_IsNull(argValue)) {
        FXJSE_Value_Release(argValue);
        continue;
      } else if (FXJSE_Value_IsArray(argValue)) {
        FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
        FXJSE_Value_GetObjectProp(argValue, "length", lengthValue);
        int32_t iLength = FXJSE_Value_ToInteger(lengthValue);
        FXJSE_Value_Release(lengthValue);
        if (iLength > 2) {
          FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
          FXJSE_Value_GetObjectPropByIdx(argValue, 1, propertyValue);
          FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
          FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
          if (FXJSE_Value_IsNull(propertyValue)) {
            for (int32_t j = 2; j < iLength; j++) {
              FXJSE_Value_GetObjectPropByIdx(argValue, j, jsObjectValue);
              GetObjectDefaultValue(jsObjectValue, newPropertyValue);
              if (!FXJSE_Value_IsNull(newPropertyValue)) {
                dSum += HValueToDouble(hThis, jsObjectValue);
                uCount++;
              }
            }
          } else {
            CFX_ByteString propertyStr;
            FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
            for (int32_t j = 2; j < iLength; j++) {
              FXJSE_Value_GetObjectPropByIdx(argValue, j, jsObjectValue);
              FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr.AsStringC(),
                                        newPropertyValue);
              if (!FXJSE_Value_IsNull(newPropertyValue)) {
                dSum += HValueToDouble(hThis, newPropertyValue);
                uCount++;
              }
            }
          }
          FXJSE_Value_Release(newPropertyValue);
          FXJSE_Value_Release(jsObjectValue);
          FXJSE_Value_Release(propertyValue);
        } else {
          pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
        }
      } else if (FXJSE_Value_IsObject(argValue)) {
        FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
        GetObjectDefaultValue(argValue, newPropertyValue);
        if (!FXJSE_Value_IsNull(newPropertyValue)) {
          dSum += HValueToDouble(hThis, argValue);
          uCount++;
        }
        FXJSE_Value_Release(newPropertyValue);
      } else {
        dSum += HValueToDouble(hThis, argValue);
        uCount++;
      }
      FXJSE_Value_Release(argValue);
    }
    argValue = 0;
  }
  if (uCount < 1) {
    FXJSE_Value_SetNull(args.GetReturnValue());
  } else {
    FXJSE_Value_SetDouble(args.GetReturnValue(), dSum);
  }
}
void CXFA_FM2JSContext::Date(FXJSE_HOBJECT hThis,
                             const CFX_ByteStringC& szFuncName,
                             CFXJSE_Arguments& args) {
  if (args.GetLength() == 0) {
    struct tm* pTmStruct = 0;
    time_t currentTime;
    time(&currentTime);
    pTmStruct = gmtime(&currentTime);
    CFX_ByteString bufferYear;
    CFX_ByteString bufferMon;
    CFX_ByteString bufferDay;
    bufferYear.Format("%d", pTmStruct->tm_year + 1900);
    bufferMon.Format("%02d", pTmStruct->tm_mon + 1);
    bufferDay.Format("%02d", pTmStruct->tm_mday);
    CFX_ByteString bufferCurrent = bufferYear + bufferMon + bufferDay;
    int32_t dDays = DateString2Num(bufferCurrent.AsStringC());
    FXJSE_Value_SetInteger(args.GetReturnValue(), dDays);
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Date");
  }
}
void CXFA_FM2JSContext::Date2Num(FXJSE_HOBJECT hThis,
                                 const CFX_ByteStringC& szFuncName,
                                 CFXJSE_Arguments& args) {
  int32_t argc = args.GetLength();
  if ((argc > 0) && (argc < 4)) {
    FX_BOOL bFlags = FALSE;
    CFX_ByteString dateString;
    CFX_ByteString formatString;
    CFX_ByteString localString;
    FXJSE_HVALUE dateValue = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE formatValue = 0;
    FXJSE_HVALUE localValue = 0;
    if (HValueIsNull(hThis, dateValue)) {
      bFlags = TRUE;
    } else {
      HValueToUTF8String(dateValue, dateString);
    }
    if (argc > 1) {
      formatValue = GetSimpleHValue(hThis, args, 1);
      if (HValueIsNull(hThis, formatValue)) {
        bFlags = TRUE;
      } else {
        HValueToUTF8String(formatValue, formatString);
      }
    }
    if (argc == 3) {
      localValue = GetSimpleHValue(hThis, args, 2);
      if (HValueIsNull(hThis, localValue)) {
        bFlags = TRUE;
      } else {
        HValueToUTF8String(localValue, localString);
      }
    }
    if (!bFlags) {
      CFX_ByteString szIsoDateString;
      FX_BOOL bRet =
          Local2IsoDate(hThis, dateString.AsStringC(), formatString.AsStringC(),
                        localString.AsStringC(), szIsoDateString);
      if (bRet) {
        FXJSE_Value_SetInteger(args.GetReturnValue(),
                               DateString2Num(szIsoDateString.AsStringC()));
      } else {
        FXJSE_Value_SetInteger(args.GetReturnValue(), 0);
      }
    } else {
      FXJSE_Value_SetNull(args.GetReturnValue());
    }
    FXJSE_Value_Release(dateValue);
    if (argc > 1) {
      FXJSE_Value_Release(formatValue);
      if (argc == 3) {
        FXJSE_Value_Release(localValue);
      }
    }
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Date2Num");
  }
}
void CXFA_FM2JSContext::DateFmt(FXJSE_HOBJECT hThis,
                                const CFX_ByteStringC& szFuncName,
                                CFXJSE_Arguments& args) {
  int32_t argc = args.GetLength();
  if (argc < 3) {
    FX_BOOL bFlags = FALSE;
    int32_t iStyle = 0;
    CFX_ByteString szLocal;
    FXJSE_HVALUE argStyle = 0;
    FXJSE_HVALUE argLocal = 0;
    if (argc > 0) {
      argStyle = GetSimpleHValue(hThis, args, 0);
      if (FXJSE_Value_IsNull(argStyle)) {
        bFlags = TRUE;
      }
      iStyle = (int32_t)HValueToFloat(hThis, argStyle);
      if (iStyle > 4 || iStyle < 0) {
        iStyle = 0;
      }
    }
    if (argc == 2) {
      argLocal = GetSimpleHValue(hThis, args, 1);
      if (FXJSE_Value_IsNull(argLocal)) {
        bFlags = TRUE;
      } else {
        HValueToUTF8String(argLocal, szLocal);
      }
    }
    if (!bFlags) {
      CFX_ByteString formatStr;
      GetStandardDateFormat(hThis, iStyle, szLocal.AsStringC(), formatStr);
      if (formatStr.IsEmpty()) {
        formatStr = "";
      }
      FXJSE_Value_SetUTF8String(args.GetReturnValue(), formatStr.AsStringC());
    } else {
      FXJSE_Value_SetNull(args.GetReturnValue());
    }
    if (argc > 0) {
      FXJSE_Value_Release(argStyle);
      if (argc == 2) {
        FXJSE_Value_Release(argLocal);
      }
    }
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Date2Num");
  }
}
void CXFA_FM2JSContext::IsoDate2Num(FXJSE_HOBJECT hThis,
                                    const CFX_ByteStringC& szFuncName,
                                    CFXJSE_Arguments& args) {
  if (args.GetLength() == 1) {
    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
    if (FXJSE_Value_IsNull(argOne)) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      CFX_ByteString szArgString;
      HValueToUTF8String(argOne, szArgString);
      int32_t dDays = DateString2Num(szArgString.AsStringC());
      FXJSE_Value_SetInteger(args.GetReturnValue(), (int32_t)dDays);
    }
    FXJSE_Value_Release(argOne);
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"IsoDate2Num");
  }
}
void CXFA_FM2JSContext::IsoTime2Num(FXJSE_HOBJECT hThis,
                                    const CFX_ByteStringC& szFuncName,
                                    CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  if (args.GetLength() == 1) {
    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
    if (HValueIsNull(hThis, argOne)) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      CXFA_Document* pDoc = pContext->GetDocument();
      FXSYS_assert(pDoc);
      IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr();
      CFX_ByteString szArgString;
      HValueToUTF8String(argOne, szArgString);
      szArgString = szArgString.Mid(szArgString.Find('T', 0) + 1);
      if (szArgString.IsEmpty()) {
        FXJSE_Value_SetInteger(args.GetReturnValue(), 0);
        FXJSE_Value_Release(argOne);
        return;
      }
      CXFA_LocaleValue timeValue(
          XFA_VT_TIME, CFX_WideString::FromUTF8(szArgString.AsStringC()),
          (CXFA_LocaleMgr*)pMgr);
      if (timeValue.IsValid()) {
        CFX_Unitime uniTime = timeValue.GetTime();
        int32_t hour = uniTime.GetHour();
        int32_t min = uniTime.GetMinute();
        int32_t second = uniTime.GetSecond();
        int32_t milSecond = uniTime.GetMillisecond();
        IFX_Locale* pDefLocale = pMgr->GetDefLocale();
        FXSYS_assert(pDefLocale);
        FX_TIMEZONE tzLocale;
        pDefLocale->GetTimeZone(tzLocale);
        int32_t mins = hour * 60 + min;
        mins -= (tzLocale.tzHour * 60);
        while (mins > 1440) {
          mins -= 1440;
        }
        while (mins < 0) {
          mins += 1440;
        }
        hour = mins / 60;
        min = mins % 60;
        int32_t iResult =
            hour * 3600000 + min * 60000 + second * 1000 + milSecond + 1;
        FXJSE_Value_SetInteger(args.GetReturnValue(), iResult);
      } else {
        FXJSE_Value_SetInteger(args.GetReturnValue(), 0);
      }
    }
    FXJSE_Value_Release(argOne);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"IsoTime2Num");
  }
}
void CXFA_FM2JSContext::LocalDateFmt(FXJSE_HOBJECT hThis,
                                     const CFX_ByteStringC& szFuncName,
                                     CFXJSE_Arguments& args) {
  int32_t argc = args.GetLength();
  if (argc < 3) {
    FX_BOOL bFlags = FALSE;
    int32_t iStyle = 0;
    CFX_ByteString szLocal;
    FXJSE_HVALUE argStyle = 0;
    FXJSE_HVALUE argLocal = 0;
    if (argc > 0) {
      argStyle = GetSimpleHValue(hThis, args, 0);
      if (FXJSE_Value_IsNull(argStyle)) {
        bFlags = TRUE;
      }
      iStyle = (int32_t)HValueToFloat(hThis, argStyle);
      if (iStyle > 4 || iStyle < 0) {
        iStyle = 0;
      }
    }
    if (argc == 2) {
      argLocal = GetSimpleHValue(hThis, args, 1);
      if (FXJSE_Value_IsNull(argLocal)) {
        bFlags = TRUE;
      } else {
        HValueToUTF8String(argLocal, szLocal);
      }
    }
    if (!bFlags) {
      CFX_ByteString formatStr;
      GetLocalDateFormat(hThis, iStyle, szLocal.AsStringC(), formatStr, FALSE);
      if (formatStr.IsEmpty()) {
        formatStr = "";
      }
      FXJSE_Value_SetUTF8String(args.GetReturnValue(), formatStr.AsStringC());
    } else {
      FXJSE_Value_SetNull(args.GetReturnValue());
    }
    if (argc > 0) {
      FXJSE_Value_Release(argStyle);
      if (argc == 2) {
        FXJSE_Value_Release(argLocal);
      }
    }
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"LocalDateFmt");
  }
}
void CXFA_FM2JSContext::LocalTimeFmt(FXJSE_HOBJECT hThis,
                                     const CFX_ByteStringC& szFuncName,
                                     CFXJSE_Arguments& args) {
  int32_t argc = args.GetLength();
  if (argc < 3) {
    FX_BOOL bFlags = FALSE;
    int32_t iStyle = 0;
    CFX_ByteString szLocal;
    FXJSE_HVALUE argStyle = 0;
    FXJSE_HVALUE argLocal = 0;
    if (argc > 0) {
      argStyle = GetSimpleHValue(hThis, args, 0);
      if (FXJSE_Value_IsNull(argStyle)) {
        bFlags = TRUE;
      }
      iStyle = (int32_t)HValueToFloat(hThis, argStyle);
      if (iStyle > 4 || iStyle < 0) {
        iStyle = 0;
      }
    }
    if (argc == 2) {
      argLocal = GetSimpleHValue(hThis, args, 1);
      if (FXJSE_Value_IsNull(argLocal)) {
        bFlags = TRUE;
      } else {
        HValueToUTF8String(argLocal, szLocal);
      }
    }
    if (!bFlags) {
      CFX_ByteString formatStr;
      GetLocalTimeFormat(hThis, iStyle, szLocal.AsStringC(), formatStr, FALSE);
      if (formatStr.IsEmpty()) {
        formatStr = "";
      }
      FXJSE_Value_SetUTF8String(args.GetReturnValue(), formatStr.AsStringC());
    } else {
      FXJSE_Value_SetNull(args.GetReturnValue());
    }
    if (argc > 0) {
      FXJSE_Value_Release(argStyle);
      if (argc == 2) {
        FXJSE_Value_Release(argLocal);
      }
    }
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"LocalTimeFmt");
  }
}
void CXFA_FM2JSContext::Num2Date(FXJSE_HOBJECT hThis,
                                 const CFX_ByteStringC& szFuncName,
                                 CFXJSE_Arguments& args) {
  int32_t argc = args.GetLength();
  if ((argc > 0) && (argc < 4)) {
    FX_BOOL bFlags = FALSE;
    int32_t dDate;
    CFX_ByteString formatString;
    CFX_ByteString localString;
    FXJSE_HVALUE dateValue = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE formatValue = 0;
    FXJSE_HVALUE localValue = 0;
    if (HValueIsNull(hThis, dateValue)) {
      bFlags = TRUE;
    } else {
      dDate = (int32_t)HValueToFloat(hThis, dateValue);
      bFlags = dDate < 1;
    }
    if (argc > 1) {
      formatValue = GetSimpleHValue(hThis, args, 1);
      if (HValueIsNull(hThis, formatValue)) {
        bFlags = TRUE;
      } else {
        HValueToUTF8String(formatValue, formatString);
      }
    }
    if (argc == 3) {
      localValue = GetSimpleHValue(hThis, args, 2);
      if (HValueIsNull(hThis, localValue)) {
        bFlags = TRUE;
      } else {
        HValueToUTF8String(localValue, localString);
      }
    }
    if (!bFlags) {
      int32_t iYear = 1900;
      int32_t iMonth = 1;
      int32_t iDay = 1;
      int32_t i = 0;
      while (dDate > 0) {
        if (iMonth == 2) {
          if ((!((iYear + i) % 4) && ((iYear + i) % 100)) ||
              !((iYear + i) % 400)) {
            if (dDate > 29) {
              ++iMonth;
              if (iMonth > 12) {
                iMonth = 1;
                ++i;
              }
              iDay = 1;
              dDate -= 29;
            } else {
              iDay += static_cast<int32_t>(dDate) - 1;
              dDate = 0;
            }
          } else {
            if (dDate > 28) {
              ++iMonth;
              if (iMonth > 12) {
                iMonth = 1;
                ++i;
              }
              iDay = 1;
              dDate -= 28;
            } else {
              iDay += static_cast<int32_t>(dDate) - 1;
              dDate = 0;
            }
          }
        } else if (iMonth < 8) {
          if ((iMonth % 2 == 0)) {
            if (dDate > 30) {
              ++iMonth;
              if (iMonth > 12) {
                iMonth = 1;
                ++i;
              }
              iDay = 1;
              dDate -= 30;
            } else {
              iDay += static_cast<int32_t>(dDate) - 1;
              dDate = 0;
            }
          } else {
            if (dDate > 31) {
              ++iMonth;
              if (iMonth > 12) {
                iMonth = 1;
                ++i;
              }
              iDay = 1;
              dDate -= 31;
            } else {
              iDay += static_cast<int32_t>(dDate) - 1;
              dDate = 0;
            }
          }
        } else {
          if (iMonth % 2 != 0) {
            if (dDate > 30) {
              ++iMonth;
              if (iMonth > 12) {
                iMonth = 1;
                ++i;
              }
              iDay = 1;
              dDate -= 30;
            } else {
              iDay += static_cast<int32_t>(dDate) - 1;
              dDate = 0;
            }
          } else {
            if (dDate > 31) {
              ++iMonth;
              if (iMonth > 12) {
                iMonth = 1;
                ++i;
              }
              iDay = 1;
              dDate -= 31;
            } else {
              iDay += static_cast<int32_t>(dDate) - 1;
              dDate = 0;
            }
          }
        }
      }
      CFX_ByteString szIsoDateString;
      szIsoDateString.Format("%d%02d%02d", iYear + i, iMonth, iDay);
      CFX_ByteString szLocalDateString;
      IsoDate2Local(hThis, szIsoDateString.AsStringC(),
                    formatString.AsStringC(), localString.AsStringC(),
                    szLocalDateString);
      if (szLocalDateString.IsEmpty()) {
        szLocalDateString = "";
      }
      FXJSE_Value_SetUTF8String(args.GetReturnValue(),
                                szLocalDateString.AsStringC());
    } else {
      FXJSE_Value_SetNull(args.GetReturnValue());
    }
    FXJSE_Value_Release(dateValue);
    if (argc > 1) {
      FXJSE_Value_Release(formatValue);
      if (argc == 3) {
        FXJSE_Value_Release(localValue);
      }
    }
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Num2Date");
  }
}
void CXFA_FM2JSContext::Num2GMTime(FXJSE_HOBJECT hThis,
                                   const CFX_ByteStringC& szFuncName,
                                   CFXJSE_Arguments& args) {
  int32_t argc = args.GetLength();
  if ((argc > 0) && (argc < 4)) {
    FX_BOOL bFlags = FALSE;
    int32_t iTime;
    CFX_ByteString formatString;
    CFX_ByteString localString;
    FXJSE_HVALUE timeValue = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE formatValue = 0;
    FXJSE_HVALUE localValue = 0;
    if (FXJSE_Value_IsNull(timeValue)) {
      bFlags = TRUE;
    } else {
      iTime = (int32_t)HValueToFloat(hThis, timeValue);
      if (FXSYS_abs(iTime) < 1.0) {
        bFlags = TRUE;
      }
    }
    if (argc > 1) {
      formatValue = GetSimpleHValue(hThis, args, 1);
      if (FXJSE_Value_IsNull(formatValue)) {
        bFlags = TRUE;
      } else {
        HValueToUTF8String(formatValue, formatString);
      }
    }
    if (argc == 3) {
      localValue = GetSimpleHValue(hThis, args, 2);
      if (FXJSE_Value_IsNull(localValue)) {
        bFlags = TRUE;
      } else {
        HValueToUTF8String(localValue, localString);
      }
    }
    if (!bFlags) {
      CFX_ByteString szGMTTimeString;
      Num2AllTime(hThis, iTime, formatString.AsStringC(),
                  localString.AsStringC(), TRUE, szGMTTimeString);
      if (szGMTTimeString.IsEmpty()) {
        szGMTTimeString = "";
      }
      FXJSE_Value_SetUTF8String(args.GetReturnValue(),
                                szGMTTimeString.AsStringC());
    } else {
      FXJSE_Value_SetNull(args.GetReturnValue());
    }
    FXJSE_Value_Release(timeValue);
    if (argc > 1) {
      FXJSE_Value_Release(formatValue);
      if (argc == 3) {
        FXJSE_Value_Release(localValue);
      }
    }
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Num2GMTime");
  }
}
void CXFA_FM2JSContext::Num2Time(FXJSE_HOBJECT hThis,
                                 const CFX_ByteStringC& szFuncName,
                                 CFXJSE_Arguments& args) {
  int32_t argc = args.GetLength();
  if ((argc > 0) && (argc < 4)) {
    FX_BOOL bFlags = FALSE;
    FX_FLOAT fTime;
    CFX_ByteString formatString;
    CFX_ByteString localString;
    FXJSE_HVALUE timeValue = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE formatValue = 0;
    FXJSE_HVALUE localValue = 0;
    if (FXJSE_Value_IsNull(timeValue)) {
      bFlags = TRUE;
    } else {
      fTime = HValueToFloat(hThis, timeValue);
      if (FXSYS_fabs(fTime) < 1.0) {
        bFlags = TRUE;
      }
    }
    if (argc > 1) {
      formatValue = GetSimpleHValue(hThis, args, 1);
      if (FXJSE_Value_IsNull(formatValue)) {
        bFlags = TRUE;
      } else {
        HValueToUTF8String(formatValue, formatString);
      }
    }
    if (argc == 3) {
      localValue = GetSimpleHValue(hThis, args, 2);
      if (FXJSE_Value_IsNull(localValue)) {
        bFlags = TRUE;
      } else {
        HValueToUTF8String(localValue, localString);
      }
    }
    if (!bFlags) {
      CFX_ByteString szLocalTimeString;
      Num2AllTime(hThis, (int32_t)fTime, formatString.AsStringC(),
                  localString.AsStringC(), FALSE, szLocalTimeString);
      if (szLocalTimeString.IsEmpty()) {
        szLocalTimeString = "";
      }
      FXJSE_Value_SetUTF8String(args.GetReturnValue(),
                                szLocalTimeString.AsStringC());
    } else {
      FXJSE_Value_SetNull(args.GetReturnValue());
    }
    FXJSE_Value_Release(timeValue);
    if (argc > 1) {
      FXJSE_Value_Release(formatValue);
      if (argc == 3) {
        FXJSE_Value_Release(localValue);
      }
    }
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Num2Time");
  }
}
void CXFA_FM2JSContext::Time(FXJSE_HOBJECT hThis,
                             const CFX_ByteStringC& szFuncName,
                             CFXJSE_Arguments& args) {
  if (args.GetLength() == 0) {
    time_t now;
    time(&now);
    struct tm* pGmt = gmtime(&now);
    int32_t iGMHour = pGmt->tm_hour;
    int32_t iGMMin = pGmt->tm_min;
    int32_t iGMSec = pGmt->tm_sec;
    FXJSE_Value_SetInteger(args.GetReturnValue(),
                           ((iGMHour * 3600 + iGMMin * 60 + iGMSec) * 1000));
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Time");
  }
}
void CXFA_FM2JSContext::Time2Num(FXJSE_HOBJECT hThis,
                                 const CFX_ByteStringC& szFuncName,
                                 CFXJSE_Arguments& args) {
  int32_t argc = args.GetLength();
  if ((argc > 0) && (argc < 4)) {
    FX_BOOL bFlags = FALSE;
    CFX_ByteString timeString;
    CFX_ByteString formatString;
    CFX_ByteString localString;
    FXJSE_HVALUE timeValue = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE formatValue = 0;
    FXJSE_HVALUE localValue = 0;
    if (HValueIsNull(hThis, timeValue)) {
      bFlags = TRUE;
    } else {
      HValueToUTF8String(timeValue, timeString);
    }
    if (argc > 1) {
      formatValue = GetSimpleHValue(hThis, args, 1);
      if (HValueIsNull(hThis, formatValue)) {
        bFlags = TRUE;
      } else {
        HValueToUTF8String(formatValue, formatString);
      }
    }
    if (argc == 3) {
      localValue = GetSimpleHValue(hThis, args, 2);
      if (HValueIsNull(hThis, localValue)) {
        bFlags = TRUE;
      } else {
        HValueToUTF8String(localValue, localString);
      }
    }
    if (!bFlags) {
      CXFA_FM2JSContext* pContext =
          (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
      CXFA_Document* pDoc = pContext->GetDocument();
      IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr();
      IFX_Locale* pLocale = NULL;
      if (localString.IsEmpty()) {
        CXFA_Node* pThisNode =
            ToNode(pDoc->GetScriptContext()->GetThisObject());
        FXSYS_assert(pThisNode);
        CXFA_WidgetData widgetData(pThisNode);
        pLocale = widgetData.GetLocal();
      } else {
        pLocale = pMgr->GetLocaleByName(
            CFX_WideString::FromUTF8(localString.AsStringC()).AsStringC());
      }
      CFX_WideString wsFormat;
      if (formatString.IsEmpty()) {
        pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat);
      } else {
        wsFormat = CFX_WideString::FromUTF8(formatString.AsStringC());
      }
      wsFormat = FX_WSTRC(L"time{") + wsFormat;
      wsFormat += FX_WSTRC(L"}");
      CXFA_LocaleValue timeValue(
          XFA_VT_TIME, CFX_WideString::FromUTF8(timeString.AsStringC()),
          wsFormat, pLocale, (CXFA_LocaleMgr*)pMgr);
      if (timeValue.IsValid()) {
        CFX_Unitime uniTime = timeValue.GetTime();
        int32_t hour = uniTime.GetHour();
        int32_t min = uniTime.GetMinute();
        int32_t second = uniTime.GetSecond();
        int32_t milSecond = uniTime.GetMillisecond();
        int32_t mins = hour * 60 + min;
        CXFA_TimeZoneProvider* pProvider = CXFA_TimeZoneProvider::Get();
        if (pProvider) {
          FX_TIMEZONE tz;
          pProvider->GetTimeZone(tz);
          mins -= (tz.tzHour * 60);
          while (mins > 1440) {
            mins -= 1440;
          }
          while (mins < 0) {
            mins += 1440;
          }
          hour = mins / 60;
          min = mins % 60;
        }
        int32_t iResult =
            hour * 3600000 + min * 60000 + second * 1000 + milSecond + 1;
        FXJSE_Value_SetInteger(args.GetReturnValue(), iResult);
      } else {
        FXJSE_Value_SetInteger(args.GetReturnValue(), 0);
      }
    } else {
      FXJSE_Value_SetNull(args.GetReturnValue());
    }
    FXJSE_Value_Release(timeValue);
    if (argc > 1) {
      FXJSE_Value_Release(formatValue);
      if (argc == 3) {
        FXJSE_Value_Release(localValue);
      }
    }
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Time2Num");
  }
}
void CXFA_FM2JSContext::TimeFmt(FXJSE_HOBJECT hThis,
                                const CFX_ByteStringC& szFuncName,
                                CFXJSE_Arguments& args) {
  int32_t argc = args.GetLength();
  if (argc < 3) {
    FX_BOOL bFlags = FALSE;
    int32_t iStyle = 0;
    CFX_ByteString szLocal;
    FXJSE_HVALUE argStyle = 0;
    FXJSE_HVALUE argLocal = 0;
    if (argc > 0) {
      argStyle = GetSimpleHValue(hThis, args, 0);
      if (FXJSE_Value_IsNull(argStyle)) {
        bFlags = TRUE;
      }
      iStyle = (int32_t)HValueToFloat(hThis, argStyle);
      if (iStyle > 4 || iStyle < 0) {
        iStyle = 0;
      }
    }
    if (argc == 2) {
      argLocal = GetSimpleHValue(hThis, args, 1);
      if (FXJSE_Value_IsNull(argLocal)) {
        bFlags = TRUE;
      } else {
        HValueToUTF8String(argLocal, szLocal);
      }
    }
    if (!bFlags) {
      CFX_ByteString formatStr;
      GetStandardTimeFormat(hThis, iStyle, szLocal.AsStringC(), formatStr);
      if (formatStr.IsEmpty()) {
        formatStr = "";
      }
      FXJSE_Value_SetUTF8String(args.GetReturnValue(), formatStr.AsStringC());
    } else {
      FXJSE_Value_SetNull(args.GetReturnValue());
    }
    if (argc > 0) {
      FXJSE_Value_Release(argStyle);
      if (argc == 2) {
        FXJSE_Value_Release(argLocal);
      }
    }
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"TimeFmt");
  }
}
FX_BOOL CXFA_FM2JSContext::IsIsoDateFormat(const FX_CHAR* pData,
                                           int32_t iLength,
                                           int32_t& iStyle,
                                           int32_t& iYear,
                                           int32_t& iMonth,
                                           int32_t& iDay) {
  iYear = 0;
  iMonth = 1;
  iDay = 1;
  FX_BOOL iRet = FALSE;
  if (iLength < 4) {
    return iRet;
  }
  FX_CHAR strYear[5];
  strYear[4] = '\0';
  for (int32_t i = 0; i < 4; ++i) {
    if (*(pData + i) <= '9' && *(pData + i) >= '0') {
      strYear[i] = *(pData + i);
    } else {
      return iRet;
    }
  }
  iYear = FXSYS_atoi(strYear);
  iStyle = 0;
  if (iLength > 4) {
    if (*(pData + 4) == '-') {
      iStyle = 1;
    } else {
      iStyle = 0;
    }
  } else {
    iRet = TRUE;
    return iRet;
  }
  FX_CHAR strTemp[3];
  strTemp[2] = '\0';
  int32_t iPosOff = 0;
  if (iStyle == 0) {
    iPosOff = 4;
    if (iLength == 4) {
      iRet = TRUE;
      return iRet;
    }
  } else {
    iPosOff = 5;
    if (iLength == 4) {
      iRet = TRUE;
      return iRet;
    }
  }
  if ((*(pData + iPosOff) > '9' || *(pData + iPosOff) < '0') ||
      (*(pData + iPosOff + 1) > '9' || *(pData + iPosOff + 1) < '0')) {
    return iRet;
  }
  strTemp[0] = *(pData + iPosOff);
  strTemp[1] = *(pData + iPosOff + 1);
  iMonth = FXSYS_atoi(strTemp);
  if (iMonth > 12 || iMonth < 1) {
    return iRet;
  }
  if (iStyle == 0) {
    iPosOff += 2;
    if (iLength == 6) {
      iRet = 1;
      return iRet;
    }
  } else {
    iPosOff += 3;
    if (iLength == 7) {
      iRet = 1;
      return iRet;
    }
  }
  if ((*(pData + iPosOff) > '9' || *(pData + iPosOff) < '0') ||
      (*(pData + iPosOff + 1) > '9' || *(pData + iPosOff + 1) < '0')) {
    return iRet;
  }
  strTemp[0] = *(pData + iPosOff);
  strTemp[1] = *(pData + iPosOff + 1);
  iDay = FXSYS_atoi(strTemp);
  if (iPosOff + 2 < iLength) {
    return iRet;
  }
  if ((!(iYear % 4) && (iYear % 100)) || !(iYear % 400)) {
    if (iMonth == 2) {
      if (iDay > 29) {
        return iRet;
      }
    } else {
      if (iMonth < 8) {
        if (iDay > (iMonth % 2 == 0 ? 30 : 31)) {
          return iRet;
        }
      } else {
        if (iDay > (iMonth % 2 == 0 ? 31 : 30)) {
          return iRet;
        }
      }
    }
  } else {
    if (iMonth == 2) {
      if (iDay > 28) {
        return iRet;
      }
    } else {
      if (iMonth < 8) {
        if (iDay > (iMonth % 2 == 0 ? 30 : 31)) {
          return iRet;
        }
      } else {
        if (iDay > (iMonth % 2 == 0 ? 31 : 30)) {
          return iRet;
        }
      }
    }
  }
  iRet = TRUE;
  return iRet;
}
FX_BOOL CXFA_FM2JSContext::IsIsoTimeFormat(const FX_CHAR* pData,
                                           int32_t iLength,
                                           int32_t& iHour,
                                           int32_t& iMinute,
                                           int32_t& iSecond,
                                           int32_t& iMilliSecond,
                                           int32_t& iZoneHour,
                                           int32_t& iZoneMinute) {
  iHour = 0;
  iMinute = 0;
  iSecond = 0;
  iMilliSecond = 0;
  iZoneHour = 0;
  iZoneMinute = 0;
  if (!pData) {
    return FALSE;
  }
  int32_t iRet = FALSE;
  FX_CHAR strTemp[3];
  strTemp[2] = '\0';
  int32_t iIndex = 0;
  int32_t iZone = 0;
  int32_t i = iIndex;
  while (i < iLength) {
    if ((*(pData + i) > '9' || *(pData + i) < '0') && *(pData + i) != ':') {
      iZone = i;
      break;
    }
    ++i;
  }
  if (i == iLength) {
    iZone = iLength;
  }
  int32_t iPos = 0;
  while (iIndex < iZone) {
    if (iIndex >= iZone) {
      break;
    }
    if (*(pData + iIndex) > '9' || *(pData + iIndex) < '0') {
      return iRet;
    }
    strTemp[0] = *(pData + iIndex);
    if (*(pData + iIndex + 1) > '9' || *(pData + iIndex + 1) < '0') {
      return iRet;
    }
    strTemp[1] = *(pData + iIndex + 1);
    if (FXSYS_atoi(strTemp) > 60) {
      return iRet;
    }
    if (*(pData + 2) == ':') {
      if (iPos == 0) {
        iHour = FXSYS_atoi(strTemp);
        ++iPos;
      } else if (iPos == 1) {
        iMinute = FXSYS_atoi(strTemp);
        ++iPos;
      } else {
        iSecond = FXSYS_atoi(strTemp);
      }
      iIndex += 3;
    } else {
      if (iPos == 0) {
        iHour = FXSYS_atoi(strTemp);
        ++iPos;
      } else if (iPos == 1) {
        iMinute = FXSYS_atoi(strTemp);
        ++iPos;
      } else if (iPos == 2) {
        iSecond = FXSYS_atoi(strTemp);
        ++iPos;
      }
      iIndex += 2;
    }
  }
  if (*(pData + iIndex) == '.') {
    ++iIndex;
    FX_CHAR strTemp[4];
    strTemp[3] = '\0';
    if (*(pData + iIndex) > '9' || *(pData + iIndex) < '0') {
      return iRet;
    }
    strTemp[0] = *(pData + iIndex);
    if (*(pData + iIndex + 1) > '9' || *(pData + iIndex + 1) < '0') {
      return iRet;
    }
    strTemp[1] = *(pData + iIndex + 1);
    if (*(pData + iIndex + 2) > '9' || *(pData + iIndex + 2) < '0') {
      return iRet;
    }
    strTemp[2] = *(pData + iIndex + 2);
    iMilliSecond = FXSYS_atoi(strTemp);
    if (iMilliSecond > 100) {
      iMilliSecond = 0;
      return iRet;
    }
    iIndex += 3;
  }
  int32_t iSign = 1;
  if (*(pData + iIndex) == 'z' || *(pData + iIndex) == 'Z') {
    iRet = 1;
    return iRet;
  } else if (*(pData + iIndex) == '+') {
    ++iIndex;
  } else if (*(pData + iIndex) == '-') {
    iSign = -1;
    ++iIndex;
  }
  iPos = 0;
  while (iIndex < iLength) {
    if (iIndex >= iLength) {
      return iRet;
    }
    if (*(pData + iIndex) > '9' || *(pData + iIndex) < '0') {
      return iRet;
    }
    strTemp[0] = *(pData + iIndex);
    if (*(pData + iIndex + 1) > '9' || *(pData + iIndex + 1) < '0') {
      return iRet;
    }
    strTemp[1] = *(pData + iIndex + 1);
    if (FXSYS_atoi(strTemp) > 60) {
      return iRet;
    }
    if (*(pData + 2) == ':') {
      if (iPos == 0) {
        iZoneHour = FXSYS_atoi(strTemp);
      } else if (iPos == 1) {
        iZoneMinute = FXSYS_atoi(strTemp);
      }
      iIndex += 3;
    } else {
      if (!iPos) {
        iZoneHour = FXSYS_atoi(strTemp);
        ++iPos;
      } else if (iPos == 1) {
        iZoneMinute = FXSYS_atoi(strTemp);
        ++iPos;
      }
      iIndex += 2;
    }
  }
  if (iIndex < iLength) {
    return iRet;
  }
  iZoneHour *= iSign;
  iRet = TRUE;
  return iRet;
}
FX_BOOL CXFA_FM2JSContext::IsIsoDateTimeFormat(const FX_CHAR* pData,
                                               int32_t iLength,
                                               int32_t& iYear,
                                               int32_t& iMonth,
                                               int32_t& iDay,
                                               int32_t& iHour,
                                               int32_t& iMinute,
                                               int32_t& iSecond,
                                               int32_t& iMillionSecond,
                                               int32_t& iZoneHour,
                                               int32_t& iZoneMinute) {
  iYear = 0;
  iMonth = 0;
  iDay = 0;
  iHour = 0;
  iMinute = 0;
  iSecond = 0;
  if (!pData) {
    return FALSE;
  }
  int32_t iRet = FALSE;
  int32_t iIndex = 0;
  while (*(pData + iIndex) != 'T' && *(pData + iIndex) != 't') {
    if (iIndex >= iLength) {
      return iRet;
    }
    ++iIndex;
  }
  if (iIndex != 8 && iIndex != 10) {
    return iRet;
  }
  int32_t iStyle = -1;
  iRet = IsIsoDateFormat(pData, iIndex, iStyle, iYear, iMonth, iDay);
  if (!iRet) {
    return iRet;
  }
  if (*(pData + iIndex) != 'T' && *(pData + iIndex) != 't') {
    return iRet;
  }
  ++iIndex;
  if (((iLength - iIndex > 13) && (iLength - iIndex < 6)) &&
      (iLength - iIndex != 15)) {
    return iRet;
  }
  iRet = IsIsoTimeFormat(pData + iIndex, iLength - iIndex, iHour, iMinute,
                         iSecond, iMillionSecond, iZoneHour, iZoneMinute);
  if (!iRet) {
    return iRet;
  }
  iRet = TRUE;
  return iRet;
}
FX_BOOL CXFA_FM2JSContext::Local2IsoDate(FXJSE_HOBJECT hThis,
                                         const CFX_ByteStringC& szDate,
                                         const CFX_ByteStringC& szFormat,
                                         const CFX_ByteStringC& szLocale,
                                         CFX_ByteString& strIsoDate) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  CXFA_Document* pDoc = pContext->GetDocument();
  if (!pDoc) {
    return FALSE;
  }
  IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr();
  IFX_Locale* pLocale = NULL;
  if (szLocale.IsEmpty()) {
    CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject());
    FXSYS_assert(pThisNode);
    CXFA_WidgetData widgetData(pThisNode);
    pLocale = widgetData.GetLocal();
  } else {
    pLocale =
        pMgr->GetLocaleByName(CFX_WideString::FromUTF8(szLocale).AsStringC());
  }
  if (!pLocale) {
    return FALSE;
  }
  CFX_WideString wsFormat;
  if (szFormat.IsEmpty()) {
    pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat);
  } else {
    wsFormat = CFX_WideString::FromUTF8(szFormat);
  }
  CXFA_LocaleValue widgetValue(XFA_VT_DATE, CFX_WideString::FromUTF8(szDate),
                               wsFormat, pLocale, (CXFA_LocaleMgr*)pMgr);
  CFX_Unitime dt = widgetValue.GetDate();
  strIsoDate.Format("%4d-%02d-%02d", dt.GetYear(), dt.GetMonth(), dt.GetDay());
  return TRUE;
}
FX_BOOL CXFA_FM2JSContext::Local2IsoTime(FXJSE_HOBJECT hThis,
                                         const CFX_ByteStringC& szTime,
                                         const CFX_ByteStringC& szFormat,
                                         const CFX_ByteStringC& szLocale,
                                         CFX_ByteString& strIsoTime) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  CXFA_Document* pDoc = pContext->GetDocument();
  if (!pDoc) {
    return FALSE;
  }
  IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr();
  IFX_Locale* pLocale = NULL;
  if (szLocale.IsEmpty()) {
    CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject());
    FXSYS_assert(pThisNode);
    CXFA_WidgetData widgetData(pThisNode);
    pLocale = widgetData.GetLocal();
  } else {
    pLocale =
        pMgr->GetLocaleByName(CFX_WideString::FromUTF8(szLocale).AsStringC());
  }
  if (!pLocale) {
    return FALSE;
  }
  CFX_WideString wsFormat;
  if (szFormat.IsEmpty()) {
    pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat);
  } else {
    wsFormat = CFX_WideString::FromUTF8(szFormat);
  }
  wsFormat = FX_WSTRC(L"time{") + wsFormat;
  wsFormat += FX_WSTRC(L"}");
  CXFA_LocaleValue widgetValue(XFA_VT_TIME, CFX_WideString::FromUTF8(szTime),
                               wsFormat, pLocale, (CXFA_LocaleMgr*)pMgr);
  CFX_Unitime utime = widgetValue.GetTime();
  strIsoTime.Format("%02d:%02d:%02d.%03d", utime.GetHour(), utime.GetMinute(),
                    utime.GetSecond(), utime.GetMillisecond());
  return TRUE;
}
FX_BOOL CXFA_FM2JSContext::IsoDate2Local(FXJSE_HOBJECT hThis,
                                         const CFX_ByteStringC& szDate,
                                         const CFX_ByteStringC& szFormat,
                                         const CFX_ByteStringC& szLocale,
                                         CFX_ByteString& strLocalDate) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  CXFA_Document* pDoc = pContext->GetDocument();
  if (!pDoc) {
    return FALSE;
  }
  IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr();
  IFX_Locale* pLocale = NULL;
  if (szLocale.IsEmpty()) {
    CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject());
    FXSYS_assert(pThisNode);
    CXFA_WidgetData widgetData(pThisNode);
    pLocale = widgetData.GetLocal();
  } else {
    pLocale =
        pMgr->GetLocaleByName(CFX_WideString::FromUTF8(szLocale).AsStringC());
  }
  if (!pLocale) {
    return FALSE;
  }
  CFX_WideString wsFormat;
  if (szFormat.IsEmpty()) {
    pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat);
  } else {
    wsFormat = CFX_WideString::FromUTF8(szFormat);
  }
  CXFA_LocaleValue widgetValue(XFA_VT_DATE, CFX_WideString::FromUTF8(szDate),
                               (CXFA_LocaleMgr*)pMgr);
  CFX_WideString wsRet;
  widgetValue.FormatPatterns(wsRet, wsFormat, pLocale,
                             XFA_VALUEPICTURE_Display);
  strLocalDate = FX_UTF8Encode(wsRet.c_str(), wsRet.GetLength());
  return TRUE;
}
FX_BOOL CXFA_FM2JSContext::IsoTime2Local(FXJSE_HOBJECT hThis,
                                         const CFX_ByteStringC& szTime,
                                         const CFX_ByteStringC& szFormat,
                                         const CFX_ByteStringC& szLocale,
                                         CFX_ByteString& strLocalTime) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  CXFA_Document* pDoc = pContext->GetDocument();
  if (!pDoc) {
    return FALSE;
  }
  IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr();
  IFX_Locale* pLocale = NULL;
  if (szLocale.IsEmpty()) {
    CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject());
    FXSYS_assert(pThisNode);
    CXFA_WidgetData widgetData(pThisNode);
    pLocale = widgetData.GetLocal();
  } else {
    pLocale =
        pMgr->GetLocaleByName(CFX_WideString::FromUTF8(szLocale).AsStringC());
  }
  if (!pLocale) {
    return FALSE;
  }
  CFX_WideString wsFormat;
  if (szFormat.IsEmpty()) {
    pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat);
  } else {
    wsFormat = CFX_WideString::FromUTF8(szFormat);
  }
  wsFormat = FX_WSTRC(L"time{") + wsFormat;
  wsFormat += FX_WSTRC(L"}");
  CXFA_LocaleValue widgetValue(XFA_VT_TIME, CFX_WideString::FromUTF8(szTime),
                               (CXFA_LocaleMgr*)pMgr);
  CFX_WideString wsRet;
  widgetValue.FormatPatterns(wsRet, wsFormat, pLocale,
                             XFA_VALUEPICTURE_Display);
  strLocalTime = FX_UTF8Encode(wsRet.c_str(), wsRet.GetLength());
  return TRUE;
}
FX_BOOL CXFA_FM2JSContext::GetGMTTime(FXJSE_HOBJECT hThis,
                                      const CFX_ByteStringC& szTime,
                                      const CFX_ByteStringC& szFormat,
                                      const CFX_ByteStringC& szLocale,
                                      CFX_ByteString& strGMTTime) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  CXFA_Document* pDoc = pContext->GetDocument();
  if (!pDoc) {
    return FALSE;
  }
  IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr();
  IFX_Locale* pLocale = NULL;
  if (szLocale.IsEmpty()) {
    CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject());
    FXSYS_assert(pThisNode);
    CXFA_WidgetData widgetData(pThisNode);
    pLocale = widgetData.GetLocal();
  } else {
    pLocale =
        pMgr->GetLocaleByName(CFX_WideString::FromUTF8(szLocale).AsStringC());
  }
  if (!pLocale) {
    return FALSE;
  }
  CFX_WideString wsFormat;
  if (szFormat.IsEmpty()) {
    pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat);
  } else {
    wsFormat = CFX_WideString::FromUTF8(szFormat);
  }
  wsFormat = FX_WSTRC(L"time{") + wsFormat;
  wsFormat += FX_WSTRC(L"}");
  CXFA_LocaleValue widgetValue(XFA_VT_TIME, CFX_WideString::FromUTF8(szTime),
                               (CXFA_LocaleMgr*)pMgr);
  CFX_WideString wsRet;
  widgetValue.FormatPatterns(wsRet, wsFormat, pLocale,
                             XFA_VALUEPICTURE_Display);
  strGMTTime = FX_UTF8Encode(wsRet.c_str(), wsRet.GetLength());
  return TRUE;
}
int32_t CXFA_FM2JSContext::DateString2Num(const CFX_ByteStringC& szDateString) {
  FX_BOOL bFlags = FALSE;
  int32_t iLength = szDateString.GetLength();
  FX_BOOL iRet = FALSE;
  int32_t iStyle = -1;
  int32_t iYear = 0;
  int32_t iMonth = 0;
  int32_t iDay = 0;
  int32_t iHour = 0;
  int32_t iMinute = 0;
  int32_t iSecond = 0;
  int32_t iMillionSecond = 0;
  int32_t iZoneHour = 0;
  int32_t iZoneMinute = 0;
  if (iLength <= 10) {
    iRet = IsIsoDateFormat(szDateString.c_str(), iLength, iStyle, iYear, iMonth,
                           iDay);
  } else {
    iRet = IsIsoDateTimeFormat(szDateString.c_str(), iLength, iYear, iMonth,
                               iDay, iHour, iMinute, iSecond, iMillionSecond,
                               iZoneHour, iZoneMinute);
  }
  if (!iRet) {
    bFlags = TRUE;
  }
  FX_FLOAT dDays = 0;
  int32_t i = 1;
  if (iYear < 1900) {
    bFlags = TRUE;
  }
  if (!bFlags) {
    while (iYear - i >= 1900) {
      if ((!((iYear - i) % 4) && ((iYear - i) % 100)) || !((iYear - i) % 400)) {
        dDays += 366;
      } else {
        dDays += 365;
      }
      ++i;
    }
    i = 1;
    while (i < iMonth) {
      if (i == 2) {
        if ((!(iYear % 4) && (iYear % 100)) || !(iYear % 400)) {
          dDays += 29;
        } else {
          dDays += 28;
        }
      } else if (i <= 7) {
        if (i % 2 == 0) {
          dDays += 30;
        } else {
          dDays += 31;
        }
      } else {
        if (i % 2 == 0) {
          dDays += 31;
        } else {
          dDays += 30;
        }
      }
      ++i;
    }
    i = 0;
    while (iDay - i > 0) {
      dDays += 1;
      ++i;
    }
  } else {
    dDays = 0;
  }
  return (int32_t)dDays;
}
#define XFA_N 19
static uint8_t g_sAltTable_Date[] = {
    XFA_N, XFA_N, XFA_N, 3,     9,     XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,
    XFA_N, 2,     XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,
    XFA_N, XFA_N, 1,     XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,
    XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,
    XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,
    XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,
};
static uint8_t g_sAltTable_Time[] = {
    14,    XFA_N, XFA_N, 3,     9,     XFA_N, XFA_N, 15,    XFA_N, XFA_N, XFA_N,
    XFA_N, 6,     XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, 7,     XFA_N, XFA_N, XFA_N,
    XFA_N, XFA_N, 1,     17,    XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,
    XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, 15,    XFA_N, XFA_N, XFA_N, XFA_N,
    XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,
    XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N,
};
static void XFA_FM_AlternateDateTimeSymbols(CFX_WideString& wsPattern,
                                            const CFX_WideString& wsAltSymbols,
                                            uint8_t* pAltTable) {
  int32_t nLength = wsPattern.GetLength();
  FX_BOOL bInConstRange = FALSE;
  FX_BOOL bEscape = FALSE;
  int32_t i = 0, n = 0;
  while (i < nLength) {
    FX_WCHAR wc = wsPattern[i];
    if (wc == L'\'') {
      bInConstRange = !bInConstRange;
      if (bEscape) {
        i++;
      } else {
        wsPattern.Delete(i);
        nLength--;
      }
      bEscape = !bEscape;
      continue;
    }
    if (!bInConstRange && (n = wc - L'A') >= 0 && n <= (L'a' - L'A')) {
      int32_t nAlt = (int32_t)pAltTable[n];
      if (nAlt != XFA_N) {
        wsPattern.SetAt(i, wsAltSymbols[nAlt]);
      }
    }
    i++;
    bEscape = FALSE;
  }
}
#undef XFA_N
void CXFA_FM2JSContext::GetLocalDateFormat(FXJSE_HOBJECT hThis,
                                           int32_t iStyle,
                                           const CFX_ByteStringC& szLocalStr,
                                           CFX_ByteString& strFormat,
                                           FX_BOOL bStandard) {
  FX_LOCALEDATETIMESUBCATEGORY strStyle;
  switch (iStyle) {
    case 0:
      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium;
      break;
    case 1:
      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Short;
      break;
    case 2:
      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium;
      break;
    case 3:
      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Long;
      break;
    case 4:
      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Full;
      break;
    default:
      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium;
      break;
  }
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  CXFA_Document* pDoc = pContext->GetDocument();
  if (!pDoc) {
    return;
  }
  IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr();
  IFX_Locale* pLocale = NULL;
  if (szLocalStr.IsEmpty()) {
    CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject());
    FXSYS_assert(pThisNode);
    CXFA_WidgetData widgetData(pThisNode);
    pLocale = widgetData.GetLocal();
  } else {
    pLocale =
        pMgr->GetLocaleByName(CFX_WideString::FromUTF8(szLocalStr).AsStringC());
  }
  if (!pLocale) {
    return;
  }
  CFX_WideString strRet;
  pLocale->GetDatePattern(strStyle, strRet);
  if (!bStandard) {
    CFX_WideString wsSymbols;
    pLocale->GetDateTimeSymbols(wsSymbols);
    XFA_FM_AlternateDateTimeSymbols(strRet, wsSymbols, g_sAltTable_Date);
  }
  strFormat = FX_UTF8Encode(strRet.c_str(), strRet.GetLength());
}
void CXFA_FM2JSContext::GetLocalTimeFormat(FXJSE_HOBJECT hThis,
                                           int32_t iStyle,
                                           const CFX_ByteStringC& szLocalStr,
                                           CFX_ByteString& strFormat,
                                           FX_BOOL bStandard) {
  FX_LOCALEDATETIMESUBCATEGORY strStyle;
  switch (iStyle) {
    case 0:
      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium;
      break;
    case 1:
      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Short;
      break;
    case 2:
      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium;
      break;
    case 3:
      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Long;
      break;
    case 4:
      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Full;
      break;
    default:
      strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium;
      break;
  }
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  CXFA_Document* pDoc = pContext->GetDocument();
  if (!pDoc) {
    return;
  }
  IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr();
  IFX_Locale* pLocale = NULL;
  if (szLocalStr.IsEmpty()) {
    CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject());
    FXSYS_assert(pThisNode);
    CXFA_WidgetData widgetData(pThisNode);
    pLocale = widgetData.GetLocal();
  } else {
    pLocale =
        pMgr->GetLocaleByName(CFX_WideString::FromUTF8(szLocalStr).AsStringC());
  }
  if (!pLocale) {
    return;
  }
  CFX_WideString strRet;
  pLocale->GetTimePattern(strStyle, strRet);
  if (!bStandard) {
    CFX_WideString wsSymbols;
    pLocale->GetDateTimeSymbols(wsSymbols);
    XFA_FM_AlternateDateTimeSymbols(strRet, wsSymbols, g_sAltTable_Time);
  }
  strFormat = FX_UTF8Encode(strRet.c_str(), strRet.GetLength());
}
void CXFA_FM2JSContext::GetStandardDateFormat(FXJSE_HOBJECT hThis,
                                              int32_t iStyle,
                                              const CFX_ByteStringC& szLocalStr,
                                              CFX_ByteString& strFormat) {
  GetLocalDateFormat(hThis, iStyle, szLocalStr, strFormat, TRUE);
}
void CXFA_FM2JSContext::GetStandardTimeFormat(FXJSE_HOBJECT hThis,
                                              int32_t iStyle,
                                              const CFX_ByteStringC& szLocalStr,
                                              CFX_ByteString& strFormat) {
  GetLocalTimeFormat(hThis, iStyle, szLocalStr, strFormat, TRUE);
}
void CXFA_FM2JSContext::Num2AllTime(FXJSE_HOBJECT hThis,
                                    int32_t iTime,
                                    const CFX_ByteStringC& szFormat,
                                    const CFX_ByteStringC& szLocale,
                                    FX_BOOL bGM,
                                    CFX_ByteString& strTime) {
  int32_t iHour = 0;
  int32_t iMin = 0;
  int32_t iSec = 0;
  int32_t iZoneHour = 0;
  int32_t iZoneMin = 0;
  int32_t iZoneSec = 0;
  iHour = static_cast<int>(iTime) / 3600000;
  iMin = (static_cast<int>(iTime) - iHour * 3600000) / 60000;
  iSec = (static_cast<int>(iTime) - iHour * 3600000 - iMin * 60000) / 1000;
  if (!bGM) {
    GetLocalTimeZone(iZoneHour, iZoneMin, iZoneSec);
    iHour += iZoneHour;
    iMin += iZoneMin;
    iSec += iZoneSec;
  }
  int32_t iRet = 0;
  CFX_ByteString strIsoTime;
  strIsoTime.Format("%02d:%02d:%02d", iHour, iMin, iSec);
  if (bGM) {
    iRet =
        GetGMTTime(hThis, strIsoTime.AsStringC(), szFormat, szLocale, strTime);
  } else {
    iRet = IsoTime2Local(hThis, strIsoTime.AsStringC(), szFormat, szLocale,
                         strTime);
  }
  if (!iRet) {
    strTime = "";
  }
}

void CXFA_FM2JSContext::GetLocalTimeZone(int32_t& iHour,
                                         int32_t& iMin,
                                         int32_t& iSec) {
  time_t now;
  time(&now);
  struct tm* pGmt = gmtime(&now);
  int32_t iGMHour = pGmt->tm_hour;
  int32_t iGMMin = pGmt->tm_min;
  int32_t iGMSec = pGmt->tm_sec;
  struct tm* pLocal = localtime(&now);
  int32_t iLocalHour = pLocal->tm_hour;
  int32_t iLocalMin = pLocal->tm_min;
  int32_t iLocalSec = pLocal->tm_sec;
  iHour = iLocalHour - iGMHour;
  iMin = iLocalMin - iGMMin;
  iSec = iLocalSec - iGMSec;
}
void CXFA_FM2JSContext::Apr(FXJSE_HOBJECT hThis,
                            const CFX_ByteStringC& szFuncName,
                            CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  if (args.GetLength() == 3) {
    FX_BOOL bFlags = FALSE;
    FX_DOUBLE nPrincipal = 0;
    FX_DOUBLE nPayment = 0;
    FX_DOUBLE nPeriods = 0;
    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
    FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2);
    bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) ||
              HValueIsNull(hThis, argThree));
    if (bFlags) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      nPrincipal = HValueToDouble(hThis, argOne);
      nPayment = HValueToDouble(hThis, argTwo);
      nPeriods = HValueToDouble(hThis, argThree);
      bFlags = ((nPrincipal <= 0) || (nPayment <= 0) || (nPeriods <= 0));
      if (bFlags) {
        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
      } else {
        FX_DOUBLE r =
            2 * (nPeriods * nPayment - nPrincipal) / (nPeriods * nPrincipal);
        FX_DOUBLE nTemp = 1;
        for (int32_t i = 0; i < nPeriods; ++i) {
          nTemp *= (1 + r);
        }
        FX_DOUBLE nRet = r * nTemp / (nTemp - 1) - nPayment / nPrincipal;
        while ((nRet > FINANCIAL_PRECISION || nRet < -FINANCIAL_PRECISION) &&
               (!bFlags)) {
          FX_DOUBLE nDerivative = 0;
          nDerivative =
              ((nTemp + r * nPeriods * (nTemp / (1 + r))) * (nTemp - 1) -
               (r * nTemp * nPeriods * (nTemp / (1 + r)))) /
              ((nTemp - 1) * (nTemp - 1));
          if (nDerivative == 0) {
            bFlags = TRUE;
            continue;
          }
          r = r - nRet / nDerivative;
          nTemp = 1;
          for (int32_t i = 0; i < nPeriods; ++i) {
            nTemp *= (1 + r);
          }
          nRet = r * nTemp / (nTemp - 1) - nPayment / nPrincipal;
        }
        if (bFlags) {
          FXJSE_Value_SetNull(args.GetReturnValue());
        } else {
          r = r * 12;
          FXJSE_Value_SetDouble(args.GetReturnValue(), r);
        }
      }
    }
    FXJSE_Value_Release(argOne);
    FXJSE_Value_Release(argTwo);
    FXJSE_Value_Release(argThree);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Apr");
  }
}
void CXFA_FM2JSContext::CTerm(FXJSE_HOBJECT hThis,
                              const CFX_ByteStringC& szFuncName,
                              CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  if (args.GetLength() == 3) {
    FX_BOOL bFlags = FALSE;
    FX_FLOAT nRate = 0;
    FX_FLOAT nFutureValue = 0;
    FX_FLOAT nInitAmount = 0;
    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
    FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2);
    bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) ||
              HValueIsNull(hThis, argThree));
    if (bFlags) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      nRate = HValueToFloat(hThis, argOne);
      nFutureValue = HValueToFloat(hThis, argTwo);
      nInitAmount = HValueToFloat(hThis, argThree);
      bFlags = ((nRate <= 0) || (nFutureValue <= 0) || (nInitAmount <= 0));
      if (bFlags) {
        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
      } else {
        FXJSE_Value_SetFloat(args.GetReturnValue(),
                             FXSYS_log((FX_FLOAT)(nFutureValue / nInitAmount)) /
                                 FXSYS_log((FX_FLOAT)(1 + nRate)));
      }
    }
    FXJSE_Value_Release(argOne);
    FXJSE_Value_Release(argTwo);
    FXJSE_Value_Release(argThree);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"CTerm");
  }
}
void CXFA_FM2JSContext::FV(FXJSE_HOBJECT hThis,
                           const CFX_ByteStringC& szFuncName,
                           CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  if (args.GetLength() == 3) {
    FX_BOOL bFlags = FALSE;
    FX_DOUBLE nAmount = 0;
    FX_DOUBLE nRate = 0;
    FX_DOUBLE nPeriod = 0;
    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
    FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2);
    bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) ||
              HValueIsNull(hThis, argThree));
    if (bFlags) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      nAmount = HValueToDouble(hThis, argOne);
      nRate = HValueToDouble(hThis, argTwo);
      nPeriod = HValueToDouble(hThis, argThree);
      bFlags = ((nRate < 0) || (nPeriod <= 0) || (nAmount <= 0));
      if (bFlags) {
        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
      } else {
        FX_DOUBLE dResult = 0;
        if (!nRate) {
          dResult = nAmount * nPeriod;
        } else {
          FX_DOUBLE nTemp = 1;
          for (int i = 0; i < nPeriod; ++i) {
            nTemp *= 1 + nRate;
          }
          dResult = nAmount * (nTemp - 1) / nRate;
        }
        FXJSE_Value_SetDouble(args.GetReturnValue(), dResult);
      }
    }
    FXJSE_Value_Release(argOne);
    FXJSE_Value_Release(argTwo);
    FXJSE_Value_Release(argThree);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"FV");
  }
}
void CXFA_FM2JSContext::IPmt(FXJSE_HOBJECT hThis,
                             const CFX_ByteStringC& szFuncName,
                             CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  if (args.GetLength() == 5) {
    FX_BOOL bFlags = FALSE;
    FX_FLOAT nPrincpalAmount = 0;
    FX_FLOAT nRate = 0;
    FX_FLOAT nPayment = 0;
    FX_FLOAT nFirstMonth = 0;
    FX_FLOAT nNumberOfMonths = 0;
    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
    FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2);
    FXJSE_HVALUE argFour = GetSimpleHValue(hThis, args, 3);
    FXJSE_HVALUE argFive = GetSimpleHValue(hThis, args, 4);
    bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) ||
              HValueIsNull(hThis, argThree) || HValueIsNull(hThis, argFour) ||
              HValueIsNull(hThis, argFive));
    if (bFlags) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      nPrincpalAmount = HValueToFloat(hThis, argOne);
      nRate = HValueToFloat(hThis, argTwo);
      nPayment = HValueToFloat(hThis, argThree);
      nFirstMonth = HValueToFloat(hThis, argFour);
      nNumberOfMonths = HValueToFloat(hThis, argFive);
      bFlags = ((nPrincpalAmount <= 0) || (nRate <= 0) || (nPayment <= 0) ||
                (nFirstMonth < 0) || (nNumberOfMonths < 0));
      if (bFlags) {
        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
      } else {
        FX_FLOAT fResult = 0;
        FX_FLOAT nRateOfMonth = nRate / 12;
        int32_t iNums =
            (int32_t)((FXSYS_log10((FX_FLOAT)(nPayment / nPrincpalAmount)) -
                       FXSYS_log10((FX_FLOAT)(nPayment / nPrincpalAmount -
                                              nRateOfMonth))) /
                      FXSYS_log10((FX_FLOAT)(1 + nRateOfMonth)));
        int32_t iEnd = (int32_t)(nFirstMonth + nNumberOfMonths - 1);
        if (iEnd > iNums) {
          iEnd = iNums;
        }
        FX_FLOAT nSum = 0;
        if (nPayment < nPrincpalAmount * nRateOfMonth) {
          bFlags = TRUE;
          fResult = 0;
        }
        if (!bFlags) {
          int32_t i = 0;
          for (i = 0; i < nFirstMonth - 1; ++i) {
            nPrincpalAmount -= nPayment - nPrincpalAmount * nRateOfMonth;
          }
          for (; i < iEnd; ++i) {
            nSum += nPrincpalAmount * nRateOfMonth;
            nPrincpalAmount -= nPayment - nPrincpalAmount * nRateOfMonth;
          }
          fResult = nSum;
        }
        FXJSE_Value_SetFloat(args.GetReturnValue(), fResult);
      }
    }
    FXJSE_Value_Release(argOne);
    FXJSE_Value_Release(argTwo);
    FXJSE_Value_Release(argThree);
    FXJSE_Value_Release(argFour);
    FXJSE_Value_Release(argFive);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"IPmt");
  }
}
void CXFA_FM2JSContext::NPV(FXJSE_HOBJECT hThis,
                            const CFX_ByteStringC& szFuncName,
                            CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  int32_t argc = args.GetLength();
  if (argc > 2) {
    FX_BOOL bFlags = FALSE;
    FXJSE_HVALUE* argValues = FX_Alloc(FXJSE_HVALUE, argc);
    for (int32_t i = 0; i < argc; i++) {
      argValues[i] = GetSimpleHValue(hThis, args, i);
      if (HValueIsNull(hThis, argValues[i])) {
        bFlags = TRUE;
      }
    }
    if (!bFlags) {
      FX_DOUBLE nRate = 0;
      nRate = HValueToDouble(hThis, argValues[0]);
      if (nRate <= 0) {
        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
      } else {
        FX_DOUBLE* pData = FX_Alloc(FX_DOUBLE, argc - 1);
        for (int32_t i = 1; i < argc; i++) {
          pData[i - 1] = HValueToDouble(hThis, argValues[i]);
        }
        FX_DOUBLE nSum = 0;
        int32_t iIndex = 0;
        for (int32_t i = 0; i < argc - 1; i++) {
          FX_DOUBLE nTemp = 1;
          for (int32_t j = 0; j <= i; j++) {
            nTemp *= 1 + nRate;
          }
          FX_DOUBLE nNum = *(pData + iIndex++);
          nSum += nNum / nTemp;
        }
        FXJSE_Value_SetDouble(args.GetReturnValue(), nSum);
        FX_Free(pData);
        pData = 0;
      }
    } else {
      FXJSE_Value_SetNull(args.GetReturnValue());
    }
    for (int32_t i = 0; i < argc; i++) {
      FXJSE_Value_Release(argValues[i]);
    }
    FX_Free(argValues);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"NPV");
  }
}
void CXFA_FM2JSContext::Pmt(FXJSE_HOBJECT hThis,
                            const CFX_ByteStringC& szFuncName,
                            CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  if (args.GetLength() == 3) {
    FX_BOOL bFlags = FALSE;
    FX_FLOAT nPrincipal = 0;
    FX_FLOAT nRate = 0;
    FX_FLOAT nPeriods = 0;
    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
    FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2);
    bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) ||
              HValueIsNull(hThis, argThree));
    if (bFlags) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      nPrincipal = HValueToFloat(hThis, argOne);
      nRate = HValueToFloat(hThis, argTwo);
      nPeriods = HValueToFloat(hThis, argThree);
      bFlags = ((nPrincipal <= 0) || (nRate <= 0) || (nPeriods <= 0));
      if (bFlags) {
        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
      } else {
        FX_FLOAT nSum = 0;
        FX_FLOAT nTmp = 1 + nRate;
        nSum = nTmp;
        for (int32_t i = 0; i < nPeriods - 1; ++i) {
          nSum *= nTmp;
        }
        FXJSE_Value_SetFloat(args.GetReturnValue(),
                             (nPrincipal * nRate * nSum) / (nSum - 1));
      }
    }
    FXJSE_Value_Release(argOne);
    FXJSE_Value_Release(argTwo);
    FXJSE_Value_Release(argThree);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Pmt");
  }
}
void CXFA_FM2JSContext::PPmt(FXJSE_HOBJECT hThis,
                             const CFX_ByteStringC& szFuncName,
                             CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  if (args.GetLength() == 5) {
    FX_BOOL bFlags = FALSE;
    FX_FLOAT nPrincpalAmount = 0;
    FX_FLOAT nRate = 0;
    FX_FLOAT nPayment = 0;
    FX_FLOAT nFirstMonth = 0;
    FX_FLOAT nNumberOfMonths = 0;
    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
    FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2);
    FXJSE_HVALUE argFour = GetSimpleHValue(hThis, args, 3);
    FXJSE_HVALUE argFive = GetSimpleHValue(hThis, args, 4);
    bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) ||
              HValueIsNull(hThis, argThree) || HValueIsNull(hThis, argFour) ||
              HValueIsNull(hThis, argFive));
    if (bFlags) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      nPrincpalAmount = HValueToFloat(hThis, argOne);
      nRate = HValueToFloat(hThis, argTwo);
      nPayment = HValueToFloat(hThis, argThree);
      nFirstMonth = HValueToFloat(hThis, argFour);
      nNumberOfMonths = HValueToFloat(hThis, argFive);
      bFlags = ((nPrincpalAmount <= 0) || (nRate <= 0) || (nPayment <= 0) ||
                (nFirstMonth < 0) || (nNumberOfMonths < 0));
      if (bFlags) {
        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
      } else {
        int32_t iEnd = (int32_t)(nFirstMonth + nNumberOfMonths - 1);
        FX_FLOAT nSum = 0;
        FX_FLOAT nRateOfMonth = nRate / 12;
        int32_t iNums =
            (int32_t)((FXSYS_log10((FX_FLOAT)(nPayment / nPrincpalAmount)) -
                       FXSYS_log10((FX_FLOAT)(nPayment / nPrincpalAmount -
                                              nRateOfMonth))) /
                      FXSYS_log10((FX_FLOAT)(1 + nRateOfMonth)));
        if (iEnd > iNums) {
          iEnd = iNums;
        }
        if (nPayment < nPrincpalAmount * nRateOfMonth) {
          bFlags = TRUE;
        }
        if (!bFlags) {
          int32_t i = 0;
          for (i = 0; i < nFirstMonth - 1; ++i) {
            nPrincpalAmount -= nPayment - nPrincpalAmount * nRateOfMonth;
          }
          FX_FLOAT nTemp = 0;
          for (; i < iEnd; ++i) {
            nTemp = nPayment - nPrincpalAmount * nRateOfMonth;
            nSum += nTemp;
            nPrincpalAmount -= nTemp;
          }
          FXJSE_Value_SetFloat(args.GetReturnValue(), nSum);
        } else {
          pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
        }
      }
    }
    FXJSE_Value_Release(argOne);
    FXJSE_Value_Release(argTwo);
    FXJSE_Value_Release(argThree);
    FXJSE_Value_Release(argFour);
    FXJSE_Value_Release(argFive);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"PPmt");
  }
}
void CXFA_FM2JSContext::PV(FXJSE_HOBJECT hThis,
                           const CFX_ByteStringC& szFuncName,
                           CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  if (args.GetLength() == 3) {
    FX_BOOL bFlags = FALSE;
    FX_DOUBLE nAmount = 0;
    FX_DOUBLE nRate = 0;
    FX_DOUBLE nPeriod = 0;
    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
    FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2);
    bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) ||
              HValueIsNull(hThis, argThree));
    if (bFlags) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      nAmount = HValueToDouble(hThis, argOne);
      nRate = HValueToDouble(hThis, argTwo);
      nPeriod = HValueToDouble(hThis, argThree);
      bFlags = ((nAmount <= 0) || (nRate < 0) || (nPeriod <= 0));
      if (bFlags) {
        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
      } else {
        FX_DOUBLE nTemp = 1;
        for (int32_t i = 0; i < nPeriod; ++i) {
          nTemp *= 1 + nRate;
        }
        nTemp = 1 / nTemp;
        FXJSE_Value_SetDouble(args.GetReturnValue(),
                              nAmount * ((1 - nTemp) / nRate));
      }
    }
    FXJSE_Value_Release(argOne);
    FXJSE_Value_Release(argTwo);
    FXJSE_Value_Release(argThree);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"PV");
  }
}
void CXFA_FM2JSContext::Rate(FXJSE_HOBJECT hThis,
                             const CFX_ByteStringC& szFuncName,
                             CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  if (args.GetLength() == 3) {
    FX_BOOL bFlags = FALSE;
    FX_FLOAT nFuture = 0;
    FX_FLOAT nPresent = 0;
    FX_FLOAT nTotalNumber = 0;
    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
    FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2);
    bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) ||
              HValueIsNull(hThis, argThree));
    if (bFlags) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      nFuture = HValueToFloat(hThis, argOne);
      nPresent = HValueToFloat(hThis, argTwo);
      nTotalNumber = HValueToFloat(hThis, argThree);
      bFlags = ((nFuture <= 0) || (nPresent < 0) || (nTotalNumber <= 0));
      if (bFlags) {
        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
      } else {
        FXJSE_Value_SetFloat(args.GetReturnValue(),
                             (FXSYS_pow((FX_FLOAT)(nFuture / nPresent),
                                        (FX_FLOAT)(1 / nTotalNumber)) -
                              1));
      }
    }
    FXJSE_Value_Release(argOne);
    FXJSE_Value_Release(argTwo);
    FXJSE_Value_Release(argThree);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Rate");
  }
}
void CXFA_FM2JSContext::Term(FXJSE_HOBJECT hThis,
                             const CFX_ByteStringC& szFuncName,
                             CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  if (args.GetLength() == 3) {
    FX_BOOL bFlags = FALSE;
    FX_FLOAT nMount = 0;
    FX_FLOAT nRate = 0;
    FX_FLOAT nFuture = 0;
    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
    FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2);
    bFlags = (FXJSE_Value_IsNull(argOne) || FXJSE_Value_IsNull(argTwo) ||
              FXJSE_Value_IsNull(argThree));
    if (bFlags) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      nMount = HValueToFloat(hThis, argOne);
      nRate = HValueToFloat(hThis, argTwo);
      nFuture = HValueToFloat(hThis, argThree);
      bFlags = ((nMount <= 0) || (nRate <= 0) || (nFuture <= 0));
      if (bFlags) {
        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
      } else {
        FXJSE_Value_SetFloat(
            args.GetReturnValue(),
            (FXSYS_log((FX_FLOAT)(nFuture / nMount * nRate) + 1) /
             FXSYS_log((FX_FLOAT)(1 + nRate))));
      }
    }
    FXJSE_Value_Release(argOne);
    FXJSE_Value_Release(argTwo);
    FXJSE_Value_Release(argThree);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Term");
  }
}
void CXFA_FM2JSContext::Choose(FXJSE_HOBJECT hThis,
                               const CFX_ByteStringC& szFuncName,
                               CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
  int32_t argc = args.GetLength();
  if (argc > 1) {
    FXJSE_HVALUE argOne = args.GetValue(0);
    FX_BOOL argOneIsNull = FALSE;
    int32_t iIndex = 0;
    argOneIsNull = HValueIsNull(hThis, argOne);
    if (!argOneIsNull) {
      iIndex = (int32_t)HValueToFloat(hThis, argOne);
    }
    FXJSE_Value_Release(argOne);
    if (argOneIsNull) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else if (iIndex < 1) {
      FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
    } else {
      FX_BOOL bFound = FALSE;
      FX_BOOL bStopCounterFlags = FALSE;
      int32_t iArgIndex = 1;
      int32_t iValueIndex = 0;
      while (!bFound && !bStopCounterFlags && (iArgIndex < argc)) {
        FXJSE_HVALUE argIndexValue = args.GetValue(iArgIndex);
        if (FXJSE_Value_IsArray(argIndexValue)) {
          FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
          FXJSE_Value_GetObjectProp(argIndexValue, "length", lengthValue);
          int32_t iLength = FXJSE_Value_ToInteger(lengthValue);
          FXJSE_Value_Release(lengthValue);
          if (iLength > 3) {
            bStopCounterFlags = TRUE;
          }
          iValueIndex += (iLength - 2);
          if (iValueIndex >= iIndex) {
            FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
            FXJSE_HVALUE jsobjectValue = FXJSE_Value_Create(hruntime);
            FXJSE_HVALUE newProperty = FXJSE_Value_Create(hruntime);
            FXJSE_Value_GetObjectPropByIdx(argIndexValue, 1, propertyValue);
            FXJSE_Value_GetObjectPropByIdx(
                argIndexValue, ((iLength - 1) - (iValueIndex - iIndex)),
                jsobjectValue);
            if (FXJSE_Value_IsNull(propertyValue)) {
              GetObjectDefaultValue(jsobjectValue, newProperty);
            } else {
              CFX_ByteString propStr;
              FXJSE_Value_ToUTF8String(propertyValue, propStr);
              FXJSE_Value_GetObjectProp(jsobjectValue, propStr.AsStringC(),
                                        newProperty);
            }
            CFX_ByteString bsChoosed;
            HValueToUTF8String(newProperty, bsChoosed);
            FXJSE_Value_SetUTF8String(args.GetReturnValue(),
                                      bsChoosed.AsStringC());
            FXJSE_Value_Release(newProperty);
            FXJSE_Value_Release(jsobjectValue);
            FXJSE_Value_Release(propertyValue);
            bFound = TRUE;
          }
        } else {
          iValueIndex++;
          if (iValueIndex == iIndex) {
            CFX_ByteString bsChoosed;
            HValueToUTF8String(argIndexValue, bsChoosed);
            FXJSE_Value_SetUTF8String(args.GetReturnValue(),
                                      bsChoosed.AsStringC());
            bFound = TRUE;
          }
        }
        FXJSE_Value_Release(argIndexValue);
        iArgIndex++;
      }
      if (!bFound) {
        FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
      }
    }
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Choose");
  }
}
void CXFA_FM2JSContext::Exists(FXJSE_HOBJECT hThis,
                               const CFX_ByteStringC& szFuncName,
                               CFXJSE_Arguments& args) {
  if (args.GetLength() == 1) {
    FXJSE_HVALUE argOne = args.GetValue(0);
    FXJSE_Value_SetInteger(args.GetReturnValue(), FXJSE_Value_IsObject(argOne));
    FXJSE_Value_Release(argOne);
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Exists");
  }
}
void CXFA_FM2JSContext::HasValue(FXJSE_HOBJECT hThis,
                                 const CFX_ByteStringC& szFuncName,
                                 CFXJSE_Arguments& args) {
  if (args.GetLength() == 1) {
    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
    if (FXJSE_Value_IsUTF8String(argOne)) {
      CFX_ByteString valueStr;
      FXJSE_Value_ToUTF8String(argOne, valueStr);
      valueStr.TrimLeft();
      FXJSE_Value_SetInteger(args.GetReturnValue(), (!valueStr.IsEmpty()));
    } else if (FXJSE_Value_IsNumber(argOne) || FXJSE_Value_IsBoolean(argOne)) {
      FXJSE_Value_SetInteger(args.GetReturnValue(), TRUE);
    } else {
      FXJSE_Value_SetInteger(args.GetReturnValue(), FALSE);
    }
    FXJSE_Value_Release(argOne);
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"HasValue");
  }
}
void CXFA_FM2JSContext::Oneof(FXJSE_HOBJECT hThis,
                              const CFX_ByteStringC& szFuncName,
                              CFXJSE_Arguments& args) {
  int32_t argc = args.GetLength();
  if (argc > 1) {
    FX_BOOL bFlags = FALSE;
    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE* parametersValue = 0;
    int32_t iCount = 0;
    unfoldArgs(hThis, args, parametersValue, iCount, 1);
    for (int32_t i = 0; i < iCount; i++) {
      if (simpleValueCompare(hThis, argOne, parametersValue[i])) {
        bFlags = TRUE;
        break;
      }
    }
    FXJSE_Value_SetInteger(args.GetReturnValue(), bFlags);
    FXJSE_Value_Release(argOne);
    for (int32_t i = 0; i < iCount; i++) {
      FXJSE_Value_Release(parametersValue[i]);
    }
    FX_Free(parametersValue);
    parametersValue = 0;
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Oneof");
  }
}
void CXFA_FM2JSContext::Within(FXJSE_HOBJECT hThis,
                               const CFX_ByteStringC& szFuncName,
                               CFXJSE_Arguments& args) {
  int32_t argc = args.GetLength();
  if (argc == 3) {
    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
    if (FXJSE_Value_IsNull(argOne)) {
      FXJSE_Value_SetUndefined(args.GetReturnValue());
    } else {
      FXJSE_HVALUE argLow = GetSimpleHValue(hThis, args, 1);
      FXJSE_HVALUE argHeight = GetSimpleHValue(hThis, args, 2);
      if (FXJSE_Value_IsNumber(argOne)) {
        FX_FLOAT oneNumber = HValueToFloat(hThis, argOne);
        FX_FLOAT lowNumber = HValueToFloat(hThis, argLow);
        FX_FLOAT heightNumber = HValueToFloat(hThis, argHeight);
        FXJSE_Value_SetInteger(
            args.GetReturnValue(),
            ((oneNumber >= lowNumber) && (oneNumber <= heightNumber)));
      } else {
        CFX_ByteString oneString;
        CFX_ByteString lowString;
        CFX_ByteString heightString;
        HValueToUTF8String(argOne, oneString);
        HValueToUTF8String(argLow, lowString);
        HValueToUTF8String(argHeight, heightString);
        FXJSE_Value_SetInteger(
            args.GetReturnValue(),
            ((oneString.Compare(lowString.AsStringC()) >= 0) &&
             (oneString.Compare(heightString.AsStringC()) <= 0)));
      }
      FXJSE_Value_Release(argLow);
      FXJSE_Value_Release(argHeight);
    }
    FXJSE_Value_Release(argOne);
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Within");
  }
}
void CXFA_FM2JSContext::If(FXJSE_HOBJECT hThis,
                           const CFX_ByteStringC& szFuncName,
                           CFXJSE_Arguments& args) {
  if (args.GetLength() == 3) {
    FXJSE_HVALUE argCondition = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE argFirstValue = GetSimpleHValue(hThis, args, 1);
    FXJSE_HVALUE argSecondValue = GetSimpleHValue(hThis, args, 2);
    FX_BOOL bCondition = FXJSE_Value_ToBoolean(argCondition);
    FXJSE_Value_Set(args.GetReturnValue(),
                    bCondition ? argFirstValue : argSecondValue);
    FXJSE_Value_Release(argSecondValue);
    FXJSE_Value_Release(argFirstValue);
    FXJSE_Value_Release(argCondition);
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"If");
  }
}
void CXFA_FM2JSContext::Eval(FXJSE_HOBJECT hThis,
                             const CFX_ByteStringC& szFuncName,
                             CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
  if (args.GetLength() == 1) {
    FXJSE_HVALUE scriptValue = GetSimpleHValue(hThis, args, 0);
    CFX_ByteString utf8ScriptString;
    HValueToUTF8String(scriptValue, utf8ScriptString);
    if (utf8ScriptString.IsEmpty()) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      CFX_WideTextBuf wsJavaScriptBuf;
      CFX_WideString javaScript;
      CFX_WideString wsError;
      XFA_FM2JS_Translate(
          CFX_WideString::FromUTF8(utf8ScriptString.AsStringC()).AsStringC(),
          wsJavaScriptBuf, wsError);
      FXJSE_HCONTEXT hContext = FXJSE_Context_Create(hruntime);
      FXJSE_HVALUE returnValue = FXJSE_Value_Create(hruntime);
      javaScript = wsJavaScriptBuf.AsStringC();
      FXJSE_ExecuteScript(
          hContext,
          FX_UTF8Encode(javaScript.c_str(), javaScript.GetLength()).c_str(),
          returnValue);
      FXJSE_Value_Set(args.GetReturnValue(), returnValue);
      FXJSE_Value_Release(returnValue);
      FXJSE_Context_Release(hContext);
    }
    FXJSE_Value_Release(scriptValue);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Eval");
  }
}
void CXFA_FM2JSContext::Ref(FXJSE_HOBJECT hThis,
                            const CFX_ByteStringC& szFuncName,
                            CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
  if (args.GetLength() == 1) {
    FXJSE_HVALUE argOne = args.GetValue(0);
    if (FXJSE_Value_IsNull(argOne)) {
      FXJSE_HVALUE rgValues[3];
      for (int32_t i = 0; i < 3; i++) {
        rgValues[i] = FXJSE_Value_Create(hruntime);
      }
      FXJSE_Value_SetInteger(rgValues[0], 4);
      FXJSE_Value_SetNull(rgValues[1]);
      FXJSE_Value_SetNull(rgValues[2]);
      FXJSE_Value_SetArray(args.GetReturnValue(), 3, rgValues);
      for (int32_t i = 0; i < 3; i++) {
        FXJSE_Value_Release(rgValues[i]);
      }
    } else if (FXJSE_Value_IsArray(argOne)) {
#ifndef NDEBUG
      FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
      FXJSE_Value_GetObjectProp(argOne, "length", lengthValue);
      FXSYS_assert(FXJSE_Value_ToInteger(lengthValue) >= 3);
      FXJSE_Value_Release(lengthValue);
#endif
      FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
      FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
      FXJSE_Value_GetObjectPropByIdx(argOne, 1, propertyValue);
      FXJSE_Value_GetObjectPropByIdx(argOne, 2, jsObjectValue);
      if (FXJSE_Value_IsNull(jsObjectValue)) {
        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
      } else if (FXJSE_Value_IsNull(propertyValue) &&
                 (!FXJSE_Value_IsNull(jsObjectValue))) {
        FXJSE_HVALUE rgValues[3];
        for (int32_t i = 0; i < 3; i++) {
          rgValues[i] = FXJSE_Value_Create(hruntime);
        }
        FXJSE_Value_SetInteger(rgValues[0], 3);
        FXJSE_Value_SetNull(rgValues[1]);
        FXJSE_Value_Set(rgValues[2], jsObjectValue);
        FXJSE_Value_SetArray(args.GetReturnValue(), 3, rgValues);
        for (int32_t i = 0; i < 3; i++) {
          FXJSE_Value_Release(rgValues[i]);
        }
      } else {
        pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
      }
      FXJSE_Value_Release(jsObjectValue);
      FXJSE_Value_Release(propertyValue);
    } else if (FXJSE_Value_IsObject(argOne)) {
      FXJSE_HVALUE rgValues[3];
      for (int32_t i = 0; i < 3; i++) {
        rgValues[i] = FXJSE_Value_Create(hruntime);
      }
      FXJSE_Value_SetInteger(rgValues[0], 3);
      FXJSE_Value_SetNull(rgValues[1]);
      FXJSE_Value_Set(rgValues[2], argOne);
      FXJSE_Value_SetArray(args.GetReturnValue(), 3, rgValues);
      for (int32_t i = 0; i < 3; i++) {
        FXJSE_Value_Release(rgValues[i]);
      }
    } else if (FXJSE_Value_IsBoolean(argOne) ||
               FXJSE_Value_IsUTF8String(argOne) ||
               FXJSE_Value_IsNumber(argOne)) {
      FXJSE_Value_Set(args.GetReturnValue(), argOne);
    } else {
      pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
    }
    FXJSE_Value_Release(argOne);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Ref");
  }
}
void CXFA_FM2JSContext::UnitType(FXJSE_HOBJECT hThis,
                                 const CFX_ByteStringC& szFuncName,
                                 CFXJSE_Arguments& args) {
  if (args.GetLength() == 1) {
    FXJSE_HVALUE unitspanValue = GetSimpleHValue(hThis, args, 0);
    if (FXJSE_Value_IsNull(unitspanValue)) {
      FXJSE_Value_SetNull(args.GetReturnValue());
      FXJSE_Value_Release(unitspanValue);
      return;
    }
    CFX_ByteString unitspanString;
    HValueToUTF8String(unitspanValue, unitspanString);
    if (unitspanString.IsEmpty()) {
      FXJSE_Value_SetUTF8String(args.GetReturnValue(), "in");
    } else {
      enum XFA_FM2JS_VALUETYPE_ParserStatus {
        VALUETYPE_START,
        VALUETYPE_HAVEINVALIDCHAR,
        VALUETYPE_HAVEDIGIT,
        VALUETYPE_HAVEDIGITWHITE,
        VALUETYPE_ISCM,
        VALUETYPE_ISMM,
        VALUETYPE_ISPT,
        VALUETYPE_ISMP,
        VALUETYPE_ISIN,
      };
      unitspanString.MakeLower();
      CFX_WideString wsTypeString =
          CFX_WideString::FromUTF8(unitspanString.AsStringC());
      const FX_WCHAR* pData = wsTypeString.c_str();
      int32_t u = 0;
      int32_t uLen = wsTypeString.GetLength();
      while (*(pData + u) == 0x20 || *(pData + u) == 0x09 ||
             *(pData + u) == 0x0B || *(pData + u) == 0x0C ||
             *(pData + u) == 0x0A || *(pData + u) == 0x0D) {
        u++;
      }
      XFA_FM2JS_VALUETYPE_ParserStatus eParserStatus = VALUETYPE_START;
      FX_WCHAR typeChar;
      while (u < uLen) {
        typeChar = *(pData + u);
        if (typeChar == 0x20 || typeChar == 0x09 || typeChar == 0x0B ||
            typeChar == 0x0C || typeChar == 0x0A || typeChar == 0x0D) {
          if (eParserStatus == VALUETYPE_HAVEDIGIT ||
              eParserStatus == VALUETYPE_HAVEDIGITWHITE) {
            eParserStatus = VALUETYPE_HAVEDIGITWHITE;
          } else {
            eParserStatus = VALUETYPE_ISIN;
            break;
          }
        } else if ((typeChar >= '0' && typeChar <= '9') || typeChar == '-' ||
                   typeChar == '.') {
          if (eParserStatus == VALUETYPE_HAVEDIGITWHITE) {
            eParserStatus = VALUETYPE_ISIN;
            break;
          } else {
            eParserStatus = VALUETYPE_HAVEDIGIT;
          }
        } else if ((typeChar == 'c' || typeChar == 'p') && (u + 1 < uLen)) {
          FX_WCHAR nextChar = *(pData + u + 1);
          if ((eParserStatus == VALUETYPE_START ||
               eParserStatus == VALUETYPE_HAVEDIGIT ||
               eParserStatus == VALUETYPE_HAVEDIGITWHITE) &&
              (nextChar > '9' || nextChar < '0') && nextChar != '.' &&
              nextChar != '-') {
            eParserStatus = (typeChar == 'c') ? VALUETYPE_ISCM : VALUETYPE_ISPT;
            break;
          } else {
            eParserStatus = VALUETYPE_HAVEINVALIDCHAR;
          }
        } else if (typeChar == 'm' && (u + 1 < uLen)) {
          FX_WCHAR nextChar = *(pData + u + 1);
          if ((eParserStatus == VALUETYPE_START ||
               eParserStatus == VALUETYPE_HAVEDIGIT ||
               eParserStatus == VALUETYPE_HAVEDIGITWHITE) &&
              (nextChar > '9' || nextChar < '0') && nextChar != '.' &&
              nextChar != '-') {
            eParserStatus = VALUETYPE_ISMM;
            if (nextChar == 'p' ||
                ((u + 5 < uLen) && *(pData + u + 1) == 'i' &&
                 *(pData + u + 2) == 'l' && *(pData + u + 3) == 'l' &&
                 *(pData + u + 4) == 'i' && *(pData + u + 5) == 'p')) {
              eParserStatus = VALUETYPE_ISMP;
            }
            break;
          }
        } else {
          eParserStatus = VALUETYPE_HAVEINVALIDCHAR;
        }
        u++;
      }
      switch (eParserStatus) {
        case VALUETYPE_ISCM:
          FXJSE_Value_SetUTF8String(args.GetReturnValue(), "cm");
          break;
        case VALUETYPE_ISMM:
          FXJSE_Value_SetUTF8String(args.GetReturnValue(), "mm");
          break;
        case VALUETYPE_ISPT:
          FXJSE_Value_SetUTF8String(args.GetReturnValue(), "pt");
          break;
        case VALUETYPE_ISMP:
          FXJSE_Value_SetUTF8String(args.GetReturnValue(), "mp");
          break;
        default:
          FXJSE_Value_SetUTF8String(args.GetReturnValue(), "in");
          break;
      }
    }
    FXJSE_Value_Release(unitspanValue);
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"UnitType");
  }
}
void CXFA_FM2JSContext::UnitValue(FXJSE_HOBJECT hThis,
                                  const CFX_ByteStringC& szFuncName,
                                  CFXJSE_Arguments& args) {
  int32_t argc = args.GetLength();
  if ((argc == 1) || (argc == 2)) {
    FXJSE_HVALUE unitspanValue = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE unitValue = 0;
    CFX_ByteString unitspanString;
    FX_DOUBLE dFirstNumber = 0;
    CFX_ByteString strFirstUnit;
    CFX_ByteString strUnit;
    if (FXJSE_Value_IsNull(unitspanValue)) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      HValueToUTF8String(unitspanValue, unitspanString);
      const FX_CHAR* pData = unitspanString.c_str();
      if (pData) {
        int32_t u = 0;
        while (*(pData + u) == 0x20 || *(pData + u) == 0x09 ||
               *(pData + u) == 0x0B || *(pData + u) == 0x0C ||
               *(pData + u) == 0x0A || *(pData + u) == 0x0D) {
          ++u;
        }
        while (u < unitspanString.GetLength()) {
          if ((*(pData + u) > '9' || *(pData + u) < '0') &&
              *(pData + u) != '.' && *(pData + u) != '-') {
            break;
          }
          ++u;
        }
        FX_CHAR* pTemp = NULL;
        dFirstNumber = strtod(pData, &pTemp);
        while (*(pData + u) == ' ' || *(pData + u) == 0x09 ||
               *(pData + u) == 0x0B || *(pData + u) == 0x0C ||
               *(pData + u) == 0x0A || *(pData + u) == 0x0D) {
          ++u;
        }
        int32_t uLen = unitspanString.GetLength();
        while (u < uLen) {
          if (*(pData + u) == ' ') {
            break;
          }
          strFirstUnit += (*(pData + u));
          ++u;
        }
        strFirstUnit.MakeLower();
        if (argc == 2) {
          unitValue = GetSimpleHValue(hThis, args, 1);
          CFX_ByteString unitTempString;
          HValueToUTF8String(unitValue, unitTempString);
          const FX_CHAR* pData = unitTempString.c_str();
          int32_t u = 0;
          while (*(pData + u) == ' ' || *(pData + u) == 0x09 ||
                 *(pData + u) == 0x0B || *(pData + u) == 0x0C ||
                 *(pData + u) == 0x0A || *(pData + u) == 0x0D) {
            ++u;
          }
          while (u < unitTempString.GetLength()) {
            if ((*(pData + u) > '9' || *(pData + u) < '0') &&
                *(pData + u) != '.') {
              break;
            }
            ++u;
          }
          while (*(pData + u) == ' ' || *(pData + u) == 0x09 ||
                 *(pData + u) == 0x0B || *(pData + u) == 0x0C ||
                 *(pData + u) == 0x0A || *(pData + u) == 0x0D) {
            ++u;
          }
          int32_t uLen = unitTempString.GetLength();
          while (u < uLen) {
            if (*(pData + u) == ' ') {
              break;
            }
            strUnit += (*(pData + u));
            ++u;
          }
          strUnit.MakeLower();
        } else {
          strUnit = strFirstUnit;
        }
        FX_DOUBLE dResult = 0;
        if (strFirstUnit == "in" || strFirstUnit == "inches") {
          if (strUnit == "mm" || strUnit == "millimeters") {
            dResult = dFirstNumber * 25.4;
          } else if (strUnit == "cm" || strUnit == "centimeters") {
            dResult = dFirstNumber * 2.54;
          } else if (strUnit == "pt" || strUnit == "points") {
            dResult = dFirstNumber / 72;
          } else if (strUnit == "mp" || strUnit == "millipoints") {
            dResult = dFirstNumber / 72000;
          } else {
            dResult = dFirstNumber;
          }
        } else if (strFirstUnit == "mm" || strFirstUnit == "millimeters") {
          if (strUnit == "mm" || strUnit == "millimeters") {
            dResult = dFirstNumber;
          } else if (strUnit == "cm" || strUnit == "centimeters") {
            dResult = dFirstNumber / 10;
          } else if (strUnit == "pt" || strUnit == "points") {
            dResult = dFirstNumber / 25.4 / 72;
          } else if (strUnit == "mp" || strUnit == "millipoints") {
            dResult = dFirstNumber / 25.4 / 72000;
          } else {
            dResult = dFirstNumber / 25.4;
          }
        } else if (strFirstUnit == "cm" || strFirstUnit == "centimeters") {
          if (strUnit == "mm" || strUnit == "millimeters") {
            dResult = dFirstNumber * 10;
          } else if (strUnit == "cm" || strUnit == "centimeters") {
            dResult = dFirstNumber;
          } else if (strUnit == "pt" || strUnit == "points") {
            dResult = dFirstNumber / 2.54 / 72;
          } else if (strUnit == "mp" || strUnit == "millipoints") {
            dResult = dFirstNumber / 2.54 / 72000;
          } else {
            dResult = dFirstNumber / 2.54;
          }
        } else if (strFirstUnit == "pt" || strFirstUnit == "points") {
          if (strUnit == "mm" || strUnit == "millimeters") {
            dResult = dFirstNumber / 72 * 25.4;
          } else if (strUnit == "cm" || strUnit == "centimeters") {
            dResult = dFirstNumber / 72 * 2.54;
          } else if (strUnit == "pt" || strUnit == "points") {
            dResult = dFirstNumber;
          } else if (strUnit == "mp" || strUnit == "millipoints") {
            dResult = dFirstNumber * 1000;
          } else {
            dResult = dFirstNumber / 72;
          }
        } else if (strFirstUnit == "mp" || strFirstUnit == "millipoints") {
          if (strUnit == "mm" || strUnit == "millimeters") {
            dResult = dFirstNumber / 72000 * 25.4;
          } else if (strUnit == "cm" || strUnit == "centimeters") {
            dResult = dFirstNumber / 72000 * 2.54;
          } else if (strUnit == "pt" || strUnit == "points") {
            dResult = dFirstNumber / 1000;
          } else if (strUnit == "mp" || strUnit == "millipoints") {
            dResult = dFirstNumber;
          } else {
            dResult = dFirstNumber / 72000;
          }
        }
        FXJSE_Value_SetDouble(args.GetReturnValue(), dResult);
      } else {
        FXJSE_Value_SetInteger(args.GetReturnValue(), 0);
      }
    }
    FXJSE_Value_Release(unitspanValue);
    if (argc == 2) {
      FXJSE_Value_Release(unitValue);
    }
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"UnitValue");
  }
}
void CXFA_FM2JSContext::At(FXJSE_HOBJECT hThis,
                           const CFX_ByteStringC& szFuncName,
                           CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  if (args.GetLength() == 2) {
    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
    if (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo)) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      CFX_ByteString stringTwo;
      HValueToUTF8String(argTwo, stringTwo);
      if (stringTwo.IsEmpty()) {
        FXJSE_Value_SetInteger(args.GetReturnValue(), 1);
      } else {
        CFX_ByteString stringOne;
        HValueToUTF8String(argOne, stringOne);
        FX_STRSIZE iPosition = stringOne.Find(stringTwo.AsStringC());
        FXJSE_Value_SetInteger(args.GetReturnValue(), iPosition + 1);
      }
    }
    FXJSE_Value_Release(argOne);
    FXJSE_Value_Release(argTwo);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"At");
  }
}
void CXFA_FM2JSContext::Concat(FXJSE_HOBJECT hThis,
                               const CFX_ByteStringC& szFuncName,
                               CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  int32_t argc = args.GetLength();
  if (argc >= 1) {
    CFX_ByteString resultString;
    FX_BOOL bAllNull = TRUE;
    FXJSE_HVALUE* argValues = FX_Alloc(FXJSE_HVALUE, argc);
    for (int32_t i = 0; i < argc; i++) {
      argValues[i] = GetSimpleHValue(hThis, args, i);
      if (!HValueIsNull(hThis, argValues[i])) {
        CFX_ByteString valueStr;
        HValueToUTF8String(argValues[i], valueStr);
        resultString += valueStr;
        bAllNull = FALSE;
      }
    }
    for (int32_t i = 0; i < argc; i++) {
      FXJSE_Value_Release(argValues[i]);
    }
    FX_Free(argValues);
    if (bAllNull) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      FXJSE_Value_SetUTF8String(args.GetReturnValue(),
                                resultString.AsStringC());
    }
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Concat");
  }
}
void CXFA_FM2JSContext::Decode(FXJSE_HOBJECT hThis,
                               const CFX_ByteStringC& szFuncName,
                               CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  int32_t argc = args.GetLength();
  if (argc == 1) {
    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
    if (HValueIsNull(hThis, argOne)) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      CFX_ByteString toDecodeString;
      HValueToUTF8String(argOne, toDecodeString);
      CFX_ByteTextBuf resultBuf;
      DecodeURL(toDecodeString.AsStringC(), resultBuf);
      FXJSE_Value_SetUTF8String(args.GetReturnValue(), resultBuf.AsStringC());
    }
    FXJSE_Value_Release(argOne);
  } else if (argc == 2) {
    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
    if (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo)) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      CFX_ByteString toDecodeString;
      HValueToUTF8String(argOne, toDecodeString);
      CFX_ByteString identifyString;
      HValueToUTF8String(argTwo, identifyString);
      CFX_ByteTextBuf resultBuf;
      if (identifyString.EqualNoCase("html")) {
        DecodeHTML(toDecodeString.AsStringC(), resultBuf);
      } else if (identifyString.EqualNoCase("xml")) {
        DecodeXML(toDecodeString.AsStringC(), resultBuf);
      } else {
        DecodeURL(toDecodeString.AsStringC(), resultBuf);
      }
      FXJSE_Value_SetUTF8String(args.GetReturnValue(), resultBuf.AsStringC());
    }
    FXJSE_Value_Release(argOne);
    FXJSE_Value_Release(argTwo);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Decode");
  }
}
void CXFA_FM2JSContext::DecodeURL(const CFX_ByteStringC& szURLString,
                                  CFX_ByteTextBuf& szResultString) {
  CFX_WideString wsURLString = CFX_WideString::FromUTF8(szURLString);
  const FX_WCHAR* pData = wsURLString.c_str();
  int32_t iLen = wsURLString.GetLength();
  int32_t i = 0;
  FX_WCHAR ch = 0;
  FX_WCHAR chTemp = 0;
  CFX_WideTextBuf wsResultBuf;
  while (i < iLen) {
    ch = *(pData + i);
    if ('%' == ch) {
      chTemp = 0;
      int32_t iCount = 0;
      while (iCount < 2) {
        ++i;
        ch = *(pData + i);
        if (ch <= '9' && ch >= '0') {
          if (!iCount) {
            chTemp += (ch - '0') * 16;
          } else {
            chTemp += (ch - '0');
          }
        } else {
          if (ch <= 'F' && ch >= 'A') {
            if (!iCount) {
              chTemp += (ch - 'A' + 10) * 16;
            } else {
              chTemp += (ch - 'A' + 10);
            }
          } else if (ch <= 'f' && ch >= 'a') {
            if (!iCount) {
              chTemp += (ch - 'a' + 10) * 16;
            } else {
              chTemp += (ch - 'a' + 10);
            }
          } else {
            wsResultBuf.Clear();
            return;
          }
        }
        ++iCount;
      }
      wsResultBuf.AppendChar(chTemp);
    } else {
      wsResultBuf.AppendChar(ch);
    }
    ++i;
  }
  wsResultBuf.AppendChar(0);
  szResultString.Clear();
  szResultString << FX_UTF8Encode(wsResultBuf.GetBuffer(),
                                  wsResultBuf.GetLength())
                        .AsStringC();
}
void CXFA_FM2JSContext::DecodeHTML(const CFX_ByteStringC& szHTMLString,
                                   CFX_ByteTextBuf& szResultString) {
  CFX_WideString wsHTMLString = CFX_WideString::FromUTF8(szHTMLString);
  FX_WCHAR strString[9];
  int32_t iStrIndex = 0;
  int32_t iLen = wsHTMLString.GetLength();
  int32_t i = 0;
  int32_t iCode = 0;
  FX_WCHAR ch = 0;
  const FX_WCHAR* pData = wsHTMLString.c_str();
  CFX_WideTextBuf wsResultBuf;
  while (i < iLen) {
    ch = *(pData + i);
    if (ch == '&') {
      ++i;
      ch = *(pData + i);
      if (ch == '#') {
        ++i;
        ch = *(pData + i);
        if (ch == 'x' || ch == 'X') {
          ++i;
          ch = *(pData + i);
          if ((ch >= '0' && ch <= '9') || (ch <= 'f' && ch >= 'a') ||
              (ch <= 'F' && ch >= 'A')) {
            while (ch != ';' && i < iLen) {
              if (ch >= '0' && ch <= '9') {
                iCode += ch - '0';
              } else if (ch <= 'f' && ch >= 'a') {
                iCode += ch - 'a' + 10;
              } else if (ch <= 'F' && ch >= 'A') {
                iCode += ch - 'A' + 10;
              } else {
                wsResultBuf.Clear();
                return;
              }
              ++i;
              iCode *= 16;
              ch = *(pData + i);
            }
            iCode /= 16;
          }
        } else {
          wsResultBuf.Clear();
          return;
        }
      } else {
        while (ch != ';' && i < iLen) {
          strString[iStrIndex++] = ch;
          ++i;
          ch = *(pData + i);
        }
        strString[iStrIndex] = 0;
      }
    } else {
      wsResultBuf.AppendChar(ch);
      ++i;
      continue;
    }
    uint32_t iData = 0;
    if (HTMLSTR2Code(strString, iData)) {
      wsResultBuf.AppendChar((FX_WCHAR)iData);
    } else {
      wsResultBuf.AppendChar(iCode);
    }
    iStrIndex = 0;
    strString[iStrIndex] = 0;
    ++i;
  }
  wsResultBuf.AppendChar(0);
  szResultString.Clear();
  szResultString << FX_UTF8Encode(wsResultBuf.GetBuffer(),
                                  wsResultBuf.GetLength())
                        .AsStringC();
}
void CXFA_FM2JSContext::DecodeXML(const CFX_ByteStringC& szXMLString,
                                  CFX_ByteTextBuf& szResultString) {
  CFX_WideString wsXMLString = CFX_WideString::FromUTF8(szXMLString);
  FX_WCHAR strString[9];
  int32_t iStrIndex = 0;
  int32_t iLen = wsXMLString.GetLength();
  int32_t i = 0;
  int32_t iCode = 0;
  FX_WCHAR ch = 0;
  const FX_WCHAR* pData = wsXMLString.c_str();
  CFX_WideTextBuf wsXMLBuf;
  while (i < iLen) {
    ch = *(pData + i);
    if (ch == '&') {
      ++i;
      ch = *(pData + i);
      if (ch == '#') {
        ++i;
        ch = *(pData + i);
        if (ch == 'x' || ch == 'X') {
          ++i;
          ch = *(pData + i);
          if ((ch >= '0' && ch <= '9') || (ch <= 'f' && ch >= 'a') ||
              (ch <= 'F' && ch >= 'A')) {
            while (ch != ';') {
              if (ch >= '0' && ch <= '9') {
                iCode += ch - '0';
              } else if (ch <= 'f' && ch >= 'a') {
                iCode += ch - 'a' + 10;
              } else if (ch <= 'F' && ch >= 'A') {
                iCode += ch - 'A' + 10;
              } else {
                wsXMLBuf.Clear();
                return;
              }
              ++i;
              iCode *= 16;
              ch = *(pData + i);
            }
            iCode /= 16;
          }
        } else {
          wsXMLBuf.Clear();
          return;
        }
      } else {
        while (ch != ';' && i < iLen) {
          strString[iStrIndex++] = ch;
          ++i;
          ch = *(pData + i);
        }
        strString[iStrIndex] = 0;
      }
    } else {
      wsXMLBuf.AppendChar(ch);
      ++i;
      continue;
    }
    const FX_WCHAR* const strName[] = {L"quot", L"amp", L"apos", L"lt", L"gt"};
    int32_t iIndex = 0;
    while (iIndex < 5) {
      if (FXSYS_memcmp(strString, strName[iIndex],
                       FXSYS_wcslen(strName[iIndex])) == 0) {
        break;
      }
      ++iIndex;
    }
    switch (iIndex) {
      case 0:
        wsXMLBuf.AppendChar('"');
        break;
      case 1:
        wsXMLBuf.AppendChar('&');
        break;
      case 2:
        wsXMLBuf.AppendChar('\'');
        break;
      case 3:
        wsXMLBuf.AppendChar('<');
        break;
      case 4:
        wsXMLBuf.AppendChar('>');
        break;
      default:
        wsXMLBuf.AppendChar(iCode);
        break;
    }
    iStrIndex = 0;
    strString[iStrIndex] = 0;
    ++i;
    iCode = 0;
  }
  wsXMLBuf.AppendChar(0);
  szResultString.Clear();
  szResultString << FX_UTF8Encode(wsXMLBuf.GetBuffer(), wsXMLBuf.GetLength())
                        .AsStringC();
}
void CXFA_FM2JSContext::Encode(FXJSE_HOBJECT hThis,
                               const CFX_ByteStringC& szFuncName,
                               CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  int32_t argc = args.GetLength();
  if (argc == 1) {
    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
    if (HValueIsNull(hThis, argOne)) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      CFX_ByteString toEncodeString;
      HValueToUTF8String(argOne, toEncodeString);
      CFX_ByteTextBuf resultBuf;
      EncodeURL(toEncodeString.AsStringC(), resultBuf);
      FXJSE_Value_SetUTF8String(args.GetReturnValue(), resultBuf.AsStringC());
    }
    FXJSE_Value_Release(argOne);
  } else if (argc == 2) {
    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
    if (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo)) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      CFX_ByteString toEncodeString;
      HValueToUTF8String(argOne, toEncodeString);
      CFX_ByteString identifyString;
      HValueToUTF8String(argTwo, identifyString);
      CFX_ByteTextBuf resultBuf;
      if (identifyString.EqualNoCase("html")) {
        EncodeHTML(toEncodeString.AsStringC(), resultBuf);
      } else if (identifyString.EqualNoCase("xml")) {
        EncodeXML(toEncodeString.AsStringC(), resultBuf);
      } else {
        EncodeURL(toEncodeString.AsStringC(), resultBuf);
      }
      FXJSE_Value_SetUTF8String(args.GetReturnValue(), resultBuf.AsStringC());
    }
    FXJSE_Value_Release(argOne);
    FXJSE_Value_Release(argTwo);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Encode");
  }
}
void CXFA_FM2JSContext::EncodeURL(const CFX_ByteStringC& szURLString,
                                  CFX_ByteTextBuf& szResultBuf) {
  CFX_WideString wsURLString = CFX_WideString::FromUTF8(szURLString);
  CFX_WideTextBuf wsResultBuf;
  FX_WCHAR ch = 0;
  int32_t iLength = wsURLString.GetLength();
  FX_WCHAR strEncode[4];
  strEncode[0] = '%';
  strEncode[3] = 0;
  FX_WCHAR strUnsafe[] = {' ', '<',  '>', '"', '#', '%', '{', '}',
                          '|', '\\', '^', '~', '[', ']', '`'};
  FX_WCHAR strReserved[] = {';', '/', '?', ':', '@', '=', '&'};
  FX_WCHAR strSpecial[] = {'$', '-', '+', '!', '*', '\'', '(', ')', ','};
  const FX_WCHAR* strCode = L"0123456789abcdef";
  for (int32_t u = 0; u < iLength; ++u) {
    ch = wsURLString.GetAt(u);
    int32_t i = 0;
    int32_t iCount = sizeof(strUnsafe) / sizeof(strUnsafe[0]);
    while (i < iCount) {
      if (ch == strUnsafe[i]) {
        int32_t iIndex = ch / 16;
        strEncode[1] = strCode[iIndex];
        strEncode[2] = strCode[ch - iIndex * 16];
        wsResultBuf << FX_WSTRC(strEncode);
        break;
      }
      ++i;
    }
    if (i < iCount) {
      continue;
    }
    i = 0;
    iCount = sizeof(strReserved) / sizeof(strReserved[0]);
    while (i < iCount) {
      if (ch == strReserved[i]) {
        int32_t iIndex = ch / 16;
        strEncode[1] = strCode[iIndex];
        strEncode[2] = strCode[ch - iIndex * 16];
        wsResultBuf << FX_WSTRC(strEncode);
        break;
      }
      ++i;
    }
    if (i < iCount) {
      continue;
    }
    i = 0;
    iCount = sizeof(strSpecial) / sizeof(strSpecial[0]);
    while (i < iCount) {
      if (ch == strSpecial[i]) {
        wsResultBuf.AppendChar(ch);
        break;
      }
      ++i;
    }
    if (i < iCount) {
      continue;
    }
    if (ch >= 0x80 && ch <= 0xff) {
      int32_t iIndex = ch / 16;
      strEncode[1] = strCode[iIndex];
      strEncode[2] = strCode[ch - iIndex * 16];
      wsResultBuf << FX_WSTRC(strEncode);
    } else if (ch <= 0x1f || ch == 0x7f) {
      int32_t iIndex = ch / 16;
      strEncode[1] = strCode[iIndex];
      strEncode[2] = strCode[ch - iIndex * 16];
      wsResultBuf << FX_WSTRC(strEncode);
    } else if (ch >= 0x20 && ch <= 0x7e) {
      wsResultBuf.AppendChar(ch);
    } else {
      int32_t iRadix = 16;
      CFX_WideString strTmp;
      while (ch >= iRadix) {
        FX_WCHAR tmp = strCode[ch % iRadix];
        ch /= iRadix;
        strTmp += tmp;
      }
      strTmp += strCode[ch];
      int32_t iLen = strTmp.GetLength();
      if (iLen < 2) {
        break;
      }
      int32_t iIndex = 0;
      if (iLen % 2 != 0) {
        strEncode[1] = '0';
        strEncode[2] = strTmp.GetAt(iLen - 1);
        iIndex = iLen - 2;
      } else {
        strEncode[1] = strTmp.GetAt(iLen - 1);
        strEncode[2] = strTmp.GetAt(iLen - 2);
        iIndex = iLen - 3;
      }
      wsResultBuf << FX_WSTRC(strEncode);
      while (iIndex > 0) {
        strEncode[1] = strTmp.GetAt(iIndex);
        strEncode[2] = strTmp.GetAt(iIndex - 1);
        iIndex -= 2;
        wsResultBuf << FX_WSTRC(strEncode);
      }
    }
  }
  wsResultBuf.AppendChar(0);
  szResultBuf.Clear();
  szResultBuf << FX_UTF8Encode(wsResultBuf.GetBuffer(), wsResultBuf.GetLength())
                     .AsStringC();
}
void CXFA_FM2JSContext::EncodeHTML(const CFX_ByteStringC& szHTMLString,
                                   CFX_ByteTextBuf& szResultBuf) {
  CFX_ByteString str = szHTMLString.c_str();
  CFX_WideString wsHTMLString = CFX_WideString::FromUTF8(str.AsStringC());
  const FX_WCHAR* strCode = L"0123456789abcdef";
  FX_WCHAR strEncode[9];
  strEncode[0] = '&';
  strEncode[1] = '#';
  strEncode[2] = 'x';
  strEncode[5] = ';';
  strEncode[6] = 0;
  strEncode[7] = ';';
  strEncode[8] = 0;
  CFX_WideTextBuf wsResultBuf;
  uint32_t ch = 0;
  int32_t iLen = wsHTMLString.GetLength();
  int32_t i = 0;
  const FX_WCHAR* pData = wsHTMLString.c_str();
  int32_t iIndex = 0;
  CFX_WideString htmlReserve;
  while (i < iLen) {
    ch = *(pData + i);
    htmlReserve.clear();
    if (HTMLCode2STR(ch, htmlReserve)) {
      wsResultBuf.AppendChar(L'&');
      wsResultBuf << htmlReserve;
      wsResultBuf.AppendChar(L';');
    } else {
      if (ch >= 32 && ch <= 126) {
        wsResultBuf.AppendChar((FX_WCHAR)ch);
      } else if (ch < 256) {
        iIndex = ch / 16;
        strEncode[3] = strCode[iIndex];
        strEncode[4] = strCode[ch - iIndex * 16];
        strEncode[5] = ';';
        strEncode[6] = 0;
        wsResultBuf << FX_WSTRC(strEncode);
      } else {
        int32_t iBigByte = ch / 256;
        int32_t iLittleByte = ch % 256;
        strEncode[3] = strCode[iBigByte / 16];
        strEncode[4] = strCode[iBigByte % 16];
        strEncode[5] = strCode[iLittleByte / 16];
        strEncode[6] = strCode[iLittleByte % 16];
        wsResultBuf << FX_WSTRC(strEncode);
      }
    }
    ++i;
  }
  wsResultBuf.AppendChar(0);
  szResultBuf.Clear();
  szResultBuf << FX_UTF8Encode(wsResultBuf.GetBuffer(), wsResultBuf.GetLength())
                     .AsStringC();
}
void CXFA_FM2JSContext::EncodeXML(const CFX_ByteStringC& szXMLString,
                                  CFX_ByteTextBuf& szResultBuf) {
  CFX_WideString wsXMLString = CFX_WideString::FromUTF8(szXMLString);
  CFX_WideTextBuf wsResultBuf;
  enum {
    QUOT,
    AMP,
    APOS,
    LT,
    GT,
  };
  FX_WCHAR strEncode[9];
  strEncode[0] = '&';
  strEncode[1] = '#';
  strEncode[2] = 'x';
  strEncode[5] = ';';
  strEncode[6] = 0;
  strEncode[7] = ';';
  strEncode[8] = 0;
  const FX_WCHAR* const strName[] = {L"quot", L"amp", L"apos", L"lt", L"gt"};
  const FX_WCHAR* strCode = L"0123456789abcdef";
  FX_WCHAR ch = 0;
  int32_t iLength = wsXMLString.GetLength();
  int32_t iIndex = 0;
  int32_t u = 0;
  const FX_WCHAR* pData = wsXMLString.c_str();
  for (u = 0; u < iLength; ++u) {
    ch = *(pData + u);
    switch (ch) {
      case '"':
        wsResultBuf.AppendChar('&');
        wsResultBuf << CFX_WideStringC(strName[QUOT]);
        wsResultBuf.AppendChar(';');
        break;
      case '&':
        wsResultBuf.AppendChar('&');
        wsResultBuf << CFX_WideStringC(strName[AMP]);
        wsResultBuf.AppendChar(';');
        break;
      case '\'':
        wsResultBuf.AppendChar('&');
        wsResultBuf << CFX_WideStringC(strName[APOS]);
        wsResultBuf.AppendChar(';');
        break;
      case '<':
        wsResultBuf.AppendChar('&');
        wsResultBuf << CFX_WideStringC(strName[LT]);
        wsResultBuf.AppendChar(';');
        break;
      case '>':
        wsResultBuf.AppendChar('&');
        wsResultBuf << CFX_WideStringC(strName[GT]);
        wsResultBuf.AppendChar(';');
        break;
      default: {
        if (ch >= 32 && ch <= 126) {
          wsResultBuf.AppendChar(ch);
        } else if (ch < 256) {
          iIndex = ch / 16;
          strEncode[3] = strCode[iIndex];
          strEncode[4] = strCode[ch - iIndex * 16];
          strEncode[5] = ';';
          strEncode[6] = 0;
          wsResultBuf << FX_WSTRC(strEncode);
        } else {
          int32_t iBigByte = ch / 256;
          int32_t iLittleByte = ch % 256;
          strEncode[3] = strCode[iBigByte / 16];
          strEncode[4] = strCode[iBigByte % 16];
          strEncode[5] = strCode[iLittleByte / 16];
          strEncode[6] = strCode[iLittleByte % 16];
          wsResultBuf << FX_WSTRC(strEncode);
        }
      } break;
    }
  }
  wsResultBuf.AppendChar(0);
  szResultBuf.Clear();
  szResultBuf << FX_UTF8Encode(wsResultBuf.GetBuffer(), wsResultBuf.GetLength())
                     .AsStringC();
}
FX_BOOL CXFA_FM2JSContext::HTMLSTR2Code(const CFX_WideStringC& pData,
                                        uint32_t& iCode) {
  int32_t iLength = pData.GetLength();
  uint32_t uHash = FX_HashCode_String_GetW(pData.c_str(), iLength);
  XFA_FMHtmlHashedReserveCode htmlhashedreservecode;
  int32_t iStart = 0,
          iEnd = (sizeof(reservesForDecode) / sizeof(reservesForDecode[0])) - 1;
  int32_t iMid = (iStart + iEnd) / 2;
  do {
    iMid = (iStart + iEnd) / 2;
    htmlhashedreservecode = reservesForDecode[iMid];
    if (uHash == htmlhashedreservecode.m_uHash) {
      iCode = htmlhashedreservecode.m_uCode;
      return TRUE;
    } else if (uHash < htmlhashedreservecode.m_uHash) {
      iEnd = iMid - 1;
    } else {
      iStart = iMid + 1;
    }
  } while (iStart <= iEnd);
  return FALSE;
}
FX_BOOL CXFA_FM2JSContext::HTMLCode2STR(uint32_t iCode,
                                        CFX_WideString& wsHTMLReserve) {
  XFA_FMHtmlReserveCode htmlreservecode;
  int32_t iStart = 0,
          iEnd = (sizeof(reservesForEncode) / sizeof(reservesForEncode[0])) - 1;
  int32_t iMid = (iStart + iEnd) / 2;
  do {
    iMid = (iStart + iEnd) / 2;
    htmlreservecode = reservesForEncode[iMid];
    if (iCode == htmlreservecode.m_uCode) {
      wsHTMLReserve = htmlreservecode.m_htmlReserve;
      return TRUE;
    } else if (iCode < htmlreservecode.m_uCode) {
      iEnd = iMid - 1;
    } else {
      iStart = iMid + 1;
    }
  } while (iStart <= iEnd);
  return FALSE;
}
static FX_BOOL XFA_PATTERN_STRING_Type(const CFX_ByteStringC& szPattern,
                                       uint32_t& patternType) {
  CFX_WideString wsPattern = CFX_WideString::FromUTF8(szPattern);
  if (FX_WSTRC(L"datetime") == wsPattern.Left(8)) {
    patternType = XFA_VT_DATETIME;
    return TRUE;
  } else if (FX_WSTRC(L"date") == wsPattern.Left(4)) {
    patternType = wsPattern.Find(L"time") > 0 ? XFA_VT_DATETIME : XFA_VT_DATE;
    return TRUE;
  } else if (FX_WSTRC(L"time") == wsPattern.Left(4)) {
    patternType = XFA_VT_TIME;
    return TRUE;
  } else if (FX_WSTRC(L"text") == wsPattern.Left(4)) {
    patternType = XFA_VT_TEXT;
    return TRUE;
  } else if (FX_WSTRC(L"num") == wsPattern.Left(3)) {
    if (FX_WSTRC(L"integer") == wsPattern.Mid(4, 7)) {
      patternType = XFA_VT_INTEGER;
    } else if (FX_WSTRC(L"decimal") == wsPattern.Mid(4, 7)) {
      patternType = XFA_VT_DECIMAL;
    } else if (FX_WSTRC(L"currency") == wsPattern.Mid(4, 8)) {
      patternType = XFA_VT_FLOAT;
    } else if (FX_WSTRC(L"percent") == wsPattern.Mid(4, 7)) {
      patternType = XFA_VT_FLOAT;
    } else {
      patternType = XFA_VT_FLOAT;
    }
    return TRUE;
  }
  patternType = XFA_VT_NULL;
  wsPattern.MakeLower();
  const FX_WCHAR* pData = wsPattern.c_str();
  int32_t iLength = wsPattern.GetLength();
  int32_t iIndex = 0;
  FX_BOOL bSingleQuotation = FALSE;
  FX_WCHAR patternChar;
  while (iIndex < iLength) {
    patternChar = *(pData + iIndex);
    if (patternChar == 0x27) {
      bSingleQuotation = !bSingleQuotation;
    } else if (!bSingleQuotation &&
               (patternChar == 'y' || patternChar == 'j')) {
      patternType = XFA_VT_DATE;
      iIndex++;
      FX_WCHAR timePatternChar;
      while (iIndex < iLength) {
        timePatternChar = *(pData + iIndex);
        if (timePatternChar == 0x27) {
          bSingleQuotation = !bSingleQuotation;
        } else if (!bSingleQuotation && timePatternChar == 't') {
          patternType = XFA_VT_DATETIME;
          break;
        }
        iIndex++;
      }
      break;
    } else if (!bSingleQuotation &&
               (patternChar == 'h' || patternChar == 'k')) {
      patternType = XFA_VT_TIME;
      break;
    } else if (!bSingleQuotation &&
               (patternChar == 'a' || patternChar == 'x' ||
                patternChar == 'o' || patternChar == '0')) {
      patternType = XFA_VT_TEXT;
      if (patternChar == 'x' || patternChar == 'o' || patternChar == '0') {
        break;
      }
    } else if (!bSingleQuotation &&
               (patternChar == 'z' || patternChar == 's' ||
                patternChar == 'e' || patternChar == 'v' ||
                patternChar == '8' || patternChar == ',' ||
                patternChar == '.' || patternChar == '$')) {
      patternType = XFA_VT_FLOAT;
      if (patternChar == 'v' || patternChar == '8' || patternChar == '$') {
        break;
      }
    }
    iIndex++;
  }
  if (patternType == XFA_VT_NULL) {
    patternType = XFA_VT_TEXT | XFA_VT_FLOAT;
  }
  return FALSE;
}
void CXFA_FM2JSContext::Format(FXJSE_HOBJECT hThis,
                               const CFX_ByteStringC& szFuncName,
                               CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  int32_t argc = args.GetLength();
  if (argc >= 2) {
    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
    CFX_ByteString szPattern;
    HValueToUTF8String(argOne, szPattern);
    CFX_ByteString szValue;
    HValueToUTF8String(argTwo, szValue);
    CXFA_Document* pDoc = pContext->GetDocument();
    IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr();
    CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject());
    FXSYS_assert(pThisNode);
    CXFA_WidgetData widgetData(pThisNode);
    IFX_Locale* pLocale = widgetData.GetLocal();
    uint32_t patternType;
    FX_BOOL bCompelte =
        XFA_PATTERN_STRING_Type(szPattern.AsStringC(), patternType);
    CFX_WideString wsPattern = CFX_WideString::FromUTF8(szPattern.AsStringC());
    CFX_WideString wsValue = CFX_WideString::FromUTF8(szValue.AsStringC());
    if (!bCompelte) {
      switch (patternType) {
        case XFA_VT_DATETIME: {
          FX_STRSIZE iTChar = wsPattern.Find(L'T');
          CFX_WideString wsDatePattern = FX_WSTRC(L"date{");
          wsDatePattern += wsPattern.Left(iTChar);
          wsDatePattern += FX_WSTRC(L"} ");
          CFX_WideString wsTimePattern = FX_WSTRC(L"time{");
          wsTimePattern += wsPattern.Mid(iTChar + 1);
          wsTimePattern += FX_WSTRC(L"}");
          wsPattern = wsDatePattern + wsTimePattern;
        } break;
        case XFA_VT_DATE: {
          wsPattern = FX_WSTRC(L"date{") + wsPattern;
          wsPattern += FX_WSTRC(L"}");
        } break;
        case XFA_VT_TIME: {
          wsPattern = FX_WSTRC(L"time{") + wsPattern;
          wsPattern += FX_WSTRC(L"}");
        } break;
        case XFA_VT_TEXT: {
          wsPattern = FX_WSTRC(L"text{") + wsPattern;
          wsPattern += FX_WSTRC(L"}");
        } break;
        case XFA_VT_FLOAT: {
          wsPattern = FX_WSTRC(L"num{") + wsPattern;
          wsPattern += FX_WSTRC(L"}");
        } break;
        default: {
          CFX_WideString wsTestPattern;
          wsTestPattern = FX_WSTRC(L"num{") + wsPattern;
          wsTestPattern += FX_WSTRC(L"}");
          CXFA_LocaleValue tempLocaleValue(XFA_VT_FLOAT, wsValue, wsTestPattern,
                                           pLocale, (CXFA_LocaleMgr*)pMgr);
          if (tempLocaleValue.IsValid()) {
            wsPattern = wsTestPattern;
            patternType = XFA_VT_FLOAT;
          } else {
            wsTestPattern = FX_WSTRC(L"text{") + wsPattern;
            wsTestPattern += FX_WSTRC(L"}");
            wsPattern = wsTestPattern;
            patternType = XFA_VT_TEXT;
          }
        } break;
      }
    }
    CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern, pLocale,
                                 (CXFA_LocaleMgr*)pMgr);
    CFX_WideString wsRet;
    if (localeValue.FormatPatterns(wsRet, wsPattern, pLocale,
                                   XFA_VALUEPICTURE_Display)) {
      FXJSE_Value_SetUTF8String(
          args.GetReturnValue(),
          FX_UTF8Encode(wsRet.c_str(), wsRet.GetLength()).AsStringC());
    } else {
      FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
    }
    FXJSE_Value_Release(argOne);
    FXJSE_Value_Release(argTwo);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Format");
  }
}
void CXFA_FM2JSContext::Left(FXJSE_HOBJECT hThis,
                             const CFX_ByteStringC& szFuncName,
                             CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  if (args.GetLength() == 2) {
    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
    FX_BOOL argIsNull = FALSE;
    if ((HValueIsNull(hThis, argOne)) || (HValueIsNull(hThis, argTwo))) {
      argIsNull = TRUE;
    }
    if (argIsNull) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      CFX_ByteString sourceString;
      HValueToUTF8String(argOne, sourceString);
      int32_t count = HValueToInteger(hThis, argTwo);
      if (count < 0) {
        count = 0;
      }
      FXJSE_Value_SetUTF8String(args.GetReturnValue(),
                                sourceString.Left(count).AsStringC());
    }
    FXJSE_Value_Release(argOne);
    FXJSE_Value_Release(argTwo);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Left");
  }
}
void CXFA_FM2JSContext::Len(FXJSE_HOBJECT hThis,
                            const CFX_ByteStringC& szFuncName,
                            CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  if (args.GetLength() == 1) {
    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
    if (HValueIsNull(hThis, argOne)) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      CFX_ByteString sourceString;
      HValueToUTF8String(argOne, sourceString);
      FXJSE_Value_SetInteger(args.GetReturnValue(), sourceString.GetLength());
    }
    FXJSE_Value_Release(argOne);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Len");
  }
}
void CXFA_FM2JSContext::Lower(FXJSE_HOBJECT hThis,
                              const CFX_ByteStringC& szFuncName,
                              CFXJSE_Arguments& args) {
  int32_t argc = args.GetLength();
  if ((argc > 0) && (argc < 3)) {
    CFX_ByteString argString;
    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE localeValue = 0;
    if (HValueIsNull(hThis, argOne)) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      if (argc == 2) {
        localeValue = GetSimpleHValue(hThis, args, 1);
      }
      HValueToUTF8String(argOne, argString);
      CFX_WideTextBuf lowStringBuf;
      CFX_WideString wsArgString =
          CFX_WideString::FromUTF8(argString.AsStringC());
      const FX_WCHAR* pData = wsArgString.c_str();
      int32_t iLen = argString.GetLength();
      int32_t i = 0;
      int32_t ch = 0;
      while (i < iLen) {
        ch = *(pData + i);
        if (ch >= 0x41 && ch <= 0x5A) {
          ch += 32;
        } else if (ch >= 0xC0 && ch <= 0xDE) {
          ch += 32;
        } else if (ch == 0x100 || ch == 0x102 || ch == 0x104) {
          ch += 1;
        }
        lowStringBuf.AppendChar(ch);
        ++i;
      }
      lowStringBuf.AppendChar(0);
      FXJSE_Value_SetUTF8String(
          args.GetReturnValue(),
          FX_UTF8Encode(lowStringBuf.GetBuffer(), lowStringBuf.GetLength())
              .AsStringC());
      if (argc == 2) {
        FXJSE_Value_Release(localeValue);
      }
    }
    FXJSE_Value_Release(argOne);
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Lower");
  }
}
void CXFA_FM2JSContext::Ltrim(FXJSE_HOBJECT hThis,
                              const CFX_ByteStringC& szFuncName,
                              CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  if (args.GetLength() == 1) {
    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
    if (HValueIsNull(hThis, argOne)) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      CFX_ByteString sourceString;
      HValueToUTF8String(argOne, sourceString);
      sourceString.TrimLeft();
      FXJSE_Value_SetUTF8String(args.GetReturnValue(),
                                sourceString.AsStringC());
    }
    FXJSE_Value_Release(argOne);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Ltrim");
  }
}
void CXFA_FM2JSContext::Parse(FXJSE_HOBJECT hThis,
                              const CFX_ByteStringC& szFuncName,
                              CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  if (args.GetLength() == 2) {
    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
    if (HValueIsNull(hThis, argTwo)) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      CFX_ByteString szPattern;
      HValueToUTF8String(argOne, szPattern);
      CFX_ByteString szValue;
      HValueToUTF8String(argTwo, szValue);
      CXFA_Document* pDoc = pContext->GetDocument();
      IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr();
      CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject());
      FXSYS_assert(pThisNode);
      CXFA_WidgetData widgetData(pThisNode);
      IFX_Locale* pLocale = widgetData.GetLocal();
      uint32_t patternType;
      FX_BOOL bCompletePattern =
          XFA_PATTERN_STRING_Type(szPattern.AsStringC(), patternType);
      CFX_WideString wsPattern =
          CFX_WideString::FromUTF8(szPattern.AsStringC());
      CFX_WideString wsValue = CFX_WideString::FromUTF8(szValue.AsStringC());
      CFX_ByteString szParsedValue;
      if (bCompletePattern) {
        CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern, pLocale,
                                     (CXFA_LocaleMgr*)pMgr);
        if (localeValue.IsValid()) {
          szParsedValue = FX_UTF8Encode(localeValue.GetValue());
          FXJSE_Value_SetUTF8String(args.GetReturnValue(),
                                    szParsedValue.AsStringC());
        } else {
          FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
        }
      } else {
        switch (patternType) {
          case XFA_VT_DATETIME: {
            FX_STRSIZE iTChar = wsPattern.Find(L'T');
            CFX_WideString wsDatePattern = FX_WSTRC(L"date{");
            wsDatePattern += wsPattern.Left(iTChar);
            wsDatePattern += FX_WSTRC(L"} ");
            CFX_WideString wsTimePattern = FX_WSTRC(L"time{");
            wsTimePattern += wsPattern.Mid(iTChar + 1);
            wsTimePattern += FX_WSTRC(L"}");
            wsPattern = wsDatePattern + wsTimePattern;
            CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern,
                                         pLocale, (CXFA_LocaleMgr*)pMgr);
            if (localeValue.IsValid()) {
              szParsedValue = FX_UTF8Encode(localeValue.GetValue());
              FXJSE_Value_SetUTF8String(args.GetReturnValue(),
                                        szParsedValue.AsStringC());
            } else {
              FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
            }
          } break;
          case XFA_VT_DATE: {
            wsPattern = FX_WSTRC(L"date{") + wsPattern;
            wsPattern += FX_WSTRC(L"}");
            CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern,
                                         pLocale, (CXFA_LocaleMgr*)pMgr);
            if (localeValue.IsValid()) {
              szParsedValue = FX_UTF8Encode(localeValue.GetValue());
              FXJSE_Value_SetUTF8String(args.GetReturnValue(),
                                        szParsedValue.AsStringC());
            } else {
              FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
            }
          } break;
          case XFA_VT_TIME: {
            wsPattern = FX_WSTRC(L"time{") + wsPattern;
            wsPattern += FX_WSTRC(L"}");
            CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern,
                                         pLocale, (CXFA_LocaleMgr*)pMgr);
            if (localeValue.IsValid()) {
              szParsedValue = FX_UTF8Encode(localeValue.GetValue());
              FXJSE_Value_SetUTF8String(args.GetReturnValue(),
                                        szParsedValue.AsStringC());
            } else {
              FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
            }
          } break;
          case XFA_VT_TEXT: {
            wsPattern = FX_WSTRC(L"text{") + wsPattern;
            wsPattern += FX_WSTRC(L"}");
            CXFA_LocaleValue localeValue(XFA_VT_TEXT, wsValue, wsPattern,
                                         pLocale, (CXFA_LocaleMgr*)pMgr);
            if (localeValue.IsValid()) {
              szParsedValue = FX_UTF8Encode(localeValue.GetValue());
              FXJSE_Value_SetUTF8String(args.GetReturnValue(),
                                        szParsedValue.AsStringC());
            } else {
              FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
            }
          } break;
          case XFA_VT_FLOAT: {
            wsPattern = FX_WSTRC(L"num{") + wsPattern;
            wsPattern += FX_WSTRC(L"}");
            CXFA_LocaleValue localeValue(XFA_VT_FLOAT, wsValue, wsPattern,
                                         pLocale, (CXFA_LocaleMgr*)pMgr);
            if (localeValue.IsValid()) {
              FXJSE_Value_SetDouble(args.GetReturnValue(),
                                    localeValue.GetDoubleNum());
            } else {
              FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
            }
          } break;
          default: {
            CFX_WideString wsTestPattern;
            wsTestPattern = FX_WSTRC(L"num{") + wsPattern;
            wsTestPattern += FX_WSTRC(L"}");
            CXFA_LocaleValue localeValue(XFA_VT_FLOAT, wsValue, wsTestPattern,
                                         pLocale, (CXFA_LocaleMgr*)pMgr);
            if (localeValue.IsValid()) {
              FXJSE_Value_SetDouble(args.GetReturnValue(),
                                    localeValue.GetDoubleNum());
            } else {
              wsTestPattern = FX_WSTRC(L"text{") + wsPattern;
              wsTestPattern += FX_WSTRC(L"}");
              CXFA_LocaleValue localeValue(XFA_VT_TEXT, wsValue, wsTestPattern,
                                           pLocale, (CXFA_LocaleMgr*)pMgr);
              if (localeValue.IsValid()) {
                szParsedValue = FX_UTF8Encode(localeValue.GetValue());
                FXJSE_Value_SetUTF8String(args.GetReturnValue(),
                                          szParsedValue.AsStringC());
              } else {
                FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
              }
            }
          } break;
        }
      }
    }
    FXJSE_Value_Release(argOne);
    FXJSE_Value_Release(argTwo);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Parse");
  }
}
void CXFA_FM2JSContext::Replace(FXJSE_HOBJECT hThis,
                                const CFX_ByteStringC& szFuncName,
                                CFXJSE_Arguments& args) {
  int32_t argc = args.GetLength();
  if ((argc == 2) || (argc == 3)) {
    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
    FXJSE_HVALUE argThree = 0;
    CFX_ByteString oneString;
    CFX_ByteString twoString;
    CFX_ByteString threeString;
    if (!HValueIsNull(hThis, argOne) && !HValueIsNull(hThis, argTwo)) {
      HValueToUTF8String(argOne, oneString);
      HValueToUTF8String(argTwo, twoString);
    }
    if (argc == 3) {
      argThree = GetSimpleHValue(hThis, args, 2);
      HValueToUTF8String(argThree, threeString);
    }
    int32_t iSrcLen = oneString.GetLength();
    int32_t iFindLen = twoString.GetLength();
    CFX_ByteTextBuf resultString;
    int32_t iFindIndex = 0;
    uint8_t ch = 0;
    for (int32_t u = 0; u < iSrcLen; ++u) {
      ch = oneString.GetAt(u);
      if (ch == twoString.GetAt(iFindIndex)) {
        int32_t iTemp = u + 1;
        ++iFindIndex;
        uint8_t chTemp = 0;
        while (iFindIndex < iFindLen) {
          chTemp = oneString.GetAt(iTemp);
          if (chTemp == twoString.GetAt(iFindIndex)) {
            ++iTemp;
            ++iFindIndex;
          } else {
            iFindIndex = 0;
            break;
          }
        }
        if (iFindIndex == iFindLen) {
          resultString << threeString.AsStringC();
          u += iFindLen - 1;
          iFindIndex = 0;
        } else {
          resultString.AppendChar(ch);
        }
      } else {
        resultString.AppendChar(ch);
      }
    }
    resultString.AppendChar(0);
    FXJSE_Value_SetUTF8String(args.GetReturnValue(), resultString.AsStringC());
    FXJSE_Value_Release(argOne);
    FXJSE_Value_Release(argTwo);
    if (argc == 3) {
      FXJSE_Value_Release(argThree);
    }
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Replace");
  }
}
void CXFA_FM2JSContext::Right(FXJSE_HOBJECT hThis,
                              const CFX_ByteStringC& szFuncName,
                              CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  if (args.GetLength() == 2) {
    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1);
    FX_BOOL argIsNull = FALSE;
    if ((HValueIsNull(hThis, argOne)) || (HValueIsNull(hThis, argTwo))) {
      argIsNull = TRUE;
    }
    if (argIsNull) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      CFX_ByteString sourceString;
      HValueToUTF8String(argOne, sourceString);
      int32_t count = HValueToInteger(hThis, argTwo);
      if (count < 0) {
        count = 0;
      }
      FXJSE_Value_SetUTF8String(args.GetReturnValue(),
                                sourceString.Right(count).AsStringC());
    }
    FXJSE_Value_Release(argOne);
    FXJSE_Value_Release(argTwo);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Right");
  }
}
void CXFA_FM2JSContext::Rtrim(FXJSE_HOBJECT hThis,
                              const CFX_ByteStringC& szFuncName,
                              CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  if (args.GetLength() == 1) {
    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
    if (HValueIsNull(hThis, argOne)) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      CFX_ByteString sourceString;
      HValueToUTF8String(argOne, sourceString);
      sourceString.TrimRight();
      FXJSE_Value_SetUTF8String(args.GetReturnValue(),
                                sourceString.AsStringC());
    }
    FXJSE_Value_Release(argOne);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Rtrim");
  }
}
void CXFA_FM2JSContext::Space(FXJSE_HOBJECT hThis,
                              const CFX_ByteStringC& szFuncName,
                              CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  if (args.GetLength() == 1) {
    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
    if (FXJSE_Value_IsNull(argOne)) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      int32_t count = 0;
      count = HValueToInteger(hThis, argOne);
      count = (count < 0) ? 0 : count;
      CFX_ByteTextBuf spaceString;
      int32_t index = 0;
      while (index < count) {
        spaceString.AppendByte(' ');
        index++;
      }
      spaceString.AppendByte(0);
      FXJSE_Value_SetUTF8String(args.GetReturnValue(), spaceString.AsStringC());
    }
    FXJSE_Value_Release(argOne);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Space");
  }
}
void CXFA_FM2JSContext::Str(FXJSE_HOBJECT hThis,
                            const CFX_ByteStringC& szFuncName,
                            CFXJSE_Arguments& args) {
  int32_t argc = args.GetLength();
  if ((argc > 0) && (argc < 4)) {
    FX_BOOL bFlags = FALSE;
    FX_FLOAT fNumber;
    int32_t iWidth = 10;
    int32_t iPrecision = 0;
    FXJSE_HVALUE numberValue = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE widthValue = 0;
    FXJSE_HVALUE precisionValue = 0;
    if (FXJSE_Value_IsNull(numberValue)) {
      bFlags = TRUE;
    } else {
      fNumber = HValueToFloat(hThis, numberValue);
    }
    if (argc > 1) {
      widthValue = GetSimpleHValue(hThis, args, 1);
      iWidth = (int32_t)HValueToFloat(hThis, widthValue);
    }
    if (argc == 3) {
      precisionValue = GetSimpleHValue(hThis, args, 2);
      iPrecision = (int32_t)HValueToFloat(hThis, precisionValue);
      if (iPrecision < 0) {
        iPrecision = 0;
      }
    }
    if (!bFlags) {
      CFX_ByteString numberString;
      CFX_ByteString formatStr = "%";
      if (iPrecision) {
        formatStr += ".";
        formatStr += CFX_ByteString::FormatInteger(iPrecision);
      }
      formatStr += "f";
      numberString.Format(formatStr.c_str(), fNumber);
      const FX_CHAR* pData = numberString.c_str();
      int32_t iLength = numberString.GetLength();
      int32_t u = 0;
      while (u < iLength) {
        if (*(pData + u) == '.') {
          break;
        }
        ++u;
      }
      CFX_ByteTextBuf resultBuf;
      if (u > iWidth || (iPrecision + u) >= iWidth) {
        int32_t i = 0;
        while (i < iWidth) {
          resultBuf.AppendChar('*');
          ++i;
        }
        resultBuf.AppendChar(0);
      } else {
        if (u == iLength) {
          if (iLength > iWidth) {
            int32_t i = 0;
            while (i < iWidth) {
              resultBuf.AppendChar('*');
              ++i;
            }
          } else {
            int32_t i = 0;
            int32_t iSpace = iWidth - iLength;
            while (i < iSpace) {
              resultBuf.AppendChar(' ');
              ++i;
            }
            resultBuf << pData;
          }
        } else {
          int32_t iLeavingSpace = 0;
          if (iPrecision == 0) {
            iLeavingSpace = iWidth - (u + iPrecision);
          } else {
            iLeavingSpace = iWidth - (u + iPrecision + 1);
          }
          int32_t i = 0;
          while (i < iLeavingSpace) {
            resultBuf.AppendChar(' ');
            ++i;
          }
          i = 0;
          while (i < u) {
            resultBuf.AppendChar(*(pData + i));
            ++i;
          }
          if (iPrecision != 0) {
            resultBuf.AppendChar('.');
          }
          u++;
          i = 0;
          while (u < iLength) {
            if (i >= iPrecision) {
              break;
            }
            resultBuf.AppendChar(*(pData + u));
            ++i;
            ++u;
          }
          while (i < iPrecision) {
            resultBuf.AppendChar('0');
            ++i;
          }
          resultBuf.AppendChar(0);
        }
      }
      FXJSE_Value_SetUTF8String(args.GetReturnValue(), resultBuf.AsStringC());
    } else {
      FXJSE_Value_SetNull(args.GetReturnValue());
    }
    FXJSE_Value_Release(numberValue);
    if (argc > 1) {
      FXJSE_Value_Release(widthValue);
      if (argc == 3) {
        FXJSE_Value_Release(precisionValue);
      }
    }
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Str");
  }
}
void CXFA_FM2JSContext::Stuff(FXJSE_HOBJECT hThis,
                              const CFX_ByteStringC& szFuncName,
                              CFXJSE_Arguments& args) {
  int32_t argc = args.GetLength();
  if ((argc == 3) || (argc == 4)) {
    CFX_ByteString sourceString;
    CFX_ByteString insertString;
    int32_t iLength = 0;
    int32_t iStart = 0;
    int32_t iDelete = 0;
    FXJSE_HVALUE sourceValue = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE startValue = GetSimpleHValue(hThis, args, 1);
    FXJSE_HVALUE deleteValue = GetSimpleHValue(hThis, args, 2);
    FXJSE_HVALUE insertValue = 0;
    if (!FXJSE_Value_IsNull(sourceValue) && !FXJSE_Value_IsNull(startValue) &&
        !FXJSE_Value_IsNull(deleteValue)) {
      HValueToUTF8String(sourceValue, sourceString);
      iLength = sourceString.GetLength();
      iStart = (int32_t)HValueToFloat(hThis, startValue);
      if (iStart < 1) {
        iStart = 1;
      }
      if (iStart > iLength) {
        iStart = iLength;
      }
      iDelete = (int32_t)HValueToFloat(hThis, deleteValue);
      if (iDelete <= 0) {
        iDelete = 0;
      }
    }
    if (argc == 4) {
      insertValue = GetSimpleHValue(hThis, args, 3);
      HValueToUTF8String(insertValue, insertString);
    }
    iStart -= 1;
    CFX_ByteTextBuf resultString;
    int32_t i = 0;
    while (i < iStart) {
      resultString.AppendChar(sourceString.GetAt(i));
      ++i;
    }
    resultString << insertString.AsStringC();
    i = iStart + iDelete;
    while (i < iLength) {
      resultString.AppendChar(sourceString.GetAt(i));
      ++i;
    }
    resultString.AppendChar(0);
    FXJSE_Value_SetUTF8String(args.GetReturnValue(), resultString.AsStringC());
    FXJSE_Value_Release(sourceValue);
    FXJSE_Value_Release(startValue);
    FXJSE_Value_Release(deleteValue);
    if (argc == 4) {
      FXJSE_Value_Release(insertValue);
    }
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Stuff");
  }
}
void CXFA_FM2JSContext::Substr(FXJSE_HOBJECT hThis,
                               const CFX_ByteStringC& szFuncName,
                               CFXJSE_Arguments& args) {
  int32_t argc = args.GetLength();
  if (argc == 3) {
    FXJSE_HVALUE stringValue = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE startValue = GetSimpleHValue(hThis, args, 1);
    FXJSE_HVALUE endValue = GetSimpleHValue(hThis, args, 2);
    if (HValueIsNull(hThis, stringValue) || (HValueIsNull(hThis, startValue)) ||
        (HValueIsNull(hThis, endValue))) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      CFX_ByteString szSourceStr;
      int32_t iStart = 0;
      int32_t iCount = 0;
      HValueToUTF8String(stringValue, szSourceStr);
      int32_t iLength = szSourceStr.GetLength();
      if (iLength == 0) {
        FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
      } else {
        iStart = (int32_t)HValueToFloat(hThis, startValue);
        iCount = (int32_t)HValueToFloat(hThis, endValue);
        if (iStart < 1) {
          iStart = 1;
        }
        if (iStart > iLength) {
          iStart = iLength;
        }
        if (iCount <= 0) {
          iCount = 0;
        }
        iStart -= 1;
        FXJSE_Value_SetUTF8String(args.GetReturnValue(),
                                  szSourceStr.Mid(iStart, iCount).AsStringC());
      }
    }
    FXJSE_Value_Release(stringValue);
    FXJSE_Value_Release(startValue);
    FXJSE_Value_Release(endValue);
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Substr");
  }
}
void CXFA_FM2JSContext::Uuid(FXJSE_HOBJECT hThis,
                             const CFX_ByteStringC& szFuncName,
                             CFXJSE_Arguments& args) {
  int32_t argc = args.GetLength();
  if ((argc == 0) || (argc == 1)) {
    int32_t iNum = 0;
    FXJSE_HVALUE argOne = 0;
    if (argc == 1) {
      argOne = GetSimpleHValue(hThis, args, 0);
      iNum = (int32_t)HValueToFloat(hThis, argOne);
    }
    FX_GUID guid;
    FX_GUID_CreateV4(&guid);
    CFX_ByteString bsUId;
    FX_GUID_ToString(&guid, bsUId, iNum);
    FXJSE_Value_SetUTF8String(args.GetReturnValue(), bsUId.AsStringC());
    if (argc == 1) {
      FXJSE_Value_Release(argOne);
    }
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Uuid");
  }
}
void CXFA_FM2JSContext::Upper(FXJSE_HOBJECT hThis,
                              const CFX_ByteStringC& szFuncName,
                              CFXJSE_Arguments& args) {
  int32_t argc = args.GetLength();
  if ((argc > 0) && (argc < 3)) {
    CFX_ByteString argString;
    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE localeValue = 0;
    if (HValueIsNull(hThis, argOne)) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      if (argc == 2) {
        localeValue = GetSimpleHValue(hThis, args, 1);
      }
      HValueToUTF8String(argOne, argString);
      CFX_WideTextBuf upperStringBuf;
      CFX_WideString wsArgString =
          CFX_WideString::FromUTF8(argString.AsStringC());
      const FX_WCHAR* pData = wsArgString.c_str();
      int32_t iLen = wsArgString.GetLength();
      int32_t i = 0;
      int32_t ch = 0;
      while (i < iLen) {
        ch = *(pData + i);
        if (ch >= 0x61 && ch <= 0x7A) {
          ch -= 32;
        } else if (ch >= 0xE0 && ch <= 0xFE) {
          ch -= 32;
        } else if (ch == 0x101 || ch == 0x103 || ch == 0x105) {
          ch -= 1;
        }
        upperStringBuf.AppendChar(ch);
        ++i;
      }
      upperStringBuf.AppendChar(0);
      FXJSE_Value_SetUTF8String(
          args.GetReturnValue(),
          FX_UTF8Encode(upperStringBuf.GetBuffer(), upperStringBuf.GetLength())
              .AsStringC());
      if (argc == 2) {
        FXJSE_Value_Release(localeValue);
      }
    }
    FXJSE_Value_Release(argOne);
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Upper");
  }
}
void CXFA_FM2JSContext::WordNum(FXJSE_HOBJECT hThis,
                                const CFX_ByteStringC& szFuncName,
                                CFXJSE_Arguments& args) {
  int32_t argc = args.GetLength();
  if ((argc > 0) && (argc < 4)) {
    FX_BOOL bFlags = FALSE;
    FX_FLOAT fNumber;
    int32_t iIdentifier = 0;
    CFX_ByteString localeString;
    FXJSE_HVALUE numberValue = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE identifierValue = 0;
    FXJSE_HVALUE localeValue = 0;
    if (FXJSE_Value_IsNull(numberValue)) {
      bFlags = TRUE;
    } else {
      fNumber = HValueToFloat(hThis, numberValue);
    }
    if (argc > 1) {
      identifierValue = GetSimpleHValue(hThis, args, 1);
      if (FXJSE_Value_IsNull(identifierValue)) {
        bFlags = TRUE;
      } else {
        iIdentifier = (int32_t)HValueToFloat(hThis, identifierValue);
      }
    }
    if (argc == 3) {
      localeValue = GetSimpleHValue(hThis, args, 2);
      if (FXJSE_Value_IsNull(localeValue)) {
        bFlags = TRUE;
      } else {
        HValueToUTF8String(localeValue, localeString);
      }
    }
    if (!bFlags) {
      if ((fNumber < 0) || (fNumber > 922337203685477550)) {
        FXJSE_Value_SetUTF8String(args.GetReturnValue(), "*");
      } else {
        CFX_ByteTextBuf resultBuf;
        CFX_ByteString numberString;
        numberString.Format("%.2f", fNumber);
        WordUS(numberString.AsStringC(), iIdentifier, resultBuf);
        FXJSE_Value_SetUTF8String(args.GetReturnValue(), resultBuf.AsStringC());
      }
    } else {
      FXJSE_Value_SetNull(args.GetReturnValue());
    }
    FXJSE_Value_Release(numberValue);
    if (argc > 1) {
      FXJSE_Value_Release(identifierValue);
      if (argc == 3) {
        FXJSE_Value_Release(localeValue);
      }
    }
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"WordNum");
  }
}
void CXFA_FM2JSContext::TrillionUS(const CFX_ByteStringC& szData,
                                   CFX_ByteTextBuf& strBuf) {
  CFX_ByteStringC pUnits[] = {"zero", "one", "two",   "three", "four",
                              "five", "six", "seven", "eight", "nine"};
  CFX_ByteStringC pCapUnits[] = {"Zero", "One", "Two",   "Three", "Four",
                                 "Five", "Six", "Seven", "Eight", "Nine"};
  CFX_ByteStringC pTens[] = {"Ten",      "Eleven",  "Twelve",  "Thirteen",
                             "Fourteen", "Fifteen", "Sixteen", "Seventeen",
                             "Eighteen", "Nineteen"};
  CFX_ByteStringC pLastTens[] = {"Twenty", "Thirty",  "Forty",  "Fifty",
                                 "Sixty",  "Seventy", "Eighty", "Ninety"};
  CFX_ByteStringC pComm[] = {" Hundred ", " Thousand ", " Million ",
                             " Billion ", "Trillion"};
  int32_t iComm = 0;
  const FX_CHAR* pData = szData.c_str();
  int32_t iLength = szData.GetLength();
  if (iLength > 12) {
    iComm = 4;
  } else if (iLength > 9) {
    iComm = 3;
  } else if (iLength > 6) {
    iComm = 2;
  } else if (iLength > 3) {
    iComm = 1;
  }
  int32_t iIndex = 0;
  int32_t iFirstCount = iLength % 3;
  if (iFirstCount == 0) {
    iFirstCount = 3;
  }
  if (iFirstCount == 3) {
    if (*(pData + iIndex) != '0') {
      strBuf << pCapUnits[*(pData + iIndex) - '0'];
      strBuf << pComm[0];
    }
    if (*(pData + iIndex + 1) == '0') {
      strBuf << pCapUnits[*(pData + iIndex + 2) - '0'];
    } else {
      if (*(pData + iIndex + 1) > '1') {
        strBuf << pLastTens[*(pData + iIndex + 1) - '2'];
        strBuf << "-";
        strBuf << pUnits[*(pData + iIndex + 2) - '0'];
      } else if (*(pData + iIndex + 1) == '1') {
        strBuf << pTens[*(pData + iIndex + 2) - '0'];
      } else if (*(pData + iIndex + 1) == '0') {
        strBuf << pCapUnits[*(pData + iIndex + 2) - '0'];
      }
    }
    iIndex += 3;
  } else if (iFirstCount == 2) {
    if (*(pData + iIndex) == '0') {
      strBuf << pCapUnits[*(pData + iIndex + 1) - '0'];
    } else {
      if (*(pData + iIndex) > '1') {
        strBuf << pLastTens[*(pData + iIndex) - '2'];
        strBuf << "-";
        strBuf << pUnits[*(pData + iIndex + 1) - '0'];
      } else if (*(pData + iIndex) == '1') {
        strBuf << pTens[*(pData + iIndex + 1) - '0'];
      } else if (*(pData + iIndex) == '0') {
        strBuf << pCapUnits[*(pData + iIndex + 1) - '0'];
      }
    }
    iIndex += 2;
  } else if (iFirstCount == 1) {
    strBuf << pCapUnits[*(pData + iIndex) - '0'];
    iIndex += 1;
  }
  if (iLength > 3 && iFirstCount > 0) {
    strBuf << pComm[iComm];
    --iComm;
  }
  while (iIndex < iLength) {
    if (*(pData + iIndex) != '0') {
      strBuf << pCapUnits[*(pData + iIndex) - '0'];
      strBuf << pComm[0];
    }
    if (*(pData + iIndex + 1) == '0') {
      strBuf << pCapUnits[*(pData + iIndex + 2) - '0'];
    } else {
      if (*(pData + iIndex + 1) > '1') {
        strBuf << pLastTens[*(pData + iIndex + 1) - '2'];
        strBuf << "-";
        strBuf << pUnits[*(pData + iIndex + 2) - '0'];
      } else if (*(pData + iIndex + 1) == '1') {
        strBuf << pTens[*(pData + iIndex + 2) - '0'];
      } else if (*(pData + iIndex + 1) == '0') {
        strBuf << pCapUnits[*(pData + iIndex + 2) - '0'];
      }
    }
    if (iIndex < iLength - 3) {
      strBuf << pComm[iComm];
      --iComm;
    }
    iIndex += 3;
  }
}
void CXFA_FM2JSContext::WordUS(const CFX_ByteStringC& szData,
                               int32_t iStyle,
                               CFX_ByteTextBuf& strBuf) {
  const FX_CHAR* pData = szData.c_str();
  int32_t iLength = szData.GetLength();
  switch (iStyle) {
    case 0: {
      int32_t iIndex = 0;
      while (iIndex < iLength) {
        if (*(pData + iIndex) == '.') {
          break;
        }
        ++iIndex;
      }
      iLength = iIndex;
      iIndex = 0;
      int32_t iCount = 0;
      while (iIndex < iLength) {
        iCount = (iLength - iIndex) % 12;
        if (!iCount && iLength - iIndex > 0) {
          iCount = 12;
        }
        TrillionUS(CFX_ByteStringC(pData + iIndex, iCount), strBuf);
        iIndex += iCount;
        if (iIndex < iLength) {
          strBuf << " Trillion ";
        }
      }
    } break;
    case 1: {
      int32_t iIndex = 0;
      while (iIndex < iLength) {
        if (*(pData + iIndex) == '.') {
          break;
        }
        ++iIndex;
      }
      iLength = iIndex;
      iIndex = 0;
      int32_t iCount = 0;
      while (iIndex < iLength) {
        iCount = (iLength - iIndex) % 12;
        if (!iCount && iLength - iIndex > 0) {
          iCount = 12;
        }
        TrillionUS(CFX_ByteStringC(pData + iIndex, iCount), strBuf);
        iIndex += iCount;
        if (iIndex < iLength) {
          strBuf << " Trillion ";
        }
      }
      strBuf << " Dollars";
    } break;
    case 2: {
      int32_t iIndex = 0;
      while (iIndex < iLength) {
        if (*(pData + iIndex) == '.') {
          break;
        }
        ++iIndex;
      }
      int32_t iInteger = iIndex;
      iIndex = 0;
      int32_t iCount = 0;
      while (iIndex < iInteger) {
        iCount = (iInteger - iIndex) % 12;
        if (!iCount && iLength - iIndex > 0) {
          iCount = 12;
        }
        TrillionUS(CFX_ByteStringC(pData + iIndex, iCount), strBuf);
        iIndex += iCount;
        if (iIndex < iInteger) {
          strBuf << " Trillion ";
        }
      }
      strBuf << " Dollars";
      if (iInteger < iLength) {
        strBuf << " And ";
        iIndex = iInteger + 1;
        int32_t iCount = 0;
        while (iIndex < iLength) {
          iCount = (iLength - iIndex) % 12;
          if (!iCount && iLength - iIndex > 0) {
            iCount = 12;
          }
          TrillionUS(CFX_ByteStringC(pData + iIndex, iCount), strBuf);
          iIndex += iCount;
          if (iIndex < iLength) {
            strBuf << " Trillion ";
          }
        }
        strBuf << " Cents";
      }
    } break;
    default:
      break;
  }
}
void CXFA_FM2JSContext::Get(FXJSE_HOBJECT hThis,
                            const CFX_ByteStringC& szFuncName,
                            CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  int32_t argc = args.GetLength();
  if (argc == 1) {
    CXFA_Document* pDoc = pContext->GetDocument();
    if (!pDoc) {
      return;
    }
    IXFA_AppProvider* pAppProvider =
        pDoc->GetParser()->GetNotify()->GetAppProvider();
    if (!pAppProvider) {
      return;
    }
    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
    CFX_ByteString urlString;
    HValueToUTF8String(argOne, urlString);
    IFX_FileRead* pFile = pAppProvider->DownloadURL(
        CFX_WideString::FromUTF8(urlString.AsStringC()).AsStringC());
    if (pFile) {
      int32_t size = pFile->GetSize();
      uint8_t* pData = FX_Alloc(uint8_t, size);
      pFile->ReadBlock(pData, size);
      FXJSE_Value_SetUTF8String(args.GetReturnValue(),
                                CFX_ByteStringC(pData, size));
      FX_Free(pData);
      pFile->Release();
    }
    FXJSE_Value_Release(argOne);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Get");
  }
}
void CXFA_FM2JSContext::Post(FXJSE_HOBJECT hThis,
                             const CFX_ByteStringC& szFuncName,
                             CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  int32_t argc = args.GetLength();
  if ((argc >= 2) && (argc <= 5)) {
    CXFA_Document* pDoc = pContext->GetDocument();
    if (!pDoc) {
      return;
    }
    IXFA_AppProvider* pAppProvider =
        pDoc->GetParser()->GetNotify()->GetAppProvider();
    if (!pAppProvider) {
      return;
    }
    CFX_ByteString bsURL;
    CFX_ByteString bsData;
    CFX_ByteString bsContentType;
    CFX_ByteString bsEncode;
    CFX_ByteString bsHeader;
    FXJSE_HVALUE argOne;
    FXJSE_HVALUE argTwo;
    FXJSE_HVALUE argThree;
    FXJSE_HVALUE argFour;
    FXJSE_HVALUE argFive;
    argOne = GetSimpleHValue(hThis, args, 0);
    HValueToUTF8String(argOne, bsURL);
    argTwo = GetSimpleHValue(hThis, args, 1);
    HValueToUTF8String(argTwo, bsData);
    if (argc > 2) {
      argThree = GetSimpleHValue(hThis, args, 2);
      HValueToUTF8String(argThree, bsContentType);
    }
    if (argc > 3) {
      argFour = GetSimpleHValue(hThis, args, 3);
      HValueToUTF8String(argFour, bsEncode);
    }
    if (argc > 4) {
      argFive = GetSimpleHValue(hThis, args, 4);
      HValueToUTF8String(argFive, bsHeader);
    }
    CFX_WideString decodedResponse;
    FX_BOOL bFlags = pAppProvider->PostRequestURL(
        CFX_WideString::FromUTF8(bsURL.AsStringC()).AsStringC(),
        CFX_WideString::FromUTF8(bsData.AsStringC()).AsStringC(),
        CFX_WideString::FromUTF8(bsContentType.AsStringC()).AsStringC(),
        CFX_WideString::FromUTF8(bsEncode.AsStringC()).AsStringC(),
        CFX_WideString::FromUTF8(bsHeader.AsStringC()).AsStringC(),
        decodedResponse);
    FXJSE_Value_Release(argOne);
    FXJSE_Value_Release(argTwo);
    if (argc > 2) {
      FXJSE_Value_Release(argThree);
    }
    if (argc > 3) {
      FXJSE_Value_Release(argFour);
    }
    if (argc > 4) {
      FXJSE_Value_Release(argFive);
    }
    if (bFlags) {
      FXJSE_Value_SetUTF8String(
          args.GetReturnValue(),
          FX_UTF8Encode(decodedResponse.c_str(), decodedResponse.GetLength())
              .AsStringC());
    } else {
      pContext->ThrowScriptErrorMessage(XFA_IDS_SERVER_DENY);
    }
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Post");
  }
}
void CXFA_FM2JSContext::Put(FXJSE_HOBJECT hThis,
                            const CFX_ByteStringC& szFuncName,
                            CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  int32_t argc = args.GetLength();
  if ((argc == 2) || (argc == 3)) {
    CXFA_Document* pDoc = pContext->GetDocument();
    if (!pDoc) {
      return;
    }
    IXFA_AppProvider* pAppProvider =
        pDoc->GetParser()->GetNotify()->GetAppProvider();
    if (!pAppProvider) {
      return;
    }
    CFX_ByteString bsURL;
    CFX_ByteString bsData;
    CFX_ByteString bsEncode;
    FXJSE_HVALUE argOne;
    FXJSE_HVALUE argTwo;
    FXJSE_HVALUE argThree;
    argOne = GetSimpleHValue(hThis, args, 0);
    HValueToUTF8String(argOne, bsURL);
    argTwo = GetSimpleHValue(hThis, args, 1);
    HValueToUTF8String(argTwo, bsData);
    if (argc > 2) {
      argThree = GetSimpleHValue(hThis, args, 2);
      HValueToUTF8String(argThree, bsEncode);
    }
    FX_BOOL bFlags = pAppProvider->PutRequestURL(
        CFX_WideString::FromUTF8(bsURL.AsStringC()).AsStringC(),
        CFX_WideString::FromUTF8(bsData.AsStringC()).AsStringC(),
        CFX_WideString::FromUTF8(bsEncode.AsStringC()).AsStringC());
    FXJSE_Value_Release(argOne);
    FXJSE_Value_Release(argTwo);
    if (argc > 2) {
      FXJSE_Value_Release(argThree);
    }
    if (bFlags) {
      FXJSE_Value_SetUTF8String(args.GetReturnValue(), "");
    } else {
      pContext->ThrowScriptErrorMessage(XFA_IDS_SERVER_DENY);
    }
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Put");
  }
}
void CXFA_FM2JSContext::assign_value_operator(FXJSE_HOBJECT hThis,
                                              const CFX_ByteStringC& szFuncName,
                                              CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
  if (args.GetLength() == 2) {
    FXJSE_HVALUE lValue = args.GetValue(0);
    FXJSE_HVALUE rValue = GetSimpleHValue(hThis, args, 1);
    FX_BOOL bSetStatus = TRUE;
    if (FXJSE_Value_IsArray(lValue)) {
      FXJSE_HVALUE leftLengthValue = FXJSE_Value_Create(hruntime);
      FXJSE_Value_GetObjectProp(lValue, "length", leftLengthValue);
      int32_t iLeftLength = FXJSE_Value_ToInteger(leftLengthValue);
      FXJSE_Value_Release(leftLengthValue);
      FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
      FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
      FXJSE_Value_GetObjectPropByIdx(lValue, 1, propertyValue);
      if (FXJSE_Value_IsNull(propertyValue)) {
        for (int32_t i = 2; i < iLeftLength; i++) {
          FXJSE_Value_GetObjectPropByIdx(lValue, i, jsObjectValue);
          bSetStatus = SetObjectDefaultValue(jsObjectValue, rValue);
          if (!bSetStatus) {
            pContext->ThrowScriptErrorMessage(XFA_IDS_NOT_DEFAUL_VALUE);
            break;
          }
        }
      } else {
        CFX_ByteString propertyStr;
        FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
        for (int32_t i = 2; i < iLeftLength; i++) {
          FXJSE_Value_GetObjectPropByIdx(lValue, i, jsObjectValue);
          FXJSE_Value_SetObjectProp(jsObjectValue, propertyStr.AsStringC(),
                                    rValue);
        }
      }
      FXJSE_Value_Release(jsObjectValue);
      FXJSE_Value_Release(propertyValue);
    } else if (FXJSE_Value_IsObject(lValue)) {
      bSetStatus = SetObjectDefaultValue(lValue, rValue);
      if (!bSetStatus) {
        pContext->ThrowScriptErrorMessage(XFA_IDS_NOT_DEFAUL_VALUE);
      }
    }
    FXJSE_Value_Set(args.GetReturnValue(), rValue);
    FXJSE_Value_Release(lValue);
    FXJSE_Value_Release(rValue);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
  }
}
void CXFA_FM2JSContext::logical_or_operator(FXJSE_HOBJECT hThis,
                                            const CFX_ByteStringC& szFuncName,
                                            CFXJSE_Arguments& args) {
  if (args.GetLength() == 2) {
    FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1);
    if (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      FX_FLOAT first = HValueToFloat(hThis, argFirst);
      FX_FLOAT second = HValueToFloat(hThis, argSecond);
      FXJSE_Value_SetInteger(args.GetReturnValue(), (first || second) ? 1 : 0);
    }
    FXJSE_Value_Release(argFirst);
    FXJSE_Value_Release(argSecond);
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
  }
}
void CXFA_FM2JSContext::logical_and_operator(FXJSE_HOBJECT hThis,
                                             const CFX_ByteStringC& szFuncName,
                                             CFXJSE_Arguments& args) {
  if (args.GetLength() == 2) {
    FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1);
    if (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      FX_FLOAT first = HValueToFloat(hThis, argFirst);
      FX_FLOAT second = HValueToFloat(hThis, argSecond);
      FXJSE_Value_SetInteger(args.GetReturnValue(), (first && second) ? 1 : 0);
    }
    FXJSE_Value_Release(argFirst);
    FXJSE_Value_Release(argSecond);
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
  }
}
void CXFA_FM2JSContext::equality_operator(FXJSE_HOBJECT hThis,
                                          const CFX_ByteStringC& szFuncName,
                                          CFXJSE_Arguments& args) {
  if (args.GetLength() == 2) {
    if (fm_ref_equal(hThis, args)) {
      FXJSE_Value_SetInteger(args.GetReturnValue(), 1);
    } else {
      FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0);
      FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1);
      if (FXJSE_Value_IsNull(argFirst) || FXJSE_Value_IsNull(argSecond)) {
        FXJSE_Value_SetInteger(
            args.GetReturnValue(),
            (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond))
                ? 1
                : 0);
      } else if (FXJSE_Value_IsUTF8String(argFirst) &&
                 FXJSE_Value_IsUTF8String(argSecond)) {
        CFX_ByteString firstOutput;
        CFX_ByteString secondOutput;
        FXJSE_Value_ToUTF8String(argFirst, firstOutput);
        FXJSE_Value_ToUTF8String(argSecond, secondOutput);
        FXJSE_Value_SetInteger(args.GetReturnValue(),
                               firstOutput == secondOutput);
      } else {
        FX_DOUBLE first = HValueToDouble(hThis, argFirst);
        FX_DOUBLE second = HValueToDouble(hThis, argSecond);
        FXJSE_Value_SetInteger(args.GetReturnValue(),
                               (first == second) ? 1 : 0);
      }
      FXJSE_Value_Release(argFirst);
      FXJSE_Value_Release(argSecond);
    }
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
  }
}
void CXFA_FM2JSContext::notequality_operator(FXJSE_HOBJECT hThis,
                                             const CFX_ByteStringC& szFuncName,
                                             CFXJSE_Arguments& args) {
  if (args.GetLength() == 2) {
    if (fm_ref_equal(hThis, args)) {
      FXJSE_Value_SetInteger(args.GetReturnValue(), 0);
    } else {
      FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0);
      FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1);
      if (FXJSE_Value_IsNull(argFirst) || FXJSE_Value_IsNull(argSecond)) {
        FXJSE_Value_SetInteger(
            args.GetReturnValue(),
            (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond))
                ? 0
                : 1);
      } else if (FXJSE_Value_IsUTF8String(argFirst) &&
                 FXJSE_Value_IsUTF8String(argSecond)) {
        CFX_ByteString firstOutput;
        CFX_ByteString secondOutput;
        FXJSE_Value_ToUTF8String(argFirst, firstOutput);
        FXJSE_Value_ToUTF8String(argSecond, secondOutput);
        FXJSE_Value_SetInteger(args.GetReturnValue(),
                               firstOutput != secondOutput);
      } else {
        FX_DOUBLE first = HValueToDouble(hThis, argFirst);
        FX_DOUBLE second = HValueToDouble(hThis, argSecond);
        FXJSE_Value_SetInteger(args.GetReturnValue(), first != second);
      }
      FXJSE_Value_Release(argFirst);
      FXJSE_Value_Release(argSecond);
    }
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
  }
}
FX_BOOL CXFA_FM2JSContext::fm_ref_equal(FXJSE_HOBJECT hThis,
                                        CFXJSE_Arguments& args) {
  FX_BOOL bRet = FALSE;
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
  FXJSE_HVALUE argFirst = args.GetValue(0);
  FXJSE_HVALUE argSecond = args.GetValue(0);
  if (FXJSE_Value_IsArray(argFirst) && FXJSE_Value_IsArray(argSecond)) {
    FXJSE_HVALUE firstFlagValue = FXJSE_Value_Create(hruntime);
    FXJSE_HVALUE secondFlagValue = FXJSE_Value_Create(hruntime);
    FXJSE_Value_GetObjectPropByIdx(argFirst, 0, firstFlagValue);
    FXJSE_Value_GetObjectPropByIdx(argSecond, 0, secondFlagValue);
    if ((FXJSE_Value_ToInteger(firstFlagValue) == 3) &&
        (FXJSE_Value_ToInteger(secondFlagValue) == 3)) {
      FXJSE_HVALUE firstJSObject = FXJSE_Value_Create(hruntime);
      FXJSE_HVALUE secondJSObject = FXJSE_Value_Create(hruntime);
      FXJSE_Value_GetObjectPropByIdx(argFirst, 2, firstJSObject);
      FXJSE_Value_GetObjectPropByIdx(argSecond, 2, secondJSObject);
      if (!FXJSE_Value_IsNull(firstJSObject) &&
          !FXJSE_Value_IsNull(secondJSObject)) {
        bRet = (FXJSE_Value_ToObject(firstJSObject, NULL) ==
                FXJSE_Value_ToObject(secondJSObject, NULL));
      }
      FXJSE_Value_Release(firstJSObject);
      FXJSE_Value_Release(secondJSObject);
    }
    FXJSE_Value_Release(firstFlagValue);
    FXJSE_Value_Release(secondFlagValue);
  }
  FXJSE_Value_Release(argFirst);
  FXJSE_Value_Release(argSecond);
  return bRet;
}
void CXFA_FM2JSContext::less_operator(FXJSE_HOBJECT hThis,
                                      const CFX_ByteStringC& szFuncName,
                                      CFXJSE_Arguments& args) {
  if (args.GetLength() == 2) {
    FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1);
    if (FXJSE_Value_IsNull(argFirst) || FXJSE_Value_IsNull(argSecond)) {
      FXJSE_Value_SetInteger(args.GetReturnValue(), 0);
    } else if (FXJSE_Value_IsUTF8String(argFirst) &&
               FXJSE_Value_IsUTF8String(argSecond)) {
      CFX_ByteString firstOutput;
      CFX_ByteString secondOutput;
      FXJSE_Value_ToUTF8String(argFirst, firstOutput);
      FXJSE_Value_ToUTF8String(argSecond, secondOutput);
      FXJSE_Value_SetInteger(
          args.GetReturnValue(),
          firstOutput.Compare(secondOutput.AsStringC()) == -1);
    } else {
      FX_DOUBLE first = HValueToDouble(hThis, argFirst);
      FX_DOUBLE second = HValueToDouble(hThis, argSecond);
      FXJSE_Value_SetInteger(args.GetReturnValue(), (first < second) ? 1 : 0);
    }
    FXJSE_Value_Release(argFirst);
    FXJSE_Value_Release(argSecond);
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
  }
}
void CXFA_FM2JSContext::lessequal_operator(FXJSE_HOBJECT hThis,
                                           const CFX_ByteStringC& szFuncName,
                                           CFXJSE_Arguments& args) {
  if (args.GetLength() == 2) {
    FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1);
    if (FXJSE_Value_IsNull(argFirst) || FXJSE_Value_IsNull(argSecond)) {
      FXJSE_Value_SetInteger(
          args.GetReturnValue(),
          (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) ? 1
                                                                          : 0);
    } else if (FXJSE_Value_IsUTF8String(argFirst) &&
               FXJSE_Value_IsUTF8String(argSecond)) {
      CFX_ByteString firstOutput;
      CFX_ByteString secondOutput;
      FXJSE_Value_ToUTF8String(argFirst, firstOutput);
      FXJSE_Value_ToUTF8String(argSecond, secondOutput);
      FXJSE_Value_SetInteger(
          args.GetReturnValue(),
          firstOutput.Compare(secondOutput.AsStringC()) != 1);
    } else {
      FX_DOUBLE first = HValueToDouble(hThis, argFirst);
      FX_DOUBLE second = HValueToDouble(hThis, argSecond);
      FXJSE_Value_SetInteger(args.GetReturnValue(), (first <= second) ? 1 : 0);
    }
    FXJSE_Value_Release(argFirst);
    FXJSE_Value_Release(argSecond);
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
  }
}
void CXFA_FM2JSContext::greater_operator(FXJSE_HOBJECT hThis,
                                         const CFX_ByteStringC& szFuncName,
                                         CFXJSE_Arguments& args) {
  if (args.GetLength() == 2) {
    FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1);
    if (FXJSE_Value_IsNull(argFirst) || FXJSE_Value_IsNull(argSecond)) {
      FXJSE_Value_SetInteger(args.GetReturnValue(), 0);
    } else if (FXJSE_Value_IsUTF8String(argFirst) &&
               FXJSE_Value_IsUTF8String(argSecond)) {
      CFX_ByteString firstOutput;
      CFX_ByteString secondOutput;
      FXJSE_Value_ToUTF8String(argFirst, firstOutput);
      FXJSE_Value_ToUTF8String(argSecond, secondOutput);
      FXJSE_Value_SetInteger(
          args.GetReturnValue(),
          firstOutput.Compare(secondOutput.AsStringC()) == 1);
    } else {
      FX_DOUBLE first = HValueToDouble(hThis, argFirst);
      FX_DOUBLE second = HValueToDouble(hThis, argSecond);
      FXJSE_Value_SetInteger(args.GetReturnValue(), (first > second) ? 1 : 0);
    }
    FXJSE_Value_Release(argFirst);
    FXJSE_Value_Release(argSecond);
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
  }
}
void CXFA_FM2JSContext::greaterequal_operator(FXJSE_HOBJECT hThis,
                                              const CFX_ByteStringC& szFuncName,
                                              CFXJSE_Arguments& args) {
  if (args.GetLength() == 2) {
    FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1);
    if (FXJSE_Value_IsNull(argFirst) || FXJSE_Value_IsNull(argSecond)) {
      FXJSE_Value_SetInteger(
          args.GetReturnValue(),
          (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) ? 1
                                                                          : 0);
    } else if (FXJSE_Value_IsUTF8String(argFirst) &&
               FXJSE_Value_IsUTF8String(argSecond)) {
      CFX_ByteString firstOutput;
      CFX_ByteString secondOutput;
      FXJSE_Value_ToUTF8String(argFirst, firstOutput);
      FXJSE_Value_ToUTF8String(argSecond, secondOutput);
      FXJSE_Value_SetInteger(
          args.GetReturnValue(),
          firstOutput.Compare(secondOutput.AsStringC()) != -1);
    } else {
      FX_DOUBLE first = HValueToDouble(hThis, argFirst);
      FX_DOUBLE second = HValueToDouble(hThis, argSecond);
      FXJSE_Value_SetInteger(args.GetReturnValue(), (first >= second) ? 1 : 0);
    }
    FXJSE_Value_Release(argFirst);
    FXJSE_Value_Release(argSecond);
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
  }
}
void CXFA_FM2JSContext::plus_operator(FXJSE_HOBJECT hThis,
                                      const CFX_ByteStringC& szFuncName,
                                      CFXJSE_Arguments& args) {
  if (args.GetLength() == 2) {
    FXJSE_HVALUE argFirst = args.GetValue(0);
    FXJSE_HVALUE argSecond = args.GetValue(1);
    if (HValueIsNull(hThis, argFirst) && HValueIsNull(hThis, argSecond)) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      FX_DOUBLE first = HValueToDouble(hThis, argFirst);
      FX_DOUBLE second = HValueToDouble(hThis, argSecond);
      FXJSE_Value_SetDouble(args.GetReturnValue(), first + second);
    }
    FXJSE_Value_Release(argFirst);
    FXJSE_Value_Release(argSecond);
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
  }
}
void CXFA_FM2JSContext::minus_operator(FXJSE_HOBJECT hThis,
                                       const CFX_ByteStringC& szFuncName,
                                       CFXJSE_Arguments& args) {
  if (args.GetLength() == 2) {
    FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1);
    if (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      FX_DOUBLE first = HValueToDouble(hThis, argFirst);
      FX_DOUBLE second = HValueToDouble(hThis, argSecond);
      FXJSE_Value_SetDouble(args.GetReturnValue(), first - second);
    }
    FXJSE_Value_Release(argFirst);
    FXJSE_Value_Release(argSecond);
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
  }
}
void CXFA_FM2JSContext::multiple_operator(FXJSE_HOBJECT hThis,
                                          const CFX_ByteStringC& szFuncName,
                                          CFXJSE_Arguments& args) {
  if (args.GetLength() == 2) {
    FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1);
    if (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      FX_DOUBLE first = HValueToDouble(hThis, argFirst);
      FX_DOUBLE second = HValueToDouble(hThis, argSecond);
      FXJSE_Value_SetDouble(args.GetReturnValue(), first * second);
    }
    FXJSE_Value_Release(argFirst);
    FXJSE_Value_Release(argSecond);
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
  }
}
void CXFA_FM2JSContext::divide_operator(FXJSE_HOBJECT hThis,
                                        const CFX_ByteStringC& szFuncName,
                                        CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  if (args.GetLength() == 2) {
    FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0);
    FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1);
    if (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      FX_DOUBLE first = HValueToDouble(hThis, argFirst);
      FX_DOUBLE second = HValueToDouble(hThis, argSecond);
      if (second == 0.0) {
        pContext->ThrowScriptErrorMessage(XFA_IDS_DIVIDE_ZERO);
      } else {
        FXJSE_Value_SetDouble(args.GetReturnValue(), first / second);
      }
    }
    FXJSE_Value_Release(argFirst);
    FXJSE_Value_Release(argSecond);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
  }
}
void CXFA_FM2JSContext::positive_operator(FXJSE_HOBJECT hThis,
                                          const CFX_ByteStringC& szFuncName,
                                          CFXJSE_Arguments& args) {
  int32_t iLength = args.GetLength();
  if (iLength == 1) {
    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
    if (FXJSE_Value_IsNull(argOne)) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      FXJSE_Value_SetDouble(args.GetReturnValue(),
                            0.0 + HValueToDouble(hThis, argOne));
    }
    FXJSE_Value_Release(argOne);
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
  }
}
void CXFA_FM2JSContext::negative_operator(FXJSE_HOBJECT hThis,
                                          const CFX_ByteStringC& szFuncName,
                                          CFXJSE_Arguments& args) {
  int32_t iLength = args.GetLength();
  if (iLength == 1) {
    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
    if (FXJSE_Value_IsNull(argOne)) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      FXJSE_Value_SetDouble(args.GetReturnValue(),
                            0.0 - HValueToDouble(hThis, argOne));
    }
    FXJSE_Value_Release(argOne);
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
  }
}
void CXFA_FM2JSContext::logical_not_operator(FXJSE_HOBJECT hThis,
                                             const CFX_ByteStringC& szFuncName,
                                             CFXJSE_Arguments& args) {
  int32_t iLength = args.GetLength();
  if (iLength == 1) {
    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
    if (FXJSE_Value_IsNull(argOne)) {
      FXJSE_Value_SetNull(args.GetReturnValue());
    } else {
      FX_DOUBLE first = HValueToDouble(hThis, argOne);
      FXJSE_Value_SetInteger(args.GetReturnValue(), (first == 0.0) ? 1 : 0);
    }
    FXJSE_Value_Release(argOne);
  } else {
    CXFA_FM2JSContext* pContext =
        (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
  }
}
void CXFA_FM2JSContext::dot_accessor(FXJSE_HOBJECT hThis,
                                     const CFX_ByteStringC& szFuncName,
                                     CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
  int32_t argc = args.GetLength();
  if ((argc == 4) || (argc == 5)) {
    FX_BOOL bIsStar = TRUE;
    FXJSE_HVALUE argAccessor = args.GetValue(0);
    CFX_ByteString bsAccessorName = args.GetUTF8String(1);
    CFX_ByteString szName = args.GetUTF8String(2);
    int32_t iIndexFlags = args.GetInt32(3);
    int32_t iIndexValue = 0;
    FXJSE_HVALUE argIndex = NULL;
    if (argc == 5) {
      bIsStar = FALSE;
      argIndex = args.GetValue(4);
      iIndexValue = HValueToInteger(hThis, argIndex);
    }
    CFX_ByteString szSomExp;
    GenerateSomExpression(szName.AsStringC(), iIndexFlags, iIndexValue, bIsStar,
                          szSomExp);
    if (FXJSE_Value_IsArray(argAccessor)) {
      FXJSE_HVALUE hLengthValue = FXJSE_Value_Create(hruntime);
      FXJSE_Value_GetObjectProp(argAccessor, "length", hLengthValue);
      int32_t iLength = FXJSE_Value_ToInteger(hLengthValue);
      FXJSE_Value_Release(hLengthValue);
      int32_t iCounter = 0;
      FXJSE_HVALUE** hResolveValues = FX_Alloc(FXJSE_HVALUE*, iLength - 2);
      int32_t* iSizes = FX_Alloc(int32_t, iLength - 2);
      for (int32_t i = 0; i < (iLength - 2); i++) {
        iSizes[i] = 0;
      }
      FXJSE_HVALUE hJSObjValue = FXJSE_Value_Create(hruntime);
      FX_BOOL bAttribute = FALSE;
      for (int32_t i = 2; i < iLength; i++) {
        FXJSE_Value_GetObjectPropByIdx(argAccessor, i, hJSObjValue);
        XFA_RESOLVENODE_RS resoveNodeRS;
        int32_t iRet = ResolveObjects(hThis, hJSObjValue, szSomExp.AsStringC(),
                                      resoveNodeRS, TRUE, szName.IsEmpty());
        if (iRet > 0) {
          ParseResolveResult(hThis, resoveNodeRS, hJSObjValue,
                             hResolveValues[i - 2], iSizes[i - 2], bAttribute);
          iCounter += iSizes[i - 2];
        }
      }
      FXJSE_Value_Release(hJSObjValue);
      if (iCounter > 0) {
        FXJSE_HVALUE* rgValues = FX_Alloc(FXJSE_HVALUE, iCounter + 2);
        for (int32_t i = 0; i < (iCounter + 2); i++) {
          rgValues[i] = FXJSE_Value_Create(hruntime);
        }
        FXJSE_Value_SetInteger(rgValues[0], 1);
        if (bAttribute) {
          FXJSE_Value_SetUTF8String(rgValues[1], szName.AsStringC());
        } else {
          FXJSE_Value_SetNull(rgValues[1]);
        }
        int32_t iIndex = 2;
        for (int32_t i = 0; i < iLength - 2; i++) {
          for (int32_t j = 0; j < iSizes[i]; j++) {
            FXJSE_Value_Set(rgValues[iIndex], hResolveValues[i][j]);
            iIndex++;
          }
        }
        FXJSE_Value_SetArray(args.GetReturnValue(), (iCounter + 2), rgValues);
        for (int32_t i = 0; i < (iCounter + 2); i++) {
          FXJSE_Value_Release(rgValues[i]);
        }
        FX_Free(rgValues);
      } else {
        CFX_WideString wsPropertyName =
            CFX_WideString::FromUTF8(szName.AsStringC());
        CFX_WideString wsSomExpression =
            CFX_WideString::FromUTF8(szSomExp.AsStringC());
        pContext->ThrowScriptErrorMessage(XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT,
                                          wsPropertyName.c_str(),
                                          wsSomExpression.c_str());
      }
      for (int32_t i = 0; i < iLength - 2; i++) {
        for (int32_t j = 0; j < iSizes[i]; j++) {
          FXJSE_Value_Release(hResolveValues[i][j]);
        }
        if (iSizes[i] > 0) {
          FX_Free(hResolveValues[i]);
        }
      }
      FX_Free(hResolveValues);
      FX_Free(iSizes);
    } else {
      XFA_RESOLVENODE_RS resoveNodeRS;
      int32_t iRet = 0;
      if (FXJSE_Value_IsObject(argAccessor) ||
          (FXJSE_Value_IsNull(argAccessor) && bsAccessorName.IsEmpty())) {
        iRet = ResolveObjects(hThis, argAccessor, szSomExp.AsStringC(),
                              resoveNodeRS, TRUE, szName.IsEmpty());
      } else if (!FXJSE_Value_IsObject(argAccessor) &&
                 !bsAccessorName.IsEmpty()) {
        FX_BOOL bGetObject =
            GetObjectByName(hThis, argAccessor, bsAccessorName.AsStringC());
        if (bGetObject) {
          iRet = ResolveObjects(hThis, argAccessor, szSomExp.AsStringC(),
                                resoveNodeRS, TRUE, szName.IsEmpty());
        }
      }
      if (iRet > 0) {
        FXJSE_HVALUE* hResolveValues;
        int32_t iSize = 0;
        FX_BOOL bAttribute = FALSE;
        ParseResolveResult(hThis, resoveNodeRS, argAccessor, hResolveValues,
                           iSize, bAttribute);
        FXJSE_HVALUE* rgValues = FX_Alloc(FXJSE_HVALUE, iSize + 2);
        for (int32_t i = 0; i < (iSize + 2); i++) {
          rgValues[i] = FXJSE_Value_Create(hruntime);
        }
        FXJSE_Value_SetInteger(rgValues[0], 1);
        if (bAttribute) {
          FXJSE_Value_SetUTF8String(rgValues[1], szName.AsStringC());
        } else {
          FXJSE_Value_SetNull(rgValues[1]);
        }
        for (int32_t i = 0; i < iSize; i++) {
          FXJSE_Value_Set(rgValues[i + 2], hResolveValues[i]);
        }
        FXJSE_Value_SetArray(args.GetReturnValue(), (iSize + 2), rgValues);
        for (int32_t i = 0; i < (iSize + 2); i++) {
          FXJSE_Value_Release(rgValues[i]);
        }
        FX_Free(rgValues);
        for (int32_t i = 0; i < iSize; i++) {
          FXJSE_Value_Release(hResolveValues[i]);
        }
        FX_Free(hResolveValues);
      } else {
        CFX_WideString wsPropertyName =
            CFX_WideString::FromUTF8(szName.AsStringC());
        CFX_WideString wsSomExpression =
            CFX_WideString::FromUTF8(szSomExp.AsStringC());
        pContext->ThrowScriptErrorMessage(XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT,
                                          wsPropertyName.c_str(),
                                          wsSomExpression.c_str());
      }
    }
    if (argc == 5) {
      FXJSE_Value_Release(argIndex);
    }
    FXJSE_Value_Release(argAccessor);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
  }
}
void CXFA_FM2JSContext::dotdot_accessor(FXJSE_HOBJECT hThis,
                                        const CFX_ByteStringC& szFuncName,
                                        CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
  int32_t argc = args.GetLength();
  if ((argc == 4) || (argc == 5)) {
    FX_BOOL bIsStar = TRUE;
    FXJSE_HVALUE argAccessor = args.GetValue(0);
    CFX_ByteString bsAccessorName = args.GetUTF8String(1);
    CFX_ByteString szName = args.GetUTF8String(2);
    int32_t iIndexFlags = args.GetInt32(3);
    int32_t iIndexValue = 0;
    FXJSE_HVALUE argIndex = NULL;
    if (argc == 5) {
      bIsStar = FALSE;
      argIndex = args.GetValue(4);
      iIndexValue = HValueToInteger(hThis, argIndex);
    }
    CFX_ByteString szSomExp;
    GenerateSomExpression(szName.AsStringC(), iIndexFlags, iIndexValue, bIsStar,
                          szSomExp);
    if (FXJSE_Value_IsArray(argAccessor)) {
      FXJSE_HVALUE hLengthValue = FXJSE_Value_Create(hruntime);
      FXJSE_Value_GetObjectProp(argAccessor, "length", hLengthValue);
      int32_t iLength = FXJSE_Value_ToInteger(hLengthValue);
      int32_t iCounter = 0;
      FXJSE_HVALUE** hResolveValues = FX_Alloc(FXJSE_HVALUE*, iLength - 2);
      int32_t* iSizes = FX_Alloc(int32_t, iLength - 2);
      FXJSE_HVALUE hJSObjValue = FXJSE_Value_Create(hruntime);
      FX_BOOL bAttribute = FALSE;
      for (int32_t i = 2; i < iLength; i++) {
        FXJSE_Value_GetObjectPropByIdx(argAccessor, i, hJSObjValue);
        XFA_RESOLVENODE_RS resoveNodeRS;
        int32_t iRet = ResolveObjects(hThis, hJSObjValue, szSomExp.AsStringC(),
                                      resoveNodeRS, FALSE);
        if (iRet > 0) {
          ParseResolveResult(hThis, resoveNodeRS, hJSObjValue,
                             hResolveValues[i - 2], iSizes[i - 2], bAttribute);
          iCounter += iSizes[i - 2];
        }
      }
      FXJSE_Value_Release(hJSObjValue);
      if (iCounter > 0) {
        FXJSE_HVALUE* rgValues = FX_Alloc(FXJSE_HVALUE, iCounter + 2);
        for (int32_t i = 0; i < (iCounter + 2); i++) {
          rgValues[i] = FXJSE_Value_Create(hruntime);
        }
        FXJSE_Value_SetInteger(rgValues[0], 1);
        if (bAttribute) {
          FXJSE_Value_SetUTF8String(rgValues[1], szName.AsStringC());
        } else {
          FXJSE_Value_SetNull(rgValues[1]);
        }
        int32_t iIndex = 2;
        for (int32_t i = 0; i < iLength - 2; i++) {
          for (int32_t j = 0; j < iSizes[i]; j++) {
            FXJSE_Value_Set(rgValues[iIndex], hResolveValues[i][j]);
            iIndex++;
          }
        }
        FXJSE_Value_SetArray(args.GetReturnValue(), (iCounter + 2), rgValues);
        for (int32_t i = 0; i < (iCounter + 2); i++) {
          FXJSE_Value_Release(rgValues[i]);
        }
        FX_Free(rgValues);
      } else {
        CFX_WideString wsPropertyName =
            CFX_WideString::FromUTF8(szName.AsStringC());
        CFX_WideString wsSomExpression =
            CFX_WideString::FromUTF8(szSomExp.AsStringC());
        pContext->ThrowScriptErrorMessage(XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT,
                                          wsPropertyName.c_str(),
                                          wsSomExpression.c_str());
      }
      for (int32_t i = 0; i < iLength - 2; i++) {
        for (int32_t j = 0; j < iSizes[i]; j++) {
          FXJSE_Value_Release(hResolveValues[i][j]);
        }
        FX_Free(hResolveValues[i]);
      }
      FX_Free(hResolveValues);
      FX_Free(iSizes);
      FXJSE_Value_Release(hLengthValue);
    } else {
      XFA_RESOLVENODE_RS resoveNodeRS;
      int32_t iRet = 0;
      if (FXJSE_Value_IsObject(argAccessor) ||
          (FXJSE_Value_IsNull(argAccessor) && bsAccessorName.IsEmpty())) {
        iRet = ResolveObjects(hThis, argAccessor, szSomExp.AsStringC(),
                              resoveNodeRS, FALSE);
      } else if (!FXJSE_Value_IsObject(argAccessor) &&
                 !bsAccessorName.IsEmpty()) {
        FX_BOOL bGetObject =
            GetObjectByName(hThis, argAccessor, bsAccessorName.AsStringC());
        if (bGetObject) {
          iRet = ResolveObjects(hThis, argAccessor, szSomExp.AsStringC(),
                                resoveNodeRS, FALSE);
        }
      }
      if (iRet > 0) {
        FXJSE_HVALUE* hResolveValues;
        int32_t iSize = 0;
        FX_BOOL bAttribute = FALSE;
        ParseResolveResult(hThis, resoveNodeRS, argAccessor, hResolveValues,
                           iSize, bAttribute);
        FXJSE_HVALUE* rgValues = FX_Alloc(FXJSE_HVALUE, iSize + 2);
        for (int32_t i = 0; i < (iSize + 2); i++) {
          rgValues[i] = FXJSE_Value_Create(hruntime);
        }
        FXJSE_Value_SetInteger(rgValues[0], 1);
        if (bAttribute) {
          FXJSE_Value_SetUTF8String(rgValues[1], szName.AsStringC());
        } else {
          FXJSE_Value_SetNull(rgValues[1]);
        }
        for (int32_t i = 0; i < iSize; i++) {
          FXJSE_Value_Set(rgValues[i + 2], hResolveValues[i]);
        }
        FXJSE_Value_SetArray(args.GetReturnValue(), (iSize + 2), rgValues);
        for (int32_t i = 0; i < (iSize + 2); i++) {
          FXJSE_Value_Release(rgValues[i]);
        }
        FX_Free(rgValues);
        for (int32_t i = 0; i < iSize; i++) {
          FXJSE_Value_Release(hResolveValues[i]);
        }
        FX_Free(hResolveValues);
      } else {
        CFX_WideString wsPropertyName =
            CFX_WideString::FromUTF8(szName.AsStringC());
        CFX_WideString wsSomExpression =
            CFX_WideString::FromUTF8(szSomExp.AsStringC());
        pContext->ThrowScriptErrorMessage(XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT,
                                          wsPropertyName.c_str(),
                                          wsSomExpression.c_str());
      }
    }
    if (argc == 5) {
      FXJSE_Value_Release(argIndex);
    }
    FXJSE_Value_Release(argAccessor);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
  }
}
void CXFA_FM2JSContext::eval_translation(FXJSE_HOBJECT hThis,
                                         const CFX_ByteStringC& szFuncName,
                                         CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  int32_t argc = args.GetLength();
  if (argc == 1) {
    FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0);
    CFX_ByteString argString;
    HValueToUTF8String(argOne, argString);
    if (argString.IsEmpty()) {
      pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
    } else {
      CFX_WideString scriptString =
          CFX_WideString::FromUTF8(argString.AsStringC());
      CFX_WideTextBuf wsJavaScriptBuf;
      CFX_WideString wsError;
      XFA_FM2JS_Translate(scriptString.AsStringC(), wsJavaScriptBuf, wsError);
      if (wsError.IsEmpty()) {
        CFX_WideString javaScript = wsJavaScriptBuf.AsStringC();
        FXJSE_Value_SetUTF8String(
            args.GetReturnValue(),
            FX_UTF8Encode(javaScript.c_str(), javaScript.GetLength())
                .AsStringC());
      } else {
        pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
      }
    }
    FXJSE_Value_Release(argOne);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
                                      L"Eval");
  }
}
void CXFA_FM2JSContext::is_fm_object(FXJSE_HOBJECT hThis,
                                     const CFX_ByteStringC& szFuncName,
                                     CFXJSE_Arguments& args) {
  int32_t iLength = args.GetLength();
  if (iLength == 1) {
    FXJSE_HVALUE argOne = args.GetValue(0);
    FXJSE_Value_SetBoolean(args.GetReturnValue(), FXJSE_Value_IsObject(argOne));
    FXJSE_Value_Release(argOne);
  } else {
    FXJSE_Value_SetBoolean(args.GetReturnValue(), FALSE);
  }
}
void CXFA_FM2JSContext::is_fm_array(FXJSE_HOBJECT hThis,
                                    const CFX_ByteStringC& szFuncName,
                                    CFXJSE_Arguments& args) {
  int32_t iLength = args.GetLength();
  if (iLength == 1) {
    FXJSE_HVALUE argOne = args.GetValue(0);
    FX_BOOL bIsArray = FXJSE_Value_IsArray(argOne);
    FXJSE_Value_SetBoolean(args.GetReturnValue(), bIsArray);
    FXJSE_Value_Release(argOne);
  } else {
    FXJSE_Value_SetBoolean(args.GetReturnValue(), FALSE);
  }
}
void CXFA_FM2JSContext::get_fm_value(FXJSE_HOBJECT hThis,
                                     const CFX_ByteStringC& szFuncName,
                                     CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
  int32_t iLength = args.GetLength();
  if (iLength == 1) {
    FXJSE_HVALUE argOne = args.GetValue(0);
    if (FXJSE_Value_IsArray(argOne)) {
      FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
      FXJSE_HVALUE jsobjectValue = FXJSE_Value_Create(hruntime);
      FXJSE_Value_GetObjectPropByIdx(argOne, 1, propertyValue);
      FXJSE_Value_GetObjectPropByIdx(argOne, 2, jsobjectValue);
      if (FXJSE_Value_IsNull(propertyValue)) {
        GetObjectDefaultValue(jsobjectValue, args.GetReturnValue());
      } else {
        CFX_ByteString propertyStr;
        FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
        FXJSE_Value_GetObjectProp(jsobjectValue, propertyStr.AsStringC(),
                                  args.GetReturnValue());
      }
      FXJSE_Value_Release(propertyValue);
      FXJSE_Value_Release(jsobjectValue);
    } else if (FXJSE_Value_IsObject(argOne)) {
      GetObjectDefaultValue(argOne, args.GetReturnValue());
    } else {
      FXJSE_Value_Set(args.GetReturnValue(), argOne);
    }
    FXJSE_Value_Release(argOne);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
  }
}
void CXFA_FM2JSContext::get_fm_jsobj(FXJSE_HOBJECT hThis,
                                     const CFX_ByteStringC& szFuncName,
                                     CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      static_cast<CXFA_FM2JSContext*>(FXJSE_Value_ToObject(hThis, nullptr));
  int32_t argc = args.GetLength();
  if (argc == 1) {
    FXJSE_HVALUE argOne = args.GetValue(0);
    if (FXJSE_Value_IsArray(argOne)) {
#ifndef NDEBUG
      FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
      FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
      FXJSE_Value_GetObjectProp(argOne, "length", lengthValue);
      FXSYS_assert(FXJSE_Value_ToInteger(lengthValue) >= 3);
      FXJSE_Value_Release(lengthValue);
#endif
      FXJSE_Value_GetObjectPropByIdx(argOne, 2, args.GetReturnValue());
    } else {
      FXJSE_Value_Set(args.GetReturnValue(), argOne);
    }
    FXJSE_Value_Release(argOne);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
  }
}
void CXFA_FM2JSContext::fm_var_filter(FXJSE_HOBJECT hThis,
                                      const CFX_ByteStringC& szFuncName,
                                      CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
  int32_t argc = args.GetLength();
  if (argc == 1) {
    FXJSE_HVALUE argOne = args.GetValue(0);
    if (FXJSE_Value_IsArray(argOne)) {
#ifndef NDEBUG
      FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
      FXJSE_Value_GetObjectProp(argOne, "length", lengthValue);
      FXSYS_assert(FXJSE_Value_ToInteger(lengthValue) >= 3);
      FXJSE_Value_Release(lengthValue);
#endif
      FXJSE_HVALUE flagsValue = FXJSE_Value_Create(hruntime);
      FXJSE_Value_GetObjectPropByIdx(argOne, 0, flagsValue);
      int32_t iFlags = FXJSE_Value_ToInteger(flagsValue);
      FXJSE_Value_Release(flagsValue);
      if (iFlags == 4) {
        FXJSE_HVALUE rgValues[3];
        for (int32_t i = 0; i < 3; i++) {
          rgValues[i] = FXJSE_Value_Create(hruntime);
        }
        FXJSE_Value_SetInteger(rgValues[0], 3);
        FXJSE_Value_SetNull(rgValues[1]);
        FXJSE_Value_SetNull(rgValues[2]);
        FXJSE_Value_SetArray(args.GetReturnValue(), 3, rgValues);
        for (int32_t i = 0; i < 3; i++) {
          FXJSE_Value_Release(rgValues[i]);
        }
      } else if (iFlags == 3) {
        FXJSE_HVALUE objectValue = FXJSE_Value_Create(hruntime);
        FXJSE_Value_GetObjectPropByIdx(argOne, 2, objectValue);
        if (!FXJSE_Value_IsNull(objectValue)) {
          FXJSE_Value_Set(args.GetReturnValue(), argOne);
        } else {
          pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
        }
        FXJSE_Value_Release(objectValue);
      } else {
        FXJSE_HVALUE simpleValue = GetSimpleHValue(hThis, args, 0);
        FXJSE_Value_Set(args.GetReturnValue(), simpleValue);
        FXJSE_Value_Release(simpleValue);
      }
    } else {
      FXJSE_HVALUE simpleValue = GetSimpleHValue(hThis, args, 0);
      FXJSE_Value_Set(args.GetReturnValue(), simpleValue);
      FXJSE_Value_Release(simpleValue);
    }
    FXJSE_Value_Release(argOne);
  } else {
    pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR);
  }
}
void CXFA_FM2JSContext::concat_fm_object(FXJSE_HOBJECT hThis,
                                         const CFX_ByteStringC& szFuncName,
                                         CFXJSE_Arguments& args) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
  uint32_t iLength = 0;
  int32_t argCount = args.GetLength();
  FXJSE_HVALUE* argValues = FX_Alloc(FXJSE_HVALUE, argCount);
  for (int32_t i = 0; i < argCount; i++) {
    argValues[i] = args.GetValue(i);
    if (FXJSE_Value_IsArray(argValues[i])) {
      FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
      FXJSE_Value_GetObjectProp(argValues[i], "length", lengthValue);
      int32_t length = FXJSE_Value_ToInteger(lengthValue);
      iLength = iLength + ((length > 2) ? (length - 2) : 0);
      FXJSE_Value_Release(lengthValue);
    }
    iLength += 1;
  }
  FXJSE_HVALUE* returnValues = FX_Alloc(FXJSE_HVALUE, iLength);
  for (int32_t i = 0; i < (int32_t)iLength; i++) {
    returnValues[i] = FXJSE_Value_Create(hruntime);
  }
  int32_t index = 0;
  for (int32_t i = 0; i < argCount; i++) {
    if (FXJSE_Value_IsArray(argValues[i])) {
      FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
      FXJSE_Value_GetObjectProp(argValues[i], "length", lengthValue);
      int32_t length = FXJSE_Value_ToInteger(lengthValue);
      for (int32_t j = 2; j < length; j++) {
        FXJSE_Value_GetObjectPropByIdx(argValues[i], j, returnValues[index]);
        index++;
      }
      FXJSE_Value_Release(lengthValue);
    }
    FXJSE_Value_Set(returnValues[index], argValues[i]);
    index++;
  }
  FXJSE_Value_SetArray(args.GetReturnValue(), iLength, returnValues);
  for (int32_t i = 0; i < argCount; i++) {
    FXJSE_Value_Release(argValues[i]);
  }
  FX_Free(argValues);
  for (int32_t i = 0; i < (int32_t)iLength; i++) {
    FXJSE_Value_Release(returnValues[i]);
  }
  FX_Free(returnValues);
}
FXJSE_HVALUE CXFA_FM2JSContext::GetSimpleHValue(FXJSE_HOBJECT hThis,
                                                CFXJSE_Arguments& args,
                                                uint32_t index) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
  FXSYS_assert(index < (uint32_t)args.GetLength());
  FXJSE_HVALUE argIndex = args.GetValue(index);
  if (FXJSE_Value_IsArray(argIndex)) {
    FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
    FXJSE_Value_GetObjectProp(argIndex, "length", lengthValue);
    int32_t iLength = FXJSE_Value_ToInteger(lengthValue);
    FXJSE_Value_Release(lengthValue);
    FXJSE_HVALUE simpleValue = FXJSE_Value_Create(hruntime);
    if (iLength > 2) {
      FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
      FXJSE_HVALUE jsobjectValue = FXJSE_Value_Create(hruntime);
      FXJSE_Value_GetObjectPropByIdx(argIndex, 1, propertyValue);
      FXJSE_Value_GetObjectPropByIdx(argIndex, 2, jsobjectValue);
      if (FXJSE_Value_IsNull(propertyValue)) {
        GetObjectDefaultValue(jsobjectValue, simpleValue);
      } else {
        CFX_ByteString propertyStr;
        FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
        FXJSE_Value_GetObjectProp(jsobjectValue, propertyStr.AsStringC(),
                                  simpleValue);
      }
      FXJSE_Value_Release(propertyValue);
      FXJSE_Value_Release(jsobjectValue);
    } else {
      FXJSE_Value_SetUndefined(simpleValue);
    }
    FXJSE_Value_Release(argIndex);
    return simpleValue;
  } else if (FXJSE_Value_IsObject(argIndex)) {
    FXJSE_HVALUE defaultValue = FXJSE_Value_Create(hruntime);
    GetObjectDefaultValue(argIndex, defaultValue);
    FXJSE_Value_Release(argIndex);
    return defaultValue;
  } else {
    return argIndex;
  }
}
FX_BOOL CXFA_FM2JSContext::HValueIsNull(FXJSE_HOBJECT hThis, FXJSE_HVALUE arg) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
  FX_BOOL isNull = FALSE;
  if (FXJSE_Value_IsNull(arg)) {
    isNull = TRUE;
  } else if (FXJSE_Value_IsArray(arg)) {
    int32_t iLength = hvalue_get_array_length(hThis, arg);
    if (iLength > 2) {
      FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
      FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
      FXJSE_Value_GetObjectPropByIdx(arg, 1, propertyValue);
      FXJSE_Value_GetObjectPropByIdx(arg, 2, jsObjectValue);
      if (FXJSE_Value_IsNull(propertyValue)) {
        FXJSE_HVALUE defaultValue = FXJSE_Value_Create(hruntime);
        GetObjectDefaultValue(jsObjectValue, defaultValue);
        if (FXJSE_Value_IsNull(defaultValue)) {
          isNull = TRUE;
        }
        FXJSE_Value_Release(defaultValue);
      } else {
        CFX_ByteString propertyStr;
        FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
        FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime);
        FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr.AsStringC(),
                                  newPropertyValue);
        if (FXJSE_Value_IsNull(newPropertyValue)) {
          isNull = TRUE;
        }
        FXJSE_Value_Release(newPropertyValue);
      }
      FXJSE_Value_Release(propertyValue);
      FXJSE_Value_Release(jsObjectValue);
    } else {
      isNull = TRUE;
    }
  } else if (FXJSE_Value_IsObject(arg)) {
    FXJSE_HVALUE defaultValue = FXJSE_Value_Create(hruntime);
    GetObjectDefaultValue(arg, defaultValue);
    if (FXJSE_Value_IsNull(defaultValue)) {
      isNull = TRUE;
    }
    FXJSE_Value_Release(defaultValue);
  }
  return isNull;
}
int32_t CXFA_FM2JSContext::hvalue_get_array_length(FXJSE_HOBJECT hThis,
                                                   FXJSE_HVALUE arg) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
  int32_t iLength = 0;
  if (FXJSE_Value_IsArray(arg)) {
    FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
    FXJSE_Value_GetObjectProp(arg, "length", lengthValue);
    iLength = FXJSE_Value_ToInteger(lengthValue);
    FXJSE_Value_Release(lengthValue);
  }
  return iLength;
}
FX_BOOL CXFA_FM2JSContext::simpleValueCompare(FXJSE_HOBJECT hThis,
                                              FXJSE_HVALUE firstValue,
                                              FXJSE_HVALUE secondValue) {
  FX_BOOL bReturn = FALSE;
  if (FXJSE_Value_IsUTF8String(firstValue)) {
    CFX_ByteString firstString, secondString;
    HValueToUTF8String(firstValue, firstString);
    HValueToUTF8String(secondValue, secondString);
    bReturn = firstString == secondString;
  } else if (FXJSE_Value_IsNumber(firstValue)) {
    FX_FLOAT first = HValueToFloat(hThis, firstValue);
    FX_FLOAT second = HValueToFloat(hThis, secondValue);
    bReturn = (first == second);
  } else if (FXJSE_Value_IsBoolean(firstValue)) {
    bReturn = (FXJSE_Value_ToBoolean(firstValue) ==
               FXJSE_Value_ToBoolean(secondValue));
  } else if (FXJSE_Value_IsNull(firstValue) &&
             FXJSE_Value_IsNull(secondValue)) {
    bReturn = TRUE;
  }
  return bReturn;
}
void CXFA_FM2JSContext::unfoldArgs(FXJSE_HOBJECT hThis,
                                   CFXJSE_Arguments& args,
                                   FXJSE_HVALUE*& resultValues,
                                   int32_t& iCount,
                                   int32_t iStart) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
  iCount = 0;
  int32_t argc = args.GetLength();
  FXJSE_HVALUE* argsValue = FX_Alloc(FXJSE_HVALUE, argc);
  for (int32_t i = iStart; i < argc; i++) {
    argsValue[i] = args.GetValue(i);
    if (FXJSE_Value_IsArray(argsValue[i])) {
      FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
      FXJSE_Value_GetObjectProp(argsValue[i], "length", lengthValue);
      int32_t iLength = FXJSE_Value_ToInteger(lengthValue);
      FXJSE_Value_Release(lengthValue);
      iCount += ((iLength > 2) ? (iLength - 2) : 0);
    } else {
      iCount += 1;
    }
  }
  resultValues = FX_Alloc(FXJSE_HVALUE, iCount);
  for (int32_t i = 0; i < iCount; i++) {
    resultValues[i] = FXJSE_Value_Create(hruntime);
  }
  int32_t index = 0;
  for (int32_t i = iStart; i < argc; i++) {
    if (FXJSE_Value_IsArray(argsValue[i])) {
      FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime);
      FXJSE_Value_GetObjectProp(argsValue[i], "length", lengthValue);
      int32_t iLength = FXJSE_Value_ToInteger(lengthValue);
      FXJSE_Value_Release(lengthValue);
      if (iLength > 2) {
        FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
        FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime);
        FXJSE_Value_GetObjectPropByIdx(argsValue[i], 1, propertyValue);
        if (FXJSE_Value_IsNull(propertyValue)) {
          for (int32_t j = 2; j < iLength; j++) {
            FXJSE_Value_GetObjectPropByIdx(argsValue[i], j, jsObjectValue);
            GetObjectDefaultValue(jsObjectValue, resultValues[index]);
            index++;
          }
        } else {
          CFX_ByteString propertyString;
          FXJSE_Value_ToUTF8String(propertyValue, propertyString);
          for (int32_t j = 2; j < iLength; j++) {
            FXJSE_Value_GetObjectPropByIdx(argsValue[i], j, jsObjectValue);
            FXJSE_Value_GetObjectProp(jsObjectValue, propertyString.AsStringC(),
                                      resultValues[index]);
            index++;
          }
        }
        FXJSE_Value_Release(propertyValue);
        FXJSE_Value_Release(jsObjectValue);
      }
    } else if (FXJSE_Value_IsObject(argsValue[i])) {
      GetObjectDefaultValue(argsValue[i], resultValues[index]);
      index++;
    } else {
      FXJSE_Value_Set(resultValues[index], argsValue[i]);
      index++;
    }
  }
  for (int32_t i = iStart; i < argc; i++) {
    FXJSE_Value_Release(argsValue[i]);
  }
  FX_Free(argsValue);
}
void CXFA_FM2JSContext::GetObjectDefaultValue(FXJSE_HVALUE hObjectValue,
                                              FXJSE_HVALUE hDefaultValue) {
  CXFA_Node* pNode =
      ToNode((CXFA_Object*)FXJSE_Value_ToObject(hObjectValue, NULL));
  if (pNode) {
    pNode->Script_Som_DefaultValue(hDefaultValue, FALSE, (XFA_ATTRIBUTE)-1);
  } else {
    FXJSE_Value_SetNull(hDefaultValue);
  }
}
FX_BOOL CXFA_FM2JSContext::SetObjectDefaultValue(FXJSE_HVALUE hObjectValue,
                                                 FXJSE_HVALUE hNewValue) {
  CXFA_Node* pNode =
      ToNode((CXFA_Object*)FXJSE_Value_ToObject(hObjectValue, NULL));
  if (pNode) {
    pNode->Script_Som_DefaultValue(hNewValue, TRUE, (XFA_ATTRIBUTE)-1);
    return TRUE;
  }
  return FALSE;
}
void CXFA_FM2JSContext::GenerateSomExpression(const CFX_ByteStringC& szName,
                                              int32_t iIndexFlags,
                                              int32_t iIndexValue,
                                              FX_BOOL bIsStar,
                                              CFX_ByteString& szSomExp) {
  if (bIsStar) {
    szSomExp = szName + "[*]";
    return;
  }
  if (iIndexFlags == 0) {
    szSomExp = szName;
    return;
  }
  if (iIndexFlags == 1 || iIndexValue == 0) {
    szSomExp = szName + "[" +
               CFX_ByteString::FormatInteger(iIndexValue, FXFORMAT_SIGNED) +
               "]";
  } else if (iIndexFlags == 2) {
    szSomExp = (iIndexValue < 0) ? (szName + "[-") : (szName + "[+");
    iIndexValue = (iIndexValue < 0) ? (0 - iIndexValue) : iIndexValue;
    szSomExp += CFX_ByteString::FormatInteger(iIndexValue);
    szSomExp += "]";
  } else {
    szSomExp = (iIndexValue < 0) ? (szName + "[") : (szName + "[-");
    iIndexValue = (iIndexValue < 0) ? (0 - iIndexValue) : iIndexValue;
    szSomExp += CFX_ByteString::FormatInteger(iIndexValue);
    szSomExp += "]";
  }
}
FX_BOOL CXFA_FM2JSContext::GetObjectByName(
    FXJSE_HOBJECT hThis,
    FXJSE_HVALUE accessorValue,
    const CFX_ByteStringC& szAccessorName) {
  FX_BOOL bFlags = FALSE;
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  CXFA_Document* pDoc = pContext->GetDocument();
  if (!pDoc) {
    return bFlags;
  }
  CXFA_ScriptContext* pScriptContext = pDoc->GetScriptContext();
  XFA_RESOLVENODE_RS resoveNodeRS;
  uint32_t dwFlags = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties |
                     XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent;
  int32_t iRet = pScriptContext->ResolveObjects(
      pScriptContext->GetThisObject(),
      CFX_WideString::FromUTF8(szAccessorName).AsStringC(), resoveNodeRS,
      dwFlags);
  if (iRet >= 1 && resoveNodeRS.dwFlags == XFA_RESOVENODE_RSTYPE_Nodes) {
    FXJSE_Value_Set(accessorValue, pScriptContext->GetJSValueFromMap(
                                       resoveNodeRS.nodes.GetAt(0)));
    bFlags = TRUE;
  }
  return bFlags;
}
int32_t CXFA_FM2JSContext::ResolveObjects(FXJSE_HOBJECT hThis,
                                          FXJSE_HVALUE hRefValue,
                                          const CFX_ByteStringC& bsSomExp,
                                          XFA_RESOLVENODE_RS& resoveNodeRS,
                                          FX_BOOL bdotAccessor,
                                          FX_BOOL bHasNoResolveName) {
  CFX_WideString wsSomExpression = CFX_WideString::FromUTF8(bsSomExp);
  int32_t iRet = -1;
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  CXFA_Document* pDoc = pContext->GetDocument();
  if (!pDoc) {
    return iRet;
  }
  CXFA_ScriptContext* pScriptContext = pDoc->GetScriptContext();
  CXFA_Object* pNode = NULL;
  uint32_t dFlags = 0UL;
  if (bdotAccessor) {
    if (FXJSE_Value_IsNull(hRefValue)) {
      pNode = pScriptContext->GetThisObject();
      dFlags = XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent;
    } else {
      pNode = (CXFA_Object*)FXJSE_Value_ToObject(hRefValue, NULL);
      FXSYS_assert(pNode);
      if (bHasNoResolveName) {
        CFX_WideString wsName;
        if (CXFA_Node* pXFANode = pNode->AsNode()) {
          pXFANode->GetAttribute(XFA_ATTRIBUTE_Name, wsName, FALSE);
        }
        if (wsName.IsEmpty()) {
          CFX_WideStringC className;
          pNode->GetClassName(className);
          wsName = FX_WSTRC(L"#") + className;
        }
        wsSomExpression = wsName + wsSomExpression;
        dFlags = XFA_RESOLVENODE_Siblings;
      } else {
        dFlags = (bsSomExp == "*")
                     ? (XFA_RESOLVENODE_Children)
                     : (XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Attributes |
                        XFA_RESOLVENODE_Properties);
      }
    }
  } else {
    pNode = (CXFA_Object*)FXJSE_Value_ToObject(hRefValue, NULL);
    dFlags = XFA_RESOLVENODE_AnyChild;
  }
  iRet = pScriptContext->ResolveObjects(pNode, wsSomExpression.AsStringC(),
                                        resoveNodeRS, dFlags);
  return iRet;
}
void CXFA_FM2JSContext::ParseResolveResult(
    FXJSE_HOBJECT hThis,
    const XFA_RESOLVENODE_RS& resoveNodeRS,
    FXJSE_HVALUE hParentValue,
    FXJSE_HVALUE*& resultValues,
    int32_t& iSize,
    FX_BOOL& bAttribute) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  FXJSE_HRUNTIME hRuntime = pContext->GetScriptRuntime();
  iSize = 0;
  resultValues = NULL;
  if (resoveNodeRS.dwFlags == XFA_RESOVENODE_RSTYPE_Nodes) {
    bAttribute = FALSE;
    iSize = resoveNodeRS.nodes.GetSize();
    resultValues = FX_Alloc(FXJSE_HVALUE, iSize);
    for (int32_t i = 0; i < iSize; i++) {
      resultValues[i] = FXJSE_Value_Create(hRuntime);
      FXJSE_Value_Set(
          resultValues[i],
          pContext->GetDocument()->GetScriptContext()->GetJSValueFromMap(
              resoveNodeRS.nodes.GetAt(i)));
    }
  } else {
    CXFA_HVALUEArray objectProperties(hRuntime);
    int32_t iRet = resoveNodeRS.GetAttributeResult(objectProperties);
    bAttribute = (iRet == 0);
    if (bAttribute) {
      if (FXJSE_Value_IsObject(hParentValue)) {
        iSize = 1;
        resultValues = FX_Alloc(FXJSE_HVALUE, 1);
        resultValues[0] = FXJSE_Value_Create(hRuntime);
        FXJSE_Value_Set(resultValues[0], hParentValue);
      }
    } else {
      iSize = iRet;
      resultValues = FX_Alloc(FXJSE_HVALUE, iSize);
      for (int32_t i = 0; i < iSize; i++) {
        resultValues[i] = FXJSE_Value_Create(hRuntime);
        FXJSE_Value_Set(resultValues[i], objectProperties[i]);
      }
    }
  }
}
int32_t CXFA_FM2JSContext::HValueToInteger(FXJSE_HOBJECT hThis,
                                           FXJSE_HVALUE hValue) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
  int32_t iValue = 0;
  if (FXJSE_Value_IsArray(hValue)) {
    FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
    FXJSE_HVALUE jsobjectValue = FXJSE_Value_Create(hruntime);
    FXJSE_HVALUE newProperty = FXJSE_Value_Create(hruntime);
    FXJSE_Value_GetObjectPropByIdx(hValue, 1, propertyValue);
    FXJSE_Value_GetObjectPropByIdx(hValue, 2, jsobjectValue);
    if (FXJSE_Value_IsNull(propertyValue)) {
      GetObjectDefaultValue(jsobjectValue, newProperty);
    } else {
      CFX_ByteString propertyStr;
      FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
      FXJSE_Value_GetObjectProp(jsobjectValue, propertyStr.AsStringC(),
                                newProperty);
    }
    iValue = HValueToInteger(hThis, newProperty);
    FXJSE_Value_Release(newProperty);
    FXJSE_Value_Release(jsobjectValue);
    FXJSE_Value_Release(propertyValue);
    return iValue;
  } else if (FXJSE_Value_IsObject(hValue)) {
    FXJSE_HVALUE newProperty = FXJSE_Value_Create(hruntime);
    GetObjectDefaultValue(hValue, newProperty);
    iValue = HValueToInteger(hThis, newProperty);
    FXJSE_Value_Release(newProperty);
    return iValue;
  } else if (FXJSE_Value_IsUTF8String(hValue)) {
    CFX_ByteString szValue;
    FXJSE_Value_ToUTF8String(hValue, szValue);
    iValue = FXSYS_atoi(szValue.c_str());
  } else {
    iValue = FXJSE_Value_ToInteger(hValue);
  }
  return iValue;
}
FX_DOUBLE CXFA_FM2JSContext::StringToDouble(
    const CFX_ByteStringC& szStringVal) {
  return XFA_ByteStringToDouble(szStringVal);
}
FX_FLOAT CXFA_FM2JSContext::HValueToFloat(FXJSE_HOBJECT hThis,
                                          FXJSE_HVALUE arg) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
  FX_FLOAT fRet = 0.0f;
  if (FXJSE_Value_IsArray(arg)) {
    FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
    FXJSE_HVALUE jsobjectValue = FXJSE_Value_Create(hruntime);
    FXJSE_HVALUE newProperty = FXJSE_Value_Create(hruntime);
    FXJSE_Value_GetObjectPropByIdx(arg, 1, propertyValue);
    FXJSE_Value_GetObjectPropByIdx(arg, 2, jsobjectValue);
    if (FXJSE_Value_IsNull(propertyValue)) {
      GetObjectDefaultValue(jsobjectValue, newProperty);
    } else {
      CFX_ByteString propertyStr;
      FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
      FXJSE_Value_GetObjectProp(jsobjectValue, propertyStr.AsStringC(),
                                newProperty);
    }
    fRet = HValueToFloat(hThis, newProperty);
    FXJSE_Value_Release(newProperty);
    FXJSE_Value_Release(jsobjectValue);
    FXJSE_Value_Release(propertyValue);
  } else if (FXJSE_Value_IsObject(arg)) {
    FXJSE_HVALUE newProperty = FXJSE_Value_Create(hruntime);
    GetObjectDefaultValue(arg, newProperty);
    fRet = HValueToFloat(hThis, newProperty);
    FXJSE_Value_Release(newProperty);
  } else if (FXJSE_Value_IsUTF8String(arg)) {
    CFX_ByteString bsOutput;
    FXJSE_Value_ToUTF8String(arg, bsOutput);
    fRet = (FX_FLOAT)StringToDouble(bsOutput.AsStringC());
  } else if (FXJSE_Value_IsUndefined(arg)) {
    fRet = 0;
  } else {
    fRet = FXJSE_Value_ToFloat(arg);
  }
  return fRet;
}
FX_DOUBLE CXFA_FM2JSContext::HValueToDouble(FXJSE_HOBJECT hThis,
                                            FXJSE_HVALUE arg) {
  CXFA_FM2JSContext* pContext =
      (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL);
  FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime();
  FX_DOUBLE dRet = 0;
  if (FXJSE_Value_IsArray(arg)) {
    FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime);
    FXJSE_HVALUE jsobjectValue = FXJSE_Value_Create(hruntime);
    FXJSE_HVALUE newProperty = FXJSE_Value_Create(hruntime);
    FXJSE_Value_GetObjectPropByIdx(arg, 1, propertyValue);
    FXJSE_Value_GetObjectPropByIdx(arg, 2, jsobjectValue);
    if (FXJSE_Value_IsNull(propertyValue)) {
      GetObjectDefaultValue(jsobjectValue, newProperty);
    } else {
      CFX_ByteString propertyStr;
      FXJSE_Value_ToUTF8String(propertyValue, propertyStr);
      FXJSE_Value_GetObjectProp(jsobjectValue, propertyStr.AsStringC(),
                                newProperty);
    }
    dRet = HValueToDouble(hThis, newProperty);
    FXJSE_Value_Release(newProperty);
    FXJSE_Value_Release(jsobjectValue);
    FXJSE_Value_Release(propertyValue);
  } else if (FXJSE_Value_IsObject(arg)) {
    FXJSE_HVALUE newProperty = FXJSE_Value_Create(hruntime);
    GetObjectDefaultValue(arg, newProperty);
    dRet = HValueToDouble(hThis, newProperty);
    FXJSE_Value_Release(newProperty);
  } else if (FXJSE_Value_IsUTF8String(arg)) {
    CFX_ByteString bsOutput;
    FXJSE_Value_ToUTF8String(arg, bsOutput);
    dRet = StringToDouble(bsOutput.AsStringC());
  } else if (FXJSE_Value_IsUndefined(arg)) {
    dRet = 0;
  } else {
    dRet = FXJSE_Value_ToDouble(arg);
  }
  return dRet;
}
void CXFA_FM2JSContext::HValueToUTF8String(FXJSE_HVALUE arg,
                                           CFX_ByteString& szOutputString) {
  if (FXJSE_Value_IsNull(arg) || FXJSE_Value_IsUndefined(arg)) {
    szOutputString = "";
  } else if (FXJSE_Value_IsBoolean(arg)) {
    szOutputString = FXJSE_Value_ToBoolean(arg) ? "1" : "0";
  } else {
    szOutputString = "";
    FXJSE_Value_ToUTF8String(arg, szOutputString);
  }
}
static FXJSE_FUNCTION formcalc_fm2js_functions[] = {
    {"Abs", CXFA_FM2JSContext::Abs},
    {"Avg", CXFA_FM2JSContext::Avg},
    {"Ceil", CXFA_FM2JSContext::Ceil},
    {"Count", CXFA_FM2JSContext::Count},
    {"Floor", CXFA_FM2JSContext::Floor},
    {"Max", CXFA_FM2JSContext::Max},
    {"Min", CXFA_FM2JSContext::Min},
    {"Mod", CXFA_FM2JSContext::Mod},
    {"Round", CXFA_FM2JSContext::Round},
    {"Sum", CXFA_FM2JSContext::Sum},
    {"Date", CXFA_FM2JSContext::Date},
    {"Date2Num", CXFA_FM2JSContext::Date2Num},
    {"DateFmt", CXFA_FM2JSContext::DateFmt},
    {"IsoDate2Num", CXFA_FM2JSContext::IsoDate2Num},
    {"IsoTime2Num", CXFA_FM2JSContext::IsoTime2Num},
    {"LocalDateFmt", CXFA_FM2JSContext::LocalDateFmt},
    {"LocalTimeFmt", CXFA_FM2JSContext::LocalTimeFmt},
    {"Num2Date", CXFA_FM2JSContext::Num2Date},
    {"Num2GMTime", CXFA_FM2JSContext::Num2GMTime},
    {"Num2Time", CXFA_FM2JSContext::Num2Time},
    {"Time", CXFA_FM2JSContext::Time},
    {"Time2Num", CXFA_FM2JSContext::Time2Num},
    {"TimeFmt", CXFA_FM2JSContext::TimeFmt},
    {"Apr", CXFA_FM2JSContext::Apr},
    {"Cterm", CXFA_FM2JSContext::CTerm},
    {"FV", CXFA_FM2JSContext::FV},
    {"Ipmt", CXFA_FM2JSContext::IPmt},
    {"NPV", CXFA_FM2JSContext::NPV},
    {"Pmt", CXFA_FM2JSContext::Pmt},
    {"PPmt", CXFA_FM2JSContext::PPmt},
    {"PV", CXFA_FM2JSContext::PV},
    {"Rate", CXFA_FM2JSContext::Rate},
    {"Term", CXFA_FM2JSContext::Term},
    {"Choose", CXFA_FM2JSContext::Choose},
    {"Exists", CXFA_FM2JSContext::Exists},
    {"HasValue", CXFA_FM2JSContext::HasValue},
    {"Oneof", CXFA_FM2JSContext::Oneof},
    {"Within", CXFA_FM2JSContext::Within},
    {"If", CXFA_FM2JSContext::If},
    {"Eval", CXFA_FM2JSContext::Eval},
    {"Translate", CXFA_FM2JSContext::eval_translation},
    {"Ref", CXFA_FM2JSContext::Ref},
    {"UnitType", CXFA_FM2JSContext::UnitType},
    {"UnitValue", CXFA_FM2JSContext::UnitValue},
    {"At", CXFA_FM2JSContext::At},
    {"Concat", CXFA_FM2JSContext::Concat},
    {"Decode", CXFA_FM2JSContext::Decode},
    {"Encode", CXFA_FM2JSContext::Encode},
    {"Format", CXFA_FM2JSContext::Format},
    {"Left", CXFA_FM2JSContext::Left},
    {"Len", CXFA_FM2JSContext::Len},
    {"Lower", CXFA_FM2JSContext::Lower},
    {"Ltrim", CXFA_FM2JSContext::Ltrim},
    {"Parse", CXFA_FM2JSContext::Parse},
    {"Replace", CXFA_FM2JSContext::Replace},
    {"Right", CXFA_FM2JSContext::Right},
    {"Rtrim", CXFA_FM2JSContext::Rtrim},
    {"Space", CXFA_FM2JSContext::Space},
    {"Str", CXFA_FM2JSContext::Str},
    {"Stuff", CXFA_FM2JSContext::Stuff},
    {"Substr", CXFA_FM2JSContext::Substr},
    {"Uuid", CXFA_FM2JSContext::Uuid},
    {"Upper", CXFA_FM2JSContext::Upper},
    {"WordNum", CXFA_FM2JSContext::WordNum},
    {"Get", CXFA_FM2JSContext::Get},
    {"Post", CXFA_FM2JSContext::Post},
    {"Put", CXFA_FM2JSContext::Put},
    {"positive_operator", CXFA_FM2JSContext::positive_operator},
    {"negative_operator", CXFA_FM2JSContext::negative_operator},
    {"logical_or_operator", CXFA_FM2JSContext::logical_or_operator},
    {"logical_and_operator", CXFA_FM2JSContext::logical_and_operator},
    {"logical_not_operator", CXFA_FM2JSContext::logical_not_operator},
    {"equality_operator", CXFA_FM2JSContext::equality_operator},
    {"notequality_operator", CXFA_FM2JSContext::notequality_operator},
    {"less_operator", CXFA_FM2JSContext::less_operator},
    {"lessequal_operator", CXFA_FM2JSContext::lessequal_operator},
    {"greater_operator", CXFA_FM2JSContext::greater_operator},
    {"greaterequal_operator", CXFA_FM2JSContext::greaterequal_operator},
    {"plus_operator", CXFA_FM2JSContext::plus_operator},
    {"minus_operator", CXFA_FM2JSContext::minus_operator},
    {"multiple_operator", CXFA_FM2JSContext::multiple_operator},
    {"divide_operator", CXFA_FM2JSContext::divide_operator},
    {"assign_value_operator", CXFA_FM2JSContext::assign_value_operator},
    {"dot_accessor", CXFA_FM2JSContext::dot_accessor},
    {"dotdot_accessor", CXFA_FM2JSContext::dotdot_accessor},
    {"concat_fm_object", CXFA_FM2JSContext::concat_fm_object},
    {"is_fm_object", CXFA_FM2JSContext::is_fm_object},
    {"is_fm_array", CXFA_FM2JSContext::is_fm_array},
    {"get_fm_value", CXFA_FM2JSContext::get_fm_value},
    {"get_fm_jsobj", CXFA_FM2JSContext::get_fm_jsobj},
    {"fm_var_filter", CXFA_FM2JSContext::fm_var_filter},
};
CXFA_FM2JSContext::CXFA_FM2JSContext()
    : m_hFMClass(nullptr), m_pDocument(nullptr) {
  FXSYS_memset(&m_fmClass, 0, sizeof(FXJSE_CLASS));
}
CXFA_FM2JSContext::~CXFA_FM2JSContext() {
  m_pDocument = NULL;
  if (m_hValue) {
    FXJSE_Value_Release(m_hValue);
    m_hValue = NULL;
  }
  m_hScriptRuntime = NULL;
}
CXFA_FM2JSContext* CXFA_FM2JSContext::Create() {
  return new CXFA_FM2JSContext;
}
void CXFA_FM2JSContext::Initialize(FXJSE_HRUNTIME hScriptRuntime,
                                   FXJSE_HCONTEXT hScriptContext,
                                   CXFA_Document* pDoc) {
  m_pDocument = pDoc;
  m_hScriptRuntime = hScriptRuntime;
  m_fmClass.name = "XFA_FM2JS_FormCalcClass";
  m_fmClass.constructor = NULL;
  m_fmClass.properties = NULL;
  m_fmClass.methods = formcalc_fm2js_functions;
  m_fmClass.propNum = 0;
  m_fmClass.methNum =
      sizeof(formcalc_fm2js_functions) / sizeof(formcalc_fm2js_functions[0]);
  m_hFMClass = FXJSE_DefineClass(hScriptContext, &m_fmClass);
  m_hValue = FXJSE_Value_Create(hScriptRuntime);
  FXJSE_Value_SetNull(m_hValue);
  FXJSE_Value_SetObject(m_hValue, this, m_hFMClass);
}
void CXFA_FM2JSContext::GlobalPropertyGetter(FXJSE_HVALUE hValue) {
  FXJSE_Value_Set(hValue, m_hValue);
}
void CXFA_FM2JSContext::Release() {
  delete this;
}
void CXFA_FM2JSContext::ThrowScriptErrorMessage(int32_t iStringID, ...) {
  IXFA_AppProvider* pAppProvider = m_pDocument->GetNotify()->GetAppProvider();
  FXSYS_assert(pAppProvider);
  CFX_WideString wsFormat;
  pAppProvider->LoadString(iStringID, wsFormat);
  CFX_WideString wsMessage;
  va_list arg_ptr;
  va_start(arg_ptr, iStringID);
  wsMessage.FormatV(wsFormat.c_str(), arg_ptr);
  va_end(arg_ptr);
  FXJSE_ThrowMessage(
      "", FX_UTF8Encode(wsMessage.c_str(), wsMessage.GetLength()).AsStringC());
}
