// 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_DOCUMENT_H_
#define FPDFSDK_INCLUDE_JAVASCRIPT_DOCUMENT_H_

#include "JS_Define.h"

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

 public:
  FX_BOOL bUI;
  int nStart;
  int nEnd;
  FX_BOOL bSilent;
  FX_BOOL bShrinkToFit;
  FX_BOOL bPrintAsImage;
  FX_BOOL bReverse;
  FX_BOOL bAnnotations;
};

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

  DECLARE_JS_CLASS(CJS_PrintParamsObj);
};

class Icon;
class Field;

struct IconElement {
  IconElement() : IconName(L""), NextIcon(NULL), IconStream(NULL) {}
  virtual ~IconElement() {}
  CFX_WideString IconName;
  IconElement* NextIcon;
  Icon* IconStream;
};

class IconTree {
 public:
  IconTree() : m_pHead(NULL), m_pEnd(NULL), m_iLength(0) {}

  virtual ~IconTree() {}

 public:
  void InsertIconElement(IconElement* pNewIcon);
  void DeleteIconElement(CFX_WideString swIconName);
  void DeleteIconTree();
  int GetLength();
  IconElement* operator[](int iIndex);

 private:
  IconElement* m_pHead;
  IconElement* m_pEnd;
  int m_iLength;
};

