// 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_JAVASCRIPT_FIELD_H_
#define FPDFSDK_JAVASCRIPT_FIELD_H_

#include <string>
#include <vector>

#include "core/fxcrt/cfx_observable.h"
#include "core/fxge/cfx_color.h"
#include "fpdfsdk/cpdfsdk_formfillenvironment.h"
#include "fpdfsdk/javascript/JS_Define.h"

class CPDFSDK_Widget;
class Document;

enum FIELD_PROP {
  FP_ALIGNMENT,
  FP_BORDERSTYLE,
  FP_BUTTONALIGNX,
  FP_BUTTONALIGNY,
  FP_BUTTONFITBOUNDS,
  FP_BUTTONPOSITION,
  FP_BUTTONSCALEHOW,
  FP_BUTTONSCALEWHEN,
  FP_CALCORDERINDEX,
  FP_CHARLIMIT,
  FP_COMB,
  FP_COMMITONSELCHANGE,
  FP_CURRENTVALUEINDICES,
  FP_DEFAULTVALUE,
  FP_DONOTSCROLL,
  FP_DISPLAY,
  FP_FILLCOLOR,
  FP_HIDDEN,
  FP_HIGHLIGHT,
  FP_LINEWIDTH,
  FP_MULTILINE,
  FP_MULTIPLESELECTION,
  FP_PASSWORD,
  FP_RECT,
  FP_RICHTEXT,
  FP_RICHVALUE,
  FP_ROTATION,
  FP_STROKECOLOR,
  FP_STYLE,
  FP_TEXTCOLOR,
  FP_TEXTFONT,
  FP_TEXTSIZE,
  FP_USERNAME,
  FP_VALUE
};

struct CJS_DelayData {
  CJS_DelayData(FIELD_PROP prop, int idx, const WideString& name);
  ~CJS_DelayData();

