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

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

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

#include "xfa/fxfa/app/xfa_ffnotify.h"
#include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
#include "xfa/fxfa/include/xfa_ffwidgethandler.h"
#include "xfa/fxfa/parser/xfa_doclayout.h"
#include "xfa/fxfa/parser/xfa_document.h"
#include "xfa/fxfa/parser/xfa_localemgr.h"
#include "xfa/fxfa/parser/xfa_object.h"
#include "xfa/fxfa/parser/xfa_parser.h"
#include "xfa/fxfa/parser/xfa_parser_imp.h"
#include "xfa/fxfa/parser/xfa_script.h"
#include "xfa/fxfa/parser/xfa_script_imp.h"
#include "xfa/fxfa/parser/xfa_utils.h"
#include "xfa/fxjse/cfxjse_arguments.h"

CScript_EventPseudoModel::CScript_EventPseudoModel(CXFA_Document* pDocument)
    : CXFA_OrdinaryObject(pDocument, XFA_ELEMENT_EventPseudoModel) {
  m_uScriptHash = XFA_HASHCODE_Event;
}
CScript_EventPseudoModel::~CScript_EventPseudoModel() {}
void Script_EventPseudoModel_StringProperty(FXJSE_HVALUE hValue,
                                            CFX_WideString& wsValue,
                                            FX_BOOL bSetting) {
  if (bSetting) {
    CFX_ByteString bsValue;
    FXJSE_Value_ToUTF8String(hValue, bsValue);
    wsValue = CFX_WideString::FromUTF8(bsValue.AsStringC());
  } else {
    FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsValue).AsStringC());
  }
}
void Script_EventPseudoModel_InterProperty(FXJSE_HVALUE hValue,
                                           int32_t& iValue,
                                           FX_BOOL bSetting) {
  if (bSetting) {
    iValue = FXJSE_Value_ToInteger(hValue);
  } else {
    FXJSE_Value_SetInteger(hValue, iValue);
  }
}
void Script_EventPseudoModel_BooleanProperty(FXJSE_HVALUE hValue,
                                             FX_BOOL& bValue,
                                             FX_BOOL bSetting) {
  if (bSetting) {
    bValue = FXJSE_Value_ToBoolean(hValue);
  } else {
    FXJSE_Value_SetBoolean(hValue, bValue);
  }
}
void CScript_EventPseudoModel::Script_EventPseudoModel_Property(
    FXJSE_HVALUE hValue,
    uint32_t dwFlag,
    FX_BOOL bSetting) {
  CXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
  if (!pScriptContext) {
    return;
  }
  CXFA_EventParam* pEventParam = pScriptContext->GetEventParam();
  if (!pEventParam) {
    return;
  }
  switch (dwFlag) {
    case XFA_EVENT_CANCELACTION:
      Script_EventPseudoModel_BooleanProperty(
          hValue, pEventParam->m_bCancelAction, bSetting);
      break;
    case XFA_EVENT_CHANGE:
      Script_EventPseudoModel_StringProperty(hValue, pEventParam->m_wsChange,
                                             bSetting);
      break;
    case XFA_EVENT_COMMITKEY:
      Script_EventPseudoModel_InterProperty(hValue, pEventParam->m_iCommitKey,
                                            bSetting);
      break;
    case XFA_EVENT_FULLTEXT:
      Script_EventPseudoModel_StringProperty(hValue, pEventParam->m_wsFullText,
                                             bSetting);
      break;
    case XFA_EVENT_KEYDOWN:
      Script_EventPseudoModel_BooleanProperty(hValue, pEventParam->m_bKeyDown,
                                              bSetting);
      break;
    case XFA_EVENT_MODIFIER:
      Script_EventPseudoModel_BooleanProperty(hValue, pEventParam->m_bModifier,
                                              bSetting);
      break;
    case XFA_EVENT_NEWCONTENTTYPE:
      Script_EventPseudoModel_StringProperty(
          hValue, pEventParam->m_wsNewContentType, bSetting);
      break;
    case XFA_EVENT_NEWTEXT:
      Script_EventPseudoModel_StringProperty(hValue, pEventParam->m_wsNewText,
                                             bSetting);
      break;
    case XFA_EVENT_PREVCONTENTTYPE:
      Script_EventPseudoModel_StringProperty(
          hValue, pEventParam->m_wsPrevContentType, bSetting);
      break;
    case XFA_EVENT_PREVTEXT:
      Script_EventPseudoModel_StringProperty(hValue, pEventParam->m_wsPrevText,
                                             bSetting);
      break;
    case XFA_EVENT_REENTER:
      Script_EventPseudoModel_BooleanProperty(hValue, pEventParam->m_bReenter,
                                              bSetting);
      break;
    case XFA_EVENT_SELEND:
      Script_EventPseudoModel_InterProperty(hValue, pEventParam->m_iSelEnd,
                                            bSetting);
      break;
    case XFA_EVENT_SELSTART:
      Script_EventPseudoModel_InterProperty(hValue, pEventParam->m_iSelStart,
                                            bSetting);
      break;
    case XFA_EVENT_SHIFT:
      Script_EventPseudoModel_BooleanProperty(hValue, pEventParam->m_bShift,
                                              bSetting);
      break;
    case XFA_EVENT_SOAPFAULTCODE:
      Script_EventPseudoModel_StringProperty(
          hValue, pEventParam->m_wsSoapFaultCode, bSetting);
      break;
    case XFA_EVENT_SOAPFAULTSTRING:
      Script_EventPseudoModel_StringProperty(
          hValue, pEventParam->m_wsSoapFaultString, bSetting);
      break;
    case XFA_EVENT_TARGET:
      break;
    default:
      break;
  }
}
void CScript_EventPseudoModel::Script_EventPseudoModel_Change(
    FXJSE_HVALUE hValue,
    FX_BOOL bSetting,
    XFA_ATTRIBUTE eAttribute) {
  Script_EventPseudoModel_Property(hValue, XFA_EVENT_CHANGE, bSetting);
}
void CScript_EventPseudoModel::Script_EventPseudoModel_CommitKey(
    FXJSE_HVALUE hValue,
    FX_BOOL bSetting,
    XFA_ATTRIBUTE eAttribute) {
  Script_EventPseudoModel_Property(hValue, XFA_EVENT_COMMITKEY, bSetting);
}
void CScript_EventPseudoModel::Script_EventPseudoModel_FullText(
    FXJSE_HVALUE hValue,
    FX_BOOL bSetting,
    XFA_ATTRIBUTE eAttribute) {
  Script_EventPseudoModel_Property(hValue, XFA_EVENT_FULLTEXT, bSetting);
}
void CScript_EventPseudoModel::Script_EventPseudoModel_KeyDown(
    FXJSE_HVALUE hValue,
    FX_BOOL bSetting,
    XFA_ATTRIBUTE eAttribute) {
  Script_EventPseudoModel_Property(hValue, XFA_EVENT_KEYDOWN, bSetting);
}
void CScript_EventPseudoModel::Script_EventPseudoModel_Modifier(
    FXJSE_HVALUE hValue,
    FX_BOOL bSetting,
    XFA_ATTRIBUTE eAttribute) {
  Script_EventPseudoModel_Property(hValue, XFA_EVENT_MODIFIER, bSetting);
}
void CScript_EventPseudoModel::Script_EventPseudoModel_NewContentType(
    FXJSE_HVALUE hValue,
    FX_BOOL bSetting,
    XFA_ATTRIBUTE eAttribute) {
  Script_EventPseudoModel_Property(hValue, XFA_EVENT_NEWCONTENTTYPE, bSetting);
}
void CScript_EventPseudoModel::Script_EventPseudoModel_NewText(
    FXJSE_HVALUE hValue,
    FX_BOOL bSetting,
    XFA_ATTRIBUTE eAttribute) {
  Script_EventPseudoModel_Property(hValue, XFA_EVENT_NEWTEXT, bSetting);
}
void CScript_EventPseudoModel::Script_EventPseudoModel_PrevContentType(
    FXJSE_HVALUE hValue,
    FX_BOOL bSetting,
    XFA_ATTRIBUTE eAttribute) {
  Script_EventPseudoModel_Property(hValue, XFA_EVENT_PREVCONTENTTYPE, bSetting);
}
void CScript_EventPseudoModel::Script_EventPseudoModel_PrevText(
    FXJSE_HVALUE hValue,
    FX_BOOL bSetting,
    XFA_ATTRIBUTE eAttribute) {
  Script_EventPseudoModel_Property(hValue, XFA_EVENT_PREVTEXT, bSetting);
}
void CScript_EventPseudoModel::Script_EventPseudoModel_Reenter(
    FXJSE_HVALUE hValue,
    FX_BOOL bSetting,
    XFA_ATTRIBUTE eAttribute) {
  Script_EventPseudoModel_Property(hValue, XFA_EVENT_REENTER, bSetting);
}
void CScript_EventPseudoModel::Script_EventPseudoModel_SelEnd(
    FXJSE_HVALUE hValue,
    FX_BOOL bSetting,
    XFA_ATTRIBUTE eAttribute) {
  Script_EventPseudoModel_Property(hValue, XFA_EVENT_SELEND, bSetting);
}
void CScript_EventPseudoModel::Script_EventPseudoModel_SelStart(
    FXJSE_HVALUE hValue,
    FX_BOOL bSetting,
    XFA_ATTRIBUTE eAttribute) {
  Script_EventPseudoModel_Property(hValue, XFA_EVENT_SELSTART, bSetting);
}
void CScript_EventPseudoModel::Script_EventPseudoModel_Shift(
    FXJSE_HVALUE hValue,
    FX_BOOL bSetting,
    XFA_ATTRIBUTE eAttribute) {
  Script_EventPseudoModel_Property(hValue, XFA_EVENT_SHIFT, bSetting);
}
void CScript_EventPseudoModel::Script_EventPseudoModel_SoapFaultCode(
    FXJSE_HVALUE hValue,
    FX_BOOL bSetting,
    XFA_ATTRIBUTE eAttribute) {
  Script_EventPseudoModel_Property(hValue, XFA_EVENT_SOAPFAULTCODE, bSetting);
}
void CScript_EventPseudoModel::Script_EventPseudoModel_SoapFaultString(
    FXJSE_HVALUE hValue,
    FX_BOOL bSetting,
    XFA_ATTRIBUTE eAttribute) {
  Script_EventPseudoModel_Property(hValue, XFA_EVENT_SOAPFAULTSTRING, bSetting);
}
void CScript_EventPseudoModel::Script_EventPseudoModel_Target(
    FXJSE_HVALUE hValue,
    FX_BOOL bSetting,
    XFA_ATTRIBUTE eAttribute) {
  Script_EventPseudoModel_Property(hValue, XFA_EVENT_TARGET, bSetting);
}
void CScript_EventPseudoModel::Script_EventPseudoModel_Emit(
    CFXJSE_Arguments* pArguments) {
  CXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
  if (!pScriptContext) {
    return;
  }
  CXFA_EventParam* pEventParam = pScriptContext->GetEventParam();
  if (!pEventParam) {
    return;
  }
  CXFA_FFNotify* pNotify = m_pDocument->GetParser()->GetNotify();
  if (!pNotify) {
    return;
  }
  CXFA_FFWidgetHandler* pWidgetHandler = pNotify->GetWidgetHandler();
  if (!pWidgetHandler) {
    return;
  }
  pWidgetHandler->ProcessEvent(pEventParam->m_pTarget, pEventParam);
}
void CScript_EventPseudoModel::Script_EventPseudoModel_Reset(
    CFXJSE_Arguments* pArguments) {
  CXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
  if (!pScriptContext) {
    return;
  }
  CXFA_EventParam* pEventParam = pScriptContext->GetEventParam();
  if (!pEventParam) {
    return;
  }
  pEventParam->Reset();
}
