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

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

#include "xfa/fxfa/parser/cxfa_eventdata.h"

#include "xfa/fxfa/parser/cxfa_node.h"

CXFA_EventData::CXFA_EventData(CXFA_Node* pNode) : CXFA_Data(pNode) {}

int32_t CXFA_EventData::GetActivity() {
  return m_pNode->JSNode()->GetEnum(XFA_ATTRIBUTE_Activity);
}

XFA_Element CXFA_EventData::GetEventType() const {
  CXFA_Node* pChild = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
  while (pChild) {
    XFA_Element eType = pChild->GetElementType();
    if (eType != XFA_Element::Extras)
      return eType;

    pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling);
  }
  return XFA_Element::Unknown;
}

void CXFA_EventData::GetRef(WideStringView& wsRef) {
  m_pNode->JSNode()->TryCData(XFA_ATTRIBUTE_Ref, wsRef, true);
}

CXFA_ScriptData CXFA_EventData::GetScriptData() const {
  return CXFA_ScriptData(m_pNode->GetChild(0, XFA_Element::Script, false));
}

CXFA_SubmitData CXFA_EventData::GetSubmitData() const {
  return CXFA_SubmitData(m_pNode->GetChild(0, XFA_Element::Submit, false));
}

void CXFA_EventData::GetSignDataTarget(WideString& wsTarget) {
  CXFA_Node* pNode =
      m_pNode->JSNode()->GetProperty(0, XFA_Element::SignData, true);
  if (!pNode)
    return;

  WideStringView wsCData;
  pNode->JSNode()->TryCData(XFA_ATTRIBUTE_Target, wsCData, true);
  wsTarget = wsCData;
}