  FIELD_PROP eProp;
  int nControlIndex;
  WideString sFieldName;
  int32_t num;
  bool b;
  ByteString string;
  WideString widestring;
  CFX_FloatRect rect;
  CFX_Color color;
  std::vector<uint32_t> wordarray;
  std::vector<WideString> widestringarray;
};

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

  bool alignment(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
  bool borderStyle(CJS_Runtime* pRuntime,
                   CJS_PropValue& vp,
                   WideString& sError);
  bool buttonAlignX(CJS_Runtime* pRuntime,
                    CJS_PropValue& vp,
                    WideString& sError);
  bool buttonAlignY(CJS_Runtime* pRuntime,
                    CJS_PropValue& vp,
                    WideString& sError);
  bool buttonFitBounds(CJS_Runtime* pRuntime,
                       CJS_PropValue& vp,
                       WideString& sError);
  bool buttonPosition(CJS_Runtime* pRuntime,
                      CJS_PropValue& vp,
                      WideString& sError);
  bool buttonScaleHow(CJS_Runtime* pRuntime,
                      CJS_PropValue& vp,
                      WideString& sError);
  bool buttonScaleWhen(CJS_Runtime* pRuntime,
                       CJS_PropValue& vp,
                       WideString& sError);
  bool calcOrderIndex(CJS_Runtime* pRuntime,
                      CJS_PropValue& vp,
                      WideString& sError);
  bool charLimit(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
  bool comb(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
  bool commitOnSelChange(CJS_Runtime* pRuntime,
                         CJS_PropValue& vp,
                         WideString& sError);
  bool currentValueIndices(CJS_Runtime* pRuntime,
                           CJS_PropValue& vp,
                           WideString& sError);
  bool defaultStyle(CJS_Runtime* pRuntime,
                    CJS_PropValue& vp,
                    WideString& sError);
  bool defaultValue(CJS_Runtime* pRuntime,
                    CJS_PropValue& vp,
                    WideString& sError);
  bool doNotScroll(CJS_Runtime* pRuntime,
                   CJS_PropValue& vp,
                   WideString& sError);
  bool doNotSpellCheck(CJS_Runtime* pRuntime,
                       CJS_PropValue& vp,
                       WideString& sError);
  bool delay(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
  bool display(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
  bool doc(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
  bool editable(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
  bool exportValues(CJS_Runtime* pRuntime,
                    CJS_PropValue& vp,
                    WideString& sError);
  bool fileSelect(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
  bool fillColor(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
  bool hidden(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
  bool highlight(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
  bool lineWidth(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
  bool multiline(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
  bool multipleSelection(CJS_Runtime* pRuntime,
                         CJS_PropValue& vp,
                         WideString& sError);
  bool name(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
  bool numItems(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
  bool page(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
  bool password(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
  bool print(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
  bool radiosInUnison(CJS_Runtime* pRuntime,
                      CJS_PropValue& vp,
                      WideString& sError);
  bool readonly(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
  bool rect(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
  bool required(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
  bool richText(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
  bool richValue(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
  bool rotation(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
  bool strokeColor(CJS_Runtime* pRuntime,
                   CJS_PropValue& vp,
                   WideString& sError);
  bool style(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
  bool submitName(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
  bool textColor(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
  bool textFont(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
  bool textSize(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
  bool type(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
  bool userName(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
  bool value(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
  bool valueAsString(CJS_Runtime* pRuntime,
                     CJS_PropValue& vp,
                     WideString& sError);
  bool source(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);

  bool browseForFileToSubmit(CJS_Runtime* pRuntime,
                             const std::vector<CJS_Value>& params,
                             CJS_Value& vRet,
                             WideString& sError);
  bool buttonGetCaption(CJS_Runtime* pRuntime,
                        const std::vector<CJS_Value>& params,
                        CJS_Value& vRet,
                        WideString& sError);
  bool buttonGetIcon(CJS_Runtime* pRuntime,
                     const std::vector<CJS_Value>& params,
                     CJS_Value& vRet,
                     WideString& sError);
  bool buttonImportIcon(CJS_Runtime* pRuntime,
                        const std::vector<CJS_Value>& params,
                        CJS_Value& vRet,
                        WideString& sError);
  bool buttonSetCaption(CJS_Runtime* pRuntime,
                        const std::vector<CJS_Value>& params,
                        CJS_Value& vRet,
                        WideString& sError);
  bool buttonSetIcon(CJS_Runtime* pRuntime,
                     const std::vector<CJS_Value>& params,
                     CJS_Value& vRet,
                     WideString& sError);
  bool checkThisBox(CJS_Runtime* pRuntime,
                    const std::vector<CJS_Value>& params,
                    CJS_Value& vRet,
                    WideString& sError);
  bool clearItems(CJS_Runtime* pRuntime,
                  const std::vector<CJS_Value>& params,
                  CJS_Value& vRet,
                  WideString& sError);
  bool defaultIsChecked(CJS_Runtime* pRuntime,
                        const std::vector<CJS_Value>& params,
                        CJS_Value& vRet,
                        WideString& sError);
  bool deleteItemAt(CJS_Runtime* pRuntime,
                    const std::vector<CJS_Value>& params,
                    CJS_Value& vRet,
                    WideString& sError);
  bool getArray(CJS_Runtime* pRuntime,
                const std::vector<CJS_Value>& params,
                CJS_Value& vRet,
                WideString& sError);
  bool getItemAt(CJS_Runtime* pRuntime,
                 const std::vector<CJS_Value>& params,
                 CJS_Value& vRet,
                 WideString& sError);
  bool getLock(CJS_Runtime* pRuntime,
               const std::vector<CJS_Value>& params,
               CJS_Value& vRet,
               WideString& sError);
  bool insertItemAt(CJS_Runtime* pRuntime,
                    const std::vector<CJS_Value>& params,
                    CJS_Value& vRet,
                    WideString& sError);
  bool isBoxChecked(CJS_Runtime* pRuntime,
                    const std::vector<CJS_Value>& params,
                    CJS_Value& vRet,
                    WideString& sError);
  bool isDefaultChecked(CJS_Runtime* pRuntime,
                        const std::vector<CJS_Value>& params,
                        CJS_Value& vRet,
                        WideString& sError);
  bool setAction(CJS_Runtime* pRuntime,
                 const std::vector<CJS_Value>& params,
                 CJS_Value& vRet,
                 WideString& sError);
  bool setFocus(CJS_Runtime* pRuntime,
                const std::vector<CJS_Value>& params,
                CJS_Value& vRet,
                WideString& sError);
  bool setItems(CJS_Runtime* pRuntime,
                const std::vector<CJS_Value>& params,
                CJS_Value& vRet,
                WideString& sError);
  bool setLock(CJS_Runtime* pRuntime,
               const std::vector<CJS_Value>& params,
               CJS_Value& vRet,
               WideString& sError);
  bool signatureGetModifications(CJS_Runtime* pRuntime,
                                 const std::vector<CJS_Value>& params,
                                 CJS_Value& vRet,
                                 WideString& sError);
  bool signatureGetSeedValue(CJS_Runtime* pRuntime,
                             const std::vector<CJS_Value>& params,
                             CJS_Value& vRet,
                             WideString& sError);
  bool signatureInfo(CJS_Runtime* pRuntime,
                     const std::vector<CJS_Value>& params,
                     CJS_Value& vRet,
                     WideString& sError);
  bool signatureSetSeedValue(CJS_Runtime* pRuntime,
                             const std::vector<CJS_Value>& params,
                             CJS_Value& vRet,
                             WideString& sError);
  bool signatureSign(CJS_Runtime* pRuntime,
                     const std::vector<CJS_Value>& params,
                     CJS_Value& vRet,
                     WideString& sError);
  bool signatureValidate(CJS_Runtime* pRuntime,
                         const std::vector<CJS_Value>& params,
                         CJS_Value& vRet,
                         WideString& sError);

  static void SetAlignment(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                           const WideString& swFieldName,
                           int nControlIndex,
                           const ByteString& string);
  static void SetBorderStyle(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                             const WideString& swFieldName,
                             int nControlIndex,
                             const ByteString& string);
  static void SetButtonAlignX(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                              const WideString& swFieldName,
                              int nControlIndex,
                              int number);
  static void SetButtonAlignY(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                              const WideString& swFieldName,
                              int nControlIndex,
                              int number);
  static void SetButtonFitBounds(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                                 const WideString& swFieldName,
                                 int nControlIndex,
                                 bool b);
  static void SetButtonPosition(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                                const WideString& swFieldName,
                                int nControlIndex,
                                int number);
  static void SetButtonScaleHow(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                                const WideString& swFieldName,
                                int nControlIndex,
                                int number);
  static void SetButtonScaleWhen(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                                 const WideString& swFieldName,
                                 int nControlIndex,
                                 int number);
  static void SetCalcOrderIndex(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                                const WideString& swFieldName,
                                int nControlIndex,
                                int number);
  static void SetCharLimit(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                           const WideString& swFieldName,
                           int nControlIndex,
                           int number);
  static void SetComb(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                      const WideString& swFieldName,
                      int nControlIndex,
                      bool b);
  static void SetCommitOnSelChange(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                                   const WideString& swFieldName,
                                   int nControlIndex,
                                   bool b);
  static void SetCurrentValueIndices(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                                     const WideString& swFieldName,
                                     int nControlIndex,
                                     const std::vector<uint32_t>& array);
  static void SetDefaultStyle(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                              const WideString& swFieldName,
                              int nControlIndex);
  static void SetDefaultValue(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                              const WideString& swFieldName,
                              int nControlIndex,
                              const WideString& string);
  static void SetDoNotScroll(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                             const WideString& swFieldName,
                             int nControlIndex,
                             bool b);
  static void SetDisplay(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                         const WideString& swFieldName,
                         int nControlIndex,
                         int number);
  static void SetFillColor(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                           const WideString& swFieldName,
                           int nControlIndex,
                           const CFX_Color& color);
  static void SetHidden(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                        const WideString& swFieldName,
                        int nControlIndex,
                        bool b);
  static void SetHighlight(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                           const WideString& swFieldName,
                           int nControlIndex,
                           const ByteString& string);
  static void SetLineWidth(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                           const WideString& swFieldName,
                           int nControlIndex,
                           int number);
  static void SetMultiline(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                           const WideString& swFieldName,
                           int nControlIndex,
                           bool b);
  static void SetMultipleSelection(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                                   const WideString& swFieldName,
                                   int nControlIndex,
                                   bool b);
  static void SetPassword(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                          const WideString& swFieldName,
                          int nControlIndex,
                          bool b);
  static void SetRect(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                      const WideString& swFieldName,
                      int nControlIndex,
                      const CFX_FloatRect& rect);
  static void SetRotation(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                          const WideString& swFieldName,
                          int nControlIndex,
                          int number);
  static void SetStrokeColor(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                             const WideString& swFieldName,
                             int nControlIndex,
                             const CFX_Color& color);
  static void SetStyle(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                       const WideString& swFieldName,
                       int nControlIndex,
                       const ByteString& string);
  static void SetTextColor(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                           const WideString& swFieldName,
                           int nControlIndex,
                           const CFX_Color& color);
  static void SetTextFont(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                          const WideString& swFieldName,
                          int nControlIndex,
                          const ByteString& string);
  static void SetTextSize(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                          const WideString& swFieldName,
                          int nControlIndex,
                          int number);
  static void SetUserName(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                          const WideString& swFieldName,
                          int nControlIndex,
                          const WideString& string);
  static void SetValue(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                       const WideString& swFieldName,
                       int nControlIndex,
                       const std::vector<WideString>& strArray);

  static void AddField(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                       int nPageIndex,
                       int nFieldType,
                       const WideString& sName,
                       const CFX_FloatRect& rcCoords);

  static void UpdateFormField(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                              CPDF_FormField* pFormField,
                              bool bChangeMark,
                              bool bResetAP,
                              bool bRefresh);
  static void UpdateFormControl(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                                CPDF_FormControl* pFormControl,
                                bool bChangeMark,
                                bool bResetAP,
                                bool bRefresh);

  static CPDFSDK_Widget* GetWidget(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                                   CPDF_FormControl* pFormControl);
  static std::vector<CPDF_FormField*> GetFormFields(
      CPDFSDK_FormFillEnvironment* pFormFillEnv,
      const WideString& csFieldName);

  static void DoDelay(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                      CJS_DelayData* pData);

  bool AttachField(Document* pDocument, const WideString& csFieldName);
  void SetDelay(bool bDelay);

 protected:
  void ParseFieldName(const std::wstring& strFieldNameParsed,
                      std::wstring& strFieldName,
                      int& iControlNo);
  std::vector<CPDF_FormField*> GetFormFields(
      const WideString& csFieldName) const;
  CPDF_FormControl* GetSmartFieldControl(CPDF_FormField* pFormField);
  bool ValueIsOccur(CPDF_FormField* pFormField, WideString csOptLabel);

  void AddDelay_Int(FIELD_PROP prop, int32_t n);
  void AddDelay_Bool(FIELD_PROP prop, bool b);
  void AddDelay_String(FIELD_PROP prop, const ByteString& string);
  void AddDelay_WideString(FIELD_PROP prop, const WideString& string);
  void AddDelay_Rect(FIELD_PROP prop, const CFX_FloatRect& rect);
  void AddDelay_Color(FIELD_PROP prop, const CFX_Color& color);
  void AddDelay_WordArray(FIELD_PROP prop, const std::vector<uint32_t>& array);
  void AddDelay_WideStringArray(FIELD_PROP prop,
                                const std::vector<WideString>& array);

  void DoDelay();

 public:
  Document* m_pJSDoc;
  CPDFSDK_FormFillEnvironment::ObservedPtr m_pFormFillEnv;
  WideString m_FieldName;
  int m_nFormControlIndex;
  bool m_bCanSet;
  bool m_bDelay;
};

class CJS_Field : public CJS_Object {
 public:
  explicit CJS_Field(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {}
  ~CJS_Field() override {}

  void InitInstance(IJS_Runtime* pIRuntime) override;

  DECLARE_JS_CLASS();
  JS_STATIC_PROP(alignment, Field);
  JS_STATIC_PROP(borderStyle, Field);
  JS_STATIC_PROP(buttonAlignX, Field);
  JS_STATIC_PROP(buttonAlignY, Field);
  JS_STATIC_PROP(buttonFitBounds, Field);
  JS_STATIC_PROP(buttonPosition, Field);
  JS_STATIC_PROP(buttonScaleHow, Field);
  JS_STATIC_PROP(buttonScaleWhen, Field);
  JS_STATIC_PROP(calcOrderIndex, Field);
  JS_STATIC_PROP(charLimit, Field);
  JS_STATIC_PROP(comb, Field);
  JS_STATIC_PROP(commitOnSelChange, Field);
  JS_STATIC_PROP(currentValueIndices, Field);
  JS_STATIC_PROP(defaultStyle, Field);
  JS_STATIC_PROP(defaultValue, Field);
  JS_STATIC_PROP(doNotScroll, Field);
  JS_STATIC_PROP(doNotSpellCheck, Field);
  JS_STATIC_PROP(delay, Field);
  JS_STATIC_PROP(display, Field);
  JS_STATIC_PROP(doc, Field);
  JS_STATIC_PROP(editable, Field);
  JS_STATIC_PROP(exportValues, Field);
  JS_STATIC_PROP(fileSelect, Field);
  JS_STATIC_PROP(fillColor, Field);
  JS_STATIC_PROP(hidden, Field);
  JS_STATIC_PROP(highlight, Field);
  JS_STATIC_PROP(lineWidth, Field);
  JS_STATIC_PROP(multiline, Field);
  JS_STATIC_PROP(multipleSelection, Field);
  JS_STATIC_PROP(name, Field);
  JS_STATIC_PROP(numItems, Field);
  JS_STATIC_PROP(page, Field);
  JS_STATIC_PROP(password, Field);
  JS_STATIC_PROP(print, Field);
  JS_STATIC_PROP(radiosInUnison, Field);
  JS_STATIC_PROP(readonly, Field);
  JS_STATIC_PROP(rect, Field);
  JS_STATIC_PROP(required, Field);
  JS_STATIC_PROP(richText, Field);
  JS_STATIC_PROP(richValue, Field);
  JS_STATIC_PROP(rotation, Field);
  JS_STATIC_PROP(strokeColor, Field);
  JS_STATIC_PROP(style, Field);
  JS_STATIC_PROP(submitName, Field);
  JS_STATIC_PROP(textColor, Field);
  JS_STATIC_PROP(textFont, Field);
  JS_STATIC_PROP(textSize, Field);
  JS_STATIC_PROP(type, Field);
  JS_STATIC_PROP(userName, Field);
  JS_STATIC_PROP(value, Field);
  JS_STATIC_PROP(valueAsString, Field);
  JS_STATIC_PROP(source, Field);

  JS_STATIC_METHOD(browseForFileToSubmit, Field);
  JS_STATIC_METHOD(buttonGetCaption, Field);
  JS_STATIC_METHOD(buttonGetIcon, Field);
  JS_STATIC_METHOD(buttonImportIcon, Field);
  JS_STATIC_METHOD(buttonSetCaption, Field);
  JS_STATIC_METHOD(buttonSetIcon, Field);
  JS_STATIC_METHOD(checkThisBox, Field);
  JS_STATIC_METHOD(clearItems, Field);
  JS_STATIC_METHOD(defaultIsChecked, Field);
  JS_STATIC_METHOD(deleteItemAt, Field);
  JS_STATIC_METHOD(getArray, Field);
  JS_STATIC_METHOD(getItemAt, Field);
  JS_STATIC_METHOD(getLock, Field);
  JS_STATIC_METHOD(insertItemAt, Field);
  JS_STATIC_METHOD(isBoxChecked, Field);
  JS_STATIC_METHOD(isDefaultChecked, Field);
  JS_STATIC_METHOD(setAction, Field);
  JS_STATIC_METHOD(setFocus, Field);
  JS_STATIC_METHOD(setItems, Field);
  JS_STATIC_METHOD(setLock, Field);
  JS_STATIC_METHOD(signatureGetModifications, Field);
  JS_STATIC_METHOD(signatureGetSeedValue, Field);
  JS_STATIC_METHOD(signatureInfo, Field);
  JS_STATIC_METHOD(signatureSetSeedValue, Field);
  JS_STATIC_METHOD(signatureSign, Field);
  JS_STATIC_METHOD(signatureValidate, Field);
};

#endif  // FPDFSDK_JAVASCRIPT_FIELD_H_