struct CJS_DelayData;
struct CJS_DelayAnnot;
struct CJS_AnnotObj;

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

 public:
  FX_BOOL ADBE(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
  FX_BOOL author(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
  FX_BOOL baseURL(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
  FX_BOOL bookmarkRoot(IFXJS_Context* cc,
                       CJS_PropValue& vp,
                       CFX_WideString& sError);
  FX_BOOL calculate(IFXJS_Context* cc,
                    CJS_PropValue& vp,
                    CFX_WideString& sError);
  FX_BOOL Collab(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
  FX_BOOL creationDate(IFXJS_Context* cc,
                       CJS_PropValue& vp,
                       CFX_WideString& sError);
  FX_BOOL creator(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
  FX_BOOL delay(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
  FX_BOOL dirty(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
  FX_BOOL documentFileName(IFXJS_Context* cc,
                           CJS_PropValue& vp,
                           CFX_WideString& sError);
  FX_BOOL external(IFXJS_Context* cc,
                   CJS_PropValue& vp,
                   CFX_WideString& sError);
  FX_BOOL filesize(IFXJS_Context* cc,
                   CJS_PropValue& vp,
                   CFX_WideString& sError);
  FX_BOOL icons(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
  FX_BOOL info(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
  FX_BOOL keywords(IFXJS_Context* cc,
                   CJS_PropValue& vp,
                   CFX_WideString& sError);
  FX_BOOL layout(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
  FX_BOOL media(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
  FX_BOOL modDate(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
  FX_BOOL mouseX(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
  FX_BOOL mouseY(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
  FX_BOOL numFields(IFXJS_Context* cc,
                    CJS_PropValue& vp,
                    CFX_WideString& sError);
  FX_BOOL numPages(IFXJS_Context* cc,
                   CJS_PropValue& vp,
                   CFX_WideString& sError);
  FX_BOOL pageNum(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
  FX_BOOL pageWindowRect(IFXJS_Context* cc,
                         CJS_PropValue& vp,
                         CFX_WideString& sError);
  FX_BOOL path(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
  FX_BOOL producer(IFXJS_Context* cc,
                   CJS_PropValue& vp,
                   CFX_WideString& sError);
  FX_BOOL subject(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
  FX_BOOL title(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
  FX_BOOL zoom(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
  FX_BOOL zoomType(IFXJS_Context* cc,
                   CJS_PropValue& vp,
                   CFX_WideString& sError);

  FX_BOOL addAnnot(IFXJS_Context* cc,
                   const CJS_Parameters& params,
                   CJS_Value& vRet,
                   CFX_WideString& sError);
  FX_BOOL addField(IFXJS_Context* cc,
                   const CJS_Parameters& params,
                   CJS_Value& vRet,
                   CFX_WideString& sError);
  FX_BOOL addLink(IFXJS_Context* cc,
                  const CJS_Parameters& params,
                  CJS_Value& vRet,
                  CFX_WideString& sError);
  FX_BOOL addIcon(IFXJS_Context* cc,
                  const CJS_Parameters& params,
                  CJS_Value& vRet,
                  CFX_WideString& sError);
  FX_BOOL calculateNow(IFXJS_Context* cc,
                       const CJS_Parameters& params,
                       CJS_Value& vRet,
                       CFX_WideString& sError);
  FX_BOOL closeDoc(IFXJS_Context* cc,
                   const CJS_Parameters& params,
                   CJS_Value& vRet,
                   CFX_WideString& sError);
  FX_BOOL createDataObject(IFXJS_Context* cc,
                           const CJS_Parameters& params,
                           CJS_Value& vRet,
                           CFX_WideString& sError);
  FX_BOOL deletePages(IFXJS_Context* cc,
                      const CJS_Parameters& params,
                      CJS_Value& vRet,
                      CFX_WideString& sError);
  FX_BOOL exportAsText(IFXJS_Context* cc,
                       const CJS_Parameters& params,
                       CJS_Value& vRet,
                       CFX_WideString& sError);
  FX_BOOL exportAsFDF(IFXJS_Context* cc,
                      const CJS_Parameters& params,
                      CJS_Value& vRet,
                      CFX_WideString& sError);
  FX_BOOL exportAsXFDF(IFXJS_Context* cc,
                       const CJS_Parameters& params,
                       CJS_Value& vRet,
                       CFX_WideString& sError);
  FX_BOOL extractPages(IFXJS_Context* cc,
                       const CJS_Parameters& params,
                       CJS_Value& vRet,
                       CFX_WideString& sError);
  FX_BOOL getAnnot(IFXJS_Context* cc,
                   const CJS_Parameters& params,
                   CJS_Value& vRet,
                   CFX_WideString& sError);
  FX_BOOL getAnnots(IFXJS_Context* cc,
                    const CJS_Parameters& params,
                    CJS_Value& vRet,
                    CFX_WideString& sError);
  FX_BOOL getAnnot3D(IFXJS_Context* cc,
                     const CJS_Parameters& params,
                     CJS_Value& vRet,
                     CFX_WideString& sError);
  FX_BOOL getAnnots3D(IFXJS_Context* cc,
                      const CJS_Parameters& params,
                      CJS_Value& vRet,
                      CFX_WideString& sError);
  FX_BOOL getField(IFXJS_Context* cc,
                   const CJS_Parameters& params,
                   CJS_Value& vRet,
                   CFX_WideString& sError);
  FX_BOOL getIcon(IFXJS_Context* cc,
                  const CJS_Parameters& params,
                  CJS_Value& vRet,
                  CFX_WideString& sError);
  FX_BOOL getLinks(IFXJS_Context* cc,
                   const CJS_Parameters& params,
                   CJS_Value& vRet,
                   CFX_WideString& sError);
  FX_BOOL getNthFieldName(IFXJS_Context* cc,
                          const CJS_Parameters& params,
                          CJS_Value& vRet,
                          CFX_WideString& sError);
  FX_BOOL getOCGs(IFXJS_Context* cc,
                  const CJS_Parameters& params,
                  CJS_Value& vRet,
                  CFX_WideString& sError);
  FX_BOOL getPageBox(IFXJS_Context* cc,
                     const CJS_Parameters& params,
                     CJS_Value& vRet,
                     CFX_WideString& sError);
  FX_BOOL getPageNthWord(IFXJS_Context* cc,
                         const CJS_Parameters& params,
                         CJS_Value& vRet,
                         CFX_WideString& sError);
  FX_BOOL getPageNthWordQuads(IFXJS_Context* cc,
                              const CJS_Parameters& params,
                              CJS_Value& vRet,
                              CFX_WideString& sError);
  FX_BOOL getPageNumWords(IFXJS_Context* cc,
                          const CJS_Parameters& params,
                          CJS_Value& vRet,
                          CFX_WideString& sError);
  FX_BOOL getPrintParams(IFXJS_Context* cc,
                         const CJS_Parameters& params,
                         CJS_Value& vRet,
                         CFX_WideString& sError);
  FX_BOOL getURL(IFXJS_Context* cc,
                 const CJS_Parameters& params,
                 CJS_Value& vRet,
                 CFX_WideString& sError);
  FX_BOOL importAnFDF(IFXJS_Context* cc,
                      const CJS_Parameters& params,
                      CJS_Value& vRet,
                      CFX_WideString& sError);
  FX_BOOL importAnXFDF(IFXJS_Context* cc,
                       const CJS_Parameters& params,
                       CJS_Value& vRet,
                       CFX_WideString& sError);
  FX_BOOL importTextData(IFXJS_Context* cc,
                         const CJS_Parameters& params,
                         CJS_Value& vRet,
                         CFX_WideString& sError);
  FX_BOOL insertPages(IFXJS_Context* cc,
                      const CJS_Parameters& params,
                      CJS_Value& vRet,
                      CFX_WideString& sError);
  FX_BOOL mailForm(IFXJS_Context* cc,
                   const CJS_Parameters& params,
                   CJS_Value& vRet,
                   CFX_WideString& sError);
  FX_BOOL print(IFXJS_Context* cc,
                const CJS_Parameters& params,
                CJS_Value& vRet,
                CFX_WideString& sError);
  FX_BOOL removeField(IFXJS_Context* cc,
                      const CJS_Parameters& params,
                      CJS_Value& vRet,
                      CFX_WideString& sError);
  FX_BOOL replacePages(IFXJS_Context* cc,
                       const CJS_Parameters& params,
                       CJS_Value& vRet,
                       CFX_WideString& sError);
  FX_BOOL resetForm(IFXJS_Context* cc,
                    const CJS_Parameters& params,
                    CJS_Value& vRet,
                    CFX_WideString& sError);
  FX_BOOL saveAs(IFXJS_Context* cc,
                 const CJS_Parameters& params,
                 CJS_Value& vRet,
                 CFX_WideString& sError);
  FX_BOOL submitForm(IFXJS_Context* cc,
                     const CJS_Parameters& params,
                     CJS_Value& vRet,
                     CFX_WideString& sError);
  FX_BOOL mailDoc(IFXJS_Context* cc,
                  const CJS_Parameters& params,
                  CJS_Value& vRet,
                  CFX_WideString& sError);
  FX_BOOL removeIcon(IFXJS_Context* cc,
                     const CJS_Parameters& params,
                     CJS_Value& vRet,
                     CFX_WideString& sError);

 public:
  void AttachDoc(CPDFSDK_Document* pDoc);
  CPDFSDK_Document* GetReaderDoc();
  static FX_BOOL ExtractFileName(CPDFSDK_Document* pDoc,
                                 CFX_ByteString& strFileName);
  static FX_BOOL ExtractFolderName(CPDFSDK_Document* pDoc,
                                   CFX_ByteString& strFolderName);
  void AddDelayData(CJS_DelayData* pData);
  void DoFieldDelay(const CFX_WideString& sFieldName, int nControlIndex);
  void AddDelayAnnotData(CJS_AnnotObj* pData);
  void DoAnnotDelay();
  void SetIsolate(v8::Isolate* isolate) { m_isolate = isolate; }
  CJS_Document* GetCJSDoc() const;

 private:
  CFX_WideString ReversalStr(CFX_WideString cbFrom);
  CFX_WideString CutString(CFX_WideString cbFrom);
  bool IsEnclosedInRect(CFX_FloatRect rect, CFX_FloatRect LinkRect);
  int CountWords(CPDF_TextObject* pTextObj);
  CFX_WideString GetObjWordStr(CPDF_TextObject* pTextObj, int nWordIndex);
  FX_BOOL ParserParams(JSObject* pObj, CJS_AnnotObj& annotobj);

  v8::Isolate* m_isolate;
  IconTree* m_pIconTree;
  CPDFSDK_Document* m_pDocument;
  CFX_WideString m_cwBaseURL;
  bool m_bDelay;
  CFX_ArrayTemplate<CJS_DelayData*> m_DelayData;
  CFX_ArrayTemplate<CJS_AnnotObj*> m_DelayAnnotData;
};

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

  // CJS_Object
  FX_BOOL InitInstance(IFXJS_Context* cc) override;

  DECLARE_JS_CLASS(CJS_Document);

  JS_STATIC_PROP(ADBE, Document);
  JS_STATIC_PROP(author, Document);
  JS_STATIC_PROP(baseURL, Document);
  JS_STATIC_PROP(bookmarkRoot, Document);
  JS_STATIC_PROP(calculate, Document);
  JS_STATIC_PROP(Collab, Document);
  JS_STATIC_PROP(creationDate, Document);
  JS_STATIC_PROP(creator, Document);
  JS_STATIC_PROP(delay, Document);
  JS_STATIC_PROP(dirty, Document);
  JS_STATIC_PROP(documentFileName, Document);
  JS_STATIC_PROP(external, Document);
  JS_STATIC_PROP(filesize, Document);
  JS_STATIC_PROP(icons, Document);
  JS_STATIC_PROP(info, Document);
  JS_STATIC_PROP(keywords, Document);
  JS_STATIC_PROP(layout, Document);
  JS_STATIC_PROP(media, Document);
  JS_STATIC_PROP(modDate, Document);
  JS_STATIC_PROP(mouseX, Document);
  JS_STATIC_PROP(mouseY, Document);
  JS_STATIC_PROP(numFields, Document);
  JS_STATIC_PROP(numPages, Document);
  JS_STATIC_PROP(pageNum, Document);
  JS_STATIC_PROP(pageWindowRect, Document);
  JS_STATIC_PROP(path, Document);
  JS_STATIC_PROP(producer, Document);
  JS_STATIC_PROP(subject, Document);
  JS_STATIC_PROP(title, Document);
  JS_STATIC_PROP(zoom, Document);
  JS_STATIC_PROP(zoomType, Document);

  JS_STATIC_METHOD(addAnnot, Document);
  JS_STATIC_METHOD(addField, Document);
  JS_STATIC_METHOD(addLink, Document);
  JS_STATIC_METHOD(addIcon, Document);
  JS_STATIC_METHOD(calculateNow, Document);
  JS_STATIC_METHOD(closeDoc, Document);
  JS_STATIC_METHOD(createDataObject, Document);
  JS_STATIC_METHOD(deletePages, Document);
  JS_STATIC_METHOD(exportAsText, Document);
  JS_STATIC_METHOD(exportAsFDF, Document);
  JS_STATIC_METHOD(exportAsXFDF, Document);
  JS_STATIC_METHOD(extractPages, Document);
  JS_STATIC_METHOD(getAnnot, Document);
  JS_STATIC_METHOD(getAnnots, Document);
  JS_STATIC_METHOD(getAnnot3D, Document);
  JS_STATIC_METHOD(getAnnots3D, Document);
  JS_STATIC_METHOD(getField, Document);
  JS_STATIC_METHOD(getIcon, Document);
  JS_STATIC_METHOD(getLinks, Document);
  JS_STATIC_METHOD(getNthFieldName, Document);
  JS_STATIC_METHOD(getOCGs, Document);
  JS_STATIC_METHOD(getPageBox, Document);
  JS_STATIC_METHOD(getPageNthWord, Document);
  JS_STATIC_METHOD(getPageNthWordQuads, Document);
  JS_STATIC_METHOD(getPageNumWords, Document);
  JS_STATIC_METHOD(getPrintParams, Document);
  JS_STATIC_METHOD(getURL, Document);
  JS_STATIC_METHOD(importAnFDF, Document);
  JS_STATIC_METHOD(importAnXFDF, Document);
  JS_STATIC_METHOD(importTextData, Document);
  JS_STATIC_METHOD(insertPages, Document);
  JS_STATIC_METHOD(mailForm, Document);
  JS_STATIC_METHOD(print, Document);
  JS_STATIC_METHOD(removeField, Document);
  JS_STATIC_METHOD(replacePages, Document);
  JS_STATIC_METHOD(removeIcon, Document);
  JS_STATIC_METHOD(resetForm, Document);
  JS_STATIC_METHOD(saveAs, Document);
  JS_STATIC_METHOD(submitForm, Document);
  JS_STATIC_METHOD(mailDoc, Document);
};

#endif  // FPDFSDK_INCLUDE_JAVASCRIPT_DOCUMENT_H_
