// 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 FPDFSDK_INCLUDE_JAVASCRIPT_EVENT_H_
#define FPDFSDK_INCLUDE_JAVASCRIPT_EVENT_H_

#include "JS_Define.h"

class event : public CJS_EmbedObj {
 public:
  event(CJS_Object* pJSObject);
  ~event() override;

 public:
  FX_BOOL change(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
  FX_BOOL changeEx(IFXJS_Context* cc,
                   CJS_PropValue& vp,
                   CFX_WideString& sError);
  FX_BOOL commitKey(IFXJS_Context* cc,
                    CJS_PropValue& vp,
                    CFX_WideString& sError);
  FX_BOOL fieldFull(IFXJS_Context* cc,
                    CJS_PropValue& vp,
                    CFX_WideString& sError);
  FX_BOOL keyDown(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
  FX_BOOL modifier(IFXJS_Context* cc,
                   CJS_PropValue& vp,
                   CFX_WideString& sError);
  FX_BOOL name(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
  FX_BOOL rc(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
  FX_BOOL richChange(IFXJS_Context* cc,
                     CJS_PropValue& vp,
                     CFX_WideString& sError);
  FX_BOOL richChangeEx(IFXJS_Context* cc,
                       CJS_PropValue& vp,
                       CFX_WideString& sError);
  FX_BOOL richValue(IFXJS_Context* cc,
                    CJS_PropValue& vp,
                    CFX_WideString& sError);
  FX_BOOL selEnd(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
  FX_BOOL selStart(IFXJS_Context* cc,
                   CJS_PropValue& vp,
                   CFX_WideString& sError);
  FX_BOOL shift(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
  FX_BOOL source(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
  FX_BOOL target(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
  FX_BOOL targetName(IFXJS_Context* cc,
                     CJS_PropValue& vp,
                     CFX_WideString& sError);
  FX_BOOL type(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
  FX_BOOL value(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
  FX_BOOL willCommit(IFXJS_Context* cc,
                     CJS_PropValue& vp,
                     CFX_WideString& sError);
};

class CJS_Event : public CJS_Object {
 public:
  CJS_Event(JSFXObject pObject) : CJS_Object(pObject) {}
  ~CJS_Event() override {}

  DECLARE_JS_CLASS(CJS_Event);

  JS_STATIC_PROP(change, event);
  JS_STATIC_PROP(changeEx, event);
  JS_STATIC_PROP(commitKey, event);
  JS_STATIC_PROP(fieldFull, event);
  JS_STATIC_PROP(keyDown, event);
  JS_STATIC_PROP(modifier, event);
  JS_STATIC_PROP(name, event);
  JS_STATIC_PROP(rc, event);
  JS_STATIC_PROP(richChange, event);
  JS_STATIC_PROP(richChangeEx, event);
  JS_STATIC_PROP(richValue, event);
  JS_STATIC_PROP(selEnd, event);
  JS_STATIC_PROP(selStart, event);
  JS_STATIC_PROP(shift, event);
  JS_STATIC_PROP(source, event);
  JS_STATIC_PROP(target, event);
  JS_STATIC_PROP(targetName, event);
  JS_STATIC_PROP(type, event);
  JS_STATIC_PROP(value, event);
  JS_STATIC_PROP(willCommit, event);
};

#endif  // FPDFSDK_INCLUDE_JAVASCRIPT_EVENT_H_
