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

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

#ifndef XFA_FXFA_PARSER_XFA_SCRIPT_NODEHELPER_H_
#define XFA_FXFA_PARSER_XFA_SCRIPT_NODEHELPER_H_

#include "xfa/fxfa/parser/xfa_object.h"
#include "xfa/fxfa/parser/xfa_script.h"

class CXFA_ScriptContext;

enum XFA_LOGIC_TYPE {
  XFA_LOGIC_NoTransparent,
  XFA_LOGIC_Transparent,
};

class CXFA_NodeHelper {
 public:
  CXFA_NodeHelper(void);
  ~CXFA_NodeHelper(void);
  CXFA_Node* XFA_ResolveNodes_GetOneChild(CXFA_Node* parent,
                                          const FX_WCHAR* pwsName,
                                          FX_BOOL bIsClassName = FALSE);
  CXFA_Node* XFA_ResolveNodes_GetParent(
      CXFA_Node* pNode,
      XFA_LOGIC_TYPE eLogicType = XFA_LOGIC_NoTransparent);

  int32_t XFA_NodeAcc_TraverseSiblings(CXFA_Node* parent,
                                       uint32_t dNameHash,
                                       CXFA_NodeArray* pSiblings,
                                       XFA_LOGIC_TYPE eLogicType,
                                       FX_BOOL bIsClassName = FALSE,
                                       FX_BOOL bIsFindProperty = TRUE);
  int32_t XFA_NodeAcc_TraverseAnySiblings(CXFA_Node* parent,
                                          uint32_t dNameHash,
                                          CXFA_NodeArray* pSiblings,
                                          FX_BOOL bIsClassName = FALSE);
  int32_t XFA_CountSiblings(CXFA_Node* pNode,
                            XFA_LOGIC_TYPE eLogicType,
                            CXFA_NodeArray* pSiblings,
                            FX_BOOL bIsClassName = FALSE);
  int32_t XFA_GetIndex(CXFA_Node* pNode,
                       XFA_LOGIC_TYPE eLogicType = XFA_LOGIC_NoTransparent,
                       FX_BOOL bIsProperty = FALSE,
                       FX_BOOL bIsClassIndex = FALSE);
  void XFA_GetNameExpression(
      CXFA_Node* refNode,
      CFX_WideString& wsName,
      FX_BOOL bIsAllPath,
      XFA_LOGIC_TYPE eLogicType = XFA_LOGIC_NoTransparent);
  FX_BOOL XFA_NodeIsTransparent(CXFA_Node* refNode);
  FX_BOOL XFA_ResolveNodes_CreateNode(CFX_WideString wsName,
                                      CFX_WideString wsCondition,
                                      FX_BOOL bLastNode,
                                      CXFA_ScriptContext* pScriptContext);
  FX_BOOL XFA_CreateNode_ForCondition(CFX_WideString& wsCondition);
  void XFA_SetCreateNodeType(CXFA_Node* refNode);
  FX_BOOL XFA_NodeIsProperty(CXFA_Node* refNode);

 public:
  XFA_ELEMENT m_eLastCreateType;
  CXFA_Node* m_pCreateParent;
  int32_t m_iCreateCount;
  XFA_RESOVENODE_RSTYPE m_iCreateFlag;
  int32_t m_iCurAllStart;
  CXFA_Node* m_pAllStartParent;
};

#endif  // XFA_FXFA_PARSER_XFA_SCRIPT_NODEHELPER_H_
