Home | History | Annotate | Download | only in parser
      1 // Copyright 2014 PDFium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
      6 
      7 #include "xfa/src/foxitlib.h"
      8 #include "xfa/src/fxfa/src/common/xfa_utils.h"
      9 #include "xfa/src/fxfa/src/common/xfa_object.h"
     10 #include "xfa/src/fxfa/src/common/xfa_document.h"
     11 #include "xfa/src/fxfa/src/common/xfa_parser.h"
     12 #include "xfa/src/fxfa/src/common/xfa_script.h"
     13 #include "xfa/src/fxfa/src/common/xfa_docdata.h"
     14 #include "xfa/src/fxfa/src/common/xfa_doclayout.h"
     15 #include "xfa/src/fxfa/src/common/xfa_localemgr.h"
     16 #include "xfa/src/fxfa/src/common/xfa_fm2jsapi.h"
     17 #include "xfa_basic_imp.h"
     18 #include "xfa_document_layout_imp.h"
     19 CXFA_Object::CXFA_Object(CXFA_Document* pDocument, FX_DWORD uFlags)
     20     : m_pDocument(pDocument), m_uFlags(uFlags) {}
     21 void CXFA_Object::GetClassName(CFX_WideStringC& wsName) const {
     22   XFA_LPCELEMENTINFO pElement = XFA_GetElementByID(GetClassID());
     23   ASSERT(pElement != NULL);
     24   wsName = pElement->pName;
     25 }
     26 uint32_t CXFA_Object::GetClassHashCode() const {
     27   XFA_LPCELEMENTINFO pElement = XFA_GetElementByID(GetClassID());
     28   ASSERT(pElement != NULL);
     29   return pElement->uHash;
     30 }
     31 XFA_ELEMENT CXFA_Object::GetClassID() const {
     32   if (IsNode()) {
     33     return ((const CXFA_Node*)this)->GetClassID();
     34   } else if (IsOrdinaryObject()) {
     35     return ((const CXFA_OrdinaryObject*)this)->GetClassID();
     36   } else if (IsNodeList()) {
     37     return ((const CXFA_NodeList*)this)->GetClassID();
     38   } else if (IsOrdinaryList()) {
     39     return XFA_ELEMENT_List;
     40   }
     41   ASSERT(FALSE);
     42   return (XFA_ELEMENT)0;
     43 }
     44 void CXFA_Object::Script_ObjectClass_ClassName(FXJSE_HVALUE hValue,
     45                                                FX_BOOL bSetting,
     46                                                XFA_ATTRIBUTE eAttribute) {
     47   if (!bSetting) {
     48     CFX_WideStringC className;
     49     GetClassName(className);
     50     FXJSE_Value_SetUTF8String(
     51         hValue, FX_UTF8Encode(className.GetPtr(), className.GetLength()));
     52   } else {
     53     ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
     54   }
     55 }
     56 void CXFA_Object::ThrowScriptErrorMessage(int32_t iStringID, ...) {
     57   IXFA_AppProvider* pAppProvider = m_pDocument->GetNotify()->GetAppProvider();
     58   FXSYS_assert(pAppProvider);
     59   CFX_WideString wsFormat;
     60   pAppProvider->LoadString(iStringID, wsFormat);
     61   CFX_WideString wsMessage;
     62   va_list arg_ptr;
     63   va_start(arg_ptr, iStringID);
     64   wsMessage.FormatV((const FX_WCHAR*)wsFormat, arg_ptr);
     65   va_end(arg_ptr);
     66   FXJSE_ThrowMessage("", FX_UTF8Encode(wsMessage, wsMessage.GetLength()));
     67 }
     68 static void XFA_DeleteWideString(void* pData) {
     69   if (pData) {
     70     delete (CFX_WideString*)pData;
     71   }
     72 }
     73 static void XFA_CopyWideString(void*& pData) {
     74   if (pData) {
     75     CFX_WideString* pNewData = new CFX_WideString(*(CFX_WideString*)pData);
     76     pData = pNewData;
     77   }
     78 }
     79 static XFA_MAPDATABLOCKCALLBACKINFO deleteWideStringCallBack = {
     80     XFA_DeleteWideString, XFA_CopyWideString};
     81 static XFA_OBJECTTYPE XFA_GetElementObjectType(XFA_ELEMENT eElement) {
     82   XFA_LPCELEMENTINFO pElement = XFA_GetElementByID(eElement);
     83   ASSERT(pElement != NULL);
     84   return (XFA_OBJECTTYPE)pElement->eObjectType;
     85 }
     86 CXFA_Node::CXFA_Node(CXFA_Document* pDoc, FX_WORD ePacket, XFA_ELEMENT eElement)
     87     : CXFA_Object(pDoc, XFA_GetElementObjectType(eElement)),
     88       m_pNext(nullptr),
     89       m_pChild(nullptr),
     90       m_pLastChild(nullptr),
     91       m_pParent(nullptr),
     92       m_pXMLNode(nullptr),
     93       m_eNodeClass(eElement),
     94       m_ePacket(ePacket),
     95       m_dwNameHash(0),
     96       m_pAuxNode(nullptr),
     97       m_pMapModuleData(nullptr) {
     98   ASSERT(m_pDocument);
     99 }
    100 CXFA_Node::~CXFA_Node() {
    101   FXSYS_assert(m_pParent == NULL);
    102   RemoveMapModuleKey();
    103   CXFA_Node *pNext, *pNode = m_pChild;
    104   while (pNode) {
    105     pNext = pNode->m_pNext;
    106     pNode->m_pParent = NULL;
    107     delete pNode;
    108     pNode = pNext;
    109   }
    110   if (m_pXMLNode && HasFlag(XFA_NODEFLAG_OwnXMLNode)) {
    111     m_pXMLNode->Release();
    112   }
    113 }
    114 CXFA_Node* CXFA_Node::Clone(FX_BOOL bRecursive) {
    115   IXFA_ObjFactory* pFactory = m_pDocument->GetParser()->GetFactory();
    116   CXFA_Node* pClone = pFactory->CreateNode(m_ePacket, m_eNodeClass);
    117   if (!pClone) {
    118     return NULL;
    119   }
    120   MergeAllData(pClone);
    121   pClone->UpdateNameHash();
    122   if (IsNeedSavingXMLNode()) {
    123     IFDE_XMLNode* pCloneXML = NULL;
    124     if (IsAttributeInXML()) {
    125       CFX_WideString wsName;
    126       this->GetAttribute(XFA_ATTRIBUTE_Name, wsName, FALSE);
    127       IFDE_XMLElement* pCloneXMLElement = IFDE_XMLElement::Create(wsName);
    128       CFX_WideStringC wsValue = this->GetCData(XFA_ATTRIBUTE_Value);
    129       if (!wsValue.IsEmpty()) {
    130         pCloneXMLElement->SetTextData(wsValue);
    131       }
    132       pCloneXML = pCloneXMLElement;
    133       pCloneXMLElement = NULL;
    134       pClone->SetEnum(XFA_ATTRIBUTE_Contains, XFA_ATTRIBUTEENUM_Unknown);
    135     } else {
    136       pCloneXML = m_pXMLNode->Clone(FALSE);
    137     }
    138     pClone->SetXMLMappingNode(pCloneXML);
    139     pClone->SetFlag(XFA_NODEFLAG_OwnXMLNode, TRUE, FALSE);
    140   }
    141   if (bRecursive) {
    142     for (CXFA_Node* pChild = GetNodeItem(XFA_NODEITEM_FirstChild); pChild;
    143          pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling)) {
    144       pClone->InsertChild(pChild->Clone(bRecursive));
    145     }
    146   }
    147   pClone->SetFlag(XFA_NODEFLAG_Initialized);
    148   pClone->SetObject(XFA_ATTRIBUTE_BindingNode, NULL);
    149   return pClone;
    150 }
    151 CXFA_Node* CXFA_Node::GetNodeItem(XFA_NODEITEM eItem) const {
    152   switch (eItem) {
    153     case XFA_NODEITEM_NextSibling:
    154       return m_pNext;
    155     case XFA_NODEITEM_FirstChild:
    156       return m_pChild;
    157     case XFA_NODEITEM_Parent:
    158       return m_pParent;
    159     case XFA_NODEITEM_PrevSibling:
    160       if (m_pParent) {
    161         CXFA_Node* pSibling = m_pParent->m_pChild;
    162         CXFA_Node* pPrev = NULL;
    163         while (pSibling && pSibling != this) {
    164           pPrev = pSibling;
    165           pSibling = pSibling->m_pNext;
    166         }
    167         return pPrev;
    168       }
    169       return NULL;
    170     default:
    171       break;
    172   }
    173   return NULL;
    174 }
    175 CXFA_Node* CXFA_Node::GetNodeItem(XFA_NODEITEM eItem,
    176                                   XFA_OBJECTTYPE eType) const {
    177   CXFA_Node* pNode = NULL;
    178   switch (eItem) {
    179     case XFA_NODEITEM_NextSibling:
    180       pNode = m_pNext;
    181       if (eType != XFA_OBJECTTYPEMASK)
    182         while (pNode && pNode->GetObjectType() != eType) {
    183           pNode = pNode->m_pNext;
    184         }
    185       break;
    186     case XFA_NODEITEM_FirstChild:
    187       pNode = m_pChild;
    188       if (eType != XFA_OBJECTTYPEMASK)
    189         while (pNode && pNode->GetObjectType() != eType) {
    190           pNode = pNode->m_pNext;
    191         }
    192       break;
    193     case XFA_NODEITEM_Parent:
    194       pNode = m_pParent;
    195       if (eType != XFA_OBJECTTYPEMASK)
    196         while (pNode && pNode->GetObjectType() != eType) {
    197           pNode = pNode->m_pParent;
    198         }
    199       break;
    200     case XFA_NODEITEM_PrevSibling:
    201       if (m_pParent) {
    202         CXFA_Node* pSibling = m_pParent->m_pChild;
    203         while (pSibling && pSibling != this) {
    204           if (eType == XFA_OBJECTTYPEMASK ||
    205               eType == pSibling->GetObjectType()) {
    206             pNode = pSibling;
    207           }
    208           pSibling = pSibling->m_pNext;
    209         }
    210       }
    211       break;
    212     default:
    213       break;
    214   }
    215   return pNode;
    216 }
    217 int32_t CXFA_Node::GetNodeList(CXFA_NodeArray& nodes,
    218                                FX_DWORD dwTypeFilter,
    219                                XFA_ELEMENT eElementFilter,
    220                                int32_t iLevel) {
    221   if (--iLevel < 0) {
    222     return nodes.GetSize();
    223   }
    224   if (eElementFilter != XFA_ELEMENT_UNKNOWN) {
    225     CXFA_Node* pChild = m_pChild;
    226     while (pChild) {
    227       if (pChild->GetClassID() == eElementFilter) {
    228         nodes.Add(pChild);
    229         if (iLevel > 0) {
    230           GetNodeList(nodes, dwTypeFilter, eElementFilter, iLevel);
    231         }
    232       }
    233       pChild = pChild->m_pNext;
    234     }
    235   } else if (dwTypeFilter ==
    236              (XFA_NODEFILTER_Children | XFA_NODEFILTER_Properties)) {
    237     CXFA_Node* pChild = m_pChild;
    238     while (pChild) {
    239       nodes.Add(pChild);
    240       if (iLevel > 0) {
    241         GetNodeList(nodes, dwTypeFilter, eElementFilter, iLevel);
    242       }
    243       pChild = pChild->m_pNext;
    244     }
    245   } else if (dwTypeFilter != 0) {
    246     FX_BOOL bFilterChildren = (dwTypeFilter & XFA_NODEFILTER_Children) != 0;
    247     FX_BOOL bFilterProperties = (dwTypeFilter & XFA_NODEFILTER_Properties) != 0;
    248     FX_BOOL bFilterOneOfProperties =
    249         (dwTypeFilter & XFA_NODEFILTER_OneOfProperty) != 0;
    250     CXFA_Node* pChild = m_pChild;
    251     while (pChild) {
    252       XFA_LPCPROPERTY pPropert = XFA_GetPropertyOfElement(
    253           GetClassID(), pChild->GetClassID(), XFA_XDPPACKET_UNKNOWN);
    254       if (pPropert) {
    255         if (bFilterProperties) {
    256           nodes.Add(pChild);
    257         } else if (bFilterOneOfProperties &&
    258                    (pPropert->uFlags & XFA_PROPERTYFLAG_OneOf)) {
    259           nodes.Add(pChild);
    260         } else if (bFilterChildren &&
    261                    (pChild->GetClassID() == XFA_ELEMENT_Variables ||
    262                     pChild->GetClassID() == XFA_ELEMENT_PageSet)) {
    263           nodes.Add(pChild);
    264         }
    265       } else {
    266         if (bFilterChildren) {
    267           nodes.Add(pChild);
    268         }
    269       }
    270       pChild = pChild->m_pNext;
    271     }
    272     if (bFilterOneOfProperties && nodes.GetSize() < 1) {
    273       int32_t iProperties = 0;
    274       XFA_LPCPROPERTY pProperty =
    275           XFA_GetElementProperties(GetClassID(), iProperties);
    276       if (pProperty == NULL || iProperties < 1) {
    277         return 0;
    278       }
    279       for (int32_t i = 0; i < iProperties; i++) {
    280         if (pProperty[i].uFlags & XFA_PROPERTYFLAG_DefaultOneOf) {
    281           IXFA_ObjFactory* pFactory = m_pDocument->GetParser()->GetFactory();
    282           XFA_LPCPACKETINFO pPacket = XFA_GetPacketByID(GetPacketID());
    283           CXFA_Node* pNewNode =
    284               pFactory->CreateNode(pPacket, (XFA_ELEMENT)pProperty[i].eName);
    285           if (!pNewNode) {
    286             break;
    287           }
    288           InsertChild(pNewNode, NULL);
    289           pNewNode->SetFlag(XFA_NODEFLAG_Initialized);
    290           nodes.Add(pNewNode);
    291           break;
    292         }
    293       }
    294     }
    295   }
    296   return nodes.GetSize();
    297 }
    298 CXFA_Node* CXFA_Node::CreateSamePacketNode(XFA_ELEMENT eElement,
    299                                            FX_DWORD dwFlags) {
    300   IXFA_ObjFactory* pFactory = m_pDocument->GetParser()->GetFactory();
    301   CXFA_Node* pNode = pFactory->CreateNode(m_ePacket, eElement);
    302   pNode->SetFlag(dwFlags);
    303   return pNode;
    304 }
    305 CXFA_Node* CXFA_Node::CloneTemplateToForm(FX_BOOL bRecursive) {
    306   FXSYS_assert(m_ePacket == XFA_XDPPACKET_Template);
    307   IXFA_ObjFactory* pFactory = m_pDocument->GetParser()->GetFactory();
    308   CXFA_Node* pClone = pFactory->CreateNode(XFA_XDPPACKET_Form, m_eNodeClass);
    309   if (!pClone) {
    310     return NULL;
    311   }
    312   pClone->SetTemplateNode(this);
    313   pClone->UpdateNameHash();
    314   pClone->SetXMLMappingNode(GetXMLMappingNode());
    315   if (bRecursive) {
    316     for (CXFA_Node* pChild = GetNodeItem(XFA_NODEITEM_FirstChild); pChild;
    317          pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling)) {
    318       pClone->InsertChild(pChild->CloneTemplateToForm(bRecursive));
    319     }
    320   }
    321   pClone->SetFlag(XFA_NODEFLAG_Initialized);
    322   return pClone;
    323 }
    324 CXFA_Node* CXFA_Node::GetTemplateNode() {
    325   return m_pAuxNode;
    326 }
    327 void CXFA_Node::SetTemplateNode(CXFA_Node* pTemplateNode) {
    328   m_pAuxNode = pTemplateNode;
    329 }
    330 CXFA_Node* CXFA_Node::GetBindData() {
    331   ASSERT(GetPacketID() == XFA_XDPPACKET_Form);
    332   return (CXFA_Node*)GetObject(XFA_ATTRIBUTE_BindingNode);
    333 }
    334 int32_t CXFA_Node::GetBindItems(CXFA_NodeArray& formItems) {
    335   if (m_uFlags & XFA_NODEFLAG_BindFormItems) {
    336     CXFA_NodeArray* pItems = NULL;
    337     TryObject(XFA_ATTRIBUTE_BindingNode, (void*&)pItems);
    338     formItems.Copy(*pItems);
    339     return formItems.GetSize();
    340   }
    341   CXFA_Node* pFormNode = (CXFA_Node*)GetObject(XFA_ATTRIBUTE_BindingNode);
    342   if (pFormNode) {
    343     formItems.Add(pFormNode);
    344   }
    345   return formItems.GetSize();
    346 }
    347 static void XFA_DataNodeDeleteBindItem(void* pData) {
    348   if (pData) {
    349     delete ((CXFA_NodeArray*)pData);
    350   }
    351 }
    352 static XFA_MAPDATABLOCKCALLBACKINFO deleteBindItemCallBack = {
    353     XFA_DataNodeDeleteBindItem, NULL};
    354 int32_t CXFA_Node::AddBindItem(CXFA_Node* pFormNode) {
    355   ASSERT(pFormNode);
    356   if (m_uFlags & XFA_NODEFLAG_BindFormItems) {
    357     CXFA_NodeArray* pItems = NULL;
    358     TryObject(XFA_ATTRIBUTE_BindingNode, (void*&)pItems);
    359     ASSERT(pItems);
    360     if (pItems->Find(pFormNode) < 0) {
    361       pItems->Add(pFormNode);
    362     }
    363     return pItems->GetSize();
    364   }
    365   CXFA_Node* pOldFormItem = (CXFA_Node*)GetObject(XFA_ATTRIBUTE_BindingNode);
    366   if (!pOldFormItem) {
    367     SetObject(XFA_ATTRIBUTE_BindingNode, pFormNode);
    368     return 1;
    369   } else if (pOldFormItem == pFormNode) {
    370     return 1;
    371   }
    372   CXFA_NodeArray* pItems = new CXFA_NodeArray;
    373   SetObject(XFA_ATTRIBUTE_BindingNode, pItems, &deleteBindItemCallBack);
    374   pItems->Add(pOldFormItem);
    375   pItems->Add(pFormNode);
    376   m_uFlags |= XFA_NODEFLAG_BindFormItems;
    377   return 2;
    378 }
    379 int32_t CXFA_Node::RemoveBindItem(CXFA_Node* pFormNode) {
    380   if (m_uFlags & XFA_NODEFLAG_BindFormItems) {
    381     CXFA_NodeArray* pItems = NULL;
    382     TryObject(XFA_ATTRIBUTE_BindingNode, (void*&)pItems);
    383     ASSERT(pItems);
    384     int32_t iIndex = pItems->Find(pFormNode);
    385     int32_t iCount = pItems->GetSize();
    386     if (iIndex >= 0) {
    387       if (iIndex != iCount - 1) {
    388         pItems->SetAt(iIndex, pItems->GetAt(iCount - 1));
    389       }
    390       pItems->RemoveAt(iCount - 1);
    391       if (iCount == 2) {
    392         CXFA_Node* pLastFormNode = pItems->GetAt(0);
    393         SetObject(XFA_ATTRIBUTE_BindingNode, pLastFormNode);
    394         m_uFlags &= ~XFA_NODEFLAG_BindFormItems;
    395       }
    396       iCount--;
    397     }
    398     return iCount;
    399   }
    400   CXFA_Node* pOldFormItem = (CXFA_Node*)GetObject(XFA_ATTRIBUTE_BindingNode);
    401   if (pOldFormItem == pFormNode) {
    402     SetObject(XFA_ATTRIBUTE_BindingNode, NULL);
    403     pOldFormItem = NULL;
    404   }
    405   return pOldFormItem == NULL ? 0 : 1;
    406 }
    407 FX_BOOL CXFA_Node::HasBindItem() {
    408   return (GetPacketID() == XFA_XDPPACKET_Datasets) &&
    409          GetObject(XFA_ATTRIBUTE_BindingNode) != NULL;
    410 }
    411 CXFA_WidgetData* CXFA_Node::GetWidgetData() {
    412   return (CXFA_WidgetData*)GetObject(XFA_ATTRIBUTE_WidgetData);
    413 }
    414 CXFA_WidgetData* CXFA_Node::GetContainerWidgetData() {
    415   if (GetPacketID() != XFA_XDPPACKET_Form) {
    416     return NULL;
    417   }
    418   XFA_ELEMENT classID = GetClassID();
    419   if (classID == XFA_ELEMENT_ExclGroup) {
    420     return NULL;
    421   }
    422   CXFA_Node* pParentNode = GetNodeItem(XFA_NODEITEM_Parent);
    423   if (pParentNode && pParentNode->GetClassID() == XFA_ELEMENT_ExclGroup) {
    424     return NULL;
    425   }
    426   if (classID == XFA_ELEMENT_Field) {
    427     CXFA_WidgetData* pFieldWidgetData = this->GetWidgetData();
    428     if (pFieldWidgetData &&
    429         pFieldWidgetData->GetChoiceListOpen() ==
    430             XFA_ATTRIBUTEENUM_MultiSelect) {
    431       return NULL;
    432     } else {
    433       CFX_WideString wsPicture;
    434       if (pFieldWidgetData) {
    435         pFieldWidgetData->GetPictureContent(wsPicture,
    436                                             XFA_VALUEPICTURE_DataBind);
    437       }
    438       if (!wsPicture.IsEmpty()) {
    439         return pFieldWidgetData;
    440       }
    441       CXFA_Node* pDataNode = this->GetBindData();
    442       if (!pDataNode) {
    443         return NULL;
    444       }
    445       pFieldWidgetData = NULL;
    446       CXFA_NodeArray formNodes;
    447       pDataNode->GetBindItems(formNodes);
    448       for (int32_t i = 0; i < formNodes.GetSize(); i++) {
    449         CXFA_Node* pFormNode = formNodes.GetAt(i);
    450         if (!pFormNode || pFormNode->HasFlag(XFA_NODEFLAG_HasRemoved)) {
    451           continue;
    452         }
    453         pFieldWidgetData = pFormNode->GetWidgetData();
    454         if (pFieldWidgetData) {
    455           pFieldWidgetData->GetPictureContent(wsPicture,
    456                                               XFA_VALUEPICTURE_DataBind);
    457         }
    458         if (!wsPicture.IsEmpty()) {
    459           break;
    460         }
    461         pFieldWidgetData = NULL;
    462       }
    463       return pFieldWidgetData;
    464     }
    465   }
    466   CXFA_Node* pGrandNode =
    467       pParentNode ? pParentNode->GetNodeItem(XFA_NODEITEM_Parent) : NULL;
    468   CXFA_Node* pValueNode =
    469       (pParentNode && pParentNode->GetClassID() == XFA_ELEMENT_Value)
    470           ? pParentNode
    471           : NULL;
    472   if (!pValueNode) {
    473     pValueNode = (pGrandNode && pGrandNode->GetClassID() == XFA_ELEMENT_Value)
    474                      ? pGrandNode
    475                      : NULL;
    476   }
    477   CXFA_Node* pParentOfValueNode =
    478       pValueNode ? pValueNode->GetNodeItem(XFA_NODEITEM_Parent) : NULL;
    479   return pParentOfValueNode ? pParentOfValueNode->GetContainerWidgetData()
    480                             : NULL;
    481 }
    482 FX_BOOL CXFA_Node::GetLocaleName(CFX_WideString& wsLocaleName) {
    483   CXFA_Node* pForm = (CXFA_Node*)GetDocument()->GetXFANode(XFA_HASHCODE_Form);
    484   CXFA_Node* pTopSubform = pForm->GetFirstChildByClass(XFA_ELEMENT_Subform);
    485   FXSYS_assert(pTopSubform);
    486   CXFA_Node* pLocaleNode = this;
    487   FX_BOOL bLocale = FALSE;
    488   do {
    489     bLocale = pLocaleNode->TryCData(XFA_ATTRIBUTE_Locale, wsLocaleName, FALSE);
    490     if (!bLocale) {
    491       pLocaleNode = pLocaleNode->GetNodeItem(XFA_NODEITEM_Parent);
    492     }
    493   } while (pLocaleNode && pLocaleNode != pTopSubform && !bLocale);
    494   if (bLocale) {
    495     return bLocale;
    496   }
    497   CXFA_Node* pConfig =
    498       (CXFA_Node*)GetDocument()->GetXFANode(XFA_HASHCODE_Config);
    499   wsLocaleName = GetDocument()->GetLocalMgr()->GetConfigLocaleName(pConfig);
    500   if (!wsLocaleName.IsEmpty()) {
    501     bLocale = TRUE;
    502   }
    503   if (bLocale) {
    504     return bLocale;
    505   }
    506   if (pTopSubform) {
    507     bLocale = pTopSubform->TryCData(XFA_ATTRIBUTE_Locale, wsLocaleName, FALSE);
    508   }
    509   if (bLocale) {
    510     return bLocale;
    511   }
    512   IFX_Locale* pLocale = GetDocument()->GetLocalMgr()->GetDefLocale();
    513   if (pLocale) {
    514     wsLocaleName = pLocale->GetName();
    515     bLocale = TRUE;
    516   }
    517   return bLocale;
    518 }
    519 XFA_ATTRIBUTEENUM CXFA_Node::GetIntact() {
    520   XFA_ELEMENT eElement = GetClassID();
    521   CXFA_Node* pKeep = GetFirstChildByClass(XFA_ELEMENT_Keep);
    522   XFA_ATTRIBUTEENUM eLayoutType = GetEnum(XFA_ATTRIBUTE_Layout);
    523   if (pKeep) {
    524     XFA_ATTRIBUTEENUM eIntact;
    525     if (pKeep->TryEnum(XFA_ATTRIBUTE_Intact, eIntact, FALSE)) {
    526       if (eIntact == XFA_ATTRIBUTEENUM_None &&
    527           eLayoutType == XFA_ATTRIBUTEENUM_Row &&
    528           m_pDocument->GetCurVersionMode() < XFA_VERSION_208) {
    529         CXFA_Node* pPreviewRow =
    530             GetNodeItem(XFA_NODEITEM_PrevSibling, XFA_OBJECTTYPE_ContainerNode);
    531         if (pPreviewRow &&
    532             pPreviewRow->GetEnum(XFA_ATTRIBUTE_Layout) ==
    533                 XFA_ATTRIBUTEENUM_Row) {
    534           XFA_ATTRIBUTEENUM eValue;
    535           if (pKeep->TryEnum(XFA_ATTRIBUTE_Previous, eValue, FALSE)) {
    536             if (eValue == XFA_ATTRIBUTEENUM_ContentArea ||
    537                 eValue == XFA_ATTRIBUTEENUM_PageArea) {
    538               return XFA_ATTRIBUTEENUM_ContentArea;
    539             }
    540           }
    541           CXFA_Node* pKeep =
    542               pPreviewRow->GetFirstChildByClass(XFA_ELEMENT_Keep);
    543           if (pKeep) {
    544             if (pKeep->TryEnum(XFA_ATTRIBUTE_Next, eValue, FALSE)) {
    545               if (eValue == XFA_ATTRIBUTEENUM_ContentArea ||
    546                   eValue == XFA_ATTRIBUTEENUM_PageArea) {
    547                 return XFA_ATTRIBUTEENUM_ContentArea;
    548               }
    549             }
    550           }
    551         }
    552       }
    553       return eIntact;
    554     }
    555   }
    556   switch (eElement) {
    557     case XFA_ELEMENT_Subform:
    558       switch (eLayoutType) {
    559         case XFA_ATTRIBUTEENUM_Position:
    560         case XFA_ATTRIBUTEENUM_Row:
    561           return XFA_ATTRIBUTEENUM_ContentArea;
    562         case XFA_ATTRIBUTEENUM_Tb:
    563         case XFA_ATTRIBUTEENUM_Table:
    564         case XFA_ATTRIBUTEENUM_Lr_tb:
    565         case XFA_ATTRIBUTEENUM_Rl_tb:
    566           return XFA_ATTRIBUTEENUM_None;
    567         default:
    568           break;
    569       }
    570       break;
    571     case XFA_ELEMENT_Field: {
    572       CXFA_Node* pParentNode = this->GetNodeItem(XFA_NODEITEM_Parent);
    573       if (!pParentNode || pParentNode->GetClassID() == XFA_ELEMENT_PageArea) {
    574         return XFA_ATTRIBUTEENUM_ContentArea;
    575       }
    576       if (pParentNode->GetIntact() == XFA_ATTRIBUTEENUM_None) {
    577         XFA_ATTRIBUTEENUM eParLayout =
    578             pParentNode->GetEnum(XFA_ATTRIBUTE_Layout);
    579         if (eParLayout == XFA_ATTRIBUTEENUM_Position ||
    580             eParLayout == XFA_ATTRIBUTEENUM_Row ||
    581             eParLayout == XFA_ATTRIBUTEENUM_Table) {
    582           return XFA_ATTRIBUTEENUM_None;
    583         }
    584         XFA_VERSION version = m_pDocument->GetCurVersionMode();
    585         if (eParLayout == XFA_ATTRIBUTEENUM_Tb && version < XFA_VERSION_208) {
    586           CXFA_Measurement measureH;
    587           if (this->TryMeasure(XFA_ATTRIBUTE_H, measureH, FALSE)) {
    588             return XFA_ATTRIBUTEENUM_ContentArea;
    589           }
    590         }
    591         return XFA_ATTRIBUTEENUM_None;
    592       }
    593       return XFA_ATTRIBUTEENUM_ContentArea;
    594     }
    595     case XFA_ELEMENT_Draw:
    596       return XFA_ATTRIBUTEENUM_ContentArea;
    597     default:
    598       break;
    599   }
    600   return XFA_ATTRIBUTEENUM_None;
    601 }
    602 CXFA_Node* CXFA_Node::GetDataDescriptionNode() {
    603   if (m_ePacket == XFA_XDPPACKET_Datasets) {
    604     return m_pAuxNode;
    605   }
    606   return NULL;
    607 }
    608 void CXFA_Node::SetDataDescriptionNode(CXFA_Node* pDataDescriptionNode) {
    609   FXSYS_assert(m_ePacket == XFA_XDPPACKET_Datasets);
    610   m_pAuxNode = pDataDescriptionNode;
    611 }
    612 void CXFA_Node::Script_TreeClass_ResolveNode(CFXJSE_Arguments* pArguments) {
    613   int32_t iLength = pArguments->GetLength();
    614   if (iLength != 1) {
    615     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"resolveNode");
    616     return;
    617   }
    618   CFX_WideString wsExpression;
    619   CFX_ByteString bsExpression = pArguments->GetUTF8String(0);
    620   wsExpression =
    621       CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength());
    622   IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
    623   if (!pScriptContext) {
    624     return;
    625   }
    626   CXFA_Node* refNode = this;
    627   if (refNode->GetClassID() == XFA_ELEMENT_Xfa) {
    628     refNode = (CXFA_Node*)pScriptContext->GetThisObject();
    629   }
    630   FX_DWORD dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Attributes |
    631                     XFA_RESOLVENODE_Properties | XFA_RESOLVENODE_Parent |
    632                     XFA_RESOLVENODE_Siblings;
    633   XFA_RESOLVENODE_RS resoveNodeRS;
    634   int32_t iRet = pScriptContext->ResolveObjects(refNode, wsExpression,
    635                                                 resoveNodeRS, dwFlag);
    636   if (iRet < 1) {
    637     return FXJSE_Value_SetNull(pArguments->GetReturnValue());
    638   }
    639   FXJSE_HVALUE hValue = NULL;
    640   if (resoveNodeRS.dwFlags == XFA_RESOVENODE_RSTYPE_Nodes) {
    641     CXFA_Object* pNode = resoveNodeRS.nodes[0];
    642     hValue = pScriptContext->GetJSValueFromMap(pNode);
    643     FXJSE_Value_Set(pArguments->GetReturnValue(), hValue);
    644   } else {
    645     XFA_LPCSCRIPTATTRIBUTEINFO lpAttributeInfo = resoveNodeRS.pScriptAttribute;
    646     if (lpAttributeInfo && lpAttributeInfo->eValueType == XFA_SCRIPT_Object) {
    647       hValue = FXJSE_Value_Create(pScriptContext->GetRuntime());
    648       (resoveNodeRS.nodes[0]->*(lpAttributeInfo->lpfnCallback))(
    649           hValue, FALSE, (XFA_ATTRIBUTE)lpAttributeInfo->eAttribute);
    650       FXJSE_Value_Set(pArguments->GetReturnValue(), hValue);
    651       FXJSE_Value_Release(hValue);
    652     } else {
    653       FXJSE_Value_SetNull(pArguments->GetReturnValue());
    654     }
    655   }
    656 }
    657 void CXFA_Node::Script_TreeClass_ResolveNodes(CFXJSE_Arguments* pArguments) {
    658   int32_t iLength = pArguments->GetLength();
    659   if (iLength != 1) {
    660     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
    661                             L"resolveNodes");
    662     return;
    663   }
    664   CFX_WideString wsExpression;
    665   CFX_ByteString bsExpression = pArguments->GetUTF8String(0);
    666   wsExpression =
    667       CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength());
    668   FXJSE_HVALUE hValue = pArguments->GetReturnValue();
    669   if (!hValue) {
    670     return;
    671   }
    672   FX_DWORD dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Attributes |
    673                     XFA_RESOLVENODE_Properties | XFA_RESOLVENODE_Parent |
    674                     XFA_RESOLVENODE_Siblings;
    675   CXFA_Node* refNode = this;
    676   if (refNode->GetClassID() == XFA_ELEMENT_Xfa) {
    677     refNode = (CXFA_Node*)m_pDocument->GetScriptContext()->GetThisObject();
    678   }
    679   Script_Som_ResolveNodeList(hValue, wsExpression, dwFlag, refNode);
    680 }
    681 void CXFA_Node::Script_Som_ResolveNodeList(FXJSE_HVALUE hValue,
    682                                            CFX_WideString wsExpression,
    683                                            FX_DWORD dwFlag,
    684                                            CXFA_Node* refNode) {
    685   IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
    686   if (!pScriptContext) {
    687     return;
    688   }
    689   XFA_RESOLVENODE_RS resoveNodeRS;
    690   if (refNode == NULL) {
    691     refNode = this;
    692   }
    693   pScriptContext->ResolveObjects(refNode, wsExpression,
    694                                  resoveNodeRS, dwFlag);
    695   CXFA_ArrayNodeList* pNodeList = new CXFA_ArrayNodeList(m_pDocument);
    696   if (resoveNodeRS.dwFlags == XFA_RESOVENODE_RSTYPE_Nodes) {
    697     for (int32_t i = 0; i < resoveNodeRS.nodes.GetSize(); i++) {
    698       if (resoveNodeRS.nodes[i]->IsNode()) {
    699         pNodeList->Append((CXFA_Node*)resoveNodeRS.nodes[i]);
    700       }
    701     }
    702   } else {
    703     CXFA_HVALUEArray hValueArray(pScriptContext->GetRuntime());
    704     if (resoveNodeRS.GetAttributeResult(hValueArray) > 0) {
    705       CXFA_ObjArray objectArray;
    706       hValueArray.GetAttributeObject(objectArray);
    707       for (int32_t i = 0; i < objectArray.GetSize(); i++) {
    708         if (objectArray[i]->IsNode()) {
    709           pNodeList->Append((CXFA_Node*)objectArray[i]);
    710         }
    711       }
    712     }
    713   }
    714   FXJSE_Value_SetObject(hValue, (CXFA_Object*)pNodeList,
    715                         pScriptContext->GetJseNormalClass());
    716 }
    717 void CXFA_Node::Script_TreeClass_All(FXJSE_HVALUE hValue,
    718                                      FX_BOOL bSetting,
    719                                      XFA_ATTRIBUTE eAttribute) {
    720   if (bSetting) {
    721     ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
    722   } else {
    723     FX_DWORD dwFlag = XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_ALL;
    724     CFX_WideString wsName;
    725     GetAttribute(XFA_ATTRIBUTE_Name, wsName);
    726     CFX_WideString wsExpression = wsName + FX_WSTRC(L"[*]");
    727     Script_Som_ResolveNodeList(hValue, wsExpression, dwFlag);
    728   }
    729 }
    730 void CXFA_Node::Script_TreeClass_Nodes(FXJSE_HVALUE hValue,
    731                                        FX_BOOL bSetting,
    732                                        XFA_ATTRIBUTE eAttribute) {
    733   IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
    734   if (!pScriptContext) {
    735     return;
    736   }
    737   if (bSetting) {
    738     IXFA_AppProvider* pAppProvider = m_pDocument->GetNotify()->GetAppProvider();
    739     FXSYS_assert(pAppProvider);
    740     CFX_WideString wsMessage;
    741     pAppProvider->LoadString(XFA_IDS_Unable_TO_SET, wsMessage);
    742     FXJSE_ThrowMessage("", FX_UTF8Encode(wsMessage, wsMessage.GetLength()));
    743   } else {
    744     CXFA_AttachNodeList* pNodeList = new CXFA_AttachNodeList(m_pDocument, this);
    745     FXJSE_Value_SetObject(hValue, (CXFA_Object*)pNodeList,
    746                           pScriptContext->GetJseNormalClass());
    747   }
    748 }
    749 void CXFA_Node::Script_TreeClass_ClassAll(FXJSE_HVALUE hValue,
    750                                           FX_BOOL bSetting,
    751                                           XFA_ATTRIBUTE eAttribute) {
    752   if (bSetting) {
    753     ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
    754   } else {
    755     FX_DWORD dwFlag = XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_ALL;
    756     CFX_WideStringC wsName;
    757     this->GetClassName(wsName);
    758     CFX_WideString wsExpression = FX_WSTRC(L"#") + wsName + FX_WSTRC(L"[*]");
    759     Script_Som_ResolveNodeList(hValue, wsExpression, dwFlag);
    760   }
    761 }
    762 void CXFA_Node::Script_TreeClass_Parent(FXJSE_HVALUE hValue,
    763                                         FX_BOOL bSetting,
    764                                         XFA_ATTRIBUTE eAttribute) {
    765   if (bSetting) {
    766     ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
    767   } else {
    768     CXFA_Node* pParent = this->GetNodeItem(XFA_NODEITEM_Parent);
    769     if (pParent) {
    770       FXJSE_Value_Set(
    771           hValue, m_pDocument->GetScriptContext()->GetJSValueFromMap(pParent));
    772     } else {
    773       FXJSE_Value_SetNull(hValue);
    774     }
    775   }
    776 }
    777 void CXFA_Node::Script_TreeClass_Index(FXJSE_HVALUE hValue,
    778                                        FX_BOOL bSetting,
    779                                        XFA_ATTRIBUTE eAttribute) {
    780   if (bSetting) {
    781     ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
    782   } else {
    783     FXJSE_Value_SetInteger(hValue, GetNodeSameNameIndex());
    784   }
    785 }
    786 void CXFA_Node::Script_TreeClass_ClassIndex(FXJSE_HVALUE hValue,
    787                                             FX_BOOL bSetting,
    788                                             XFA_ATTRIBUTE eAttribute) {
    789   if (bSetting) {
    790     ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
    791   } else {
    792     FXJSE_Value_SetInteger(hValue, GetNodeSameClassIndex());
    793   }
    794 }
    795 void CXFA_Node::Script_TreeClass_SomExpression(FXJSE_HVALUE hValue,
    796                                                FX_BOOL bSetting,
    797                                                XFA_ATTRIBUTE eAttribute) {
    798   if (bSetting) {
    799     ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
    800   } else {
    801     CFX_WideString wsSOMExpression;
    802     GetSOMExpression(wsSOMExpression);
    803     FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsSOMExpression));
    804   }
    805 }
    806 void CXFA_Node::Script_NodeClass_ApplyXSL(CFXJSE_Arguments* pArguments) {
    807   int32_t iLength = pArguments->GetLength();
    808   if (iLength != 1) {
    809     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"applyXSL");
    810     return;
    811   }
    812   CFX_WideString wsExpression;
    813   CFX_ByteString bsExpression = pArguments->GetUTF8String(0);
    814   wsExpression =
    815       CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength());
    816 }
    817 void CXFA_Node::Script_NodeClass_AssignNode(CFXJSE_Arguments* pArguments) {
    818   int32_t iLength = pArguments->GetLength();
    819   if (iLength < 1 || iLength > 3) {
    820     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"assignNode");
    821     return;
    822   }
    823   CFX_WideString wsExpression;
    824   CFX_WideString wsValue;
    825   int32_t iAction = 0;
    826   if (iLength >= 1) {
    827     CFX_ByteString bsExpression = pArguments->GetUTF8String(0);
    828     wsExpression =
    829         CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength());
    830   }
    831   if (iLength >= 2) {
    832     CFX_ByteString bsValue = pArguments->GetUTF8String(1);
    833     wsValue = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength());
    834   }
    835   if (iLength >= 3) {
    836     iAction = pArguments->GetInt32(2);
    837   }
    838 }
    839 void CXFA_Node::Script_NodeClass_Clone(CFXJSE_Arguments* pArguments) {
    840   int32_t iLength = pArguments->GetLength();
    841   if (iLength != 1) {
    842     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"clone");
    843     return;
    844   }
    845   FX_BOOL bClone = TRUE;
    846   bClone = pArguments->GetInt32(0) == 0 ? FALSE : TRUE;
    847   CXFA_Node* pCloneNode = this->Clone(bClone);
    848   FXJSE_Value_Set(
    849       pArguments->GetReturnValue(),
    850       m_pDocument->GetScriptContext()->GetJSValueFromMap(pCloneNode));
    851 }
    852 void CXFA_Node::Script_NodeClass_GetAttribute(CFXJSE_Arguments* pArguments) {
    853   int32_t iLength = pArguments->GetLength();
    854   if (iLength != 1) {
    855     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
    856                             L"getAttribute");
    857     return;
    858   }
    859   CFX_WideString wsExpression;
    860   CFX_ByteString bsExpression = pArguments->GetUTF8String(0);
    861   wsExpression =
    862       CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength());
    863   CFX_WideString wsValue;
    864   this->GetAttribute(wsExpression, wsValue);
    865   FXJSE_HVALUE hValue = pArguments->GetReturnValue();
    866   if (hValue) {
    867     FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsValue));
    868   }
    869 }
    870 void CXFA_Node::Script_NodeClass_GetElement(CFXJSE_Arguments* pArguments) {
    871   int32_t iLength = pArguments->GetLength();
    872   if (iLength < 1 || iLength > 2) {
    873     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"getElement");
    874     return;
    875   }
    876   CFX_WideString wsExpression;
    877   int32_t iValue = 0;
    878   if (iLength >= 1) {
    879     CFX_ByteString bsExpression = pArguments->GetUTF8String(0);
    880     wsExpression =
    881         CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength());
    882   }
    883   if (iLength >= 2) {
    884     iValue = pArguments->GetInt32(1);
    885   }
    886   XFA_LPCELEMENTINFO pElementInfo = XFA_GetElementByName(wsExpression);
    887   CXFA_Node* pNode = this->GetProperty(iValue, pElementInfo->eName);
    888   FXJSE_Value_Set(pArguments->GetReturnValue(),
    889                   m_pDocument->GetScriptContext()->GetJSValueFromMap(pNode));
    890 }
    891 void CXFA_Node::Script_NodeClass_IsPropertySpecified(
    892     CFXJSE_Arguments* pArguments) {
    893   int32_t iLength = pArguments->GetLength();
    894   if (iLength < 1 || iLength > 3) {
    895     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
    896                             L"isPropertySpecified");
    897     return;
    898   }
    899   CFX_WideString wsExpression;
    900   FX_BOOL bParent = TRUE;
    901   int32_t iIndex = 0;
    902   if (iLength >= 1) {
    903     CFX_ByteString bsExpression = pArguments->GetUTF8String(0);
    904     wsExpression =
    905         CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength());
    906   }
    907   if (iLength >= 2) {
    908     bParent = pArguments->GetInt32(1) == 0 ? FALSE : TRUE;
    909   }
    910   if (iLength >= 3) {
    911     iIndex = pArguments->GetInt32(2);
    912   }
    913   FX_BOOL bHas = FALSE;
    914   XFA_LPCATTRIBUTEINFO pAttributeInfo = XFA_GetAttributeByName(wsExpression);
    915   CFX_WideString wsValue;
    916   if (pAttributeInfo) {
    917     bHas = this->HasAttribute(pAttributeInfo->eName);
    918   }
    919   if (!bHas) {
    920     XFA_LPCELEMENTINFO pElementInfo = XFA_GetElementByName(wsExpression);
    921     bHas = (this->GetProperty(iIndex, pElementInfo->eName) != NULL);
    922   }
    923   FXJSE_HVALUE hValue = pArguments->GetReturnValue();
    924   if (hValue) {
    925     FXJSE_Value_SetBoolean(hValue, bHas);
    926   }
    927 }
    928 void CXFA_Node::Script_NodeClass_LoadXML(CFXJSE_Arguments* pArguments) {
    929   int32_t iLength = pArguments->GetLength();
    930   if (iLength < 1 || iLength > 3) {
    931     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"loadXML");
    932     return;
    933   }
    934   CFX_WideString wsExpression;
    935   FX_BOOL bIgnoreRoot = TRUE;
    936   FX_BOOL bOverwrite = 0;
    937   if (iLength >= 1) {
    938     CFX_ByteString bsExpression = pArguments->GetUTF8String(0);
    939     wsExpression =
    940         CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength());
    941     if (wsExpression.IsEmpty()) {
    942       return;
    943     }
    944   }
    945   if (iLength >= 2) {
    946     bIgnoreRoot = pArguments->GetInt32(1) == 0 ? FALSE : TRUE;
    947   }
    948   if (iLength >= 3) {
    949     bOverwrite = pArguments->GetInt32(2) == 0 ? FALSE : TRUE;
    950   }
    951   IXFA_Parser* pParser = IXFA_Parser::Create(m_pDocument);
    952   if (!pParser) {
    953     return;
    954   }
    955   IFDE_XMLNode* pXMLNode = NULL;
    956   int32_t iParserStatus = pParser->ParseXMLData(wsExpression, pXMLNode, NULL);
    957   if (iParserStatus != XFA_PARSESTATUS_Done || !pXMLNode) {
    958     pParser->Release();
    959     pParser = NULL;
    960     return;
    961   }
    962   if (bIgnoreRoot && (pXMLNode->GetType() != FDE_XMLNODE_Element ||
    963                       XFA_RecognizeRichText((IFDE_XMLElement*)pXMLNode))) {
    964     bIgnoreRoot = FALSE;
    965   }
    966   CXFA_Node* pFakeRoot = this->Clone(FALSE);
    967   CFX_WideStringC wsContentType = this->GetCData(XFA_ATTRIBUTE_ContentType);
    968   if (!wsContentType.IsEmpty()) {
    969     pFakeRoot->SetCData(XFA_ATTRIBUTE_ContentType, wsContentType);
    970   }
    971   IFDE_XMLNode* pFakeXMLRoot = pFakeRoot->GetXMLMappingNode();
    972   if (!pFakeXMLRoot) {
    973     IFDE_XMLNode* pThisXMLRoot = this->GetXMLMappingNode();
    974     pFakeXMLRoot = pThisXMLRoot ? pThisXMLRoot->Clone(FALSE) : NULL;
    975   }
    976   if (!pFakeXMLRoot) {
    977     CFX_WideStringC wsClassName;
    978     this->GetClassName(wsClassName);
    979     pFakeXMLRoot = IFDE_XMLElement::Create(wsClassName);
    980   }
    981   if (bIgnoreRoot) {
    982     IFDE_XMLNode* pXMLChild = pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild);
    983     while (pXMLChild) {
    984       IFDE_XMLNode* pXMLSibling =
    985           pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling);
    986       pXMLNode->RemoveChildNode(pXMLChild);
    987       pFakeXMLRoot->InsertChildNode(pXMLChild);
    988       pXMLChild = pXMLSibling;
    989     }
    990   } else {
    991     IFDE_XMLNode* pXMLParent = pXMLNode->GetNodeItem(IFDE_XMLNode::Parent);
    992     if (pXMLParent) {
    993       pXMLParent->RemoveChildNode(pXMLNode);
    994     }
    995     pFakeXMLRoot->InsertChildNode(pXMLNode);
    996   }
    997   pParser->ConstructXFANode(pFakeRoot, pFakeXMLRoot);
    998   pFakeRoot = pParser->GetRootNode();
    999   if (pFakeRoot) {
   1000     if (bOverwrite) {
   1001       CXFA_Node* pChild = this->GetNodeItem(XFA_NODEITEM_FirstChild);
   1002       CXFA_Node* pNewChild = pFakeRoot->GetNodeItem(XFA_NODEITEM_FirstChild);
   1003       int32_t index = 0;
   1004       while (pNewChild) {
   1005         CXFA_Node* pItem = pNewChild->GetNodeItem(XFA_NODEITEM_NextSibling);
   1006         pFakeRoot->RemoveChild(pNewChild);
   1007         this->InsertChild(index++, pNewChild);
   1008         pNewChild->SetFlag(XFA_NODEFLAG_Initialized);
   1009         pNewChild = pItem;
   1010       }
   1011       while (pChild) {
   1012         CXFA_Node* pItem = pChild->GetNodeItem(XFA_NODEITEM_NextSibling);
   1013         this->RemoveChild(pChild);
   1014         pFakeRoot->InsertChild(pChild);
   1015         pChild = pItem;
   1016       }
   1017       if (GetPacketID() == XFA_XDPPACKET_Form &&
   1018           GetClassID() == XFA_ELEMENT_ExData) {
   1019         IFDE_XMLNode* pTempXMLNode = this->GetXMLMappingNode();
   1020         this->SetXMLMappingNode(pFakeXMLRoot);
   1021         this->SetFlag(XFA_NODEFLAG_OwnXMLNode, TRUE, FALSE);
   1022         if (pTempXMLNode &&
   1023             pTempXMLNode->GetNodeItem(IFDE_XMLNode::Parent) == NULL) {
   1024           pFakeXMLRoot = pTempXMLNode;
   1025         } else {
   1026           pFakeXMLRoot = NULL;
   1027         }
   1028       }
   1029       MoveBufferMapData(pFakeRoot, this, XFA_CalcData, TRUE);
   1030     } else {
   1031       CXFA_Node* pChild = pFakeRoot->GetNodeItem(XFA_NODEITEM_FirstChild);
   1032       while (pChild) {
   1033         CXFA_Node* pItem = pChild->GetNodeItem(XFA_NODEITEM_NextSibling);
   1034         pFakeRoot->RemoveChild(pChild);
   1035         this->InsertChild(pChild);
   1036         pChild->SetFlag(XFA_NODEFLAG_Initialized);
   1037         pChild = pItem;
   1038       }
   1039     }
   1040     if (pFakeXMLRoot) {
   1041       pFakeRoot->SetXMLMappingNode(pFakeXMLRoot);
   1042       pFakeRoot->SetFlag(XFA_NODEFLAG_OwnXMLNode, TRUE, FALSE);
   1043     }
   1044     pFakeRoot->SetFlag(XFA_NODEFLAG_HasRemoved, TRUE, FALSE);
   1045   } else {
   1046     if (pFakeXMLRoot) {
   1047       pFakeXMLRoot->Release();
   1048       pFakeXMLRoot = NULL;
   1049     }
   1050   }
   1051   pParser->Release();
   1052   pParser = NULL;
   1053 }
   1054 void CXFA_Node::Script_NodeClass_SaveFilteredXML(CFXJSE_Arguments* pArguments) {
   1055 }
   1056 void CXFA_Node::Script_NodeClass_SaveXML(CFXJSE_Arguments* pArguments) {
   1057   int32_t iLength = pArguments->GetLength();
   1058   if (iLength < 0 || iLength > 1) {
   1059     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"saveXML");
   1060     return;
   1061   }
   1062   FX_BOOL bPrettyMode = FALSE;
   1063   if (iLength == 1) {
   1064     CFX_ByteString bsPretty = pArguments->GetUTF8String(0);
   1065     if (bsPretty.Equal("pretty")) {
   1066       bPrettyMode = TRUE;
   1067     } else {
   1068       ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
   1069       return;
   1070     }
   1071   }
   1072   CFX_ByteStringC bsXMLHeader = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
   1073   if (GetPacketID() == XFA_XDPPACKET_Form) {
   1074     IFX_MemoryStream* pMemoryStream = FX_CreateMemoryStream(TRUE);
   1075     if (!pMemoryStream) {
   1076       FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), bsXMLHeader);
   1077       return;
   1078     }
   1079     IFX_Stream* pStream = IFX_Stream::CreateStream(
   1080         (IFX_FileWrite*)pMemoryStream,
   1081         FX_STREAMACCESS_Text | FX_STREAMACCESS_Write | FX_STREAMACCESS_Append);
   1082     if (!pStream) {
   1083       FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), bsXMLHeader);
   1084       pMemoryStream->Release();
   1085       pMemoryStream = NULL;
   1086       return;
   1087     }
   1088     pStream->SetCodePage(FX_CODEPAGE_UTF8);
   1089     pStream->WriteData(bsXMLHeader.GetPtr(), bsXMLHeader.GetLength());
   1090     XFA_DataExporter_RegenerateFormFile(this, pStream, NULL, TRUE);
   1091     FXJSE_Value_SetUTF8String(
   1092         pArguments->GetReturnValue(),
   1093         CFX_ByteStringC(pMemoryStream->GetBuffer(), pMemoryStream->GetSize()));
   1094     pStream->Release();
   1095     pStream = NULL;
   1096     if (pMemoryStream) {
   1097       pMemoryStream->Release();
   1098       pMemoryStream = NULL;
   1099     }
   1100     return;
   1101   } else if (GetPacketID() == XFA_XDPPACKET_Datasets) {
   1102     IFDE_XMLNode* pElement = this->GetXMLMappingNode();
   1103     if (!pElement || pElement->GetType() != FDE_XMLNODE_Element) {
   1104       FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), bsXMLHeader);
   1105       return;
   1106     }
   1107     XFA_DataExporter_DealWithDataGroupNode(this);
   1108     IFX_MemoryStream* pMemoryStream = FX_CreateMemoryStream(TRUE);
   1109     if (!pMemoryStream) {
   1110       FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), bsXMLHeader);
   1111       return;
   1112     }
   1113     if (pMemoryStream) {
   1114       IFX_Stream* pStream = IFX_Stream::CreateStream(
   1115           (IFX_FileWrite*)pMemoryStream, FX_STREAMACCESS_Text |
   1116                                              FX_STREAMACCESS_Write |
   1117                                              FX_STREAMACCESS_Append);
   1118       if (pStream) {
   1119         pStream->SetCodePage(FX_CODEPAGE_UTF8);
   1120         pStream->WriteData(bsXMLHeader.GetPtr(), bsXMLHeader.GetLength());
   1121         pElement->SaveXMLNode(pStream);
   1122         FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(),
   1123                                   CFX_ByteStringC(pMemoryStream->GetBuffer(),
   1124                                                   pMemoryStream->GetSize()));
   1125         pStream->Release();
   1126         pStream = NULL;
   1127       }
   1128       if (pMemoryStream) {
   1129         pMemoryStream->Release();
   1130         pMemoryStream = NULL;
   1131       }
   1132       return;
   1133     }
   1134   } else {
   1135     FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), "");
   1136   }
   1137 }
   1138 void CXFA_Node::Script_NodeClass_SetAttribute(CFXJSE_Arguments* pArguments) {
   1139   int32_t iLength = pArguments->GetLength();
   1140   if (iLength != 2) {
   1141     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
   1142                             L"setAttribute");
   1143     return;
   1144   }
   1145   CFX_WideString wsAttribute;
   1146   CFX_WideString wsAttributeValue;
   1147   CFX_ByteString bsAttributeValue = pArguments->GetUTF8String(0);
   1148   CFX_ByteString bsAttribute = pArguments->GetUTF8String(1);
   1149   wsAttributeValue =
   1150       CFX_WideString::FromUTF8(bsAttributeValue, bsAttributeValue.GetLength());
   1151   wsAttribute = CFX_WideString::FromUTF8(bsAttribute, bsAttribute.GetLength());
   1152   this->SetAttribute(wsAttribute, wsAttributeValue, TRUE);
   1153 }
   1154 void CXFA_Node::Script_NodeClass_SetElement(CFXJSE_Arguments* pArguments) {
   1155   int32_t iLength = pArguments->GetLength();
   1156   if (iLength != 1 && iLength != 2) {
   1157     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"setElement");
   1158     return;
   1159   }
   1160   CXFA_Node* pNode = NULL;
   1161   CFX_WideString wsName;
   1162   if (iLength >= 1) {
   1163     pNode = (CXFA_Node*)pArguments->GetObject(0);
   1164   }
   1165   if (iLength >= 2) {
   1166     CFX_ByteString bsName = pArguments->GetUTF8String(1);
   1167     wsName = CFX_WideString::FromUTF8(bsName, bsName.GetLength());
   1168   }
   1169 }
   1170 void CXFA_Node::Script_NodeClass_Ns(FXJSE_HVALUE hValue,
   1171                                     FX_BOOL bSetting,
   1172                                     XFA_ATTRIBUTE eAttribute) {
   1173   if (bSetting) {
   1174     ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
   1175   } else {
   1176     CFX_WideString wsNameSpace;
   1177     this->TryNamespace(wsNameSpace);
   1178     FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsNameSpace));
   1179   }
   1180 }
   1181 void CXFA_Node::Script_NodeClass_Model(FXJSE_HVALUE hValue,
   1182                                        FX_BOOL bSetting,
   1183                                        XFA_ATTRIBUTE eAttribute) {
   1184   if (bSetting) {
   1185     ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
   1186   } else {
   1187     FXJSE_Value_Set(hValue, m_pDocument->GetScriptContext()->GetJSValueFromMap(
   1188                                 this->GetModelNode()));
   1189   }
   1190 }
   1191 void CXFA_Node::Script_NodeClass_IsContainer(FXJSE_HVALUE hValue,
   1192                                              FX_BOOL bSetting,
   1193                                              XFA_ATTRIBUTE eAttribute) {
   1194   if (bSetting) {
   1195     ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
   1196   } else {
   1197     FXJSE_Value_SetBoolean(hValue, this->IsContainerNode());
   1198   }
   1199 }
   1200 void CXFA_Node::Script_NodeClass_IsNull(FXJSE_HVALUE hValue,
   1201                                         FX_BOOL bSetting,
   1202                                         XFA_ATTRIBUTE eAttribute) {
   1203   if (bSetting) {
   1204     ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
   1205   } else {
   1206     if (this->GetClassID() == XFA_ELEMENT_Subform) {
   1207       FXJSE_Value_SetBoolean(hValue, FALSE);
   1208       return;
   1209     }
   1210     CFX_WideString strValue;
   1211     FXJSE_Value_SetBoolean(hValue, !TryContent(strValue) || strValue.IsEmpty());
   1212   }
   1213 }
   1214 void CXFA_Node::Script_NodeClass_OneOfChild(FXJSE_HVALUE hValue,
   1215                                             FX_BOOL bSetting,
   1216                                             XFA_ATTRIBUTE eAttribute) {
   1217   if (bSetting) {
   1218     ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
   1219   } else {
   1220     CXFA_NodeArray properts;
   1221     int32_t iSize = this->GetNodeList(properts, XFA_NODEFILTER_OneOfProperty);
   1222     if (iSize > 0) {
   1223       FXJSE_Value_Set(
   1224           hValue,
   1225           m_pDocument->GetScriptContext()->GetJSValueFromMap(properts[0]));
   1226     }
   1227   }
   1228 }
   1229 void CXFA_Node::Script_ContainerClass_GetDelta(CFXJSE_Arguments* pArguments) {}
   1230 void CXFA_Node::Script_ContainerClass_GetDeltas(CFXJSE_Arguments* pArguments) {
   1231   CXFA_ArrayNodeList* pFormNodes = new CXFA_ArrayNodeList(m_pDocument);
   1232   FXJSE_Value_SetObject(pArguments->GetReturnValue(), (CXFA_Object*)pFormNodes,
   1233                         m_pDocument->GetScriptContext()->GetJseNormalClass());
   1234 }
   1235 void CXFA_Node::Script_ModelClass_ClearErrorList(CFXJSE_Arguments* pArguments) {
   1236 }
   1237 void CXFA_Node::Script_ModelClass_CreateNode(CFXJSE_Arguments* pArguments) {
   1238   Script_Template_CreateNode(pArguments);
   1239 }
   1240 void CXFA_Node::Script_ModelClass_IsCompatibleNS(CFXJSE_Arguments* pArguments) {
   1241   int32_t iLength = pArguments->GetLength();
   1242   if (iLength < 1) {
   1243     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
   1244                             L"isCompatibleNS");
   1245     return;
   1246   }
   1247   CFX_WideString wsNameSpace;
   1248   if (iLength >= 1) {
   1249     CFX_ByteString bsNameSpace = pArguments->GetUTF8String(0);
   1250     wsNameSpace =
   1251         CFX_WideString::FromUTF8(bsNameSpace, bsNameSpace.GetLength());
   1252   }
   1253   CFX_WideString wsNodeNameSpace;
   1254   this->TryNamespace(wsNodeNameSpace);
   1255   FXJSE_HVALUE hValue = pArguments->GetReturnValue();
   1256   if (hValue) {
   1257     FXJSE_Value_SetBoolean(hValue, wsNodeNameSpace.Equal(wsNameSpace));
   1258   }
   1259 }
   1260 void CXFA_Node::Script_ModelClass_Context(FXJSE_HVALUE hValue,
   1261                                           FX_BOOL bSetting,
   1262                                           XFA_ATTRIBUTE eAttribute) {}
   1263 void CXFA_Node::Script_ModelClass_AliasNode(FXJSE_HVALUE hValue,
   1264                                             FX_BOOL bSetting,
   1265                                             XFA_ATTRIBUTE eAttribute) {}
   1266 void CXFA_Node::Script_Attribute_Integer(FXJSE_HVALUE hValue,
   1267                                          FX_BOOL bSetting,
   1268                                          XFA_ATTRIBUTE eAttribute) {
   1269   if (bSetting) {
   1270     SetInteger(eAttribute, FXJSE_Value_ToInteger(hValue), TRUE);
   1271   } else {
   1272     FXJSE_Value_SetInteger(hValue, GetInteger(eAttribute));
   1273   }
   1274 }
   1275 void CXFA_Node::Script_Attribute_IntegerRead(FXJSE_HVALUE hValue,
   1276                                              FX_BOOL bSetting,
   1277                                              XFA_ATTRIBUTE eAttribute) {
   1278   if (!bSetting) {
   1279     FXJSE_Value_SetInteger(hValue, GetInteger(eAttribute));
   1280   } else {
   1281     ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
   1282   }
   1283 }
   1284 void CXFA_Node::Script_Attribute_BOOL(FXJSE_HVALUE hValue,
   1285                                       FX_BOOL bSetting,
   1286                                       XFA_ATTRIBUTE eAttribute) {
   1287   if (bSetting) {
   1288     SetBoolean(eAttribute, FXJSE_Value_ToBoolean(hValue), TRUE);
   1289   } else {
   1290     FXJSE_Value_SetUTF8String(hValue, GetBoolean(eAttribute) ? "1" : "0");
   1291   }
   1292 }
   1293 void CXFA_Node::Script_Attribute_BOOLRead(FXJSE_HVALUE hValue,
   1294                                           FX_BOOL bSetting,
   1295                                           XFA_ATTRIBUTE eAttribute) {
   1296   if (!bSetting) {
   1297     FXJSE_Value_SetUTF8String(hValue, GetBoolean(eAttribute) ? "1" : "0");
   1298   } else {
   1299     ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
   1300   }
   1301 }
   1302 void CXFA_Node::Script_Attribute_SendAttributeChangeMessage(
   1303     void* eAttribute,
   1304     void* eValue,
   1305     FX_BOOL bScriptModify) {
   1306   CXFA_LayoutProcessor* pLayoutPro = m_pDocument->GetLayoutProcessor();
   1307   if (!pLayoutPro) {
   1308     return;
   1309   }
   1310   IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
   1311   if (!pNotify) {
   1312     return;
   1313   }
   1314   FX_DWORD dwPacket = this->GetPacketID();
   1315   if (dwPacket & XFA_XDPPACKET_Form) {
   1316     FX_BOOL bNeedFindContainer = FALSE;
   1317     XFA_ELEMENT eType = this->GetClassID();
   1318     switch (eType) {
   1319       case XFA_ELEMENT_Caption:
   1320         bNeedFindContainer = TRUE;
   1321         pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
   1322                              eValue, this,
   1323                              this->GetNodeItem(XFA_NODEITEM_Parent));
   1324         break;
   1325       case XFA_ELEMENT_Font:
   1326       case XFA_ELEMENT_Para: {
   1327         bNeedFindContainer = TRUE;
   1328         CXFA_Node* pParentNode = this->GetNodeItem(XFA_NODEITEM_Parent);
   1329         if (pParentNode->GetClassID() == XFA_ELEMENT_Caption) {
   1330           pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
   1331                                eValue, pParentNode,
   1332                                pParentNode->GetNodeItem(XFA_NODEITEM_Parent));
   1333         } else {
   1334           pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
   1335                                eValue, this, pParentNode);
   1336         }
   1337       } break;
   1338       case XFA_ELEMENT_Margin: {
   1339         bNeedFindContainer = TRUE;
   1340         CXFA_Node* pParentNode = this->GetNodeItem(XFA_NODEITEM_Parent);
   1341         XFA_ELEMENT eParentType = pParentNode->GetClassID();
   1342         if (pParentNode->IsContainerNode()) {
   1343           pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
   1344                                eValue, this, pParentNode);
   1345         } else if (eParentType == XFA_ELEMENT_Caption) {
   1346           pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
   1347                                eValue, pParentNode,
   1348                                pParentNode->GetNodeItem(XFA_NODEITEM_Parent));
   1349         } else {
   1350           CXFA_Node* pNode = pParentNode->GetNodeItem(XFA_NODEITEM_Parent);
   1351           if (pNode && pNode->GetClassID() == XFA_ELEMENT_Ui) {
   1352             pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
   1353                                  eValue, pNode,
   1354                                  pNode->GetNodeItem(XFA_NODEITEM_Parent));
   1355           }
   1356         }
   1357       } break;
   1358       case XFA_ELEMENT_Comb: {
   1359         CXFA_Node* pEditNode = this->GetNodeItem(XFA_NODEITEM_Parent);
   1360         XFA_ELEMENT eUIType = pEditNode->GetClassID();
   1361         if (pEditNode && (eUIType == XFA_ELEMENT_DateTimeEdit ||
   1362                           eUIType == XFA_ELEMENT_NumericEdit ||
   1363                           eUIType == XFA_ELEMENT_TextEdit)) {
   1364           CXFA_Node* pUINode = pEditNode->GetNodeItem(XFA_NODEITEM_Parent);
   1365           if (pUINode) {
   1366             pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
   1367                                  eValue, pUINode,
   1368                                  pUINode->GetNodeItem(XFA_NODEITEM_Parent));
   1369           }
   1370         }
   1371       } break;
   1372       case XFA_ELEMENT_Button:
   1373       case XFA_ELEMENT_Barcode:
   1374       case XFA_ELEMENT_ChoiceList:
   1375       case XFA_ELEMENT_DateTimeEdit:
   1376       case XFA_ELEMENT_NumericEdit:
   1377       case XFA_ELEMENT_PasswordEdit:
   1378       case XFA_ELEMENT_TextEdit: {
   1379         CXFA_Node* pUINode = this->GetNodeItem(XFA_NODEITEM_Parent);
   1380         if (pUINode) {
   1381           pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
   1382                                eValue, pUINode,
   1383                                pUINode->GetNodeItem(XFA_NODEITEM_Parent));
   1384         }
   1385       } break;
   1386       case XFA_ELEMENT_CheckButton: {
   1387         bNeedFindContainer = TRUE;
   1388         CXFA_Node* pUINode = this->GetNodeItem(XFA_NODEITEM_Parent);
   1389         if (pUINode) {
   1390           pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
   1391                                eValue, pUINode,
   1392                                pUINode->GetNodeItem(XFA_NODEITEM_Parent));
   1393         }
   1394       } break;
   1395       case XFA_ELEMENT_Keep:
   1396       case XFA_ELEMENT_Bookend:
   1397       case XFA_ELEMENT_Break:
   1398       case XFA_ELEMENT_BreakAfter:
   1399       case XFA_ELEMENT_BreakBefore:
   1400       case XFA_ELEMENT_Overflow:
   1401         bNeedFindContainer = TRUE;
   1402         break;
   1403       case XFA_ELEMENT_Area:
   1404       case XFA_ELEMENT_Draw:
   1405       case XFA_ELEMENT_ExclGroup:
   1406       case XFA_ELEMENT_Field:
   1407       case XFA_ELEMENT_Subform:
   1408       case XFA_ELEMENT_SubformSet:
   1409         pLayoutPro->AddChangedContainer(this);
   1410         pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
   1411                              eValue, this, this);
   1412         break;
   1413       case XFA_ELEMENT_Sharptext:
   1414       case XFA_ELEMENT_Sharpxml:
   1415       case XFA_ELEMENT_SharpxHTML: {
   1416         CXFA_Node* pTextNode = this->GetNodeItem(XFA_NODEITEM_Parent);
   1417         if (!pTextNode) {
   1418           return;
   1419         }
   1420         CXFA_Node* pValueNode = pTextNode->GetNodeItem(XFA_NODEITEM_Parent);
   1421         if (!pValueNode) {
   1422           return;
   1423         }
   1424         XFA_ELEMENT eType = pValueNode->GetClassID();
   1425         if (eType == XFA_ELEMENT_Value) {
   1426           bNeedFindContainer = TRUE;
   1427           CXFA_Node* pNode = pValueNode->GetNodeItem(XFA_NODEITEM_Parent);
   1428           if (pNode && pNode->IsContainerNode()) {
   1429             if (bScriptModify) {
   1430               pValueNode = pNode;
   1431             }
   1432             pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
   1433                                  eValue, pValueNode, pNode);
   1434           } else {
   1435             pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
   1436                                  eValue, pNode,
   1437                                  pNode->GetNodeItem(XFA_NODEITEM_Parent));
   1438           }
   1439         } else {
   1440           if (eType == XFA_ELEMENT_Items) {
   1441             CXFA_Node* pNode = pValueNode->GetNodeItem(XFA_NODEITEM_Parent);
   1442             if (pNode && pNode->IsContainerNode()) {
   1443               pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute,
   1444                                    eValue, pValueNode, pNode);
   1445             }
   1446           }
   1447         }
   1448       } break;
   1449       default:
   1450         break;
   1451     }
   1452     if (bNeedFindContainer) {
   1453       CXFA_Node* pParent = this;
   1454       while (pParent) {
   1455         if (pParent->IsContainerNode()) {
   1456           break;
   1457         }
   1458         pParent = pParent->GetNodeItem(XFA_NODEITEM_Parent);
   1459       }
   1460       if (pParent) {
   1461         pLayoutPro->AddChangedContainer(pParent);
   1462       }
   1463     }
   1464   } else {
   1465     pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanged, eAttribute, eValue,
   1466                          this, this);
   1467   }
   1468 }
   1469 void CXFA_Node::Script_Attribute_String(FXJSE_HVALUE hValue,
   1470                                         FX_BOOL bSetting,
   1471                                         XFA_ATTRIBUTE eAttribute) {
   1472   if (bSetting) {
   1473     CFX_ByteString szValue;
   1474     FXJSE_Value_ToUTF8String(hValue, szValue);
   1475     CFX_WideString wsValue =
   1476         CFX_WideString::FromUTF8(szValue, szValue.GetLength());
   1477     SetAttribute(eAttribute, wsValue, TRUE);
   1478     if (eAttribute == XFA_ATTRIBUTE_Use &&
   1479         this->GetClassID() == XFA_ELEMENT_Desc) {
   1480       CFX_WideString wsUseVal = wsValue, wsID, wsSOM;
   1481       CXFA_Node* pTemplateNode =
   1482           (CXFA_Node*)m_pDocument->GetXFANode(XFA_HASHCODE_Template);
   1483       CXFA_Node* pProtoRoot =
   1484           pTemplateNode->GetFirstChildByClass(XFA_ELEMENT_Subform)
   1485               ->GetFirstChildByClass(XFA_ELEMENT_Proto);
   1486       if (!wsUseVal.IsEmpty()) {
   1487         if (wsUseVal[0] == '#') {
   1488           wsID = CFX_WideString((const FX_WCHAR*)wsUseVal + 1,
   1489                                 wsUseVal.GetLength() - 1);
   1490         } else {
   1491           wsSOM =
   1492               CFX_WideString((const FX_WCHAR*)wsUseVal, wsUseVal.GetLength());
   1493         }
   1494       }
   1495       CXFA_Node* pProtoNode = NULL;
   1496       if (!wsSOM.IsEmpty()) {
   1497         FX_DWORD dwFlag = XFA_RESOLVENODE_Children |
   1498                           XFA_RESOLVENODE_Attributes |
   1499                           XFA_RESOLVENODE_Properties | XFA_RESOLVENODE_Parent |
   1500                           XFA_RESOLVENODE_Siblings;
   1501         XFA_RESOLVENODE_RS resoveNodeRS;
   1502         int32_t iRet = m_pDocument->GetScriptContext()->ResolveObjects(
   1503             pProtoRoot, wsSOM, resoveNodeRS, dwFlag);
   1504         if (iRet > 0 && resoveNodeRS.nodes[0]->IsNode()) {
   1505           pProtoNode = (CXFA_Node*)resoveNodeRS.nodes[0];
   1506         }
   1507       } else if (!wsID.IsEmpty()) {
   1508         pProtoNode = m_pDocument->GetNodeByID(pProtoRoot, wsID);
   1509       }
   1510       if (pProtoNode) {
   1511         CXFA_Node* pHeadChild = GetNodeItem(XFA_NODEITEM_FirstChild);
   1512         while (pHeadChild) {
   1513           CXFA_Node* pSibling =
   1514               pHeadChild->GetNodeItem(XFA_NODEITEM_NextSibling);
   1515           RemoveChild(pHeadChild);
   1516           pHeadChild = pSibling;
   1517         }
   1518         CXFA_Node* pProtoForm = pProtoNode->CloneTemplateToForm(TRUE);
   1519         pHeadChild = pProtoForm->GetNodeItem(XFA_NODEITEM_FirstChild);
   1520         while (pHeadChild) {
   1521           CXFA_Node* pSibling =
   1522               pHeadChild->GetNodeItem(XFA_NODEITEM_NextSibling);
   1523           pProtoForm->RemoveChild(pHeadChild);
   1524           InsertChild(pHeadChild);
   1525           pHeadChild = pSibling;
   1526         }
   1527         m_pDocument->RemovePurgeNode(pProtoForm);
   1528         delete pProtoForm;
   1529       }
   1530     }
   1531   } else {
   1532     CFX_WideString wsValue;
   1533     GetAttribute(eAttribute, wsValue);
   1534     FXJSE_Value_SetUTF8String(hValue,
   1535                               FX_UTF8Encode(wsValue, wsValue.GetLength()));
   1536   }
   1537 }
   1538 void CXFA_Node::Script_Attribute_StringRead(FXJSE_HVALUE hValue,
   1539                                             FX_BOOL bSetting,
   1540                                             XFA_ATTRIBUTE eAttribute) {
   1541   if (!bSetting) {
   1542     CFX_WideString wsValue;
   1543     GetAttribute(eAttribute, wsValue);
   1544     FXJSE_Value_SetUTF8String(hValue,
   1545                               FX_UTF8Encode(wsValue, wsValue.GetLength()));
   1546   } else {
   1547     ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
   1548   }
   1549 }
   1550 void CXFA_Node::Script_WsdlConnection_Execute(CFXJSE_Arguments* pArguments) {
   1551   int32_t argc = pArguments->GetLength();
   1552   if ((argc == 0) || (argc == 1)) {
   1553     FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE);
   1554   } else {
   1555     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"execute");
   1556   }
   1557 }
   1558 void CXFA_Node::Script_Delta_Restore(CFXJSE_Arguments* pArguments) {
   1559   int32_t argc = pArguments->GetLength();
   1560   if (argc == 0) {
   1561   } else {
   1562     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"restore");
   1563   }
   1564 }
   1565 void CXFA_Node::Script_Delta_CurrentValue(FXJSE_HVALUE hValue,
   1566                                           FX_BOOL bSetting,
   1567                                           XFA_ATTRIBUTE eAttribute) {}
   1568 void CXFA_Node::Script_Delta_SavedValue(FXJSE_HVALUE hValue,
   1569                                         FX_BOOL bSetting,
   1570                                         XFA_ATTRIBUTE eAttribute) {}
   1571 void CXFA_Node::Script_Delta_Target(FXJSE_HVALUE hValue,
   1572                                     FX_BOOL bSetting,
   1573                                     XFA_ATTRIBUTE eAttribute) {}
   1574 void CXFA_Node::Script_Som_Message(FXJSE_HVALUE hValue,
   1575                                    FX_BOOL bSetting,
   1576                                    XFA_SOM_MESSAGETYPE iMessageType) {
   1577   CXFA_WidgetData* pWidgetData = GetWidgetData();
   1578   if (!pWidgetData) {
   1579     return;
   1580   }
   1581   FX_BOOL bNew = FALSE;
   1582   CXFA_Validate validate = pWidgetData->GetValidate();
   1583   if (!validate) {
   1584     validate = pWidgetData->GetValidate(TRUE);
   1585     bNew = TRUE;
   1586   }
   1587   if (bSetting) {
   1588     CFX_ByteString bsMessage;
   1589     FXJSE_Value_ToUTF8String(hValue, bsMessage);
   1590     switch (iMessageType) {
   1591       case XFA_SOM_ValidationMessage:
   1592         validate.SetScriptMessageText(
   1593             CFX_WideString::FromUTF8(bsMessage, bsMessage.GetLength()));
   1594         break;
   1595       case XFA_SOM_FormatMessage:
   1596         validate.SetFormatMessageText(
   1597             CFX_WideString::FromUTF8(bsMessage, bsMessage.GetLength()));
   1598         break;
   1599       case XFA_SOM_MandatoryMessage:
   1600         validate.SetNullMessageText(
   1601             CFX_WideString::FromUTF8(bsMessage, bsMessage.GetLength()));
   1602         break;
   1603       default:
   1604         break;
   1605     }
   1606     if (!bNew) {
   1607       IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
   1608       if (!pNotify) {
   1609         return;
   1610       }
   1611       pNotify->AddCalcValidate(this);
   1612     }
   1613   } else {
   1614     CFX_WideString wsMessage;
   1615     switch (iMessageType) {
   1616       case XFA_SOM_ValidationMessage:
   1617         validate.GetScriptMessageText(wsMessage);
   1618         break;
   1619       case XFA_SOM_FormatMessage:
   1620         validate.GetFormatMessageText(wsMessage);
   1621         break;
   1622       case XFA_SOM_MandatoryMessage:
   1623         validate.GetNullMessageText(wsMessage);
   1624         break;
   1625       default:
   1626         break;
   1627     }
   1628     FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsMessage));
   1629   }
   1630 }
   1631 void CXFA_Node::Script_Som_ValidationMessage(FXJSE_HVALUE hValue,
   1632                                              FX_BOOL bSetting,
   1633                                              XFA_ATTRIBUTE eAttribute) {
   1634   Script_Som_Message(hValue, bSetting, XFA_SOM_ValidationMessage);
   1635 }
   1636 void CXFA_Node::Script_Field_Length(FXJSE_HVALUE hValue,
   1637                                     FX_BOOL bSetting,
   1638                                     XFA_ATTRIBUTE eAttribute) {
   1639   if (bSetting) {
   1640     ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
   1641   } else {
   1642     CXFA_WidgetData* pWidgetData = GetWidgetData();
   1643     if (!pWidgetData) {
   1644       FXJSE_Value_SetInteger(hValue, 0);
   1645       return;
   1646     }
   1647     FXJSE_Value_SetInteger(hValue, pWidgetData->CountChoiceListItems(TRUE));
   1648   }
   1649 }
   1650 void CXFA_Node::Script_Som_DefaultValue(FXJSE_HVALUE hValue,
   1651                                         FX_BOOL bSetting,
   1652                                         XFA_ATTRIBUTE eAttribute) {
   1653   XFA_ELEMENT classID = GetClassID();
   1654   if (classID == XFA_ELEMENT_Field) {
   1655     Script_Field_DefaultValue(hValue, bSetting, eAttribute);
   1656     return;
   1657   } else if (classID == XFA_ELEMENT_Draw) {
   1658     Script_Draw_DefaultValue(hValue, bSetting, eAttribute);
   1659     return;
   1660   } else if (classID == XFA_ELEMENT_Boolean) {
   1661     Script_Boolean_Value(hValue, bSetting, eAttribute);
   1662     return;
   1663   }
   1664   if (bSetting) {
   1665     CFX_ByteString newValue;
   1666     if (!(FXJSE_Value_IsNull(hValue) || FXJSE_Value_IsUndefined(hValue))) {
   1667       FXJSE_Value_ToUTF8String(hValue, newValue);
   1668     }
   1669     CFX_WideString wsNewValue =
   1670         CFX_WideString::FromUTF8(newValue, newValue.GetLength());
   1671     CFX_WideString wsFormatValue(wsNewValue);
   1672     CXFA_WidgetData* pContainerWidgetData = NULL;
   1673     if (GetPacketID() == XFA_XDPPACKET_Datasets) {
   1674       CXFA_NodeArray formNodes;
   1675       this->GetBindItems(formNodes);
   1676       CFX_WideString wsPicture;
   1677       for (int32_t i = 0; i < formNodes.GetSize(); i++) {
   1678         CXFA_Node* pFormNode = formNodes.GetAt(i);
   1679         if (!pFormNode || pFormNode->HasFlag(XFA_NODEFLAG_HasRemoved)) {
   1680           continue;
   1681         }
   1682         pContainerWidgetData = pFormNode->GetContainerWidgetData();
   1683         if (pContainerWidgetData) {
   1684           pContainerWidgetData->GetPictureContent(wsPicture,
   1685                                                   XFA_VALUEPICTURE_DataBind);
   1686         }
   1687         if (!wsPicture.IsEmpty()) {
   1688           break;
   1689         }
   1690         pContainerWidgetData = NULL;
   1691       }
   1692     } else if (GetPacketID() == XFA_XDPPACKET_Form) {
   1693       pContainerWidgetData = GetContainerWidgetData();
   1694     }
   1695     if (pContainerWidgetData) {
   1696       pContainerWidgetData->GetFormatDataValue(wsNewValue, wsFormatValue);
   1697     }
   1698     SetScriptContent(wsNewValue, wsFormatValue, TRUE, TRUE);
   1699   } else {
   1700     CFX_WideString content = GetScriptContent(TRUE);
   1701     if (content.IsEmpty() && classID != XFA_ELEMENT_Text &&
   1702         classID != XFA_ELEMENT_SubmitUrl) {
   1703       FXJSE_Value_SetNull(hValue);
   1704     } else if (classID == XFA_ELEMENT_Integer) {
   1705       FXJSE_Value_SetInteger(hValue, FXSYS_wtoi(content));
   1706     } else if (classID == XFA_ELEMENT_Float || classID == XFA_ELEMENT_Decimal) {
   1707       CFX_Decimal decimal(content);
   1708       FXJSE_Value_SetFloat(hValue, (FX_FLOAT)(double)decimal);
   1709     } else {
   1710       FXJSE_Value_SetUTF8String(hValue,
   1711                                 FX_UTF8Encode(content, content.GetLength()));
   1712     }
   1713   }
   1714 }
   1715 void CXFA_Node::Script_Som_DefaultValue_Read(FXJSE_HVALUE hValue,
   1716                                              FX_BOOL bSetting,
   1717                                              XFA_ATTRIBUTE eAttribute) {
   1718   if (bSetting) {
   1719     ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
   1720     return;
   1721   }
   1722   CFX_WideString content = GetScriptContent(TRUE);
   1723   if (content.IsEmpty()) {
   1724     FXJSE_Value_SetNull(hValue);
   1725   } else {
   1726     FXJSE_Value_SetUTF8String(hValue,
   1727                               FX_UTF8Encode(content, content.GetLength()));
   1728   }
   1729 }
   1730 void CXFA_Node::Script_Boolean_Value(FXJSE_HVALUE hValue,
   1731                                      FX_BOOL bSetting,
   1732                                      XFA_ATTRIBUTE eAttribute) {
   1733   if (bSetting) {
   1734     CFX_ByteString newValue;
   1735     if (!(FXJSE_Value_IsNull(hValue) || FXJSE_Value_IsUndefined(hValue))) {
   1736       FXJSE_Value_ToUTF8String(hValue, newValue);
   1737     }
   1738     int32_t iValue = FXSYS_atoi(newValue);
   1739     CFX_WideString wsNewValue = (iValue == 0) ? FX_WSTRC(L"0") : FX_WSTRC(L"1");
   1740     CFX_WideString wsFormatValue(wsNewValue);
   1741     CXFA_WidgetData* pContainerWidgetData = GetContainerWidgetData();
   1742     if (pContainerWidgetData) {
   1743       pContainerWidgetData->GetFormatDataValue(wsNewValue, wsFormatValue);
   1744     }
   1745     SetScriptContent(wsNewValue, wsFormatValue, TRUE, TRUE);
   1746   } else {
   1747     CFX_WideString wsValue = GetScriptContent(TRUE);
   1748     FXJSE_Value_SetBoolean(hValue, wsValue.Equal(FX_WSTRC(L"1")));
   1749   }
   1750 }
   1751 struct XFA_ExecEventParaInfo {
   1752  public:
   1753   uint32_t m_uHash;
   1754   const FX_WCHAR* m_lpcEventName;
   1755   XFA_EVENTTYPE m_eventType;
   1756   uint32_t m_validFlags;
   1757 };
   1758 static const XFA_ExecEventParaInfo gs_eventParaInfos[] = {
   1759     {0x02a6c55a, L"postSubmit", XFA_EVENT_PostSubmit, 0},
   1760     {0x0ab466bb, L"preSubmit", XFA_EVENT_PreSubmit, 0},
   1761     {0x109d7ce7, L"mouseEnter", XFA_EVENT_MouseEnter, 5},
   1762     {0x17fad373, L"postPrint", XFA_EVENT_PostPrint, 0},
   1763     {0x1bfc72d9, L"preOpen", XFA_EVENT_PreOpen, 7},
   1764     {0x2196a452, L"initialize", XFA_EVENT_Initialize, 1},
   1765     {0x27410f03, L"mouseExit", XFA_EVENT_MouseExit, 5},
   1766     {0x33c43dec, L"docClose", XFA_EVENT_DocClose, 0},
   1767     {0x361fa1b6, L"preSave", XFA_EVENT_PreSave, 0},
   1768     {0x36f1c6d8, L"preSign", XFA_EVENT_PreSign, 6},
   1769     {0x4731d6ba, L"exit", XFA_EVENT_Exit, 2},
   1770     {0x56bf456b, L"docReady", XFA_EVENT_DocReady, 0},
   1771     {0x7233018a, L"validate", XFA_EVENT_Validate, 1},
   1772     {0x8808385e, L"indexChange", XFA_EVENT_IndexChange, 3},
   1773     {0x891f4606, L"change", XFA_EVENT_Change, 4},
   1774     {0x9528a7b4, L"prePrint", XFA_EVENT_PrePrint, 0},
   1775     {0x9f693b21, L"mouseDown", XFA_EVENT_MouseDown, 5},
   1776     {0xcdce56b3, L"full", XFA_EVENT_Full, 4},
   1777     {0xd576d08e, L"mouseUp", XFA_EVENT_MouseUp, 5},
   1778     {0xd95657a6, L"click", XFA_EVENT_Click, 4},
   1779     {0xdbfbe02e, L"calculate", XFA_EVENT_Calculate, 1},
   1780     {0xe25fa7b8, L"postOpen", XFA_EVENT_PostOpen, 7},
   1781     {0xe28dce7e, L"enter", XFA_EVENT_Enter, 2},
   1782     {0xfc82d695, L"postSave", XFA_EVENT_PostSave, 0},
   1783     {0xfd54fbb7, L"postSign", XFA_EVENT_PostSign, 6},
   1784 };
   1785 const XFA_ExecEventParaInfo* GetEventParaInfoByName(
   1786     const CFX_WideStringC& wsEventName) {
   1787   int32_t iLength = wsEventName.GetLength();
   1788   uint32_t uHash = FX_HashCode_String_GetW(wsEventName.GetPtr(), iLength);
   1789   const XFA_ExecEventParaInfo* eventParaInfo = NULL;
   1790   int32_t iStart = 0,
   1791           iEnd = (sizeof(gs_eventParaInfos) / sizeof(gs_eventParaInfos[0])) - 1;
   1792   int32_t iMid = (iStart + iEnd) / 2;
   1793   do {
   1794     iMid = (iStart + iEnd) / 2;
   1795     eventParaInfo = &gs_eventParaInfos[iMid];
   1796     if (uHash == eventParaInfo->m_uHash) {
   1797       return eventParaInfo;
   1798     } else if (uHash < eventParaInfo->m_uHash) {
   1799       iEnd = iMid - 1;
   1800     } else {
   1801       iStart = iMid + 1;
   1802     }
   1803   } while (iStart <= iEnd);
   1804   return NULL;
   1805 }
   1806 void XFA_STRING_TO_RGB(CFX_WideString& strRGB,
   1807                        int32_t& r,
   1808                        int32_t& g,
   1809                        int32_t& b) {
   1810   r = 0;
   1811   g = 0;
   1812   b = 0;
   1813   FX_WCHAR zero = '0';
   1814   int32_t iIndex = 0;
   1815   int32_t iLen = strRGB.GetLength();
   1816   for (int32_t i = 0; i < iLen; ++i) {
   1817     FX_WCHAR ch = strRGB.GetAt(i);
   1818     if (ch == L',') {
   1819       ++iIndex;
   1820     }
   1821     if (iIndex > 2) {
   1822       break;
   1823     }
   1824     int32_t iValue = ch - zero;
   1825     if (iValue >= 0 && iValue <= 9) {
   1826       switch (iIndex) {
   1827         case 0:
   1828           r = r * 10 + iValue;
   1829           break;
   1830         case 1:
   1831           g = g * 10 + iValue;
   1832           break;
   1833         default:
   1834           b = b * 10 + iValue;
   1835           break;
   1836       }
   1837     }
   1838   }
   1839 }
   1840 void CXFA_Node::Script_Som_BorderColor(FXJSE_HVALUE hValue,
   1841                                        FX_BOOL bSetting,
   1842                                        XFA_ATTRIBUTE eAttribute) {
   1843   CXFA_WidgetData* pWidgetData = GetWidgetData();
   1844   if (!pWidgetData) {
   1845     return;
   1846   }
   1847   CXFA_Border border = pWidgetData->GetBorder(TRUE);
   1848   int32_t iSize = border.CountEdges();
   1849   CFX_WideString strColor;
   1850   if (bSetting) {
   1851     CFX_ByteString bsValue;
   1852     FXJSE_Value_ToUTF8String(hValue, bsValue);
   1853     strColor = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength());
   1854     int32_t r = 0, g = 0, b = 0;
   1855     XFA_STRING_TO_RGB(strColor, r, g, b);
   1856     FX_ARGB rgb = ArgbEncode(100, r, g, b);
   1857     for (int32_t i = 0; i < iSize; ++i) {
   1858       CXFA_Edge edge = border.GetEdge(i);
   1859       edge.SetColor(rgb);
   1860     }
   1861   } else {
   1862     CXFA_Edge edge = border.GetEdge(0);
   1863     FX_ARGB color = edge.GetColor();
   1864     int32_t a, r, g, b;
   1865     ArgbDecode(color, a, r, g, b);
   1866     strColor.Format(L"%d,%d,%d", r, g, b);
   1867     FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(strColor));
   1868   }
   1869 }
   1870 void CXFA_Node::Script_Som_BorderWidth(FXJSE_HVALUE hValue,
   1871                                        FX_BOOL bSetting,
   1872                                        XFA_ATTRIBUTE eAttribute) {
   1873   CXFA_WidgetData* pWidgetData = GetWidgetData();
   1874   if (!pWidgetData) {
   1875     return;
   1876   }
   1877   CXFA_Border border = pWidgetData->GetBorder(TRUE);
   1878   int32_t iSize = border.CountEdges();
   1879   CFX_WideString wsThickness;
   1880   if (bSetting) {
   1881     CFX_ByteString bsValue;
   1882     FXJSE_Value_ToUTF8String(hValue, bsValue);
   1883     wsThickness = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength());
   1884     for (int32_t i = 0; i < iSize; ++i) {
   1885       CXFA_Edge edge = border.GetEdge(i);
   1886       CXFA_Measurement thickness(wsThickness);
   1887       edge.SetMSThickness(thickness);
   1888     }
   1889   } else {
   1890     CXFA_Edge edge = border.GetEdge(0);
   1891     CXFA_Measurement thickness = edge.GetMSThickness();
   1892     thickness.ToString(wsThickness);
   1893     FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsThickness));
   1894   }
   1895 }
   1896 void CXFA_Node::Script_Som_FillColor(FXJSE_HVALUE hValue,
   1897                                      FX_BOOL bSetting,
   1898                                      XFA_ATTRIBUTE eAttribute) {
   1899   CXFA_WidgetData* pWidgetData = GetWidgetData();
   1900   if (!pWidgetData) {
   1901     return;
   1902   }
   1903   CXFA_Border border = pWidgetData->GetBorder(TRUE);
   1904   CXFA_Fill borderfill = border.GetFill(TRUE);
   1905   CXFA_Node* pNode = (CXFA_Node*)borderfill;
   1906   if (!pNode) {
   1907     return;
   1908   }
   1909   CFX_WideString wsColor;
   1910   if (bSetting) {
   1911     CFX_ByteString bsValue;
   1912     FXJSE_Value_ToUTF8String(hValue, bsValue);
   1913     wsColor = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength());
   1914     int32_t r, g, b;
   1915     XFA_STRING_TO_RGB(wsColor, r, g, b);
   1916     FX_ARGB color = ArgbEncode(0xff, r, g, b);
   1917     borderfill.SetColor(color);
   1918   } else {
   1919     FX_ARGB color = borderfill.GetColor();
   1920     int32_t a, r, g, b;
   1921     ArgbDecode(color, a, r, g, b);
   1922     wsColor.Format(L"%d,%d,%d", r, g, b);
   1923     FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsColor));
   1924   }
   1925 }
   1926 void CXFA_Node::Script_Som_DataNode(FXJSE_HVALUE hValue,
   1927                                     FX_BOOL bSetting,
   1928                                     XFA_ATTRIBUTE eAttribute) {
   1929   if (!bSetting) {
   1930     CXFA_Node* pDataNode = GetBindData();
   1931     if (pDataNode) {
   1932       FXJSE_Value_Set(
   1933           hValue,
   1934           m_pDocument->GetScriptContext()->GetJSValueFromMap(pDataNode));
   1935     } else {
   1936       FXJSE_Value_SetNull(hValue);
   1937     }
   1938   } else {
   1939     ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
   1940   }
   1941 }
   1942 void CXFA_Node::Script_Draw_DefaultValue(FXJSE_HVALUE hValue,
   1943                                          FX_BOOL bSetting,
   1944                                          XFA_ATTRIBUTE eAttribute) {
   1945   if (bSetting) {
   1946     if (FXJSE_Value_IsUTF8String(hValue)) {
   1947       CXFA_WidgetData* pWidgetData = GetWidgetData();
   1948       FXSYS_assert(pWidgetData);
   1949       XFA_ELEMENT uiType = pWidgetData->GetUIType();
   1950       if (uiType == XFA_ELEMENT_Text) {
   1951         CFX_ByteString newValue;
   1952         FXJSE_Value_ToUTF8String(hValue, newValue);
   1953         CFX_WideString wsNewValue =
   1954             CFX_WideString::FromUTF8(newValue, newValue.GetLength());
   1955         CFX_WideString wsFormatValue(wsNewValue);
   1956         SetScriptContent(wsNewValue, wsFormatValue, TRUE, TRUE);
   1957       } else if (uiType != XFA_ELEMENT_Image) {
   1958       }
   1959     }
   1960   } else {
   1961     CFX_WideString content = GetScriptContent(TRUE);
   1962     if (content.IsEmpty()) {
   1963       FXJSE_Value_SetNull(hValue);
   1964     } else {
   1965       FXJSE_Value_SetUTF8String(hValue,
   1966                                 FX_UTF8Encode(content, content.GetLength()));
   1967     }
   1968   }
   1969 }
   1970 void CXFA_Node::Script_Field_DefaultValue(FXJSE_HVALUE hValue,
   1971                                           FX_BOOL bSetting,
   1972                                           XFA_ATTRIBUTE eAttribute) {
   1973   CXFA_WidgetData* pWidgetData = GetWidgetData();
   1974   if (!pWidgetData) {
   1975     return;
   1976   }
   1977   if (bSetting) {
   1978     if (FXJSE_Value_IsNull(hValue)) {
   1979       pWidgetData->m_bPreNull = pWidgetData->m_bIsNull;
   1980       pWidgetData->m_bIsNull = TRUE;
   1981     } else {
   1982       pWidgetData->m_bPreNull = pWidgetData->m_bIsNull;
   1983       pWidgetData->m_bIsNull = FALSE;
   1984     }
   1985     CFX_ByteString newValue;
   1986     if (!(FXJSE_Value_IsNull(hValue) || FXJSE_Value_IsUndefined(hValue))) {
   1987       FXJSE_Value_ToUTF8String(hValue, newValue);
   1988     }
   1989     CFX_WideString wsNewText =
   1990         CFX_WideString::FromUTF8(newValue, newValue.GetLength());
   1991     CXFA_Node* pUIChild = pWidgetData->GetUIChild();
   1992     if (pUIChild->GetClassID() == XFA_ELEMENT_NumericEdit) {
   1993       int32_t iLeadDigits = 0;
   1994       int32_t iFracDigits = 0;
   1995       pWidgetData->GetLeadDigits(iLeadDigits);
   1996       pWidgetData->GetFracDigits(iFracDigits);
   1997       wsNewText = XFA_NumericLimit(wsNewText, iLeadDigits, iFracDigits);
   1998     }
   1999     CXFA_WidgetData* pContainerWidgetData = GetContainerWidgetData();
   2000     CFX_WideString wsFormatText(wsNewText);
   2001     if (pContainerWidgetData) {
   2002       pContainerWidgetData->GetFormatDataValue(wsNewText, wsFormatText);
   2003     }
   2004     SetScriptContent(wsNewText, wsFormatText, TRUE, TRUE);
   2005   } else {
   2006     CFX_WideString content = GetScriptContent(TRUE);
   2007     if (content.IsEmpty()) {
   2008       FXJSE_Value_SetNull(hValue);
   2009     } else {
   2010       CXFA_Node* pUIChild = pWidgetData->GetUIChild();
   2011       XFA_ELEMENT eUI = pUIChild->GetClassID();
   2012       CXFA_Value defVal = pWidgetData->GetFormValue();
   2013       CXFA_Node* pNode = defVal.GetNode()->GetNodeItem(XFA_NODEITEM_FirstChild);
   2014       if (pNode && pNode->GetClassID() == XFA_ELEMENT_Decimal) {
   2015         if (eUI == XFA_ELEMENT_NumericEdit &&
   2016             (pNode->GetInteger(XFA_ATTRIBUTE_FracDigits) == -1)) {
   2017           FXJSE_Value_SetUTF8String(
   2018               hValue, FX_UTF8Encode(content, content.GetLength()));
   2019         } else {
   2020           CFX_Decimal decimal(content);
   2021           FXJSE_Value_SetFloat(hValue, (FX_FLOAT)(double)decimal);
   2022         }
   2023       } else if (pNode && pNode->GetClassID() == XFA_ELEMENT_Integer) {
   2024         FXJSE_Value_SetInteger(hValue, FXSYS_wtoi(content));
   2025       } else if (pNode && pNode->GetClassID() == XFA_ELEMENT_Boolean) {
   2026         FXJSE_Value_SetBoolean(hValue, FXSYS_wtoi(content) == 0 ? FALSE : TRUE);
   2027       } else if (pNode && pNode->GetClassID() == XFA_ELEMENT_Float) {
   2028         CFX_Decimal decimal(content);
   2029         FXJSE_Value_SetFloat(hValue, (FX_FLOAT)(double)decimal);
   2030       } else {
   2031         FXJSE_Value_SetUTF8String(hValue,
   2032                                   FX_UTF8Encode(content, content.GetLength()));
   2033       }
   2034     }
   2035   }
   2036 }
   2037 void CXFA_Node::Script_Field_EditValue(FXJSE_HVALUE hValue,
   2038                                        FX_BOOL bSetting,
   2039                                        XFA_ATTRIBUTE eAttribute) {
   2040   CXFA_WidgetData* pWidgetData = GetWidgetData();
   2041   if (!pWidgetData) {
   2042     return;
   2043   }
   2044   CFX_WideString wsValue;
   2045   if (bSetting) {
   2046     CFX_ByteString bsValue;
   2047     FXJSE_Value_ToUTF8String(hValue, bsValue);
   2048     wsValue = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength());
   2049     pWidgetData->SetValue(wsValue, XFA_VALUEPICTURE_Edit);
   2050   } else {
   2051     pWidgetData->GetValue(wsValue, XFA_VALUEPICTURE_Edit);
   2052     FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsValue));
   2053   }
   2054 }
   2055 void CXFA_Node::Script_Som_FontColor(FXJSE_HVALUE hValue,
   2056                                      FX_BOOL bSetting,
   2057                                      XFA_ATTRIBUTE eAttribute) {
   2058   CXFA_WidgetData* pWidgetData = GetWidgetData();
   2059   if (!pWidgetData) {
   2060     return;
   2061   }
   2062   CXFA_Font font = pWidgetData->GetFont(TRUE);
   2063   CXFA_Node* pNode = (CXFA_Node*)font;
   2064   if (!pNode) {
   2065     return;
   2066   }
   2067   CFX_WideString wsColor;
   2068   if (bSetting) {
   2069     CFX_ByteString bsValue;
   2070     FXJSE_Value_ToUTF8String(hValue, bsValue);
   2071     wsColor = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength());
   2072     int32_t r, g, b;
   2073     XFA_STRING_TO_RGB(wsColor, r, g, b);
   2074     FX_ARGB color = ArgbEncode(0xff, r, g, b);
   2075     font.SetColor(color);
   2076   } else {
   2077     FX_ARGB color = font.GetColor();
   2078     int32_t a, r, g, b;
   2079     ArgbDecode(color, a, r, g, b);
   2080     wsColor.Format(L"%d,%d,%d", r, g, b);
   2081     FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsColor));
   2082   }
   2083 }
   2084 void CXFA_Node::Script_Field_FormatMessage(FXJSE_HVALUE hValue,
   2085                                            FX_BOOL bSetting,
   2086                                            XFA_ATTRIBUTE eAttribute) {
   2087   Script_Som_Message(hValue, bSetting, XFA_SOM_FormatMessage);
   2088 }
   2089 void CXFA_Node::Script_Field_FormattedValue(FXJSE_HVALUE hValue,
   2090                                             FX_BOOL bSetting,
   2091                                             XFA_ATTRIBUTE eAttribute) {
   2092   CXFA_WidgetData* pWidgetData = GetWidgetData();
   2093   if (!pWidgetData) {
   2094     return;
   2095   }
   2096   CFX_WideString wsValue;
   2097   if (bSetting) {
   2098     CFX_ByteString bsValue;
   2099     FXJSE_Value_ToUTF8String(hValue, bsValue);
   2100     wsValue = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength());
   2101     pWidgetData->SetValue(wsValue, XFA_VALUEPICTURE_Display);
   2102   } else {
   2103     pWidgetData->GetValue(wsValue, XFA_VALUEPICTURE_Display);
   2104     FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsValue));
   2105   }
   2106 }
   2107 void CXFA_Node::Script_Som_Mandatory(FXJSE_HVALUE hValue,
   2108                                      FX_BOOL bSetting,
   2109                                      XFA_ATTRIBUTE eAttribute) {
   2110   CXFA_WidgetData* pWidgetData = GetWidgetData();
   2111   if (!pWidgetData) {
   2112     return;
   2113   }
   2114   CXFA_Validate validate = pWidgetData->GetValidate(TRUE);
   2115   CFX_WideString wsValue;
   2116   if (bSetting) {
   2117     CFX_ByteString bsValue;
   2118     FXJSE_Value_ToUTF8String(hValue, bsValue);
   2119     wsValue = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength());
   2120     validate.SetNullTest(wsValue);
   2121   } else {
   2122     int32_t iValue = validate.GetNullTest();
   2123     XFA_LPCATTRIBUTEENUMINFO pInfo =
   2124         XFA_GetAttributeEnumByID((XFA_ATTRIBUTEENUM)iValue);
   2125     if (pInfo) {
   2126       wsValue = pInfo->pName;
   2127     }
   2128     FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsValue));
   2129   }
   2130 }
   2131 void CXFA_Node::Script_Som_MandatoryMessage(FXJSE_HVALUE hValue,
   2132                                             FX_BOOL bSetting,
   2133                                             XFA_ATTRIBUTE eAttribute) {
   2134   Script_Som_Message(hValue, bSetting, XFA_SOM_MandatoryMessage);
   2135 }
   2136 void CXFA_Node::Script_Field_ParentSubform(FXJSE_HVALUE hValue,
   2137                                            FX_BOOL bSetting,
   2138                                            XFA_ATTRIBUTE eAttribute) {
   2139   if (bSetting) {
   2140     ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
   2141   } else {
   2142     FXJSE_Value_SetNull(hValue);
   2143   }
   2144 }
   2145 void CXFA_Node::Script_Field_SelectedIndex(FXJSE_HVALUE hValue,
   2146                                            FX_BOOL bSetting,
   2147                                            XFA_ATTRIBUTE eAttribute) {
   2148   CXFA_WidgetData* pWidgetData = GetWidgetData();
   2149   if (!pWidgetData) {
   2150     return;
   2151   }
   2152   if (bSetting) {
   2153     int32_t iIndex = FXJSE_Value_ToInteger(hValue);
   2154     if (iIndex == -1) {
   2155       pWidgetData->ClearAllSelections();
   2156       return;
   2157     }
   2158     pWidgetData->SetItemState(iIndex, TRUE, TRUE, TRUE);
   2159   } else {
   2160     FXJSE_Value_SetInteger(hValue, pWidgetData->GetSelectedItem());
   2161   }
   2162 }
   2163 void CXFA_Node::Script_Field_ClearItems(CFXJSE_Arguments* pArguments) {
   2164   CXFA_WidgetData* pWidgetData = GetWidgetData();
   2165   if (!pWidgetData) {
   2166     return;
   2167   }
   2168   pWidgetData->DeleteItem(-1, TRUE);
   2169 }
   2170 void CXFA_Node::Script_Field_ExecEvent(CFXJSE_Arguments* pArguments) {
   2171   int32_t argc = pArguments->GetLength();
   2172   if (argc == 1) {
   2173     CFX_ByteString eventString = pArguments->GetUTF8String(0);
   2174     int32_t iRet = execSingleEventByName(
   2175         CFX_WideString::FromUTF8(eventString, eventString.GetLength()),
   2176         XFA_ELEMENT_Field);
   2177     if (eventString == "validate") {
   2178       FXJSE_Value_SetBoolean(pArguments->GetReturnValue(),
   2179                              ((iRet == XFA_EVENTERROR_Error) ? FALSE : TRUE));
   2180     }
   2181   } else {
   2182     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"execEvent");
   2183   }
   2184 }
   2185 void CXFA_Node::Script_Field_ExecInitialize(CFXJSE_Arguments* pArguments) {
   2186   int32_t argc = pArguments->GetLength();
   2187   if (argc == 0) {
   2188     IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
   2189     if (!pNotify) {
   2190       return;
   2191     }
   2192     pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Initialize, FALSE, FALSE);
   2193   } else {
   2194     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
   2195                             L"execInitialize");
   2196   }
   2197 }
   2198 void CXFA_Node::Script_Field_DeleteItem(CFXJSE_Arguments* pArguments) {
   2199   int32_t iLength = pArguments->GetLength();
   2200   if (iLength != 1) {
   2201     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"deleteItem");
   2202     return;
   2203   }
   2204   CXFA_WidgetData* pWidgetData = GetWidgetData();
   2205   if (!pWidgetData) {
   2206     return;
   2207   }
   2208   int32_t iIndex = pArguments->GetInt32(0);
   2209   FX_BOOL bValue = pWidgetData->DeleteItem(iIndex, TRUE, TRUE);
   2210   FXJSE_HVALUE hValue = pArguments->GetReturnValue();
   2211   if (hValue) {
   2212     FXJSE_Value_SetBoolean(hValue, bValue);
   2213   }
   2214 }
   2215 void CXFA_Node::Script_Field_GetSaveItem(CFXJSE_Arguments* pArguments) {
   2216   int32_t iLength = pArguments->GetLength();
   2217   if (iLength != 1) {
   2218     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"getSaveItem");
   2219     return;
   2220   }
   2221   int32_t iIndex = pArguments->GetInt32(0);
   2222   if (iIndex < 0) {
   2223     FXJSE_Value_SetNull(pArguments->GetReturnValue());
   2224     return;
   2225   }
   2226   CXFA_WidgetData* pWidgetData = GetWidgetData();
   2227   if (!pWidgetData) {
   2228     FXJSE_Value_SetNull(pArguments->GetReturnValue());
   2229     return;
   2230   }
   2231   CFX_WideString wsValue;
   2232   FX_BOOL bHasItem = pWidgetData->GetChoiceListItem(wsValue, iIndex, TRUE);
   2233   if (bHasItem) {
   2234     FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(),
   2235                               FX_UTF8Encode(wsValue, wsValue.GetLength()));
   2236   } else {
   2237     FXJSE_Value_SetNull(pArguments->GetReturnValue());
   2238   }
   2239 }
   2240 void CXFA_Node::Script_Field_BoundItem(CFXJSE_Arguments* pArguments) {
   2241   int32_t iLength = pArguments->GetLength();
   2242   if (iLength != 1) {
   2243     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"boundItem");
   2244     return;
   2245   }
   2246   CXFA_WidgetData* pWidgetData = GetWidgetData();
   2247   if (!pWidgetData) {
   2248     return;
   2249   }
   2250   CFX_ByteString bsValue = pArguments->GetUTF8String(0);
   2251   CFX_WideString wsValue =
   2252       CFX_WideString::FromUTF8(bsValue, bsValue.GetLength());
   2253   CFX_WideString wsBoundValue;
   2254   pWidgetData->GetItemValue(wsValue, wsBoundValue);
   2255   FXJSE_HVALUE hValue = pArguments->GetReturnValue();
   2256   if (hValue) {
   2257     FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsBoundValue));
   2258   }
   2259 }
   2260 void CXFA_Node::Script_Field_GetItemState(CFXJSE_Arguments* pArguments) {
   2261   int32_t iLength = pArguments->GetLength();
   2262   if (iLength != 1) {
   2263     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
   2264                             L"getItemState");
   2265     return;
   2266   }
   2267   CXFA_WidgetData* pWidgetData = GetWidgetData();
   2268   if (!pWidgetData) {
   2269     return;
   2270   }
   2271   int32_t iIndex = pArguments->GetInt32(0);
   2272   FX_BOOL bValue = pWidgetData->GetItemState(iIndex);
   2273   FXJSE_HVALUE hValue = pArguments->GetReturnValue();
   2274   if (hValue) {
   2275     FXJSE_Value_SetBoolean(hValue, bValue);
   2276   }
   2277 }
   2278 void CXFA_Node::Script_Field_ExecCalculate(CFXJSE_Arguments* pArguments) {
   2279   int32_t argc = pArguments->GetLength();
   2280   if (argc == 0) {
   2281     IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
   2282     if (!pNotify) {
   2283       return;
   2284     }
   2285     pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Calculate, FALSE, FALSE);
   2286   } else {
   2287     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
   2288                             L"execCalculate");
   2289   }
   2290 }
   2291 void CXFA_Node::Script_Field_SetItems(CFXJSE_Arguments* pArguments) {}
   2292 void CXFA_Node::Script_Field_GetDisplayItem(CFXJSE_Arguments* pArguments) {
   2293   int32_t iLength = pArguments->GetLength();
   2294   if (iLength != 1) {
   2295     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
   2296                             L"getDisplayItem");
   2297     return;
   2298   }
   2299   int32_t iIndex = pArguments->GetInt32(0);
   2300   if (iIndex < 0) {
   2301     FXJSE_Value_SetNull(pArguments->GetReturnValue());
   2302     return;
   2303   }
   2304   CXFA_WidgetData* pWidgetData = GetWidgetData();
   2305   if (!pWidgetData) {
   2306     FXJSE_Value_SetNull(pArguments->GetReturnValue());
   2307     return;
   2308   }
   2309   CFX_WideString wsValue;
   2310   FX_BOOL bHasItem = pWidgetData->GetChoiceListItem(wsValue, iIndex, FALSE);
   2311   if (bHasItem) {
   2312     FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(),
   2313                               FX_UTF8Encode(wsValue, wsValue.GetLength()));
   2314   } else {
   2315     FXJSE_Value_SetNull(pArguments->GetReturnValue());
   2316   }
   2317 }
   2318 void CXFA_Node::Script_Field_SetItemState(CFXJSE_Arguments* pArguments) {
   2319   int32_t iLength = pArguments->GetLength();
   2320   if (iLength != 2) {
   2321     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
   2322                             L"setItemState");
   2323     return;
   2324   }
   2325   CXFA_WidgetData* pWidgetData = GetWidgetData();
   2326   if (!pWidgetData) {
   2327     return;
   2328   }
   2329   int32_t iIndex = pArguments->GetInt32(0);
   2330   FX_BOOL bAdd = pArguments->GetInt32(1) == 0 ? FALSE : TRUE;
   2331   if (bAdd) {
   2332     pWidgetData->SetItemState(iIndex, TRUE, TRUE, TRUE);
   2333   } else {
   2334     if (pWidgetData->GetItemState(iIndex)) {
   2335       pWidgetData->SetItemState(iIndex, FALSE, TRUE, TRUE);
   2336     }
   2337   }
   2338 }
   2339 void CXFA_Node::Script_Field_AddItem(CFXJSE_Arguments* pArguments) {
   2340   int32_t iLength = pArguments->GetLength();
   2341   if (iLength < 1 || iLength > 2) {
   2342     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"addItem");
   2343     return;
   2344   }
   2345   CXFA_WidgetData* pWidgetData = GetWidgetData();
   2346   if (!pWidgetData) {
   2347     return;
   2348   }
   2349   CFX_WideString wsLabel;
   2350   CFX_WideString wsValue;
   2351   if (iLength >= 1) {
   2352     CFX_ByteString bsLable = pArguments->GetUTF8String(0);
   2353     wsLabel = CFX_WideString::FromUTF8(bsLable, bsLable.GetLength());
   2354   }
   2355   if (iLength >= 2) {
   2356     CFX_ByteString bsValue = pArguments->GetUTF8String(1);
   2357     wsValue = CFX_WideString::FromUTF8(bsValue, bsValue.GetLength());
   2358   }
   2359   pWidgetData->InsertItem(wsLabel, wsValue, -1, TRUE);
   2360 }
   2361 void CXFA_Node::Script_Field_ExecValidate(CFXJSE_Arguments* pArguments) {
   2362   int32_t argc = pArguments->GetLength();
   2363   if (argc == 0) {
   2364     IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
   2365     if (!pNotify) {
   2366       FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE);
   2367     } else {
   2368       int32_t iRet =
   2369           pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Validate, FALSE, FALSE);
   2370       FXJSE_Value_SetBoolean(pArguments->GetReturnValue(),
   2371                              ((iRet == XFA_EVENTERROR_Error) ? FALSE : TRUE));
   2372     }
   2373   } else {
   2374     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
   2375                             L"execValidate");
   2376   }
   2377 }
   2378 void CXFA_Node::Script_ExclGroup_ErrorText(FXJSE_HVALUE hValue,
   2379                                            FX_BOOL bSetting,
   2380                                            XFA_ATTRIBUTE eAttribute) {
   2381   if (!bSetting) {
   2382   } else {
   2383     ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
   2384   }
   2385 }
   2386 void CXFA_Node::Script_ExclGroup_DefaultAndRawValue(FXJSE_HVALUE hValue,
   2387                                                     FX_BOOL bSetting,
   2388                                                     XFA_ATTRIBUTE eAttribute) {
   2389   CXFA_WidgetData* pWidgetData = GetWidgetData();
   2390   if (!pWidgetData) {
   2391     return;
   2392   }
   2393   if (bSetting) {
   2394     CFX_ByteString bsValue;
   2395     FXJSE_Value_ToUTF8String(hValue, bsValue);
   2396     pWidgetData->SetSelectedMemberByValue(
   2397         CFX_WideString::FromUTF8(bsValue, bsValue.GetLength()), TRUE, TRUE);
   2398   } else {
   2399     CFX_WideString wsValue = GetScriptContent(TRUE);
   2400     XFA_VERSION curVersion = GetDocument()->GetCurVersionMode();
   2401     if (wsValue.IsEmpty() && curVersion >= XFA_VERSION_300) {
   2402       FXJSE_Value_SetNull(hValue);
   2403     } else {
   2404       FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsValue));
   2405     }
   2406   }
   2407 }
   2408 void CXFA_Node::Script_ExclGroup_Transient(FXJSE_HVALUE hValue,
   2409                                            FX_BOOL bSetting,
   2410                                            XFA_ATTRIBUTE eAttribute) {}
   2411 void CXFA_Node::Script_ExclGroup_ExecEvent(CFXJSE_Arguments* pArguments) {
   2412   int32_t argc = pArguments->GetLength();
   2413   if (argc == 1) {
   2414     CFX_ByteString eventString = pArguments->GetUTF8String(0);
   2415     execSingleEventByName(
   2416         CFX_WideString::FromUTF8(eventString, eventString.GetLength()),
   2417         XFA_ELEMENT_ExclGroup);
   2418   } else {
   2419     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"execEvent");
   2420   }
   2421 }
   2422 void CXFA_Node::Script_ExclGroup_SelectedMember(CFXJSE_Arguments* pArguments) {
   2423   int32_t argc = pArguments->GetLength();
   2424   if ((argc == 0) || (argc == 1)) {
   2425     CXFA_WidgetData* pWidgetData = GetWidgetData();
   2426     if (!pWidgetData) {
   2427       FXJSE_Value_SetNull(pArguments->GetReturnValue());
   2428     } else {
   2429       CXFA_Node* pReturnNode = NULL;
   2430       if (argc == 0) {
   2431         pReturnNode = pWidgetData->GetSelectedMember();
   2432       } else {
   2433         CFX_ByteString szName;
   2434         szName = pArguments->GetUTF8String(0);
   2435         pReturnNode = pWidgetData->SetSelectedMember(
   2436             CFX_WideString::FromUTF8(szName, szName.GetLength()));
   2437       }
   2438       if (pReturnNode) {
   2439         FXJSE_Value_Set(
   2440             pArguments->GetReturnValue(),
   2441             m_pDocument->GetScriptContext()->GetJSValueFromMap(pReturnNode));
   2442       } else {
   2443         FXJSE_Value_SetNull(pArguments->GetReturnValue());
   2444       }
   2445     }
   2446   } else {
   2447     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
   2448                             L"selectedMember");
   2449   }
   2450 }
   2451 void CXFA_Node::Script_ExclGroup_ExecInitialize(CFXJSE_Arguments* pArguments) {
   2452   int32_t argc = pArguments->GetLength();
   2453   if (argc == 0) {
   2454     IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
   2455     if (!pNotify) {
   2456       return;
   2457     }
   2458     pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Initialize);
   2459   } else {
   2460     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
   2461                             L"execInitialize");
   2462   }
   2463 }
   2464 void CXFA_Node::Script_ExclGroup_ExecCalculate(CFXJSE_Arguments* pArguments) {
   2465   int32_t argc = pArguments->GetLength();
   2466   if (argc == 0) {
   2467     IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
   2468     if (!pNotify) {
   2469       return;
   2470     }
   2471     pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Calculate);
   2472   } else {
   2473     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
   2474                             L"execCalculate");
   2475   }
   2476 }
   2477 void CXFA_Node::Script_ExclGroup_ExecValidate(CFXJSE_Arguments* pArguments) {
   2478   int32_t argc = pArguments->GetLength();
   2479   if (argc == 0) {
   2480     IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
   2481     if (!pNotify) {
   2482       FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE);
   2483     } else {
   2484       int32_t iRet = pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Validate);
   2485       FXJSE_Value_SetBoolean(pArguments->GetReturnValue(),
   2486                              ((iRet == XFA_EVENTERROR_Error) ? FALSE : TRUE));
   2487     }
   2488   } else {
   2489     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
   2490                             L"execValidate");
   2491   }
   2492 }
   2493 static CXFA_Node* XFA_ScriptInstanceManager_GetItem(CXFA_Node* pInstMgrNode,
   2494                                                     int32_t iIndex) {
   2495   ASSERT(pInstMgrNode);
   2496   int32_t iCount = 0;
   2497   FX_DWORD dwNameHash = 0;
   2498   for (CXFA_Node* pNode = pInstMgrNode->GetNodeItem(XFA_NODEITEM_NextSibling);
   2499        pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
   2500     XFA_ELEMENT eCurType = pNode->GetClassID();
   2501     if (eCurType == XFA_ELEMENT_InstanceManager) {
   2502       break;
   2503     }
   2504     if ((eCurType != XFA_ELEMENT_Subform) &&
   2505         (eCurType != XFA_ELEMENT_SubformSet)) {
   2506       continue;
   2507     }
   2508     if (iCount == 0) {
   2509       CFX_WideStringC wsName = pNode->GetCData(XFA_ATTRIBUTE_Name);
   2510       CFX_WideStringC wsInstName = pInstMgrNode->GetCData(XFA_ATTRIBUTE_Name);
   2511       if (wsInstName.GetLength() < 1 || wsInstName.GetAt(0) != '_' ||
   2512           wsInstName.Mid(1) != wsName) {
   2513         return NULL;
   2514       }
   2515       dwNameHash = pNode->GetNameHash();
   2516     }
   2517     if (dwNameHash != pNode->GetNameHash()) {
   2518       break;
   2519     }
   2520     iCount++;
   2521     if (iCount > iIndex) {
   2522       return pNode;
   2523     }
   2524   }
   2525   return NULL;
   2526 }
   2527 void CXFA_Node::Script_Som_InstanceIndex(FXJSE_HVALUE hValue,
   2528                                          FX_BOOL bSetting,
   2529                                          XFA_ATTRIBUTE eAttribute) {
   2530   if (bSetting) {
   2531     int32_t iTo = FXJSE_Value_ToInteger(hValue);
   2532     int32_t iFrom = Subform_and_SubformSet_InstanceIndex();
   2533     CXFA_Node* pManagerNode = NULL;
   2534     for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_PrevSibling);
   2535          pNode != NULL; pNode = pNode->GetNodeItem(XFA_NODEITEM_PrevSibling)) {
   2536       if (pNode->GetClassID() == XFA_ELEMENT_InstanceManager) {
   2537         pManagerNode = pNode;
   2538         break;
   2539       }
   2540     }
   2541     if (pManagerNode) {
   2542       pManagerNode->InstanceManager_MoveInstance(iTo, iFrom);
   2543       IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
   2544       if (!pNotify) {
   2545         return;
   2546       }
   2547       CXFA_Node* pToInstance =
   2548           XFA_ScriptInstanceManager_GetItem(pManagerNode, iTo);
   2549       if (pToInstance && pToInstance->GetClassID() == XFA_ELEMENT_Subform) {
   2550         pNotify->RunSubformIndexChange(pToInstance);
   2551       }
   2552       CXFA_Node* pFromInstance =
   2553           XFA_ScriptInstanceManager_GetItem(pManagerNode, iFrom);
   2554       if (pFromInstance && pFromInstance->GetClassID() == XFA_ELEMENT_Subform) {
   2555         pNotify->RunSubformIndexChange(pFromInstance);
   2556       }
   2557     }
   2558   } else {
   2559     FXJSE_Value_SetInteger(hValue, Subform_and_SubformSet_InstanceIndex());
   2560   }
   2561 }
   2562 void CXFA_Node::Script_Subform_InstanceManager(FXJSE_HVALUE hValue,
   2563                                                FX_BOOL bSetting,
   2564                                                XFA_ATTRIBUTE eAttribute) {
   2565   if (!bSetting) {
   2566     CFX_WideStringC wsName = this->GetCData(XFA_ATTRIBUTE_Name);
   2567     CXFA_Node* pInstanceMgr = NULL;
   2568     for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_PrevSibling);
   2569          pNode != NULL; pNode = pNode->GetNodeItem(XFA_NODEITEM_PrevSibling)) {
   2570       if (pNode->GetClassID() == XFA_ELEMENT_InstanceManager) {
   2571         CFX_WideStringC wsInstMgrName = pNode->GetCData(XFA_ATTRIBUTE_Name);
   2572         if (wsInstMgrName.GetLength() >= 1 && wsInstMgrName.GetAt(0) == '_' &&
   2573             wsInstMgrName.Mid(1) == wsName) {
   2574           pInstanceMgr = pNode;
   2575         }
   2576         break;
   2577       }
   2578     }
   2579     if (pInstanceMgr) {
   2580       FXJSE_Value_Set(
   2581           hValue,
   2582           m_pDocument->GetScriptContext()->GetJSValueFromMap(pInstanceMgr));
   2583     } else {
   2584       FXJSE_Value_SetNull(hValue);
   2585     }
   2586   } else {
   2587     ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
   2588   }
   2589 }
   2590 void CXFA_Node::Script_Subform_Locale(FXJSE_HVALUE hValue,
   2591                                       FX_BOOL bSetting,
   2592                                       XFA_ATTRIBUTE eAttribute) {
   2593   if (bSetting) {
   2594     CFX_ByteString bsLocaleName;
   2595     FXJSE_Value_ToUTF8String(hValue, bsLocaleName);
   2596     this->SetCData(
   2597         XFA_ATTRIBUTE_Locale,
   2598         CFX_WideString::FromUTF8(bsLocaleName, bsLocaleName.GetLength()), TRUE,
   2599         TRUE);
   2600   } else {
   2601     CFX_WideString wsLocaleName;
   2602     GetLocaleName(wsLocaleName);
   2603     FXJSE_Value_SetUTF8String(
   2604         hValue, FX_UTF8Encode(wsLocaleName, wsLocaleName.GetLength()));
   2605   }
   2606 }
   2607 void CXFA_Node::Script_Subform_ExecEvent(CFXJSE_Arguments* pArguments) {
   2608   int32_t argc = pArguments->GetLength();
   2609   if (argc == 1) {
   2610     CFX_ByteString eventString = pArguments->GetUTF8String(0);
   2611     execSingleEventByName(
   2612         CFX_WideString::FromUTF8(eventString, eventString.GetLength()),
   2613         XFA_ELEMENT_Subform);
   2614   } else {
   2615     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"execEvent");
   2616   }
   2617 }
   2618 void CXFA_Node::Script_Subform_ExecInitialize(CFXJSE_Arguments* pArguments) {
   2619   int32_t argc = pArguments->GetLength();
   2620   if (argc == 0) {
   2621     IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
   2622     if (!pNotify) {
   2623       return;
   2624     }
   2625     pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Initialize);
   2626   } else {
   2627     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
   2628                             L"execInitialize");
   2629   }
   2630 }
   2631 void CXFA_Node::Script_Subform_ExecCalculate(CFXJSE_Arguments* pArguments) {
   2632   int32_t argc = pArguments->GetLength();
   2633   if (argc == 0) {
   2634     IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
   2635     if (!pNotify) {
   2636       return;
   2637     }
   2638     pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Calculate);
   2639   } else {
   2640     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
   2641                             L"execCalculate");
   2642   }
   2643 }
   2644 void CXFA_Node::Script_Subform_ExecValidate(CFXJSE_Arguments* pArguments) {
   2645   int32_t argc = pArguments->GetLength();
   2646   if (argc == 0) {
   2647     IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
   2648     if (!pNotify) {
   2649       FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE);
   2650     } else {
   2651       int32_t iRet = pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Validate);
   2652       FXJSE_Value_SetBoolean(pArguments->GetReturnValue(),
   2653                              ((iRet == XFA_EVENTERROR_Error) ? FALSE : TRUE));
   2654     }
   2655   } else {
   2656     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
   2657                             L"execValidate");
   2658   }
   2659 }
   2660 void CXFA_Node::Script_Subform_GetInvalidObjects(CFXJSE_Arguments* pArguments) {
   2661   int32_t argc = pArguments->GetLength();
   2662   if (argc == 0) {
   2663   } else {
   2664     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
   2665                             L"getInvalidObjects");
   2666   }
   2667 }
   2668 int32_t CXFA_Node::Subform_and_SubformSet_InstanceIndex() {
   2669   int32_t index = 0;
   2670   for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_PrevSibling); pNode != NULL;
   2671        pNode = pNode->GetNodeItem(XFA_NODEITEM_PrevSibling)) {
   2672     if ((pNode->GetClassID() == XFA_ELEMENT_Subform) ||
   2673         (pNode->GetClassID() == XFA_ELEMENT_SubformSet)) {
   2674       index++;
   2675     } else {
   2676       break;
   2677     }
   2678   }
   2679   return index;
   2680 }
   2681 void CXFA_Node::Script_Template_FormNodes(CFXJSE_Arguments* pArguments) {
   2682   int32_t argc = pArguments->GetLength();
   2683   if (argc == 1) {
   2684     FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), TRUE);
   2685   } else {
   2686     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"formNodes");
   2687   }
   2688 }
   2689 void CXFA_Node::Script_Template_Remerge(CFXJSE_Arguments* pArguments) {
   2690   int32_t argc = pArguments->GetLength();
   2691   if (argc == 0) {
   2692     m_pDocument->DoDataRemerge(TRUE);
   2693   } else {
   2694     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"remerge");
   2695   }
   2696 }
   2697 void CXFA_Node::Script_Template_ExecInitialize(CFXJSE_Arguments* pArguments) {
   2698   int32_t argc = pArguments->GetLength();
   2699   if (argc == 0) {
   2700     CXFA_WidgetData* pWidgetData = GetWidgetData();
   2701     if (!pWidgetData) {
   2702       FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE);
   2703     } else {
   2704       FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), TRUE);
   2705     }
   2706   } else {
   2707     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
   2708                             L"execInitialize");
   2709   }
   2710 }
   2711 void CXFA_Node::Script_Template_CreateNode(CFXJSE_Arguments* pArguments) {
   2712   int32_t argc = pArguments->GetLength();
   2713   if ((argc > 0) && (argc < 4)) {
   2714     CFX_WideString strTagName;
   2715     CFX_WideString strName;
   2716     CFX_WideString strNameSpace;
   2717     CFX_ByteString bsTagName = pArguments->GetUTF8String(0);
   2718     strTagName = CFX_WideString::FromUTF8(bsTagName, bsTagName.GetLength());
   2719     if (argc > 1) {
   2720       CFX_ByteString bsName = pArguments->GetUTF8String(1);
   2721       strName = CFX_WideString::FromUTF8(bsName, bsName.GetLength());
   2722       if (argc == 3) {
   2723         CFX_ByteString bsNameSpace = pArguments->GetUTF8String(2);
   2724         strNameSpace =
   2725             CFX_WideString::FromUTF8(bsNameSpace, bsNameSpace.GetLength());
   2726       }
   2727     }
   2728     XFA_LPCELEMENTINFO pElement = XFA_GetElementByName(strTagName);
   2729     CXFA_Node* pNewNode = CreateSamePacketNode(pElement->eName);
   2730     if (!pNewNode) {
   2731       FXJSE_Value_SetNull(pArguments->GetReturnValue());
   2732     } else {
   2733       if (!strName.IsEmpty()) {
   2734         if (XFA_GetAttributeOfElement(pElement->eName, XFA_ATTRIBUTE_Name,
   2735                                       XFA_XDPPACKET_UNKNOWN)) {
   2736           pNewNode->SetAttribute(XFA_ATTRIBUTE_Name, strName, TRUE);
   2737           if (pNewNode->GetPacketID() == XFA_XDPPACKET_Datasets) {
   2738             pNewNode->CreateXMLMappingNode();
   2739           }
   2740           FXJSE_Value_Set(
   2741               pArguments->GetReturnValue(),
   2742               m_pDocument->GetScriptContext()->GetJSValueFromMap(pNewNode));
   2743         } else {
   2744           ThrowScriptErrorMessage(XFA_IDS_NOT_HAVE_PROPERTY,
   2745                                   (const FX_WCHAR*)strTagName, L"name");
   2746         }
   2747       } else {
   2748         FXJSE_Value_Set(
   2749             pArguments->GetReturnValue(),
   2750             m_pDocument->GetScriptContext()->GetJSValueFromMap(pNewNode));
   2751       }
   2752     }
   2753   } else {
   2754     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"createNode");
   2755   }
   2756 }
   2757 void CXFA_Node::Script_Template_Recalculate(CFXJSE_Arguments* pArguments) {
   2758   if (pArguments->GetLength() == 1) {
   2759     FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), TRUE);
   2760   } else {
   2761     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"recalculate");
   2762   }
   2763 }
   2764 void CXFA_Node::Script_Template_ExecCalculate(CFXJSE_Arguments* pArguments) {
   2765   int32_t argc = pArguments->GetLength();
   2766   if (argc == 0) {
   2767     CXFA_WidgetData* pWidgetData = GetWidgetData();
   2768     if (!pWidgetData) {
   2769       FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE);
   2770     } else {
   2771       FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), TRUE);
   2772     }
   2773   } else {
   2774     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
   2775                             L"execCalculate");
   2776   }
   2777 }
   2778 void CXFA_Node::Script_Template_ExecValidate(CFXJSE_Arguments* pArguments) {
   2779   int32_t argc = pArguments->GetLength();
   2780   if (argc == 0) {
   2781     CXFA_WidgetData* pWidgetData = GetWidgetData();
   2782     if (!pWidgetData) {
   2783       FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE);
   2784     } else {
   2785       FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), TRUE);
   2786     }
   2787   } else {
   2788     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
   2789                             L"execValidate");
   2790   }
   2791 }
   2792 void CXFA_Node::Script_Manifest_Evaluate(CFXJSE_Arguments* pArguments) {
   2793   int32_t argc = pArguments->GetLength();
   2794   if (argc == 0) {
   2795     CXFA_WidgetData* pWidgetData = GetWidgetData();
   2796     if (!pWidgetData) {
   2797       FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE);
   2798     } else {
   2799       FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), TRUE);
   2800     }
   2801   } else {
   2802     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"evaluate");
   2803   }
   2804 }
   2805 void CXFA_Node::Script_InstanceManager_Max(FXJSE_HVALUE hValue,
   2806                                            FX_BOOL bSetting,
   2807                                            XFA_ATTRIBUTE eAttribute) {
   2808   if (bSetting) {
   2809     ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
   2810     return;
   2811   } else {
   2812     CXFA_Occur nodeOccur = GetOccurNode();
   2813     FXJSE_Value_SetInteger(hValue, nodeOccur.GetMax());
   2814   }
   2815 }
   2816 void CXFA_Node::Script_InstanceManager_Min(FXJSE_HVALUE hValue,
   2817                                            FX_BOOL bSetting,
   2818                                            XFA_ATTRIBUTE eAttribute) {
   2819   if (bSetting) {
   2820     ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
   2821     return;
   2822   } else {
   2823     CXFA_Occur nodeOccur = GetOccurNode();
   2824     FXJSE_Value_SetInteger(hValue, nodeOccur.GetMin());
   2825   }
   2826 }
   2827 static int32_t XFA_ScriptInstanceManager_GetCount(CXFA_Node* pInstMgrNode) {
   2828   ASSERT(pInstMgrNode);
   2829   int32_t iCount = 0;
   2830   FX_DWORD dwNameHash = 0;
   2831   for (CXFA_Node* pNode = pInstMgrNode->GetNodeItem(XFA_NODEITEM_NextSibling);
   2832        pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
   2833     XFA_ELEMENT eCurType = pNode->GetClassID();
   2834     if (eCurType == XFA_ELEMENT_InstanceManager) {
   2835       break;
   2836     }
   2837     if ((eCurType != XFA_ELEMENT_Subform) &&
   2838         (eCurType != XFA_ELEMENT_SubformSet)) {
   2839       continue;
   2840     }
   2841     if (iCount == 0) {
   2842       CFX_WideStringC wsName = pNode->GetCData(XFA_ATTRIBUTE_Name);
   2843       CFX_WideStringC wsInstName = pInstMgrNode->GetCData(XFA_ATTRIBUTE_Name);
   2844       if (wsInstName.GetLength() < 1 || wsInstName.GetAt(0) != '_' ||
   2845           wsInstName.Mid(1) != wsName) {
   2846         return iCount;
   2847       }
   2848       dwNameHash = pNode->GetNameHash();
   2849     }
   2850     if (dwNameHash != pNode->GetNameHash()) {
   2851       break;
   2852     }
   2853     iCount++;
   2854   }
   2855   return iCount;
   2856 }
   2857 static void
   2858 XFA_ScriptInstanceManager_ReorderDataNodes_SortNodeArrayByDocumentIdx(
   2859     const CXFA_NodeSet& rgNodeSet,
   2860     CXFA_NodeArray& rgNodeArray,
   2861     CFX_ArrayTemplate<int32_t>& rgIdxArray) {
   2862   int32_t iCount = rgNodeSet.GetCount();
   2863   rgNodeArray.SetSize(iCount);
   2864   rgIdxArray.SetSize(iCount);
   2865   if (iCount == 0) {
   2866     return;
   2867   }
   2868   int32_t iIndex = -1, iTotalIndex = -1;
   2869   CXFA_Node* pNode = NULL;
   2870   FX_POSITION pos = rgNodeSet.GetStartPosition();
   2871   rgNodeSet.GetNextAssoc(pos, pNode);
   2872   for (pNode = pNode->GetNodeItem(XFA_NODEITEM_Parent)
   2873                    ->GetNodeItem(XFA_NODEITEM_FirstChild);
   2874        pNode && iIndex < iCount;
   2875        pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
   2876     iTotalIndex++;
   2877     if (rgNodeSet.Lookup(pNode)) {
   2878       iIndex++;
   2879       rgNodeArray[iIndex] = pNode;
   2880       rgIdxArray[iIndex] = iTotalIndex;
   2881     }
   2882   }
   2883 }
   2884 struct CXFA_DualNodeArray {
   2885   CXFA_NodeSet firstNodeList;
   2886   CXFA_NodeSet secondNodeList;
   2887 };
   2888 static void XFA_ScriptInstanceManager_ReorderDataNodes(CXFA_NodeSet& sSet1,
   2889                                                        CXFA_NodeSet& sSet2,
   2890                                                        FX_BOOL bInsertBefore) {
   2891   CFX_MapPtrTemplate<CXFA_Node*,
   2892                      CFX_MapPtrTemplate<FX_DWORD, CXFA_DualNodeArray*>*>
   2893       rgNodeListMap;
   2894   FX_POSITION pos;
   2895   pos = sSet1.GetStartPosition();
   2896   while (pos) {
   2897     CXFA_Node* pNode = NULL;
   2898     sSet1.GetNextAssoc(pos, pNode);
   2899     CXFA_Node* pParentNode = pNode->GetNodeItem(XFA_NODEITEM_Parent);
   2900     FX_DWORD dwNameHash = pNode->GetNameHash();
   2901     if (!pParentNode || !dwNameHash) {
   2902       continue;
   2903     }
   2904     CFX_MapPtrTemplate<FX_DWORD, CXFA_DualNodeArray*>* pNodeListChildMap =
   2905         rgNodeListMap[pParentNode];
   2906     if (!pNodeListChildMap) {
   2907       rgNodeListMap[pParentNode] = pNodeListChildMap =
   2908           new CFX_MapPtrTemplate<FX_DWORD, CXFA_DualNodeArray*>;
   2909     }
   2910     CXFA_DualNodeArray* pDualNodeArray = (*pNodeListChildMap)[dwNameHash];
   2911     if (!pDualNodeArray) {
   2912       (*pNodeListChildMap)[dwNameHash] = pDualNodeArray =
   2913           new CXFA_DualNodeArray;
   2914     }
   2915     pDualNodeArray->firstNodeList.Add(pNode);
   2916   }
   2917   pos = sSet2.GetStartPosition();
   2918   while (pos) {
   2919     CXFA_Node* pNode = NULL;
   2920     sSet2.GetNextAssoc(pos, pNode);
   2921     CXFA_Node* pParentNode = pNode->GetNodeItem(XFA_NODEITEM_Parent);
   2922     FX_DWORD dwNameHash = pNode->GetNameHash();
   2923     if (!pParentNode || !dwNameHash) {
   2924       continue;
   2925     }
   2926     CFX_MapPtrTemplate<FX_DWORD, CXFA_DualNodeArray*>* pNodeListChildMap =
   2927         rgNodeListMap[pParentNode];
   2928     if (!pNodeListChildMap) {
   2929       rgNodeListMap[pParentNode] = pNodeListChildMap =
   2930           new CFX_MapPtrTemplate<FX_DWORD, CXFA_DualNodeArray*>;
   2931     }
   2932     CXFA_DualNodeArray* pDualNodeArray = (*pNodeListChildMap)[dwNameHash];
   2933     if (!pDualNodeArray) {
   2934       (*pNodeListChildMap)[dwNameHash] = pDualNodeArray =
   2935           new CXFA_DualNodeArray;
   2936     }
   2937     if (pDualNodeArray->firstNodeList.Lookup(pNode)) {
   2938       pDualNodeArray->firstNodeList.RemoveKey(pNode);
   2939     } else {
   2940       pDualNodeArray->secondNodeList.Add(pNode);
   2941     }
   2942   }
   2943   pos = rgNodeListMap.GetStartPosition();
   2944   while (pos) {
   2945     CXFA_Node* pParentNode = NULL;
   2946     CFX_MapPtrTemplate<FX_DWORD, CXFA_DualNodeArray*>* pNodeListChildMap = NULL;
   2947     rgNodeListMap.GetNextAssoc(pos, pParentNode, pNodeListChildMap);
   2948     if (!pNodeListChildMap) {
   2949       continue;
   2950     }
   2951     FX_POSITION childpos = pNodeListChildMap->GetStartPosition();
   2952     while (childpos) {
   2953       FX_DWORD dwNameHash = 0;
   2954       CXFA_DualNodeArray* pDualNodeArray = NULL;
   2955       pNodeListChildMap->GetNextAssoc(childpos, dwNameHash, pDualNodeArray);
   2956       if (!pDualNodeArray) {
   2957         continue;
   2958       }
   2959       if (pDualNodeArray->firstNodeList.GetCount() != 0 &&
   2960           pDualNodeArray->secondNodeList.GetCount() != 0) {
   2961         CXFA_NodeArray rgNodeArray1, rgNodeArray2;
   2962         CFX_ArrayTemplate<int32_t> rgIdxArray1, rgIdxArray2;
   2963         XFA_ScriptInstanceManager_ReorderDataNodes_SortNodeArrayByDocumentIdx(
   2964             pDualNodeArray->firstNodeList, rgNodeArray1, rgIdxArray1);
   2965         XFA_ScriptInstanceManager_ReorderDataNodes_SortNodeArrayByDocumentIdx(
   2966             pDualNodeArray->secondNodeList, rgNodeArray2, rgIdxArray2);
   2967         int32_t iLimit;
   2968         CXFA_Node *pParentNode = NULL, *pBeforeNode = NULL;
   2969         if (bInsertBefore) {
   2970           iLimit = rgIdxArray2[0];
   2971           pBeforeNode = rgNodeArray2[0];
   2972           pParentNode = pBeforeNode->GetNodeItem(XFA_NODEITEM_Parent);
   2973         } else {
   2974           iLimit = rgIdxArray2[rgIdxArray2.GetSize() - 1];
   2975           CXFA_Node* pLastNode = rgNodeArray2[rgIdxArray2.GetSize() - 1];
   2976           pParentNode = pLastNode->GetNodeItem(XFA_NODEITEM_Parent);
   2977           pBeforeNode = pLastNode->GetNodeItem(XFA_NODEITEM_NextSibling);
   2978         }
   2979         for (int32_t iIdx = 0, iCount = rgIdxArray1.GetSize(); iIdx < iCount;
   2980              iIdx++) {
   2981           CXFA_Node* pCurNode = rgNodeArray1[iIdx];
   2982           pParentNode->RemoveChild(pCurNode);
   2983           pParentNode->InsertChild(pCurNode, pBeforeNode);
   2984         }
   2985       }
   2986       delete pDualNodeArray;
   2987     }
   2988     pNodeListChildMap->RemoveAll();
   2989   }
   2990   rgNodeListMap.RemoveAll();
   2991 }
   2992 static void XFA_ScriptInstanceManager_InsertItem(
   2993     CXFA_Node* pInstMgrNode,
   2994     CXFA_Node* pNewInstance,
   2995     int32_t iPos,
   2996     int32_t iCount = -1,
   2997     FX_BOOL bMoveDataBindingNodes = TRUE) {
   2998   if (iCount < 0) {
   2999     iCount = XFA_ScriptInstanceManager_GetCount(pInstMgrNode);
   3000   }
   3001   if (iPos < 0) {
   3002     iPos = iCount;
   3003   }
   3004   if (iPos == iCount) {
   3005     CXFA_Node* pNextSibling =
   3006         iCount > 0
   3007             ? XFA_ScriptInstanceManager_GetItem(pInstMgrNode, iCount - 1)
   3008                   ->GetNodeItem(XFA_NODEITEM_NextSibling)
   3009             : pInstMgrNode->GetNodeItem(XFA_NODEITEM_NextSibling);
   3010     pInstMgrNode->GetNodeItem(XFA_NODEITEM_Parent)
   3011         ->InsertChild(pNewInstance, pNextSibling);
   3012     if (bMoveDataBindingNodes) {
   3013       CXFA_NodeSet sNew, sAfter;
   3014       CXFA_NodeIteratorTemplate<CXFA_Node,
   3015                                 CXFA_TraverseStrategy_XFAContainerNode>
   3016           sIteratorNew(pNewInstance);
   3017       for (CXFA_Node* pNode = sIteratorNew.GetCurrent(); pNode;
   3018            pNode = sIteratorNew.MoveToNext()) {
   3019         CXFA_Node* pDataNode = pNode->GetBindData();
   3020         if (!pDataNode) {
   3021           continue;
   3022         }
   3023         sNew.Add(pDataNode);
   3024       }
   3025       CXFA_NodeIteratorTemplate<CXFA_Node,
   3026                                 CXFA_TraverseStrategy_XFAContainerNode>
   3027           sIteratorAfter(pNextSibling);
   3028       for (CXFA_Node* pNode = sIteratorAfter.GetCurrent(); pNode;
   3029            pNode = sIteratorAfter.MoveToNext()) {
   3030         CXFA_Node* pDataNode = pNode->GetBindData();
   3031         if (!pDataNode) {
   3032           continue;
   3033         }
   3034         sAfter.Add(pDataNode);
   3035       }
   3036       XFA_ScriptInstanceManager_ReorderDataNodes(sNew, sAfter, FALSE);
   3037     }
   3038   } else {
   3039     CXFA_Node* pBeforeInstance =
   3040         XFA_ScriptInstanceManager_GetItem(pInstMgrNode, iPos);
   3041     pInstMgrNode->GetNodeItem(XFA_NODEITEM_Parent)
   3042         ->InsertChild(pNewInstance, pBeforeInstance);
   3043     if (bMoveDataBindingNodes) {
   3044       CXFA_NodeSet sNew, sBefore;
   3045       CXFA_NodeIteratorTemplate<CXFA_Node,
   3046                                 CXFA_TraverseStrategy_XFAContainerNode>
   3047           sIteratorNew(pNewInstance);
   3048       for (CXFA_Node* pNode = sIteratorNew.GetCurrent(); pNode;
   3049            pNode = sIteratorNew.MoveToNext()) {
   3050         CXFA_Node* pDataNode = pNode->GetBindData();
   3051         if (!pDataNode) {
   3052           continue;
   3053         }
   3054         sNew.Add(pDataNode);
   3055       }
   3056       CXFA_NodeIteratorTemplate<CXFA_Node,
   3057                                 CXFA_TraverseStrategy_XFAContainerNode>
   3058           sIteratorBefore(pBeforeInstance);
   3059       for (CXFA_Node* pNode = sIteratorBefore.GetCurrent(); pNode;
   3060            pNode = sIteratorBefore.MoveToNext()) {
   3061         CXFA_Node* pDataNode = pNode->GetBindData();
   3062         if (!pDataNode) {
   3063           continue;
   3064         }
   3065         sBefore.Add(pDataNode);
   3066       }
   3067       XFA_ScriptInstanceManager_ReorderDataNodes(sNew, sBefore, TRUE);
   3068     }
   3069   }
   3070 }
   3071 static void XFA_ScriptInstanceManager_RemoveItem(
   3072     CXFA_Node* pInstMgrNode,
   3073     CXFA_Node* pRemoveInstance,
   3074     FX_BOOL bRemoveDataBinding = TRUE) {
   3075   pInstMgrNode->GetNodeItem(XFA_NODEITEM_Parent)->RemoveChild(pRemoveInstance);
   3076   if (!bRemoveDataBinding) {
   3077     return;
   3078   }
   3079   CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFAContainerNode>
   3080       sIterator(pRemoveInstance);
   3081   for (CXFA_Node* pFormNode = sIterator.GetCurrent(); pFormNode;
   3082        pFormNode = sIterator.MoveToNext()) {
   3083     CXFA_Node* pDataNode = pFormNode->GetBindData();
   3084     if (!pDataNode) {
   3085       continue;
   3086     }
   3087     if (pDataNode->RemoveBindItem(pFormNode) == 0) {
   3088       if (CXFA_Node* pDataParent =
   3089               pDataNode->GetNodeItem(XFA_NODEITEM_Parent)) {
   3090         pDataParent->RemoveChild(pDataNode);
   3091       }
   3092     }
   3093     pFormNode->SetObject(XFA_ATTRIBUTE_BindingNode, NULL);
   3094   }
   3095 }
   3096 static CXFA_Node* XFA_ScriptInstanceManager_CreateInstance(
   3097     CXFA_Node* pInstMgrNode,
   3098     FX_BOOL bDataMerge) {
   3099   CXFA_Document* pDocument = pInstMgrNode->GetDocument();
   3100   CXFA_Node* pTemplateNode = pInstMgrNode->GetTemplateNode();
   3101   CXFA_Node* pFormParent = pInstMgrNode->GetNodeItem(XFA_NODEITEM_Parent);
   3102   CXFA_Node* pDataScope = NULL;
   3103   for (CXFA_Node* pRootBoundNode = pFormParent;
   3104        pRootBoundNode &&
   3105        pRootBoundNode->GetObjectType() == XFA_OBJECTTYPE_ContainerNode;
   3106        pRootBoundNode = pRootBoundNode->GetNodeItem(XFA_NODEITEM_Parent)) {
   3107     pDataScope = pRootBoundNode->GetBindData();
   3108     if (pDataScope) {
   3109       break;
   3110     }
   3111   }
   3112   if (!pDataScope) {
   3113     pDataScope = (CXFA_Node*)pDocument->GetXFANode(XFA_HASHCODE_Record);
   3114     ASSERT(pDataScope);
   3115   }
   3116   CXFA_Node* pInstance = pDocument->DataMerge_CopyContainer(
   3117       pTemplateNode, pFormParent, pDataScope, TRUE, bDataMerge);
   3118   if (pInstance) {
   3119     pDocument->DataMerge_UpdateBindingRelations(pInstance);
   3120     pFormParent->RemoveChild(pInstance);
   3121   }
   3122   return pInstance;
   3123 }
   3124 void CXFA_Node::Script_InstanceManager_Count(FXJSE_HVALUE hValue,
   3125                                              FX_BOOL bSetting,
   3126                                              XFA_ATTRIBUTE eAttribute) {
   3127   if (bSetting) {
   3128     int32_t iDesired = FXJSE_Value_ToInteger(hValue);
   3129     InstanceManager_SetInstances(iDesired);
   3130   } else {
   3131     FXJSE_Value_SetInteger(hValue, XFA_ScriptInstanceManager_GetCount(this));
   3132   }
   3133 }
   3134 void CXFA_Node::Script_InstanceManager_MoveInstance(
   3135     CFXJSE_Arguments* pArguments) {
   3136   int32_t argc = pArguments->GetLength();
   3137   if (argc != 2) {
   3138     FXJSE_Value_SetUndefined(pArguments->GetReturnValue());
   3139     return;
   3140   }
   3141   int32_t iFrom = pArguments->GetInt32(0);
   3142   int32_t iTo = pArguments->GetInt32(1);
   3143   InstanceManager_MoveInstance(iTo, iFrom);
   3144   IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
   3145   if (!pNotify) {
   3146     return;
   3147   }
   3148   CXFA_Node* pToInstance = XFA_ScriptInstanceManager_GetItem(this, iTo);
   3149   if (pToInstance && pToInstance->GetClassID() == XFA_ELEMENT_Subform) {
   3150     pNotify->RunSubformIndexChange(pToInstance);
   3151   }
   3152   CXFA_Node* pFromInstance = XFA_ScriptInstanceManager_GetItem(this, iFrom);
   3153   if (pFromInstance && pFromInstance->GetClassID() == XFA_ELEMENT_Subform) {
   3154     pNotify->RunSubformIndexChange(pFromInstance);
   3155   }
   3156 }
   3157 void CXFA_Node::Script_InstanceManager_RemoveInstance(
   3158     CFXJSE_Arguments* pArguments) {
   3159   int32_t argc = pArguments->GetLength();
   3160   if (argc != 1) {
   3161     FXJSE_Value_SetUndefined(pArguments->GetReturnValue());
   3162     return;
   3163   }
   3164   int32_t iIndex = pArguments->GetInt32(0);
   3165   int32_t iCount = XFA_ScriptInstanceManager_GetCount(this);
   3166   if (iIndex < 0 || iIndex >= iCount) {
   3167     ThrowScriptErrorMessage(XFA_IDS_INDEX_OUT_OF_BOUNDS);
   3168     return;
   3169   }
   3170   CXFA_Occur nodeOccur = GetOccurNode();
   3171   int32_t iMin = nodeOccur.GetMin();
   3172   if (iCount - 1 < iMin) {
   3173     ThrowScriptErrorMessage(XFA_IDS_VIOLATE_BOUNDARY, L"min");
   3174     return;
   3175   }
   3176   CXFA_Node* pRemoveInstance = XFA_ScriptInstanceManager_GetItem(this, iIndex);
   3177   XFA_ScriptInstanceManager_RemoveItem(this, pRemoveInstance);
   3178   IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
   3179   if (pNotify) {
   3180     for (int32_t i = iIndex; i < iCount - 1; i++) {
   3181       CXFA_Node* pSubformInstance = XFA_ScriptInstanceManager_GetItem(this, i);
   3182       if (pSubformInstance &&
   3183           pSubformInstance->GetClassID() == XFA_ELEMENT_Subform) {
   3184         pNotify->RunSubformIndexChange(pSubformInstance);
   3185       }
   3186     }
   3187   }
   3188   CXFA_LayoutProcessor* pLayoutPro = m_pDocument->GetLayoutProcessor();
   3189   if (!pLayoutPro) {
   3190     return;
   3191   }
   3192   pLayoutPro->AddChangedContainer(
   3193       (CXFA_Node*)m_pDocument->GetXFANode(XFA_HASHCODE_Form));
   3194 }
   3195 void CXFA_Node::Script_InstanceManager_SetInstances(
   3196     CFXJSE_Arguments* pArguments) {
   3197   int32_t argc = pArguments->GetLength();
   3198   if (argc != 1) {
   3199     FXJSE_Value_SetUndefined(pArguments->GetReturnValue());
   3200     return;
   3201   }
   3202   int32_t iDesired = pArguments->GetInt32(0);
   3203   InstanceManager_SetInstances(iDesired);
   3204 }
   3205 void CXFA_Node::Script_InstanceManager_AddInstance(
   3206     CFXJSE_Arguments* pArguments) {
   3207   int32_t argc = pArguments->GetLength();
   3208   if ((argc != 0) && (argc != 1)) {
   3209     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"addInstance");
   3210     return;
   3211   }
   3212   FX_BOOL fFlags = TRUE;
   3213   if (argc == 1) {
   3214     fFlags = pArguments->GetInt32(0) == 0 ? FALSE : TRUE;
   3215   }
   3216   int32_t iCount = XFA_ScriptInstanceManager_GetCount(this);
   3217   CXFA_Occur nodeOccur = GetOccurNode();
   3218   int32_t iMax = nodeOccur.GetMax();
   3219   if (iMax >= 0 && iCount >= iMax) {
   3220     ThrowScriptErrorMessage(XFA_IDS_VIOLATE_BOUNDARY, L"max");
   3221     return;
   3222   }
   3223   CXFA_Node* pNewInstance =
   3224       XFA_ScriptInstanceManager_CreateInstance(this, fFlags);
   3225   XFA_ScriptInstanceManager_InsertItem(this, pNewInstance, iCount, iCount,
   3226                                        FALSE);
   3227   FXJSE_Value_Set(
   3228       pArguments->GetReturnValue(),
   3229       m_pDocument->GetScriptContext()->GetJSValueFromMap(pNewInstance));
   3230   IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
   3231   if (!pNotify) {
   3232     return;
   3233   }
   3234   pNotify->RunNodeInitialize(pNewInstance);
   3235   CXFA_LayoutProcessor* pLayoutPro = m_pDocument->GetLayoutProcessor();
   3236   if (!pLayoutPro) {
   3237     return;
   3238   }
   3239   pLayoutPro->AddChangedContainer(
   3240       (CXFA_Node*)m_pDocument->GetXFANode(XFA_HASHCODE_Form));
   3241 }
   3242 void CXFA_Node::Script_InstanceManager_InsertInstance(
   3243     CFXJSE_Arguments* pArguments) {
   3244   int32_t argc = pArguments->GetLength();
   3245   if ((argc != 1) && (argc != 2)) {
   3246     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
   3247                             L"insertInstance");
   3248     return;
   3249   }
   3250   int32_t iIndex = pArguments->GetInt32(0);
   3251   FX_BOOL bBind = FALSE;
   3252   if (argc == 2) {
   3253     bBind = pArguments->GetInt32(1) == 0 ? FALSE : TRUE;
   3254   }
   3255   CXFA_Occur nodeOccur = GetOccurNode();
   3256   int32_t iCount = XFA_ScriptInstanceManager_GetCount(this);
   3257   if (iIndex < 0 || iIndex > iCount) {
   3258     ThrowScriptErrorMessage(XFA_IDS_INDEX_OUT_OF_BOUNDS);
   3259     return;
   3260   }
   3261   int32_t iMax = nodeOccur.GetMax();
   3262   if (iMax >= 0 && iCount >= iMax) {
   3263     ThrowScriptErrorMessage(XFA_IDS_VIOLATE_BOUNDARY, L"max");
   3264     return;
   3265   }
   3266   CXFA_Node* pNewInstance =
   3267       XFA_ScriptInstanceManager_CreateInstance(this, bBind);
   3268   XFA_ScriptInstanceManager_InsertItem(this, pNewInstance, iIndex, iCount,
   3269                                        TRUE);
   3270   FXJSE_Value_Set(
   3271       pArguments->GetReturnValue(),
   3272       m_pDocument->GetScriptContext()->GetJSValueFromMap(pNewInstance));
   3273   IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
   3274   if (!pNotify) {
   3275     return;
   3276   }
   3277   pNotify->RunNodeInitialize(pNewInstance);
   3278   CXFA_LayoutProcessor* pLayoutPro = m_pDocument->GetLayoutProcessor();
   3279   if (!pLayoutPro) {
   3280     return;
   3281   }
   3282   pLayoutPro->AddChangedContainer(
   3283       (CXFA_Node*)m_pDocument->GetXFANode(XFA_HASHCODE_Form));
   3284 }
   3285 int32_t CXFA_Node::InstanceManager_SetInstances(int32_t iDesired) {
   3286   CXFA_Occur nodeOccur = GetOccurNode();
   3287   int32_t iMax = nodeOccur.GetMax();
   3288   int32_t iMin = nodeOccur.GetMin();
   3289   if (iDesired < iMin) {
   3290     ThrowScriptErrorMessage(XFA_IDS_VIOLATE_BOUNDARY, L"min");
   3291     return 1;
   3292   }
   3293   if ((iMax >= 0) && (iDesired > iMax)) {
   3294     ThrowScriptErrorMessage(XFA_IDS_VIOLATE_BOUNDARY, L"max");
   3295     return 2;
   3296   }
   3297   int32_t iCount = XFA_ScriptInstanceManager_GetCount(this);
   3298   if (iDesired == iCount) {
   3299     return 0;
   3300   }
   3301   if (iDesired < iCount) {
   3302     CFX_WideStringC wsInstManagerName = this->GetCData(XFA_ATTRIBUTE_Name);
   3303     CFX_WideString wsInstanceName = wsInstManagerName.IsEmpty()
   3304                                         ? wsInstManagerName
   3305                                         : wsInstManagerName.Mid(1);
   3306     FX_DWORD dInstanceNameHash =
   3307         wsInstanceName.IsEmpty() ? 0 : FX_HashCode_String_GetW(
   3308                                            wsInstanceName,
   3309                                            wsInstanceName.GetLength());
   3310     CXFA_Node* pPrevSibling =
   3311         (iDesired == 0) ? this
   3312                         : XFA_ScriptInstanceManager_GetItem(this, iDesired - 1);
   3313     while (iCount > iDesired) {
   3314       CXFA_Node* pRemoveInstance =
   3315           pPrevSibling->GetNodeItem(XFA_NODEITEM_NextSibling);
   3316       if (pRemoveInstance->GetClassID() != XFA_ELEMENT_Subform &&
   3317           pRemoveInstance->GetClassID() != XFA_ELEMENT_SubformSet) {
   3318         continue;
   3319       }
   3320       if (pRemoveInstance->GetClassID() == XFA_ELEMENT_InstanceManager) {
   3321         FXSYS_assert(FALSE);
   3322         break;
   3323       }
   3324       if (pRemoveInstance->GetNameHash() == dInstanceNameHash) {
   3325         XFA_ScriptInstanceManager_RemoveItem(this, pRemoveInstance);
   3326         iCount--;
   3327       }
   3328     }
   3329   } else if (iDesired > iCount) {
   3330     while (iCount < iDesired) {
   3331       CXFA_Node* pNewInstance =
   3332           XFA_ScriptInstanceManager_CreateInstance(this, TRUE);
   3333       XFA_ScriptInstanceManager_InsertItem(this, pNewInstance, iCount, iCount,
   3334                                            FALSE);
   3335       iCount++;
   3336       IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
   3337       if (!pNotify) {
   3338         return 0;
   3339       }
   3340       pNotify->RunNodeInitialize(pNewInstance);
   3341     }
   3342   }
   3343   CXFA_LayoutProcessor* pLayoutPro = m_pDocument->GetLayoutProcessor();
   3344   if (!pLayoutPro) {
   3345     return 0;
   3346   }
   3347   pLayoutPro->AddChangedContainer(
   3348       (CXFA_Node*)m_pDocument->GetXFANode(XFA_HASHCODE_Form));
   3349   return 0;
   3350 }
   3351 int32_t CXFA_Node::InstanceManager_MoveInstance(int32_t iTo, int32_t iFrom) {
   3352   int32_t iCount = XFA_ScriptInstanceManager_GetCount(this);
   3353   if (iFrom > iCount || iTo > iCount - 1) {
   3354     ThrowScriptErrorMessage(XFA_IDS_INDEX_OUT_OF_BOUNDS);
   3355     return 1;
   3356   }
   3357   if (iFrom < 0 || iTo < 0 || iFrom == iTo) {
   3358     return 0;
   3359   }
   3360   CXFA_Node* pMoveInstance = XFA_ScriptInstanceManager_GetItem(this, iFrom);
   3361   XFA_ScriptInstanceManager_RemoveItem(this, pMoveInstance, FALSE);
   3362   XFA_ScriptInstanceManager_InsertItem(this, pMoveInstance, iTo, iCount - 1,
   3363                                        TRUE);
   3364   CXFA_LayoutProcessor* pLayoutPro = m_pDocument->GetLayoutProcessor();
   3365   if (!pLayoutPro) {
   3366     return 0;
   3367   }
   3368   pLayoutPro->AddChangedContainer(
   3369       (CXFA_Node*)m_pDocument->GetXFANode(XFA_HASHCODE_Form));
   3370   return 0;
   3371 }
   3372 void CXFA_Node::Script_Occur_Max(FXJSE_HVALUE hValue,
   3373                                  FX_BOOL bSetting,
   3374                                  XFA_ATTRIBUTE eAttribute) {
   3375   CXFA_Occur occur(this);
   3376   if (bSetting) {
   3377     int32_t iMax = FXJSE_Value_ToInteger(hValue);
   3378     occur.SetMax(iMax);
   3379   } else {
   3380     FXJSE_Value_SetInteger(hValue, occur.GetMax());
   3381   }
   3382 }
   3383 void CXFA_Node::Script_Occur_Min(FXJSE_HVALUE hValue,
   3384                                  FX_BOOL bSetting,
   3385                                  XFA_ATTRIBUTE eAttribute) {
   3386   CXFA_Occur occur(this);
   3387   if (bSetting) {
   3388     int32_t iMin = FXJSE_Value_ToInteger(hValue);
   3389     occur.SetMin(iMin);
   3390   } else {
   3391     FXJSE_Value_SetInteger(hValue, occur.GetMin());
   3392   }
   3393 }
   3394 void CXFA_Node::Script_Desc_Metadata(CFXJSE_Arguments* pArguments) {
   3395   int32_t argc = pArguments->GetLength();
   3396   if ((argc == 0) || (argc == 1)) {
   3397     FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), "");
   3398   } else {
   3399     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"metadata");
   3400   }
   3401 }
   3402 void CXFA_Node::Script_Form_FormNodes(CFXJSE_Arguments* pArguments) {
   3403   int32_t argc = pArguments->GetLength();
   3404   if (argc == 1) {
   3405     CXFA_Node* pDataNode = (CXFA_Node*)pArguments->GetObject(0);
   3406     if (pDataNode) {
   3407       CXFA_NodeArray formItems;
   3408       CXFA_ArrayNodeList* pFormNodes = new CXFA_ArrayNodeList(m_pDocument);
   3409       pFormNodes->SetArrayNodeList(formItems);
   3410       FXJSE_Value_SetObject(
   3411           pArguments->GetReturnValue(), (CXFA_Object*)pFormNodes,
   3412           m_pDocument->GetScriptContext()->GetJseNormalClass());
   3413     } else {
   3414       ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
   3415     }
   3416   } else {
   3417     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"formNodes");
   3418   }
   3419 }
   3420 void CXFA_Node::Script_Form_Remerge(CFXJSE_Arguments* pArguments) {
   3421   int32_t argc = pArguments->GetLength();
   3422   if (argc == 0) {
   3423     m_pDocument->DoDataRemerge(TRUE);
   3424   } else {
   3425     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"remerge");
   3426   }
   3427 }
   3428 void CXFA_Node::Script_Form_ExecInitialize(CFXJSE_Arguments* pArguments) {
   3429   int32_t argc = pArguments->GetLength();
   3430   if (argc == 0) {
   3431     IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
   3432     if (!pNotify) {
   3433       return;
   3434     }
   3435     pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Initialize);
   3436   } else {
   3437     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
   3438                             L"execInitialize");
   3439   }
   3440 }
   3441 void CXFA_Node::Script_Form_Recalculate(CFXJSE_Arguments* pArguments) {
   3442   CXFA_EventParam* pEventParam =
   3443       m_pDocument->GetScriptContext()->GetEventParam();
   3444   if (pEventParam->m_eType == XFA_EVENT_Calculate ||
   3445       pEventParam->m_eType == XFA_EVENT_InitCalculate) {
   3446     return;
   3447   }
   3448   int32_t argc = pArguments->GetLength();
   3449   if (argc == 1) {
   3450     FX_BOOL bScriptFlags = pArguments->GetInt32(0) == 0 ? FALSE : TRUE;
   3451     IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
   3452     if (!pNotify) {
   3453       return;
   3454     }
   3455     if (bScriptFlags) {
   3456       pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Calculate);
   3457       pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Validate);
   3458       pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Ready, TRUE);
   3459     } else {
   3460     }
   3461   } else {
   3462     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"recalculate");
   3463   }
   3464 }
   3465 void CXFA_Node::Script_Form_ExecCalculate(CFXJSE_Arguments* pArguments) {
   3466   int32_t argc = pArguments->GetLength();
   3467   if (argc == 0) {
   3468     IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
   3469     if (!pNotify) {
   3470       return;
   3471     }
   3472     pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Calculate);
   3473   } else {
   3474     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
   3475                             L"execCalculate");
   3476   }
   3477 }
   3478 void CXFA_Node::Script_Form_ExecValidate(CFXJSE_Arguments* pArguments) {
   3479   int32_t argc = pArguments->GetLength();
   3480   if (argc == 0) {
   3481     IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
   3482     if (!pNotify) {
   3483       FXJSE_Value_SetBoolean(pArguments->GetReturnValue(), FALSE);
   3484     } else {
   3485       int32_t iRet = pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Validate);
   3486       FXJSE_Value_SetBoolean(pArguments->GetReturnValue(),
   3487                              ((iRet == XFA_EVENTERROR_Error) ? FALSE : TRUE));
   3488     }
   3489   } else {
   3490     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
   3491                             L"execValidate");
   3492   }
   3493 }
   3494 void CXFA_Node::Script_Form_Checksum(FXJSE_HVALUE hValue,
   3495                                      FX_BOOL bSetting,
   3496                                      XFA_ATTRIBUTE eAttribute) {
   3497   if (bSetting) {
   3498     CFX_ByteString bsChecksum;
   3499     FXJSE_Value_ToUTF8String(hValue, bsChecksum);
   3500     SetAttribute(XFA_ATTRIBUTE_Checksum,
   3501                  CFX_WideString::FromUTF8(bsChecksum, bsChecksum.GetLength()));
   3502   } else {
   3503     CFX_WideString wsChecksum;
   3504     GetAttribute(XFA_ATTRIBUTE_Checksum, wsChecksum, FALSE);
   3505     FXJSE_Value_SetUTF8String(
   3506         hValue, FX_UTF8Encode(wsChecksum, wsChecksum.GetLength()));
   3507   }
   3508 }
   3509 void CXFA_Node::Script_Packet_GetAttribute(CFXJSE_Arguments* pArguments) {
   3510   int32_t argc = pArguments->GetLength();
   3511   if (argc == 1) {
   3512     CFX_ByteString bsAttributeName = pArguments->GetUTF8String(0);
   3513     CFX_WideString wsAttributeValue;
   3514     IFDE_XMLNode* pXMLNode = GetXMLMappingNode();
   3515     if (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element) {
   3516       ((IFDE_XMLElement*)pXMLNode)
   3517           ->GetString(CFX_WideString::FromUTF8(bsAttributeName,
   3518                                                bsAttributeName.GetLength()),
   3519                       wsAttributeValue);
   3520     }
   3521     FXJSE_Value_SetUTF8String(
   3522         pArguments->GetReturnValue(),
   3523         FX_UTF8Encode(wsAttributeValue, wsAttributeValue.GetLength()));
   3524   } else {
   3525     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
   3526                             L"getAttribute");
   3527   }
   3528 }
   3529 void CXFA_Node::Script_Packet_SetAttribute(CFXJSE_Arguments* pArguments) {
   3530   int32_t argc = pArguments->GetLength();
   3531   if (argc == 2) {
   3532     CFX_ByteString bsValue = pArguments->GetUTF8String(0);
   3533     CFX_ByteString bsName = pArguments->GetUTF8String(1);
   3534     IFDE_XMLNode* pXMLNode = GetXMLMappingNode();
   3535     if (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element) {
   3536       ((IFDE_XMLElement*)pXMLNode)
   3537           ->SetString(CFX_WideString::FromUTF8(bsName, bsName.GetLength()),
   3538                       CFX_WideString::FromUTF8(bsValue, bsValue.GetLength()));
   3539     }
   3540     FXJSE_Value_SetNull(pArguments->GetReturnValue());
   3541   } else {
   3542     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
   3543                             L"setAttribute");
   3544   }
   3545 }
   3546 void CXFA_Node::Script_Packet_RemoveAttribute(CFXJSE_Arguments* pArguments) {
   3547   int32_t argc = pArguments->GetLength();
   3548   if (argc == 1) {
   3549     CFX_ByteString bsName = pArguments->GetUTF8String(0);
   3550     CFX_WideString wsName =
   3551         CFX_WideString::FromUTF8(bsName, bsName.GetLength());
   3552     IFDE_XMLNode* pXMLNode = GetXMLMappingNode();
   3553     if (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element) {
   3554       IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLNode;
   3555       if (pXMLElement->HasAttribute(wsName)) {
   3556         pXMLElement->RemoveAttribute(wsName);
   3557       }
   3558     }
   3559     FXJSE_Value_SetNull(pArguments->GetReturnValue());
   3560   } else {
   3561     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
   3562                             L"removeAttribute");
   3563   }
   3564 }
   3565 void CXFA_Node::Script_Packet_Content(FXJSE_HVALUE hValue,
   3566                                       FX_BOOL bSetting,
   3567                                       XFA_ATTRIBUTE eAttribute) {
   3568   if (bSetting) {
   3569     CFX_ByteString bsNewContent;
   3570     FXJSE_Value_ToUTF8String(hValue, bsNewContent);
   3571     IFDE_XMLNode* pXMLNode = GetXMLMappingNode();
   3572     if (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element) {
   3573       IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLNode;
   3574       pXMLElement->SetTextData(
   3575           CFX_WideString::FromUTF8(bsNewContent, bsNewContent.GetLength()));
   3576     }
   3577   } else {
   3578     CFX_WideString wsTextData;
   3579     IFDE_XMLNode* pXMLNode = GetXMLMappingNode();
   3580     if (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element) {
   3581       IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)pXMLNode;
   3582       pXMLElement->GetTextData(wsTextData);
   3583     }
   3584     FXJSE_Value_SetUTF8String(
   3585         hValue, FX_UTF8Encode(wsTextData, wsTextData.GetLength()));
   3586   }
   3587 }
   3588 void CXFA_Node::Script_Source_Next(CFXJSE_Arguments* pArguments) {
   3589   int32_t argc = pArguments->GetLength();
   3590   if (argc == 0) {
   3591   } else {
   3592     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"next");
   3593   }
   3594 }
   3595 void CXFA_Node::Script_Source_CancelBatch(CFXJSE_Arguments* pArguments) {
   3596   int32_t argc = pArguments->GetLength();
   3597   if (argc == 0) {
   3598   } else {
   3599     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"cancelBatch");
   3600   }
   3601 }
   3602 void CXFA_Node::Script_Source_First(CFXJSE_Arguments* pArguments) {
   3603   int32_t argc = pArguments->GetLength();
   3604   if (argc == 0) {
   3605   } else {
   3606     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"first");
   3607   }
   3608 }
   3609 void CXFA_Node::Script_Source_UpdateBatch(CFXJSE_Arguments* pArguments) {
   3610   int32_t argc = pArguments->GetLength();
   3611   if (argc == 0) {
   3612   } else {
   3613     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"updateBatch");
   3614   }
   3615 }
   3616 void CXFA_Node::Script_Source_Previous(CFXJSE_Arguments* pArguments) {
   3617   int32_t argc = pArguments->GetLength();
   3618   if (argc == 0) {
   3619   } else {
   3620     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"previous");
   3621   }
   3622 }
   3623 void CXFA_Node::Script_Source_IsBOF(CFXJSE_Arguments* pArguments) {
   3624   int32_t argc = pArguments->GetLength();
   3625   if (argc == 0) {
   3626   } else {
   3627     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"isBOF");
   3628   }
   3629 }
   3630 void CXFA_Node::Script_Source_IsEOF(CFXJSE_Arguments* pArguments) {
   3631   int32_t argc = pArguments->GetLength();
   3632   if (argc == 0) {
   3633   } else {
   3634     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"isEOF");
   3635   }
   3636 }
   3637 void CXFA_Node::Script_Source_Cancel(CFXJSE_Arguments* pArguments) {
   3638   int32_t argc = pArguments->GetLength();
   3639   if (argc == 0) {
   3640   } else {
   3641     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"cancel");
   3642   }
   3643 }
   3644 void CXFA_Node::Script_Source_Update(CFXJSE_Arguments* pArguments) {
   3645   int32_t argc = pArguments->GetLength();
   3646   if (argc == 0) {
   3647   } else {
   3648     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"update");
   3649   }
   3650 }
   3651 void CXFA_Node::Script_Source_Open(CFXJSE_Arguments* pArguments) {
   3652   int32_t argc = pArguments->GetLength();
   3653   if (argc == 0) {
   3654   } else {
   3655     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"open");
   3656   }
   3657 }
   3658 void CXFA_Node::Script_Source_Delete(CFXJSE_Arguments* pArguments) {
   3659   int32_t argc = pArguments->GetLength();
   3660   if (argc == 0) {
   3661   } else {
   3662     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"delete");
   3663   }
   3664 }
   3665 void CXFA_Node::Script_Source_AddNew(CFXJSE_Arguments* pArguments) {
   3666   int32_t argc = pArguments->GetLength();
   3667   if (argc == 0) {
   3668   } else {
   3669     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"addNew");
   3670   }
   3671 }
   3672 void CXFA_Node::Script_Source_Requery(CFXJSE_Arguments* pArguments) {
   3673   int32_t argc = pArguments->GetLength();
   3674   if (argc == 0) {
   3675   } else {
   3676     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"requery");
   3677   }
   3678 }
   3679 void CXFA_Node::Script_Source_Resync(CFXJSE_Arguments* pArguments) {
   3680   int32_t argc = pArguments->GetLength();
   3681   if (argc == 0) {
   3682   } else {
   3683     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"resync");
   3684   }
   3685 }
   3686 void CXFA_Node::Script_Source_Close(CFXJSE_Arguments* pArguments) {
   3687   int32_t argc = pArguments->GetLength();
   3688   if (argc == 0) {
   3689   } else {
   3690     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"close");
   3691   }
   3692 }
   3693 void CXFA_Node::Script_Source_Last(CFXJSE_Arguments* pArguments) {
   3694   int32_t argc = pArguments->GetLength();
   3695   if (argc == 0) {
   3696   } else {
   3697     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"last");
   3698   }
   3699 }
   3700 void CXFA_Node::Script_Source_HasDataChanged(CFXJSE_Arguments* pArguments) {
   3701   int32_t argc = pArguments->GetLength();
   3702   if (argc == 0) {
   3703   } else {
   3704     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
   3705                             L"hasDataChanged");
   3706   }
   3707 }
   3708 void CXFA_Node::Script_Source_Db(FXJSE_HVALUE hValue,
   3709                                  FX_BOOL bSetting,
   3710                                  XFA_ATTRIBUTE eAttribute) {}
   3711 void CXFA_Node::Script_Xfa_This(FXJSE_HVALUE hValue,
   3712                                 FX_BOOL bSetting,
   3713                                 XFA_ATTRIBUTE eAttribute) {
   3714   if (!bSetting) {
   3715     CXFA_Object* pThis = m_pDocument->GetScriptContext()->GetThisObject();
   3716     FXSYS_assert(pThis);
   3717     FXJSE_Value_Set(hValue,
   3718                     m_pDocument->GetScriptContext()->GetJSValueFromMap(pThis));
   3719   }
   3720 }
   3721 void CXFA_Node::Script_Handler_Version(FXJSE_HVALUE hValue,
   3722                                        FX_BOOL bSetting,
   3723                                        XFA_ATTRIBUTE eAttribute) {}
   3724 void CXFA_Node::Script_SubmitFormat_Mode(FXJSE_HVALUE hValue,
   3725                                          FX_BOOL bSetting,
   3726                                          XFA_ATTRIBUTE eAttribute) {}
   3727 void CXFA_Node::Script_Extras_Type(FXJSE_HVALUE hValue,
   3728                                    FX_BOOL bSetting,
   3729                                    XFA_ATTRIBUTE eAttribute) {}
   3730 void CXFA_Node::Script_Script_Stateless(FXJSE_HVALUE hValue,
   3731                                         FX_BOOL bSetting,
   3732                                         XFA_ATTRIBUTE eAttribute) {
   3733   if (bSetting) {
   3734     ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
   3735     return;
   3736   }
   3737   FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(FX_WSTRC(L"0")));
   3738 }
   3739 void CXFA_Node::Script_Encrypt_Format(FXJSE_HVALUE hValue,
   3740                                       FX_BOOL bSetting,
   3741                                       XFA_ATTRIBUTE eAttribute) {}
   3742 enum XFA_KEYTYPE {
   3743   XFA_KEYTYPE_Custom,
   3744   XFA_KEYTYPE_Element,
   3745 };
   3746 void* XFA_GetMapKey_Custom(const CFX_WideStringC& wsKey) {
   3747   FX_DWORD dwKey = FX_HashCode_String_GetW(wsKey.GetPtr(), wsKey.GetLength());
   3748   return (void*)(uintptr_t)((dwKey << 1) | XFA_KEYTYPE_Custom);
   3749 }
   3750 void* XFA_GetMapKey_Element(XFA_ELEMENT eElement, XFA_ATTRIBUTE eAttribute) {
   3751   return (void*)(uintptr_t)((eElement << 16) | (eAttribute << 8) |
   3752                             XFA_KEYTYPE_Element);
   3753 }
   3754 static inline FX_BOOL XFA_NodeData_PrepareKey(XFA_ELEMENT eElem,
   3755                                               XFA_ATTRIBUTE eAttr,
   3756                                               void*& pKey) {
   3757   pKey = XFA_GetMapKey_Element(eElem, eAttr);
   3758   return TRUE;
   3759 }
   3760 FX_BOOL CXFA_Node::HasAttribute(XFA_ATTRIBUTE eAttr, FX_BOOL bCanInherit) {
   3761   void* pKey = NULL;
   3762   if (!XFA_NodeData_PrepareKey(GetClassID(), eAttr, pKey)) {
   3763     return FALSE;
   3764   }
   3765   return HasMapModuleKey(pKey, bCanInherit);
   3766 }
   3767 FX_BOOL CXFA_Node::SetAttribute(XFA_ATTRIBUTE eAttr,
   3768                                 const CFX_WideStringC& wsValue,
   3769                                 FX_BOOL bNotify) {
   3770   XFA_LPCATTRIBUTEINFO pAttr = XFA_GetAttributeByID(eAttr);
   3771   if (pAttr == NULL) {
   3772     return FALSE;
   3773   }
   3774   XFA_ATTRIBUTETYPE eType = pAttr->eType;
   3775   if (eType == XFA_ATTRIBUTETYPE_NOTSURE) {
   3776     XFA_LPCNOTSUREATTRIBUTE pNotsure =
   3777         XFA_GetNotsureAttribute(GetClassID(), pAttr->eName);
   3778     eType = pNotsure ? pNotsure->eType : XFA_ATTRIBUTETYPE_Cdata;
   3779   }
   3780   switch (eType) {
   3781     case XFA_ATTRIBUTETYPE_Enum: {
   3782       XFA_LPCATTRIBUTEENUMINFO pEnum = XFA_GetAttributeEnumByName(wsValue);
   3783       return SetEnum(pAttr->eName,
   3784                      pEnum ? pEnum->eName
   3785                            : (XFA_ATTRIBUTEENUM)(intptr_t)(pAttr->pDefValue),
   3786                      bNotify);
   3787     } break;
   3788     case XFA_ATTRIBUTETYPE_Cdata:
   3789       return SetCData(pAttr->eName, wsValue, bNotify);
   3790     case XFA_ATTRIBUTETYPE_Boolean:
   3791       return SetBoolean(pAttr->eName, wsValue != FX_WSTRC(L"0"), bNotify);
   3792     case XFA_ATTRIBUTETYPE_Integer:
   3793       return SetInteger(
   3794           pAttr->eName,
   3795           FXSYS_round(FX_wcstof(wsValue.GetPtr(), wsValue.GetLength())),
   3796           bNotify);
   3797     case XFA_ATTRIBUTETYPE_Measure:
   3798       return SetMeasure(pAttr->eName, CXFA_Measurement(wsValue), bNotify);
   3799     default:
   3800       break;
   3801   }
   3802   return FALSE;
   3803 }
   3804 FX_BOOL CXFA_Node::GetAttribute(XFA_ATTRIBUTE eAttr,
   3805                                 CFX_WideString& wsValue,
   3806                                 FX_BOOL bUseDefault) {
   3807   XFA_LPCATTRIBUTEINFO pAttr = XFA_GetAttributeByID(eAttr);
   3808   if (pAttr == NULL) {
   3809     return FALSE;
   3810   }
   3811   XFA_ATTRIBUTETYPE eType = pAttr->eType;
   3812   if (eType == XFA_ATTRIBUTETYPE_NOTSURE) {
   3813     XFA_LPCNOTSUREATTRIBUTE pNotsure =
   3814         XFA_GetNotsureAttribute(GetClassID(), pAttr->eName);
   3815     eType = pNotsure ? pNotsure->eType : XFA_ATTRIBUTETYPE_Cdata;
   3816   }
   3817   switch (eType) {
   3818     case XFA_ATTRIBUTETYPE_Enum: {
   3819       XFA_ATTRIBUTEENUM eValue;
   3820       if (!TryEnum(pAttr->eName, eValue, bUseDefault)) {
   3821         return FALSE;
   3822       }
   3823       wsValue = XFA_GetAttributeEnumByID(eValue)->pName;
   3824       return TRUE;
   3825     } break;
   3826     case XFA_ATTRIBUTETYPE_Cdata: {
   3827       CFX_WideStringC wsValueC;
   3828       if (!TryCData(pAttr->eName, wsValueC, bUseDefault)) {
   3829         return FALSE;
   3830       }
   3831       wsValue = wsValueC;
   3832       return TRUE;
   3833     } break;
   3834     case XFA_ATTRIBUTETYPE_Boolean: {
   3835       FX_BOOL bValue;
   3836       if (!TryBoolean(pAttr->eName, bValue, bUseDefault)) {
   3837         return FALSE;
   3838       }
   3839       wsValue = bValue ? FX_WSTRC(L"1") : FX_WSTRC(L"0");
   3840       return TRUE;
   3841     } break;
   3842     case XFA_ATTRIBUTETYPE_Integer: {
   3843       int32_t iValue;
   3844       if (!TryInteger(pAttr->eName, iValue, bUseDefault)) {
   3845         return FALSE;
   3846       }
   3847       wsValue.Format(L"%d", iValue);
   3848       return TRUE;
   3849     } break;
   3850     case XFA_ATTRIBUTETYPE_Measure: {
   3851       CXFA_Measurement mValue;
   3852       if (!TryMeasure(pAttr->eName, mValue, bUseDefault)) {
   3853         return FALSE;
   3854       }
   3855       mValue.ToString(wsValue);
   3856       return TRUE;
   3857     } break;
   3858     default:
   3859       break;
   3860   }
   3861   return FALSE;
   3862 }
   3863 FX_BOOL CXFA_Node::SetAttribute(const CFX_WideStringC& wsAttr,
   3864                                 const CFX_WideStringC& wsValue,
   3865                                 FX_BOOL bNotify) {
   3866   XFA_LPCATTRIBUTEINFO pAttributeInfo = XFA_GetAttributeByName(wsValue);
   3867   if (pAttributeInfo) {
   3868     return SetAttribute(pAttributeInfo->eName, wsValue, bNotify);
   3869   }
   3870   void* pKey = XFA_GetMapKey_Custom(wsAttr);
   3871   SetMapModuleString(pKey, wsValue);
   3872   return TRUE;
   3873 }
   3874 FX_BOOL CXFA_Node::GetAttribute(const CFX_WideStringC& wsAttr,
   3875                                 CFX_WideString& wsValue,
   3876                                 FX_BOOL bUseDefault) {
   3877   XFA_LPCATTRIBUTEINFO pAttributeInfo = XFA_GetAttributeByName(wsAttr);
   3878   if (pAttributeInfo) {
   3879     return GetAttribute(pAttributeInfo->eName, wsValue, bUseDefault);
   3880   }
   3881   void* pKey = XFA_GetMapKey_Custom(wsAttr);
   3882   CFX_WideStringC wsValueC;
   3883   if (GetMapModuleString(pKey, wsValueC)) {
   3884     wsValue = wsValueC;
   3885   }
   3886   return TRUE;
   3887 }
   3888 FX_BOOL CXFA_Node::RemoveAttribute(const CFX_WideStringC& wsAttr) {
   3889   void* pKey = XFA_GetMapKey_Custom(wsAttr);
   3890   RemoveMapModuleKey(pKey);
   3891   return TRUE;
   3892 }
   3893 FX_BOOL CXFA_Node::TryBoolean(XFA_ATTRIBUTE eAttr,
   3894                               FX_BOOL& bValue,
   3895                               FX_BOOL bUseDefault) {
   3896   void* pValue = NULL;
   3897   if (!GetValue(eAttr, XFA_ATTRIBUTETYPE_Boolean, bUseDefault, pValue)) {
   3898     return FALSE;
   3899   }
   3900   bValue = (FX_BOOL)(uintptr_t)pValue;
   3901   return TRUE;
   3902 }
   3903 FX_BOOL CXFA_Node::TryInteger(XFA_ATTRIBUTE eAttr,
   3904                               int32_t& iValue,
   3905                               FX_BOOL bUseDefault) {
   3906   void* pValue = NULL;
   3907   if (!GetValue(eAttr, XFA_ATTRIBUTETYPE_Integer, bUseDefault, pValue)) {
   3908     return FALSE;
   3909   }
   3910   iValue = (int32_t)(uintptr_t)pValue;
   3911   return TRUE;
   3912 }
   3913 FX_BOOL CXFA_Node::TryEnum(XFA_ATTRIBUTE eAttr,
   3914                            XFA_ATTRIBUTEENUM& eValue,
   3915                            FX_BOOL bUseDefault) {
   3916   void* pValue = NULL;
   3917   if (!GetValue(eAttr, XFA_ATTRIBUTETYPE_Enum, bUseDefault, pValue)) {
   3918     return FALSE;
   3919   }
   3920   eValue = (XFA_ATTRIBUTEENUM)(uintptr_t)pValue;
   3921   return TRUE;
   3922 }
   3923 FX_BOOL CXFA_Node::SetMeasure(XFA_ATTRIBUTE eAttr,
   3924                               CXFA_Measurement mValue,
   3925                               FX_BOOL bNotify) {
   3926   void* pKey = NULL;
   3927   if (!XFA_NodeData_PrepareKey(GetClassID(), eAttr, pKey)) {
   3928     return FALSE;
   3929   }
   3930   OnChanging(eAttr, &mValue, bNotify);
   3931   SetMapModuleBuffer(pKey, &mValue, sizeof(CXFA_Measurement));
   3932   OnChanged(eAttr, &mValue, bNotify);
   3933   return TRUE;
   3934 }
   3935 FX_BOOL CXFA_Node::TryMeasure(XFA_ATTRIBUTE eAttr,
   3936                               CXFA_Measurement& mValue,
   3937                               FX_BOOL bUseDefault) {
   3938   void* pKey = NULL;
   3939   if (!XFA_NodeData_PrepareKey(GetClassID(), eAttr, pKey)) {
   3940     return FALSE;
   3941   }
   3942   void* pValue;
   3943   int32_t iBytes;
   3944   if (GetMapModuleBuffer(pKey, pValue, iBytes) && iBytes == sizeof(mValue)) {
   3945     FX_memcpy(&mValue, pValue, sizeof(mValue));
   3946     return TRUE;
   3947   }
   3948   if (bUseDefault &&
   3949       XFA_GetAttributeDefaultValue(pValue, GetClassID(), eAttr,
   3950                                    XFA_ATTRIBUTETYPE_Measure, m_ePacket)) {
   3951     FX_memcpy(&mValue, pValue, sizeof(mValue));
   3952     return TRUE;
   3953   }
   3954   return FALSE;
   3955 }
   3956 FX_BOOL CXFA_Node::SetCData(XFA_ATTRIBUTE eAttr,
   3957                             const CFX_WideString& wsValue,
   3958                             FX_BOOL bNotify,
   3959                             FX_BOOL bScriptModify) {
   3960   void* pKey = NULL;
   3961   if (!XFA_NodeData_PrepareKey(GetClassID(), eAttr, pKey)) {
   3962     return FALSE;
   3963   }
   3964   OnChanging(eAttr, (void*)(const FX_WCHAR*)wsValue, bNotify);
   3965   if (eAttr == XFA_ATTRIBUTE_Value) {
   3966     CFX_WideString* pClone = new CFX_WideString(wsValue);
   3967     SetUserData(pKey, pClone, &deleteWideStringCallBack);
   3968   } else {
   3969     SetMapModuleString(pKey, wsValue);
   3970     if (eAttr == XFA_ATTRIBUTE_Name) {
   3971       UpdateNameHash();
   3972       if (XFA_LPCJSBUILTININFO pBuiltin =
   3973               XFA_GetJSBuiltinByHash(m_dwNameHash)) {
   3974         m_pDocument->GetScriptContext()->AddJSBuiltinObject(pBuiltin);
   3975       }
   3976     }
   3977   }
   3978   OnChanged(eAttr, (void*)(const FX_WCHAR*)wsValue, bNotify, bScriptModify);
   3979   if (IsNeedSavingXMLNode() && eAttr != XFA_ATTRIBUTE_QualifiedName &&
   3980       eAttr != XFA_ATTRIBUTE_BindingNode) {
   3981     if (eAttr == XFA_ATTRIBUTE_Name &&
   3982         (m_eNodeClass == XFA_ELEMENT_DataValue ||
   3983          m_eNodeClass == XFA_ELEMENT_DataGroup)) {
   3984       return TRUE;
   3985     }
   3986     if (eAttr == XFA_ATTRIBUTE_Value) {
   3987       FDE_XMLNODETYPE eXMLType = m_pXMLNode->GetType();
   3988       switch (eXMLType) {
   3989         case FDE_XMLNODE_Element:
   3990           if (IsAttributeInXML()) {
   3991             ((IFDE_XMLElement*)m_pXMLNode)
   3992                 ->SetString(GetCData(XFA_ATTRIBUTE_QualifiedName), wsValue);
   3993           } else {
   3994             FX_BOOL bDeleteChildren = TRUE;
   3995             if (GetPacketID() == XFA_XDPPACKET_Datasets) {
   3996               for (CXFA_Node* pChildDataNode =
   3997                        this->GetNodeItem(XFA_NODEITEM_FirstChild);
   3998                    pChildDataNode; pChildDataNode = pChildDataNode->GetNodeItem(
   3999                                        XFA_NODEITEM_NextSibling)) {
   4000                 CXFA_NodeArray formNodes;
   4001                 if (pChildDataNode->GetBindItems(formNodes) > 0) {
   4002                   bDeleteChildren = FALSE;
   4003                   break;
   4004                 }
   4005               }
   4006             }
   4007             if (bDeleteChildren) {
   4008               ((IFDE_XMLElement*)m_pXMLNode)->DeleteChildren();
   4009             }
   4010             ((IFDE_XMLElement*)m_pXMLNode)->SetTextData(wsValue);
   4011           }
   4012           break;
   4013         case FDE_XMLNODE_Text:
   4014           ((IFDE_XMLText*)m_pXMLNode)->SetText(wsValue);
   4015           break;
   4016         default:
   4017           FXSYS_assert(0);
   4018       }
   4019       return TRUE;
   4020     }
   4021     XFA_LPCATTRIBUTEINFO pInfo = XFA_GetAttributeByID(eAttr);
   4022     if (pInfo) {
   4023       FXSYS_assert(m_pXMLNode->GetType() == FDE_XMLNODE_Element);
   4024       CFX_WideString wsAttrName = pInfo->pName;
   4025       if (pInfo->eName == XFA_ATTRIBUTE_ContentType) {
   4026         wsAttrName = FX_WSTRC(L"xfa:") + wsAttrName;
   4027       }
   4028       ((IFDE_XMLElement*)m_pXMLNode)->SetString(wsAttrName, wsValue);
   4029     }
   4030   }
   4031   return TRUE;
   4032 }
   4033 FX_BOOL CXFA_Node::SetAttributeValue(const CFX_WideString& wsValue,
   4034                                      const CFX_WideString& wsXMLValue,
   4035                                      FX_BOOL bNotify,
   4036                                      FX_BOOL bScriptModify) {
   4037   void* pKey = NULL;
   4038   if (!XFA_NodeData_PrepareKey(GetClassID(), XFA_ATTRIBUTE_Value, pKey)) {
   4039     return FALSE;
   4040   }
   4041   OnChanging(XFA_ATTRIBUTE_Value, (void*)(const FX_WCHAR*)wsValue, bNotify);
   4042   CFX_WideString* pClone = new CFX_WideString(wsValue);
   4043   SetUserData(pKey, pClone, &deleteWideStringCallBack);
   4044   OnChanged(XFA_ATTRIBUTE_Value, (void*)(const FX_WCHAR*)wsValue, bNotify,
   4045             bScriptModify);
   4046   if (IsNeedSavingXMLNode()) {
   4047     FDE_XMLNODETYPE eXMLType = m_pXMLNode->GetType();
   4048     switch (eXMLType) {
   4049       case FDE_XMLNODE_Element:
   4050         if (IsAttributeInXML()) {
   4051           ((IFDE_XMLElement*)m_pXMLNode)
   4052               ->SetString(GetCData(XFA_ATTRIBUTE_QualifiedName), wsXMLValue);
   4053         } else {
   4054           FX_BOOL bDeleteChildren = TRUE;
   4055           if (GetPacketID() == XFA_XDPPACKET_Datasets) {
   4056             for (CXFA_Node* pChildDataNode =
   4057                      this->GetNodeItem(XFA_NODEITEM_FirstChild);
   4058                  pChildDataNode; pChildDataNode = pChildDataNode->GetNodeItem(
   4059                                      XFA_NODEITEM_NextSibling)) {
   4060               CXFA_NodeArray formNodes;
   4061               if (pChildDataNode->GetBindItems(formNodes) > 0) {
   4062                 bDeleteChildren = FALSE;
   4063                 break;
   4064               }
   4065             }
   4066           }
   4067           if (bDeleteChildren) {
   4068             ((IFDE_XMLElement*)m_pXMLNode)->DeleteChildren();
   4069           }
   4070           ((IFDE_XMLElement*)m_pXMLNode)->SetTextData(wsXMLValue);
   4071         }
   4072         break;
   4073       case FDE_XMLNODE_Text:
   4074         ((IFDE_XMLText*)m_pXMLNode)->SetText(wsXMLValue);
   4075         break;
   4076       default:
   4077         FXSYS_assert(0);
   4078     }
   4079   }
   4080   return TRUE;
   4081 }
   4082 FX_BOOL CXFA_Node::TryCData(XFA_ATTRIBUTE eAttr,
   4083                             CFX_WideString& wsValue,
   4084                             FX_BOOL bUseDefault,
   4085                             FX_BOOL bProto) {
   4086   void* pKey = NULL;
   4087   if (!XFA_NodeData_PrepareKey(GetClassID(), eAttr, pKey)) {
   4088     return FALSE;
   4089   }
   4090   if (eAttr == XFA_ATTRIBUTE_Value) {
   4091     CFX_WideString* pStr = (CFX_WideString*)GetUserData(pKey, bProto);
   4092     if (pStr) {
   4093       wsValue = *pStr;
   4094       return TRUE;
   4095     }
   4096   } else {
   4097     CFX_WideStringC wsValueC;
   4098     if (GetMapModuleString(pKey, wsValueC)) {
   4099       wsValue = wsValueC;
   4100       return TRUE;
   4101     }
   4102   }
   4103   if (!bUseDefault) {
   4104     return FALSE;
   4105   }
   4106   void* pValue = NULL;
   4107   if (XFA_GetAttributeDefaultValue(pValue, GetClassID(), eAttr,
   4108                                    XFA_ATTRIBUTETYPE_Cdata, m_ePacket)) {
   4109     wsValue = (const FX_WCHAR*)pValue;
   4110     return TRUE;
   4111   }
   4112   return FALSE;
   4113 }
   4114 FX_BOOL CXFA_Node::TryCData(XFA_ATTRIBUTE eAttr,
   4115                             CFX_WideStringC& wsValue,
   4116                             FX_BOOL bUseDefault,
   4117                             FX_BOOL bProto) {
   4118   void* pKey = NULL;
   4119   if (!XFA_NodeData_PrepareKey(GetClassID(), eAttr, pKey)) {
   4120     return FALSE;
   4121   }
   4122   if (eAttr == XFA_ATTRIBUTE_Value) {
   4123     CFX_WideString* pStr = (CFX_WideString*)GetUserData(pKey, bProto);
   4124     if (pStr) {
   4125       wsValue = *pStr;
   4126       return TRUE;
   4127     }
   4128   } else {
   4129     if (GetMapModuleString(pKey, wsValue)) {
   4130       return TRUE;
   4131     }
   4132   }
   4133   if (!bUseDefault) {
   4134     return FALSE;
   4135   }
   4136   void* pValue = NULL;
   4137   if (XFA_GetAttributeDefaultValue(pValue, GetClassID(), eAttr,
   4138                                    XFA_ATTRIBUTETYPE_Cdata, m_ePacket)) {
   4139     wsValue = (CFX_WideStringC)(const FX_WCHAR*)pValue;
   4140     return TRUE;
   4141   }
   4142   return FALSE;
   4143 }
   4144 FX_BOOL CXFA_Node::SetObject(XFA_ATTRIBUTE eAttr,
   4145                              void* pData,
   4146                              XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo) {
   4147   void* pKey = NULL;
   4148   if (!XFA_NodeData_PrepareKey(GetClassID(), eAttr, pKey)) {
   4149     return FALSE;
   4150   }
   4151   return SetUserData(pKey, pData, pCallbackInfo);
   4152 }
   4153 FX_BOOL CXFA_Node::TryObject(XFA_ATTRIBUTE eAttr, void*& pData) {
   4154   void* pKey = NULL;
   4155   if (!XFA_NodeData_PrepareKey(GetClassID(), eAttr, pKey)) {
   4156     return FALSE;
   4157   }
   4158   pData = GetUserData(pKey);
   4159   return pData != NULL;
   4160 }
   4161 FX_BOOL CXFA_Node::SetValue(XFA_ATTRIBUTE eAttr,
   4162                             XFA_ATTRIBUTETYPE eType,
   4163                             void* pValue,
   4164                             FX_BOOL bNotify) {
   4165   void* pKey = NULL;
   4166   if (!XFA_NodeData_PrepareKey(GetClassID(), eAttr, pKey)) {
   4167     return FALSE;
   4168   }
   4169   OnChanging(eAttr, pValue, bNotify);
   4170   SetMapModuleValue(pKey, pValue);
   4171   OnChanged(eAttr, pValue, bNotify);
   4172   if (IsNeedSavingXMLNode()) {
   4173     FXSYS_assert(m_pXMLNode->GetType() == FDE_XMLNODE_Element);
   4174     XFA_LPCATTRIBUTEINFO pInfo = XFA_GetAttributeByID(eAttr);
   4175     if (pInfo) {
   4176       switch (eType) {
   4177         case XFA_ATTRIBUTETYPE_Enum:
   4178           ((IFDE_XMLElement*)m_pXMLNode)
   4179               ->SetString(
   4180                   pInfo->pName,
   4181                   XFA_GetAttributeEnumByID((XFA_ATTRIBUTEENUM)(uintptr_t)pValue)
   4182                       ->pName);
   4183           break;
   4184         case XFA_ATTRIBUTETYPE_Boolean:
   4185           ((IFDE_XMLElement*)m_pXMLNode)
   4186               ->SetString(pInfo->pName,
   4187                           pValue ? FX_WSTRC(L"1") : FX_WSTRC(L"0"));
   4188           break;
   4189         case XFA_ATTRIBUTETYPE_Integer:
   4190           ((IFDE_XMLElement*)m_pXMLNode)
   4191               ->SetInteger(pInfo->pName, (int32_t)(uintptr_t)pValue);
   4192           break;
   4193         default:
   4194           FXSYS_assert(0);
   4195       }
   4196     }
   4197   }
   4198   return TRUE;
   4199 }
   4200 FX_BOOL CXFA_Node::GetValue(XFA_ATTRIBUTE eAttr,
   4201                             XFA_ATTRIBUTETYPE eType,
   4202                             FX_BOOL bUseDefault,
   4203                             void*& pValue) {
   4204   void* pKey = NULL;
   4205   if (!XFA_NodeData_PrepareKey(GetClassID(), eAttr, pKey)) {
   4206     return FALSE;
   4207   }
   4208   if (GetMapModuleValue(pKey, pValue)) {
   4209     return TRUE;
   4210   }
   4211   if (!bUseDefault) {
   4212     return FALSE;
   4213   }
   4214   return XFA_GetAttributeDefaultValue(pValue, GetClassID(), eAttr, eType,
   4215                                       m_ePacket);
   4216 }
   4217 static void XFA_DefaultFreeData(void* pData) {}
   4218 static XFA_MAPDATABLOCKCALLBACKINFO gs_XFADefaultFreeData = {
   4219     XFA_DefaultFreeData, NULL};
   4220 FX_BOOL CXFA_Node::SetUserData(void* pKey,
   4221                                void* pData,
   4222                                XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo) {
   4223   SetMapModuleBuffer(pKey, &pData, sizeof(void*),
   4224                      pCallbackInfo ? pCallbackInfo : &gs_XFADefaultFreeData);
   4225   return TRUE;
   4226 }
   4227 FX_BOOL CXFA_Node::TryUserData(void* pKey, void*& pData, FX_BOOL bProtoAlso) {
   4228   int32_t iBytes = 0;
   4229   if (!GetMapModuleBuffer(pKey, pData, iBytes, bProtoAlso)) {
   4230     return FALSE;
   4231   }
   4232   return iBytes == sizeof(void*) && FXSYS_memcpy(&pData, pData, iBytes);
   4233 }
   4234 FX_BOOL CXFA_Node::SetScriptContent(const CFX_WideString& wsContent,
   4235                                     const CFX_WideString& wsXMLValue,
   4236                                     FX_BOOL bNotify,
   4237                                     FX_BOOL bScriptModify,
   4238                                     FX_BOOL bSyncData) {
   4239   CXFA_Node* pNode = NULL;
   4240   CXFA_Node* pBindNode = NULL;
   4241   switch (GetObjectType()) {
   4242     case XFA_OBJECTTYPE_ContainerNode: {
   4243       if (XFA_FieldIsMultiListBox(this)) {
   4244         CXFA_Node* pValue = GetProperty(0, XFA_ELEMENT_Value);
   4245         CXFA_Node* pChildValue = pValue->GetNodeItem(XFA_NODEITEM_FirstChild);
   4246         FXSYS_assert(pChildValue);
   4247         pChildValue->SetCData(XFA_ATTRIBUTE_ContentType, FX_WSTRC(L"text/xml"));
   4248         pChildValue->SetScriptContent(wsContent, wsContent, bNotify,
   4249                                       bScriptModify, FALSE);
   4250         CXFA_Node* pBind = GetBindData();
   4251         if (bSyncData && pBind) {
   4252           CFX_WideStringArray wsSaveTextArray;
   4253           int32_t iSize = 0;
   4254           if (!wsContent.IsEmpty()) {
   4255             int32_t iStart = 0;
   4256             int32_t iLength = wsContent.GetLength();
   4257             int32_t iEnd = wsContent.Find(L'\n', iStart);
   4258             iEnd = (iEnd == -1) ? iLength : iEnd;
   4259             while (iEnd >= iStart) {
   4260               wsSaveTextArray.Add(wsContent.Mid(iStart, iEnd - iStart));
   4261               iStart = iEnd + 1;
   4262               if (iStart >= iLength) {
   4263                 break;
   4264               }
   4265               iEnd = wsContent.Find(L'\n', iStart);
   4266               if (iEnd < 0) {
   4267                 wsSaveTextArray.Add(wsContent.Mid(iStart, iLength - iStart));
   4268               }
   4269             }
   4270             iSize = wsSaveTextArray.GetSize();
   4271           }
   4272           if (iSize == 0) {
   4273             while (CXFA_Node* pChildNode =
   4274                        pBind->GetNodeItem(XFA_NODEITEM_FirstChild)) {
   4275               pBind->RemoveChild(pChildNode);
   4276             }
   4277           } else {
   4278             CXFA_NodeArray valueNodes;
   4279             int32_t iDatas = pBind->GetNodeList(
   4280                 valueNodes, XFA_NODEFILTER_Children, XFA_ELEMENT_DataValue);
   4281             if (iDatas < iSize) {
   4282               int32_t iAddNodes = iSize - iDatas;
   4283               CXFA_Node* pValueNodes = NULL;
   4284               while (iAddNodes-- > 0) {
   4285                 pValueNodes =
   4286                     pBind->CreateSamePacketNode(XFA_ELEMENT_DataValue);
   4287                 pValueNodes->SetCData(XFA_ATTRIBUTE_Name, FX_WSTRC(L"value"));
   4288                 pValueNodes->CreateXMLMappingNode();
   4289                 pBind->InsertChild(pValueNodes);
   4290               }
   4291               pValueNodes = NULL;
   4292             } else if (iDatas > iSize) {
   4293               int32_t iDelNodes = iDatas - iSize;
   4294               while (iDelNodes-- > 0) {
   4295                 pBind->RemoveChild(pBind->GetNodeItem(XFA_NODEITEM_FirstChild));
   4296               }
   4297             }
   4298             int32_t i = 0;
   4299             for (CXFA_Node* pValueNode =
   4300                      pBind->GetNodeItem(XFA_NODEITEM_FirstChild);
   4301                  pValueNode; pValueNode = pValueNode->GetNodeItem(
   4302                                  XFA_NODEITEM_NextSibling)) {
   4303               pValueNode->SetAttributeValue(wsSaveTextArray[i],
   4304                                             wsSaveTextArray[i], FALSE);
   4305               i++;
   4306             }
   4307           }
   4308           CXFA_NodeArray nodeArray;
   4309           pBind->GetBindItems(nodeArray);
   4310           for (int32_t i = 0; i < nodeArray.GetSize(); i++) {
   4311             CXFA_Node* pNode = nodeArray[i];
   4312             if (pNode == this) {
   4313               continue;
   4314             }
   4315             pNode->SetScriptContent(wsContent, wsContent, bNotify,
   4316                                     bScriptModify, FALSE);
   4317           }
   4318         }
   4319         break;
   4320       } else if (GetClassID() == XFA_ELEMENT_ExclGroup) {
   4321         pNode = this;
   4322       } else {
   4323         CXFA_Node* pValue = GetProperty(0, XFA_ELEMENT_Value);
   4324         CXFA_Node* pChildValue = pValue->GetNodeItem(XFA_NODEITEM_FirstChild);
   4325         FXSYS_assert(pChildValue);
   4326         pChildValue->SetScriptContent(wsContent, wsContent, bNotify,
   4327                                       bScriptModify, FALSE);
   4328       }
   4329       pBindNode = GetBindData();
   4330       if (pBindNode && bSyncData) {
   4331         pBindNode->SetScriptContent(wsContent, wsXMLValue, bNotify,
   4332                                     bScriptModify, FALSE);
   4333         CXFA_NodeArray nodeArray;
   4334         pBindNode->GetBindItems(nodeArray);
   4335         for (int32_t i = 0; i < nodeArray.GetSize(); i++) {
   4336           CXFA_Node* pNode = nodeArray[i];
   4337           if (pNode == this) {
   4338             continue;
   4339           }
   4340           pNode->SetScriptContent(wsContent, wsContent, bNotify, TRUE, FALSE);
   4341         }
   4342       }
   4343       pBindNode = NULL;
   4344       break;
   4345     }
   4346     case XFA_OBJECTTYPE_ContentNode: {
   4347       CFX_WideString wsContentType;
   4348       if (GetClassID() == XFA_ELEMENT_ExData) {
   4349         GetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType, FALSE);
   4350         if (wsContentType.Equal(FX_WSTRC(L"text/html"))) {
   4351           wsContentType = FX_WSTRC(L"");
   4352           SetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType);
   4353         }
   4354       }
   4355       CXFA_Node* pContentRawDataNode = GetNodeItem(XFA_NODEITEM_FirstChild);
   4356       if (!pContentRawDataNode) {
   4357         pContentRawDataNode =
   4358             CreateSamePacketNode((wsContentType.Equal(FX_WSTRC(L"text/xml")))
   4359                                      ? XFA_ELEMENT_Sharpxml
   4360                                      : XFA_ELEMENT_Sharptext);
   4361         InsertChild(pContentRawDataNode);
   4362       }
   4363       return pContentRawDataNode->SetScriptContent(
   4364           wsContent, wsXMLValue, bNotify, bScriptModify, bSyncData);
   4365     } break;
   4366     case XFA_OBJECTTYPE_NodeC:
   4367     case XFA_OBJECTTYPE_TextNode:
   4368       pNode = this;
   4369       break;
   4370     case XFA_OBJECTTYPE_NodeV:
   4371       pNode = this;
   4372       if (bSyncData && GetPacketID() == XFA_XDPPACKET_Form) {
   4373         CXFA_Node* pParent = GetNodeItem(XFA_NODEITEM_Parent);
   4374         if (pParent) {
   4375           pParent = pParent->GetNodeItem(XFA_NODEITEM_Parent);
   4376         }
   4377         if (pParent && pParent->GetClassID() == XFA_ELEMENT_Value) {
   4378           pParent = pParent->GetNodeItem(XFA_NODEITEM_Parent);
   4379           if (pParent && pParent->IsContainerNode()) {
   4380             pBindNode = pParent->GetBindData();
   4381             if (pBindNode) {
   4382               pBindNode->SetScriptContent(wsContent, wsXMLValue, bNotify,
   4383                                           bScriptModify, FALSE);
   4384             }
   4385           }
   4386         }
   4387       }
   4388       break;
   4389     default:
   4390       if (GetClassID() == XFA_ELEMENT_DataValue) {
   4391         pNode = this;
   4392         pBindNode = this;
   4393       }
   4394       break;
   4395   }
   4396   if (pNode) {
   4397     SetAttributeValue(wsContent, wsXMLValue, bNotify, bScriptModify);
   4398     if (pBindNode && bSyncData) {
   4399       CXFA_NodeArray nodeArray;
   4400       pBindNode->GetBindItems(nodeArray);
   4401       for (int32_t i = 0; i < nodeArray.GetSize(); i++) {
   4402         CXFA_Node* pNode = nodeArray[i];
   4403         pNode->SetScriptContent(wsContent, wsContent, bNotify, bScriptModify,
   4404                                 FALSE);
   4405       }
   4406     }
   4407     return TRUE;
   4408   }
   4409   return FALSE;
   4410 }
   4411 FX_BOOL CXFA_Node::SetContent(const CFX_WideString& wsContent,
   4412                               const CFX_WideString& wsXMLValue,
   4413                               FX_BOOL bNotify,
   4414                               FX_BOOL bScriptModify,
   4415                               FX_BOOL bSyncData) {
   4416   return SetScriptContent(wsContent, wsXMLValue, bNotify, bScriptModify,
   4417                           bSyncData);
   4418 }
   4419 CFX_WideString CXFA_Node::GetScriptContent(FX_BOOL bScriptModify) {
   4420   CFX_WideString wsContent;
   4421   return TryContent(wsContent, bScriptModify) ? wsContent : CFX_WideString();
   4422 }
   4423 CFX_WideString CXFA_Node::GetContent() {
   4424   return GetScriptContent();
   4425 }
   4426 FX_BOOL CXFA_Node::TryContent(CFX_WideString& wsContent,
   4427                               FX_BOOL bScriptModify,
   4428                               FX_BOOL bProto) {
   4429   CXFA_Node* pNode = NULL;
   4430   switch (GetObjectType()) {
   4431     case XFA_OBJECTTYPE_ContainerNode:
   4432       if (GetClassID() == XFA_ELEMENT_ExclGroup) {
   4433         pNode = this;
   4434       } else {
   4435         CXFA_Node* pValue = GetChild(0, XFA_ELEMENT_Value);
   4436         if (!pValue) {
   4437           return FALSE;
   4438         }
   4439         CXFA_Node* pChildValue = pValue->GetNodeItem(XFA_NODEITEM_FirstChild);
   4440         if (pChildValue && XFA_FieldIsMultiListBox(this)) {
   4441           pChildValue->SetAttribute(XFA_ATTRIBUTE_ContentType,
   4442                                     FX_WSTRC(L"text/xml"));
   4443         }
   4444         return pChildValue
   4445                    ? pChildValue->TryContent(wsContent, bScriptModify, bProto)
   4446                    : FALSE;
   4447       }
   4448       break;
   4449     case XFA_OBJECTTYPE_ContentNode: {
   4450       CXFA_Node* pContentRawDataNode = GetNodeItem(XFA_NODEITEM_FirstChild);
   4451       if (!pContentRawDataNode) {
   4452         XFA_ELEMENT element = XFA_ELEMENT_Sharptext;
   4453         if (GetClassID() == XFA_ELEMENT_ExData) {
   4454           CFX_WideString wsContentType;
   4455           GetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType, FALSE);
   4456           if (wsContentType.Equal(FX_WSTRC(L"text/html"))) {
   4457             element = XFA_ELEMENT_SharpxHTML;
   4458           } else if (wsContentType.Equal(FX_WSTRC(L"text/xml"))) {
   4459             element = XFA_ELEMENT_Sharpxml;
   4460           }
   4461         }
   4462         pContentRawDataNode = CreateSamePacketNode(element);
   4463         InsertChild(pContentRawDataNode);
   4464       }
   4465       return pContentRawDataNode->TryContent(wsContent, bScriptModify, bProto);
   4466     }
   4467     case XFA_OBJECTTYPE_NodeC:
   4468     case XFA_OBJECTTYPE_NodeV:
   4469     case XFA_OBJECTTYPE_TextNode:
   4470       pNode = this;
   4471     default:
   4472       if (GetClassID() == XFA_ELEMENT_DataValue) {
   4473         pNode = this;
   4474       }
   4475       break;
   4476   }
   4477   if (pNode) {
   4478     if (bScriptModify) {
   4479       IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
   4480       if (pScriptContext) {
   4481         m_pDocument->GetScriptContext()->AddNodesOfRunScript(this);
   4482       }
   4483     }
   4484     return TryCData(XFA_ATTRIBUTE_Value, wsContent, FALSE, bProto);
   4485   }
   4486   return FALSE;
   4487 }
   4488 CXFA_Node* CXFA_Node::GetModelNode() {
   4489   switch (GetPacketID()) {
   4490     case XFA_XDPPACKET_XDP:
   4491       return m_pDocument->GetRoot();
   4492     case XFA_XDPPACKET_Config:
   4493       return (CXFA_Node*)m_pDocument->GetXFANode(XFA_HASHCODE_Config);
   4494     case XFA_XDPPACKET_Template:
   4495       return (CXFA_Node*)m_pDocument->GetXFANode(XFA_HASHCODE_Template);
   4496     case XFA_XDPPACKET_Form:
   4497       return (CXFA_Node*)m_pDocument->GetXFANode(XFA_HASHCODE_Form);
   4498     case XFA_XDPPACKET_Datasets:
   4499       return (CXFA_Node*)m_pDocument->GetXFANode(XFA_HASHCODE_Datasets);
   4500     case XFA_XDPPACKET_LocaleSet:
   4501       return (CXFA_Node*)m_pDocument->GetXFANode(XFA_HASHCODE_LocaleSet);
   4502     case XFA_XDPPACKET_ConnectionSet:
   4503       return (CXFA_Node*)m_pDocument->GetXFANode(XFA_HASHCODE_ConnectionSet);
   4504     case XFA_XDPPACKET_SourceSet:
   4505       return (CXFA_Node*)m_pDocument->GetXFANode(XFA_HASHCODE_SourceSet);
   4506     case XFA_XDPPACKET_Xdc:
   4507       return (CXFA_Node*)m_pDocument->GetXFANode(XFA_HASHCODE_Xdc);
   4508     default:
   4509       return this;
   4510   }
   4511 }
   4512 FX_BOOL CXFA_Node::TryNamespace(CFX_WideString& wsNamespace) {
   4513   wsNamespace.Empty();
   4514   if (this->GetObjectType() == XFA_OBJECTTYPE_ModelNode ||
   4515       this->GetClassID() == XFA_ELEMENT_Packet) {
   4516     IFDE_XMLNode* pXMLNode = this->GetXMLMappingNode();
   4517     if (!pXMLNode || pXMLNode->GetType() != FDE_XMLNODE_Element) {
   4518       return FALSE;
   4519     }
   4520     ((IFDE_XMLElement*)pXMLNode)->GetNamespaceURI(wsNamespace);
   4521     return TRUE;
   4522   } else if (this->GetPacketID() == XFA_XDPPACKET_Datasets) {
   4523     IFDE_XMLNode* pXMLNode = this->GetXMLMappingNode();
   4524     if (!pXMLNode) {
   4525       return FALSE;
   4526     }
   4527     if (pXMLNode->GetType() != FDE_XMLNODE_Element) {
   4528       return TRUE;
   4529     }
   4530     if (this->GetClassID() == XFA_ELEMENT_DataValue &&
   4531         this->GetEnum(XFA_ATTRIBUTE_Contains) == XFA_ATTRIBUTEENUM_MetaData) {
   4532       return XFA_FDEExtension_ResolveNamespaceQualifier(
   4533           (IFDE_XMLElement*)pXMLNode,
   4534           this->GetCData(XFA_ATTRIBUTE_QualifiedName), wsNamespace);
   4535     }
   4536     ((IFDE_XMLElement*)pXMLNode)->GetNamespaceURI(wsNamespace);
   4537     return TRUE;
   4538   } else {
   4539     CXFA_Node* pModelNode = GetModelNode();
   4540     return pModelNode->TryNamespace(wsNamespace);
   4541   }
   4542 }
   4543 CXFA_Node* CXFA_Node::GetProperty(int32_t index,
   4544                                   XFA_ELEMENT eProperty,
   4545                                   FX_BOOL bCreateProperty) {
   4546   XFA_ELEMENT eElement = GetClassID();
   4547   FX_DWORD dwPacket = GetPacketID();
   4548   XFA_LPCPROPERTY pProperty =
   4549       XFA_GetPropertyOfElement(eElement, eProperty, dwPacket);
   4550   if (pProperty == NULL || index >= pProperty->uOccur) {
   4551     return NULL;
   4552   }
   4553   CXFA_Node* pNode = m_pChild;
   4554   int32_t iCount = 0;
   4555   for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
   4556     if (pNode->GetClassID() == eProperty) {
   4557       iCount++;
   4558       if (iCount > index) {
   4559         return pNode;
   4560       }
   4561     }
   4562   }
   4563   if (!bCreateProperty) {
   4564     return NULL;
   4565   }
   4566   if (pProperty->uFlags & XFA_PROPERTYFLAG_OneOf) {
   4567     pNode = m_pChild;
   4568     for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
   4569       XFA_LPCPROPERTY pExistProterty =
   4570           XFA_GetPropertyOfElement(eElement, pNode->GetClassID(), dwPacket);
   4571       if (pExistProterty && (pExistProterty->uFlags & XFA_PROPERTYFLAG_OneOf)) {
   4572         return NULL;
   4573       }
   4574     }
   4575   }
   4576   IXFA_ObjFactory* pFactory = m_pDocument->GetParser()->GetFactory();
   4577   XFA_LPCPACKETINFO pPacket = XFA_GetPacketByID(dwPacket);
   4578   CXFA_Node* pNewNode;
   4579   for (; iCount <= index; iCount++) {
   4580     pNewNode = pFactory->CreateNode(pPacket, eProperty);
   4581     if (!pNewNode) {
   4582       return NULL;
   4583     }
   4584     this->InsertChild(pNewNode, NULL);
   4585     pNewNode->SetFlag(XFA_NODEFLAG_Initialized);
   4586   }
   4587   return pNewNode;
   4588 }
   4589 int32_t CXFA_Node::CountChildren(XFA_ELEMENT eElement, FX_BOOL bOnlyChild) {
   4590   CXFA_Node* pNode = m_pChild;
   4591   int32_t iCount = 0;
   4592   for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
   4593     if (pNode->GetClassID() == eElement || eElement == XFA_ELEMENT_UNKNOWN) {
   4594       if (bOnlyChild) {
   4595         XFA_LPCPROPERTY pPropert = XFA_GetPropertyOfElement(
   4596             GetClassID(), pNode->GetClassID(), XFA_XDPPACKET_UNKNOWN);
   4597         if (pPropert) {
   4598           continue;
   4599         }
   4600       }
   4601       iCount++;
   4602     }
   4603   }
   4604   return iCount;
   4605 }
   4606 CXFA_Node* CXFA_Node::GetChild(int32_t index,
   4607                                XFA_ELEMENT eElement,
   4608                                FX_BOOL bOnlyChild) {
   4609   FXSYS_assert(index > -1);
   4610   CXFA_Node* pNode = m_pChild;
   4611   int32_t iCount = 0;
   4612   for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
   4613     if (pNode->GetClassID() == eElement || eElement == XFA_ELEMENT_UNKNOWN) {
   4614       if (bOnlyChild) {
   4615         XFA_LPCPROPERTY pPropert = XFA_GetPropertyOfElement(
   4616             GetClassID(), pNode->GetClassID(), XFA_XDPPACKET_UNKNOWN);
   4617         if (pPropert) {
   4618           continue;
   4619         }
   4620       }
   4621       iCount++;
   4622       if (iCount > index) {
   4623         return pNode;
   4624       }
   4625     }
   4626   }
   4627   return NULL;
   4628 }
   4629 int32_t CXFA_Node::InsertChild(int32_t index, CXFA_Node* pNode) {
   4630   ASSERT(pNode != NULL && pNode->m_pNext == NULL);
   4631   pNode->m_pParent = this;
   4632   FX_BOOL bWasPurgeNode = m_pDocument->RemovePurgeNode(pNode);
   4633   FXSYS_assert(bWasPurgeNode == TRUE);
   4634   if (m_pChild == NULL || index == 0) {
   4635     if (index > 0) {
   4636       return -1;
   4637     }
   4638     pNode->m_pNext = m_pChild;
   4639     m_pChild = pNode;
   4640     index = 0;
   4641   } else if (index < 0) {
   4642     m_pLastChild->m_pNext = pNode;
   4643   } else {
   4644     CXFA_Node* pPrev = m_pChild;
   4645     int32_t iCount = 0;
   4646     while (++iCount != index && pPrev->m_pNext) {
   4647       pPrev = pPrev->m_pNext;
   4648     }
   4649     if (index > 0 && index != iCount) {
   4650       return -1;
   4651     }
   4652     pNode->m_pNext = pPrev->m_pNext;
   4653     pPrev->m_pNext = pNode;
   4654     index = iCount;
   4655   }
   4656   if (pNode->m_pNext == NULL) {
   4657     m_pLastChild = pNode;
   4658   }
   4659   ASSERT(m_pLastChild != NULL && m_pLastChild->m_pNext == NULL);
   4660   pNode->SetFlag(XFA_NODEFLAG_HasRemoved, FALSE);
   4661   IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
   4662   if (pNotify) {
   4663     pNotify->OnNodeEvent(this, XFA_NODEEVENT_ChildAdded, pNode);
   4664   }
   4665   if (IsNeedSavingXMLNode() && pNode->m_pXMLNode) {
   4666     FXSYS_assert(pNode->m_pXMLNode->GetNodeItem(IFDE_XMLNode::Parent) == NULL);
   4667     m_pXMLNode->InsertChildNode(pNode->m_pXMLNode, index);
   4668     pNode->SetFlag(XFA_NODEFLAG_OwnXMLNode, FALSE, FALSE);
   4669   }
   4670   return index;
   4671 }
   4672 FX_BOOL CXFA_Node::InsertChild(CXFA_Node* pNode, CXFA_Node* pBeforeNode) {
   4673   if (!pNode || pNode->m_pParent != NULL ||
   4674       (pBeforeNode && pBeforeNode->m_pParent != this)) {
   4675     FXSYS_assert(FALSE);
   4676     return FALSE;
   4677   }
   4678   FX_BOOL bWasPurgeNode = m_pDocument->RemovePurgeNode(pNode);
   4679   FXSYS_assert(bWasPurgeNode == TRUE);
   4680   int32_t nIndex = -1;
   4681   pNode->m_pParent = this;
   4682   if (m_pChild == NULL || pBeforeNode == m_pChild) {
   4683     pNode->m_pNext = m_pChild;
   4684     m_pChild = pNode;
   4685     nIndex = 0;
   4686   } else if (!pBeforeNode) {
   4687     pNode->m_pNext = m_pLastChild->m_pNext;
   4688     m_pLastChild->m_pNext = pNode;
   4689   } else {
   4690     nIndex = 1;
   4691     CXFA_Node* pPrev = m_pChild;
   4692     while (pPrev->m_pNext != pBeforeNode) {
   4693       pPrev = pPrev->m_pNext;
   4694       nIndex++;
   4695     }
   4696     pNode->m_pNext = pPrev->m_pNext;
   4697     pPrev->m_pNext = pNode;
   4698   }
   4699   if (pNode->m_pNext == NULL) {
   4700     m_pLastChild = pNode;
   4701   }
   4702   ASSERT(m_pLastChild != NULL && m_pLastChild->m_pNext == NULL);
   4703   pNode->SetFlag(XFA_NODEFLAG_HasRemoved, FALSE);
   4704   IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
   4705   if (pNotify) {
   4706     pNotify->OnNodeEvent(this, XFA_NODEEVENT_ChildAdded, pNode);
   4707   }
   4708   if (IsNeedSavingXMLNode() && pNode->m_pXMLNode) {
   4709     FXSYS_assert(pNode->m_pXMLNode->GetNodeItem(IFDE_XMLNode::Parent) == NULL);
   4710     m_pXMLNode->InsertChildNode(pNode->m_pXMLNode, nIndex);
   4711     pNode->SetFlag(XFA_NODEFLAG_OwnXMLNode, FALSE, FALSE);
   4712   }
   4713   return TRUE;
   4714 }
   4715 CXFA_Node* CXFA_Node::Deprecated_GetPrevSibling() {
   4716   if (!m_pParent) {
   4717     return NULL;
   4718   }
   4719   for (CXFA_Node* pSibling = m_pParent->m_pChild; pSibling;
   4720        pSibling = pSibling->m_pNext) {
   4721     if (pSibling->m_pNext == this) {
   4722       return pSibling;
   4723     }
   4724   }
   4725   return NULL;
   4726 }
   4727 FX_BOOL CXFA_Node::RemoveChild(CXFA_Node* pNode, FX_BOOL bNotify) {
   4728   if (pNode == NULL || pNode->m_pParent != this) {
   4729     FXSYS_assert(FALSE);
   4730     return FALSE;
   4731   }
   4732   if (m_pChild == pNode) {
   4733     m_pChild = pNode->m_pNext;
   4734     if (m_pLastChild == pNode) {
   4735       m_pLastChild = pNode->m_pNext;
   4736     }
   4737     pNode->m_pNext = NULL;
   4738     pNode->m_pParent = NULL;
   4739   } else {
   4740     CXFA_Node* pPrev = pNode->Deprecated_GetPrevSibling();
   4741     pPrev->m_pNext = pNode->m_pNext;
   4742     if (m_pLastChild == pNode) {
   4743       m_pLastChild = pNode->m_pNext ? pNode->m_pNext : pPrev;
   4744     }
   4745     pNode->m_pNext = NULL;
   4746     pNode->m_pParent = NULL;
   4747   }
   4748   ASSERT(m_pLastChild == NULL || m_pLastChild->m_pNext == NULL);
   4749   OnRemoved(this, pNode, bNotify);
   4750   pNode->SetFlag(XFA_NODEFLAG_HasRemoved);
   4751   m_pDocument->AddPurgeNode(pNode);
   4752   if (IsNeedSavingXMLNode() && pNode->m_pXMLNode) {
   4753     if (pNode->IsAttributeInXML()) {
   4754       FXSYS_assert(pNode->m_pXMLNode == m_pXMLNode &&
   4755                    m_pXMLNode->GetType() == FDE_XMLNODE_Element);
   4756       if (pNode->m_pXMLNode->GetType() == FDE_XMLNODE_Element) {
   4757         IFDE_XMLElement* pXMLElement = (IFDE_XMLElement*)(pNode->m_pXMLNode);
   4758         CFX_WideStringC wsAttributeName =
   4759             pNode->GetCData(XFA_ATTRIBUTE_QualifiedName);
   4760         pXMLElement->RemoveAttribute(wsAttributeName.GetPtr());
   4761       }
   4762       CFX_WideString wsName;
   4763       pNode->GetAttribute(XFA_ATTRIBUTE_Name, wsName, FALSE);
   4764       IFDE_XMLElement* pNewXMLElement = IFDE_XMLElement::Create(wsName);
   4765       CFX_WideStringC wsValue = this->GetCData(XFA_ATTRIBUTE_Value);
   4766       if (!wsValue.IsEmpty()) {
   4767         pNewXMLElement->SetTextData(wsValue);
   4768       }
   4769       pNode->m_pXMLNode = pNewXMLElement;
   4770       pNode->SetEnum(XFA_ATTRIBUTE_Contains, XFA_ATTRIBUTEENUM_Unknown);
   4771     } else {
   4772       m_pXMLNode->RemoveChildNode(pNode->m_pXMLNode);
   4773     }
   4774     pNode->SetFlag(XFA_NODEFLAG_OwnXMLNode, TRUE, FALSE);
   4775   }
   4776   return TRUE;
   4777 }
   4778 CXFA_Node* CXFA_Node::GetFirstChildByName(const CFX_WideStringC& wsName) const {
   4779   return GetFirstChildByName(
   4780       wsName.IsEmpty() ? 0 : FX_HashCode_String_GetW(wsName.GetPtr(),
   4781                                                      wsName.GetLength()));
   4782 }
   4783 CXFA_Node* CXFA_Node::GetFirstChildByName(FX_DWORD dwNameHash) const {
   4784   for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_FirstChild); pNode;
   4785        pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
   4786     if (pNode->GetNameHash() == dwNameHash) {
   4787       return pNode;
   4788     }
   4789   }
   4790   return NULL;
   4791 }
   4792 CXFA_Node* CXFA_Node::GetFirstChildByClass(XFA_ELEMENT eElement) const {
   4793   for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_FirstChild); pNode;
   4794        pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
   4795     if (pNode->GetClassID() == eElement) {
   4796       return pNode;
   4797     }
   4798   }
   4799   return NULL;
   4800 }
   4801 CXFA_Node* CXFA_Node::GetNextSameNameSibling(FX_DWORD dwNameHash) const {
   4802   for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_NextSibling); pNode;
   4803        pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
   4804     if (pNode->GetNameHash() == dwNameHash) {
   4805       return pNode;
   4806     }
   4807   }
   4808   return NULL;
   4809 }
   4810 CXFA_Node* CXFA_Node::GetNextSameNameSibling(
   4811     const CFX_WideStringC& wsNodeName) const {
   4812   return GetNextSameNameSibling(
   4813       wsNodeName.IsEmpty() ? 0
   4814                            : FX_HashCode_String_GetW(wsNodeName.GetPtr(),
   4815                                                      wsNodeName.GetLength()));
   4816 }
   4817 CXFA_Node* CXFA_Node::GetNextSameClassSibling(XFA_ELEMENT eElement) const {
   4818   for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_NextSibling); pNode;
   4819        pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
   4820     if (pNode->GetClassID() == eElement) {
   4821       return pNode;
   4822     }
   4823   }
   4824   return NULL;
   4825 }
   4826 int32_t CXFA_Node::GetNodeSameNameIndex() const {
   4827   IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
   4828   if (!pScriptContext) {
   4829     return -1;
   4830   }
   4831   return pScriptContext->GetIndexByName((CXFA_Node*)this);
   4832 }
   4833 int32_t CXFA_Node::GetNodeSameClassIndex() const {
   4834   IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
   4835   if (!pScriptContext) {
   4836     return -1;
   4837   }
   4838   return pScriptContext->GetIndexByClassName((CXFA_Node*)this);
   4839 }
   4840 void CXFA_Node::GetSOMExpression(CFX_WideString& wsSOMExpression) {
   4841   IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
   4842   if (!pScriptContext) {
   4843     return;
   4844   }
   4845   pScriptContext->GetSomExpression(this, wsSOMExpression);
   4846 }
   4847 CXFA_Node* CXFA_Node::GetInstanceMgrOfSubform() {
   4848   CXFA_Node* pInstanceMgr = NULL;
   4849   if (m_ePacket == XFA_XDPPACKET_Form) {
   4850     CXFA_Node* pParentNode = GetNodeItem(XFA_NODEITEM_Parent);
   4851     if (!pParentNode || pParentNode->GetClassID() == XFA_ELEMENT_Area) {
   4852       return pInstanceMgr;
   4853     }
   4854     for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_PrevSibling);
   4855          pNode != NULL; pNode = pNode->GetNodeItem(XFA_NODEITEM_PrevSibling)) {
   4856       XFA_ELEMENT eType = pNode->GetClassID();
   4857       if ((eType == XFA_ELEMENT_Subform || eType == XFA_ELEMENT_SubformSet) &&
   4858           pNode->m_dwNameHash != m_dwNameHash) {
   4859         break;
   4860       }
   4861       if (eType == XFA_ELEMENT_InstanceManager) {
   4862         CFX_WideStringC wsName = GetCData(XFA_ATTRIBUTE_Name);
   4863         CFX_WideStringC wsInstName = pNode->GetCData(XFA_ATTRIBUTE_Name);
   4864         if (wsInstName.GetLength() > 0 && wsInstName.GetAt(0) == '_' &&
   4865             wsInstName.Mid(1) == wsName) {
   4866           pInstanceMgr = pNode;
   4867         }
   4868         break;
   4869       }
   4870     }
   4871   }
   4872   return pInstanceMgr;
   4873 }
   4874 CXFA_Node* CXFA_Node::GetOccurNode() {
   4875   return GetFirstChildByClass(XFA_ELEMENT_Occur);
   4876 }
   4877 FX_BOOL CXFA_Node::HasFlag(FX_DWORD dwFlag) const {
   4878   if (m_uFlags & dwFlag) {
   4879     return TRUE;
   4880   }
   4881   switch (dwFlag) {
   4882     case XFA_NODEFLAG_HasRemoved:
   4883       return m_pParent && m_pParent->HasFlag(dwFlag);
   4884     default:
   4885       break;
   4886   }
   4887   return FALSE;
   4888 }
   4889 void CXFA_Node::SetFlag(FX_DWORD dwFlag, FX_BOOL bOn, FX_BOOL bNotify) {
   4890   if (bOn) {
   4891     switch (dwFlag) {
   4892       case XFA_NODEFLAG_Initialized:
   4893         if (bNotify && !HasFlag(XFA_NODEFLAG_Initialized)) {
   4894           IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
   4895           if (pNotify) {
   4896             pNotify->OnNodeEvent(this, XFA_NODEEVENT_Ready);
   4897           }
   4898         }
   4899         break;
   4900       default:
   4901         break;
   4902     }
   4903     m_uFlags |= dwFlag;
   4904   } else {
   4905     m_uFlags &= ~dwFlag;
   4906   }
   4907 }
   4908 FX_BOOL CXFA_Node::IsAttributeInXML() {
   4909   return GetEnum(XFA_ATTRIBUTE_Contains) == XFA_ATTRIBUTEENUM_MetaData;
   4910 }
   4911 void CXFA_Node::OnRemoved(CXFA_Node* pParent,
   4912                           CXFA_Node* pRemoved,
   4913                           FX_BOOL bNotify) {
   4914   if (bNotify && (pParent != NULL)) {
   4915     IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
   4916     if (pNotify) {
   4917       pNotify->OnNodeEvent(pParent, XFA_NODEEVENT_ChildRemoved, pRemoved);
   4918     }
   4919   }
   4920 }
   4921 void CXFA_Node::OnChanging(XFA_ATTRIBUTE eAttr,
   4922                            void* pNewValue,
   4923                            FX_BOOL bNotify) {
   4924   if (bNotify && HasFlag(XFA_NODEFLAG_Initialized)) {
   4925     IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
   4926     if (pNotify) {
   4927       pNotify->OnNodeEvent(this, XFA_NODEEVENT_ValueChanging,
   4928                            (void*)(uintptr_t)eAttr, pNewValue);
   4929     }
   4930   }
   4931 }
   4932 void CXFA_Node::OnChanged(XFA_ATTRIBUTE eAttr,
   4933                           void* pNewValue,
   4934                           FX_BOOL bNotify,
   4935                           FX_BOOL bScriptModify) {
   4936   if (bNotify && HasFlag(XFA_NODEFLAG_Initialized)) {
   4937     Script_Attribute_SendAttributeChangeMessage((void*)(uintptr_t)eAttr,
   4938                                                 pNewValue, bScriptModify);
   4939   }
   4940 }
   4941 int32_t CXFA_Node::execSingleEventByName(const CFX_WideStringC& wsEventName,
   4942                                          XFA_ELEMENT eElementType) {
   4943   int32_t iRet = XFA_EVENTERROR_NotExist;
   4944   const XFA_ExecEventParaInfo* eventParaInfo =
   4945       GetEventParaInfoByName(wsEventName);
   4946   if (eventParaInfo) {
   4947     uint32_t validFlags = eventParaInfo->m_validFlags;
   4948     IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
   4949     if (!pNotify) {
   4950       return iRet;
   4951     }
   4952     if (validFlags == 1) {
   4953       iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType);
   4954     } else if (validFlags == 2) {
   4955       iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType,
   4956                                            FALSE, FALSE);
   4957     } else if (validFlags == 3) {
   4958       if (eElementType == XFA_ELEMENT_Subform) {
   4959         iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType,
   4960                                              FALSE, FALSE);
   4961       }
   4962     } else if (validFlags == 4) {
   4963       if (eElementType == XFA_ELEMENT_ExclGroup ||
   4964           eElementType == XFA_ELEMENT_Field) {
   4965         CXFA_Node* pParentNode = GetNodeItem(XFA_NODEITEM_Parent);
   4966         if (pParentNode && pParentNode->GetClassID() == XFA_ELEMENT_ExclGroup) {
   4967           iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType,
   4968                                                FALSE, FALSE);
   4969         }
   4970         iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType,
   4971                                              FALSE, FALSE);
   4972       }
   4973     } else if (validFlags == 5) {
   4974       if (eElementType == XFA_ELEMENT_Field) {
   4975         iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType,
   4976                                              FALSE, FALSE);
   4977       }
   4978     } else if (validFlags == 6) {
   4979       CXFA_WidgetData* pWidgetData = GetWidgetData();
   4980       if (pWidgetData) {
   4981         CXFA_Node* pUINode = pWidgetData->GetUIChild();
   4982         if (pUINode->m_eNodeClass == XFA_ELEMENT_Signature) {
   4983           iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType,
   4984                                                FALSE, FALSE);
   4985         }
   4986       }
   4987     } else if (validFlags == 7) {
   4988       CXFA_WidgetData* pWidgetData = GetWidgetData();
   4989       if (pWidgetData) {
   4990         CXFA_Node* pUINode = pWidgetData->GetUIChild();
   4991         if ((pUINode->m_eNodeClass == XFA_ELEMENT_ChoiceList) &&
   4992             (!pWidgetData->IsListBox())) {
   4993           iRet = pNotify->ExecEventByDeepFirst(this, eventParaInfo->m_eventType,
   4994                                                FALSE, FALSE);
   4995         }
   4996       }
   4997     }
   4998   }
   4999   return iRet;
   5000 }
   5001 void CXFA_Node::UpdateNameHash() {
   5002   XFA_LPCNOTSUREATTRIBUTE pNotsure =
   5003       XFA_GetNotsureAttribute(GetClassID(), XFA_ATTRIBUTE_Name);
   5004   if (!pNotsure || pNotsure->eType == XFA_ATTRIBUTETYPE_Cdata) {
   5005     CFX_WideStringC wsName = GetCData(XFA_ATTRIBUTE_Name);
   5006     m_dwNameHash =
   5007         wsName.IsEmpty() ? 0 : FX_HashCode_String_GetW(wsName.GetPtr(),
   5008                                                        wsName.GetLength());
   5009   } else if (pNotsure->eType == XFA_ATTRIBUTETYPE_Enum) {
   5010     CFX_WideStringC wsName =
   5011         XFA_GetAttributeEnumByID(GetEnum(XFA_ATTRIBUTE_Name))->pName;
   5012     m_dwNameHash =
   5013         wsName.IsEmpty() ? 0 : FX_HashCode_String_GetW(wsName.GetPtr(),
   5014                                                        wsName.GetLength());
   5015   }
   5016 }
   5017 IFDE_XMLNode* CXFA_Node::CreateXMLMappingNode() {
   5018   if (!m_pXMLNode) {
   5019     CFX_WideStringC wsTag = GetCData(XFA_ATTRIBUTE_Name);
   5020     m_pXMLNode = IFDE_XMLElement::Create(wsTag);
   5021     SetFlag(XFA_NODEFLAG_OwnXMLNode, TRUE, FALSE);
   5022   }
   5023   return m_pXMLNode;
   5024 }
   5025 FX_BOOL CXFA_Node::IsNeedSavingXMLNode() {
   5026   return m_pXMLNode && (GetPacketID() == XFA_XDPPACKET_Datasets ||
   5027                         GetClassID() == XFA_ELEMENT_Xfa);
   5028 }
   5029 XFA_LPMAPMODULEDATA CXFA_Node::GetMapModuleData(FX_BOOL bCreateNew) {
   5030   if (!m_pMapModuleData && bCreateNew) {
   5031     m_pMapModuleData = new XFA_MAPMODULEDATA;
   5032   }
   5033   return m_pMapModuleData;
   5034 }
   5035 void CXFA_Node::SetMapModuleValue(void* pKey, void* pValue) {
   5036   XFA_LPMAPMODULEDATA pMoudle = this->GetMapModuleData(TRUE);
   5037   if (!pMoudle) {
   5038     return;
   5039   }
   5040   pMoudle->m_ValueMap.SetAt(pKey, pValue);
   5041 }
   5042 FX_BOOL CXFA_Node::GetMapModuleValue(void* pKey, void*& pValue) {
   5043   CXFA_Node* pNode = this;
   5044   while (pNode) {
   5045     XFA_LPMAPMODULEDATA pMoudle = pNode->GetMapModuleData(FALSE);
   5046     if (pMoudle && pMoudle->m_ValueMap.Lookup(pKey, pValue)) {
   5047       return TRUE;
   5048     }
   5049     pNode = pNode->GetPacketID() != XFA_XDPPACKET_Datasets
   5050                 ? pNode->GetTemplateNode()
   5051                 : NULL;
   5052   }
   5053   return FALSE;
   5054 }
   5055 void CXFA_Node::SetMapModuleString(void* pKey, const CFX_WideStringC& wsValue) {
   5056   SetMapModuleBuffer(pKey, (void*)wsValue.GetPtr(),
   5057                      wsValue.GetLength() * sizeof(FX_WCHAR));
   5058 }
   5059 FX_BOOL CXFA_Node::GetMapModuleString(void* pKey, CFX_WideStringC& wsValue) {
   5060   void* pValue;
   5061   int32_t iBytes;
   5062   if (!GetMapModuleBuffer(pKey, pValue, iBytes)) {
   5063     return FALSE;
   5064   }
   5065   wsValue = CFX_WideStringC((const FX_WCHAR*)pValue, iBytes / sizeof(FX_WCHAR));
   5066   return TRUE;
   5067 }
   5068 void CXFA_Node::SetMapModuleBuffer(
   5069     void* pKey,
   5070     void* pValue,
   5071     int32_t iBytes,
   5072     XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo) {
   5073   XFA_LPMAPMODULEDATA pMoudle = this->GetMapModuleData(TRUE);
   5074   if (!pMoudle) {
   5075     return;
   5076   }
   5077   XFA_LPMAPDATABLOCK& pBuffer = pMoudle->m_BufferMap[pKey];
   5078   if (pBuffer == NULL) {
   5079     pBuffer = (XFA_LPMAPDATABLOCK)FX_Alloc(uint8_t,
   5080                                            sizeof(XFA_MAPDATABLOCK) + iBytes);
   5081   } else if (pBuffer->iBytes != iBytes) {
   5082     if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) {
   5083       pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData());
   5084     }
   5085     pBuffer = (XFA_LPMAPDATABLOCK)FX_Realloc(uint8_t, pBuffer,
   5086                                              sizeof(XFA_MAPDATABLOCK) + iBytes);
   5087   } else if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) {
   5088     pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData());
   5089   }
   5090   if (pBuffer == NULL) {
   5091     return;
   5092   }
   5093   pBuffer->pCallbackInfo = pCallbackInfo;
   5094   pBuffer->iBytes = iBytes;
   5095   FXSYS_memcpy(pBuffer->GetData(), pValue, iBytes);
   5096 }
   5097 FX_BOOL CXFA_Node::GetMapModuleBuffer(void* pKey,
   5098                                       void*& pValue,
   5099                                       int32_t& iBytes,
   5100                                       FX_BOOL bProtoAlso) {
   5101   XFA_LPMAPDATABLOCK pBuffer = NULL;
   5102   CXFA_Node* pNode = this;
   5103   while (pNode) {
   5104     XFA_LPMAPMODULEDATA pMoudle = pNode->GetMapModuleData(FALSE);
   5105     if (pMoudle && pMoudle->m_BufferMap.Lookup(pKey, pBuffer)) {
   5106       break;
   5107     }
   5108     pNode = (bProtoAlso && pNode->GetPacketID() != XFA_XDPPACKET_Datasets)
   5109                 ? pNode->GetTemplateNode()
   5110                 : NULL;
   5111   }
   5112   if (pBuffer == NULL) {
   5113     return FALSE;
   5114   }
   5115   pValue = pBuffer->GetData();
   5116   iBytes = pBuffer->iBytes;
   5117   return TRUE;
   5118 }
   5119 FX_BOOL CXFA_Node::HasMapModuleKey(void* pKey, FX_BOOL bProtoAlso) {
   5120   CXFA_Node* pNode = this;
   5121   while (pNode) {
   5122     void* pVal;
   5123     XFA_LPMAPMODULEDATA pMoudle = pNode->GetMapModuleData(FALSE);
   5124     if (pMoudle &&
   5125         (pMoudle->m_ValueMap.Lookup(pKey, pVal) ||
   5126          pMoudle->m_BufferMap.Lookup(pKey, (XFA_LPMAPDATABLOCK&)pVal))) {
   5127       return TRUE;
   5128     }
   5129     pNode = (bProtoAlso && pNode->GetPacketID() != XFA_XDPPACKET_Datasets)
   5130                 ? pNode->GetTemplateNode()
   5131                 : NULL;
   5132   }
   5133   return FALSE;
   5134 }
   5135 void CXFA_Node::RemoveMapModuleKey(void* pKey) {
   5136   XFA_LPMAPMODULEDATA pMoudle = this->GetMapModuleData(FALSE);
   5137   if (!pMoudle) {
   5138     return;
   5139   }
   5140   if (pKey) {
   5141     XFA_LPMAPDATABLOCK pBuffer = NULL;
   5142     pMoudle->m_BufferMap.Lookup(pKey, pBuffer);
   5143     if (pBuffer) {
   5144       if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) {
   5145         pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData());
   5146       }
   5147       FX_Free(pBuffer);
   5148     }
   5149     pMoudle->m_BufferMap.RemoveKey(pKey);
   5150     pMoudle->m_ValueMap.RemoveKey(pKey);
   5151   } else {
   5152     XFA_LPMAPDATABLOCK pBuffer;
   5153     FX_POSITION posBuffer = pMoudle->m_BufferMap.GetStartPosition();
   5154     while (posBuffer) {
   5155       pMoudle->m_BufferMap.GetNextAssoc(posBuffer, pKey, pBuffer);
   5156       if (pBuffer) {
   5157         if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) {
   5158           pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData());
   5159         }
   5160         FX_Free(pBuffer);
   5161       }
   5162     }
   5163     pMoudle->m_BufferMap.RemoveAll();
   5164     pMoudle->m_ValueMap.RemoveAll();
   5165     if (pMoudle) {
   5166       delete pMoudle;
   5167       pMoudle = NULL;
   5168     }
   5169   }
   5170 }
   5171 void CXFA_Node::MergeAllData(void* pDstModule, FX_BOOL bUseSrcAttr) {
   5172   XFA_LPMAPMODULEDATA pDstModuleData =
   5173       ((CXFA_Node*)pDstModule)->GetMapModuleData(TRUE);
   5174   if (!pDstModuleData) {
   5175     return;
   5176   }
   5177   XFA_LPMAPMODULEDATA pSrcModuleData = this->GetMapModuleData(FALSE);
   5178   if (!pSrcModuleData) {
   5179     return;
   5180   }
   5181   FX_POSITION psValue = pSrcModuleData->m_ValueMap.GetStartPosition();
   5182   while (psValue) {
   5183     void* pKey;
   5184     void* pValue;
   5185     pSrcModuleData->m_ValueMap.GetNextAssoc(psValue, pKey, pValue);
   5186     if (bUseSrcAttr || !pDstModuleData->m_ValueMap.GetValueAt(pKey)) {
   5187       pDstModuleData->m_ValueMap.SetAt(pKey, pValue);
   5188     }
   5189   }
   5190   FX_POSITION psBuffer = pSrcModuleData->m_BufferMap.GetStartPosition();
   5191   while (psBuffer) {
   5192     void* pKey;
   5193     XFA_LPMAPDATABLOCK pSrcBuffer;
   5194     pSrcModuleData->m_BufferMap.GetNextAssoc(psBuffer, pKey, pSrcBuffer);
   5195     XFA_LPMAPDATABLOCK& pBuffer = pDstModuleData->m_BufferMap[pKey];
   5196     if (pBuffer && !bUseSrcAttr) {
   5197       continue;
   5198     }
   5199     if (pSrcBuffer->pCallbackInfo && pSrcBuffer->pCallbackInfo->pFree &&
   5200         !pSrcBuffer->pCallbackInfo->pCopy) {
   5201       if (pBuffer) {
   5202         pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData());
   5203         pDstModuleData->m_BufferMap.RemoveKey(pKey);
   5204       }
   5205       continue;
   5206     }
   5207     if (pBuffer == NULL) {
   5208       pBuffer = (XFA_LPMAPDATABLOCK)FX_Alloc(
   5209           uint8_t, sizeof(XFA_MAPDATABLOCK) + pSrcBuffer->iBytes);
   5210     } else if (pBuffer->iBytes != pSrcBuffer->iBytes) {
   5211       if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) {
   5212         pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData());
   5213       }
   5214       pBuffer = (XFA_LPMAPDATABLOCK)FX_Realloc(
   5215           uint8_t, pBuffer, sizeof(XFA_MAPDATABLOCK) + pSrcBuffer->iBytes);
   5216     } else if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) {
   5217       pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData());
   5218     }
   5219     if (pBuffer == NULL) {
   5220       continue;
   5221     }
   5222     pBuffer->pCallbackInfo = pSrcBuffer->pCallbackInfo;
   5223     pBuffer->iBytes = pSrcBuffer->iBytes;
   5224     FXSYS_memcpy(pBuffer->GetData(), pSrcBuffer->GetData(), pSrcBuffer->iBytes);
   5225     if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pCopy) {
   5226       pBuffer->pCallbackInfo->pCopy(*(void**)pBuffer->GetData());
   5227     }
   5228   }
   5229 }
   5230 void CXFA_Node::MoveBufferMapData(CXFA_Node* pDstModule, void* pKey) {
   5231   if (!pDstModule) {
   5232     return;
   5233   }
   5234   FX_BOOL bNeedMove = TRUE;
   5235   if (!pKey) {
   5236     bNeedMove = FALSE;
   5237   }
   5238   if (pDstModule->GetClassID() != this->GetClassID()) {
   5239     bNeedMove = FALSE;
   5240   }
   5241   XFA_LPMAPMODULEDATA pSrcModuleData = NULL;
   5242   XFA_LPMAPMODULEDATA pDstModuleData = NULL;
   5243   if (bNeedMove) {
   5244     pSrcModuleData = this->GetMapModuleData(FALSE);
   5245     if (!pSrcModuleData) {
   5246       bNeedMove = FALSE;
   5247     }
   5248     pDstModuleData = pDstModule->GetMapModuleData(TRUE);
   5249     if (!pDstModuleData) {
   5250       bNeedMove = FALSE;
   5251     }
   5252   }
   5253   if (bNeedMove) {
   5254     void* pBufferBlockData = pSrcModuleData->m_BufferMap.GetValueAt(pKey);
   5255     if (pBufferBlockData) {
   5256       pSrcModuleData->m_BufferMap.RemoveKey(pKey);
   5257       pDstModuleData->m_BufferMap.RemoveKey(pKey);
   5258       pDstModuleData->m_BufferMap.SetAt(pKey,
   5259                                         (XFA_LPMAPDATABLOCK)pBufferBlockData);
   5260     }
   5261   }
   5262   if (pDstModule->GetObjectType() == XFA_OBJECTTYPE_NodeV) {
   5263     CFX_WideString wsValue = pDstModule->GetScriptContent(FALSE);
   5264     CFX_WideString wsFormatValue(wsValue);
   5265     CXFA_WidgetData* pWidgetData = pDstModule->GetContainerWidgetData();
   5266     if (pWidgetData) {
   5267       pWidgetData->GetFormatDataValue(wsValue, wsFormatValue);
   5268     }
   5269     pDstModule->SetScriptContent(wsValue, wsFormatValue, TRUE, TRUE);
   5270   }
   5271 }
   5272 void CXFA_Node::MoveBufferMapData(CXFA_Node* pSrcModule,
   5273                                   CXFA_Node* pDstModule,
   5274                                   void* pKey,
   5275                                   FX_BOOL bRecursive) {
   5276   if (!pSrcModule || !pDstModule || !pKey) {
   5277     return;
   5278   }
   5279   if (bRecursive) {
   5280     CXFA_Node* pSrcChild = pSrcModule->GetNodeItem(XFA_NODEITEM_FirstChild);
   5281     CXFA_Node* pDstChild = pDstModule->GetNodeItem(XFA_NODEITEM_FirstChild);
   5282     for (; pSrcChild && pDstChild;
   5283          pSrcChild = pSrcChild->GetNodeItem(XFA_NODEITEM_NextSibling),
   5284          pDstChild = pDstChild->GetNodeItem(XFA_NODEITEM_NextSibling)) {
   5285       MoveBufferMapData(pSrcChild, pDstChild, pKey, TRUE);
   5286     }
   5287   }
   5288   pSrcModule->MoveBufferMapData(pDstModule, pKey);
   5289 }
   5290 CXFA_NodeList::CXFA_NodeList(CXFA_Document* pDocument)
   5291     : CXFA_Object(pDocument, XFA_OBJECTTYPE_NodeList) {
   5292   m_pDocument->GetScriptContext()->CacheList(this);
   5293 }
   5294 CXFA_Node* CXFA_NodeList::NamedItem(const CFX_WideStringC& wsName) {
   5295   int32_t iCount = GetLength();
   5296   FX_DWORD dwHashCode =
   5297       FX_HashCode_String_GetW(wsName.GetPtr(), wsName.GetLength());
   5298   for (int32_t i = 0; i < iCount; i++) {
   5299     CXFA_Node* ret = Item(i);
   5300     if (dwHashCode == ret->GetNameHash()) {
   5301       return ret;
   5302     }
   5303   }
   5304   return NULL;
   5305 }
   5306 void CXFA_NodeList::Script_ListClass_Append(CFXJSE_Arguments* pArguments) {
   5307   int32_t argc = pArguments->GetLength();
   5308   if (argc == 1) {
   5309     CXFA_Node* pNode = (CXFA_Node*)pArguments->GetObject(0);
   5310     if (pNode) {
   5311       Append(pNode);
   5312     } else {
   5313       ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
   5314     }
   5315   } else {
   5316     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"append");
   5317   }
   5318 }
   5319 void CXFA_NodeList::Script_ListClass_Insert(CFXJSE_Arguments* pArguments) {
   5320   int32_t argc = pArguments->GetLength();
   5321   if (argc == 2) {
   5322     CXFA_Node* pNewNode = (CXFA_Node*)pArguments->GetObject(0);
   5323     CXFA_Node* pBeforeNode = (CXFA_Node*)pArguments->GetObject(1);
   5324     if (pNewNode) {
   5325       Insert(pNewNode, pBeforeNode);
   5326     } else {
   5327       ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
   5328     }
   5329   } else {
   5330     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"insert");
   5331   }
   5332 }
   5333 void CXFA_NodeList::Script_ListClass_Remove(CFXJSE_Arguments* pArguments) {
   5334   int32_t argc = pArguments->GetLength();
   5335   if (argc == 1) {
   5336     CXFA_Node* pNode = (CXFA_Node*)pArguments->GetObject(0);
   5337     if (pNode) {
   5338       Remove(pNode);
   5339     } else {
   5340       ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
   5341     }
   5342   } else {
   5343     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"remove");
   5344   }
   5345 }
   5346 void CXFA_NodeList::Script_ListClass_Item(CFXJSE_Arguments* pArguments) {
   5347   int32_t argc = pArguments->GetLength();
   5348   if (argc == 1) {
   5349     int32_t iIndex = pArguments->GetInt32(0);
   5350     if ((iIndex >= 0) && (iIndex + 1 <= GetLength())) {
   5351       FXJSE_Value_Set(
   5352           pArguments->GetReturnValue(),
   5353           m_pDocument->GetScriptContext()->GetJSValueFromMap(Item(iIndex)));
   5354     } else {
   5355       ThrowScriptErrorMessage(XFA_IDS_INDEX_OUT_OF_BOUNDS);
   5356     }
   5357   } else {
   5358     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"item");
   5359   }
   5360 }
   5361 void CXFA_NodeList::Script_TreelistClass_NamedItem(
   5362     CFXJSE_Arguments* pArguments) {
   5363   int32_t argc = pArguments->GetLength();
   5364   if (argc == 1) {
   5365     CFX_ByteString szName = pArguments->GetUTF8String(0);
   5366     CXFA_Node* pNode =
   5367         NamedItem(CFX_WideString::FromUTF8(szName, szName.GetLength()));
   5368     if (!pNode) {
   5369       return;
   5370     }
   5371     FXJSE_Value_Set(pArguments->GetReturnValue(),
   5372                     m_pDocument->GetScriptContext()->GetJSValueFromMap(pNode));
   5373   } else {
   5374     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"namedItem");
   5375   }
   5376 }
   5377 void CXFA_NodeList::Script_ListClass_Length(FXJSE_HVALUE hValue,
   5378                                             FX_BOOL bSetting,
   5379                                             XFA_ATTRIBUTE eAttribute) {
   5380   if (!bSetting) {
   5381     FXJSE_Value_SetInteger(hValue, GetLength());
   5382   } else {
   5383     ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
   5384   }
   5385 }
   5386 CXFA_ArrayNodeList::CXFA_ArrayNodeList(CXFA_Document* pDocument)
   5387     : CXFA_NodeList(pDocument) {}
   5388 void CXFA_ArrayNodeList::SetArrayNodeList(const CXFA_NodeArray& srcArray) {
   5389   if (srcArray.GetSize() > 0) {
   5390     m_array.Copy(srcArray);
   5391   }
   5392 }
   5393 int32_t CXFA_ArrayNodeList::GetLength() {
   5394   return m_array.GetSize();
   5395 }
   5396 FX_BOOL CXFA_ArrayNodeList::Append(CXFA_Node* pNode) {
   5397   m_array.Add(pNode);
   5398   return TRUE;
   5399 }
   5400 FX_BOOL CXFA_ArrayNodeList::Insert(CXFA_Node* pNewNode,
   5401                                    CXFA_Node* pBeforeNode) {
   5402   if (pBeforeNode == NULL) {
   5403     m_array.Add(pNewNode);
   5404   } else {
   5405     int32_t iSize = m_array.GetSize();
   5406     for (int32_t i = 0; i < iSize; ++i) {
   5407       if (m_array[i] == pBeforeNode) {
   5408         m_array.InsertAt(i, pNewNode);
   5409         break;
   5410       }
   5411     }
   5412   }
   5413   return TRUE;
   5414 }
   5415 FX_BOOL CXFA_ArrayNodeList::Remove(CXFA_Node* pNode) {
   5416   int32_t iSize = m_array.GetSize();
   5417   for (int32_t i = 0; i < iSize; ++i) {
   5418     if (m_array[i] == pNode) {
   5419       m_array.RemoveAt(i);
   5420       break;
   5421     }
   5422   }
   5423   return TRUE;
   5424 }
   5425 CXFA_Node* CXFA_ArrayNodeList::Item(int32_t iIndex) {
   5426   int32_t iSize = m_array.GetSize();
   5427   if (iIndex >= 0 && iIndex < iSize) {
   5428     return m_array[iIndex];
   5429   }
   5430   return NULL;
   5431 }
   5432 CXFA_AttachNodeList::CXFA_AttachNodeList(CXFA_Document* pDocument,
   5433                                          CXFA_Node* pAttachNode)
   5434     : CXFA_NodeList(pDocument) {
   5435   m_pAttachNode = pAttachNode;
   5436 }
   5437 int32_t CXFA_AttachNodeList::GetLength() {
   5438   return m_pAttachNode->CountChildren(
   5439       XFA_ELEMENT_UNKNOWN, m_pAttachNode->GetClassID() == XFA_ELEMENT_Subform);
   5440 }
   5441 FX_BOOL CXFA_AttachNodeList::Append(CXFA_Node* pNode) {
   5442   CXFA_Node* pParent = pNode->GetNodeItem(XFA_NODEITEM_Parent);
   5443   if (pParent) {
   5444     pParent->RemoveChild(pNode);
   5445   }
   5446   return m_pAttachNode->InsertChild(pNode);
   5447 }
   5448 FX_BOOL CXFA_AttachNodeList::Insert(CXFA_Node* pNewNode,
   5449                                     CXFA_Node* pBeforeNode) {
   5450   CXFA_Node* pParent = pNewNode->GetNodeItem(XFA_NODEITEM_Parent);
   5451   if (pParent) {
   5452     pParent->RemoveChild(pNewNode);
   5453   }
   5454   return m_pAttachNode->InsertChild(pNewNode, pBeforeNode);
   5455 }
   5456 FX_BOOL CXFA_AttachNodeList::Remove(CXFA_Node* pNode) {
   5457   return m_pAttachNode->RemoveChild(pNode);
   5458 }
   5459 CXFA_Node* CXFA_AttachNodeList::Item(int32_t iIndex) {
   5460   return m_pAttachNode->GetChild(
   5461       iIndex, XFA_ELEMENT_UNKNOWN,
   5462       m_pAttachNode->GetClassID() == XFA_ELEMENT_Subform);
   5463 }
   5464