// 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 "../../include/javascript/JavaScript.h"
#include "../../include/javascript/IJavaScript.h"
#include "../../include/javascript/JS_Define.h"
#include "../../include/javascript/JS_Object.h"
#include "../../include/javascript/JS_Value.h"
#include "../../include/javascript/JS_EventHandler.h"
//#include "../include/JS_ResMgr.h"
#include "../../include/javascript/JS_Context.h"
#include "../../include/javascript/event.h"
#include "../../include/javascript/Field.h"

/* -------------------------- event -------------------------- */

BEGIN_JS_STATIC_CONST(CJS_Event)
END_JS_STATIC_CONST()

BEGIN_JS_STATIC_PROP(CJS_Event)
JS_STATIC_PROP_ENTRY(change)
JS_STATIC_PROP_ENTRY(changeEx)
JS_STATIC_PROP_ENTRY(commitKey)
JS_STATIC_PROP_ENTRY(fieldFull)
JS_STATIC_PROP_ENTRY(keyDown)
JS_STATIC_PROP_ENTRY(modifier)
JS_STATIC_PROP_ENTRY(name)
JS_STATIC_PROP_ENTRY(rc)
JS_STATIC_PROP_ENTRY(richChange)
JS_STATIC_PROP_ENTRY(richChangeEx)
JS_STATIC_PROP_ENTRY(richValue)
JS_STATIC_PROP_ENTRY(selEnd)
JS_STATIC_PROP_ENTRY(selStart)
JS_STATIC_PROP_ENTRY(shift)
JS_STATIC_PROP_ENTRY(source)
JS_STATIC_PROP_ENTRY(target)
JS_STATIC_PROP_ENTRY(targetName)
JS_STATIC_PROP_ENTRY(type)
JS_STATIC_PROP_ENTRY(value)
JS_STATIC_PROP_ENTRY(willCommit)
END_JS_STATIC_PROP()

BEGIN_JS_STATIC_METHOD(CJS_Event)
END_JS_STATIC_METHOD()

IMPLEMENT_JS_CLASS(CJS_Event, event)

event::event(CJS_Object* pJsObject) : CJS_EmbedObj(pJsObject) {}

event::~event() {
}

FX_BOOL event::change(IFXJS_Context* cc,
                      CJS_PropValue& vp,
                      CFX_WideString& sError) {
  CJS_Context* pContext = (CJS_Context*)cc;
  ASSERT(pContext != NULL);
  CJS_EventHandler* pEvent = pContext->GetEventHandler();
  ASSERT(pEvent != NULL);

  CFX_WideString& wChange = pEvent->Change();
  if (vp.IsSetting()) {
    if (vp.GetType() == CJS_Value::VT_string)
      vp >> wChange;
  } else {
    vp << wChange;
  }
  return TRUE;
}

FX_BOOL event::changeEx(IFXJS_Context* cc,
                        CJS_PropValue& vp,
                        CFX_WideString& sError) {
  if (!vp.IsGetting())
    return FALSE;

  CJS_Context* pContext = (CJS_Context*)cc;
  ASSERT(pContext != NULL);
  CJS_EventHandler* pEvent = pContext->GetEventHandler();
  ASSERT(pEvent != NULL);

  vp << pEvent->ChangeEx();
  return TRUE;
}

FX_BOOL event::commitKey(IFXJS_Context* cc,
                         CJS_PropValue& vp,
                         CFX_WideString& sError) {
  if (!vp.IsGetting())
    return FALSE;

  CJS_Context* pContext = (CJS_Context*)cc;
  ASSERT(pContext != NULL);
  CJS_EventHandler* pEvent = pContext->GetEventHandler();
  ASSERT(pEvent != NULL);

  vp << pEvent->CommitKey();
  return TRUE;
}

FX_BOOL event::fieldFull(IFXJS_Context* cc,
                         CJS_PropValue& vp,
                         CFX_WideString& sError) {
  CJS_Context* pContext = (CJS_Context*)cc;
  ASSERT(pContext != NULL);
  CJS_EventHandler* pEvent = pContext->GetEventHandler();
  ASSERT(pEvent != NULL);

  if (!vp.IsGetting() &&
      wcscmp((const wchar_t*)pEvent->Name(), L"Keystroke") != 0)
    return FALSE;

  if (pEvent->FieldFull())
    vp << TRUE;
  else
    vp << FALSE;
  return TRUE;
}

FX_BOOL event::keyDown(IFXJS_Context* cc,
                       CJS_PropValue& vp,
                       CFX_WideString& sError) {
  if (!vp.IsGetting())
    return FALSE;

  CJS_Context* pContext = (CJS_Context*)cc;
  ASSERT(pContext != NULL);
  CJS_EventHandler* pEvent = pContext->GetEventHandler();
  ASSERT(pEvent != NULL);

  if (pEvent->KeyDown())
    vp << TRUE;
  else
    vp << FALSE;
  return TRUE;
}

FX_BOOL event::modifier(IFXJS_Context* cc,
                        CJS_PropValue& vp,
                        CFX_WideString& sError) {
  if (!vp.IsGetting())
    return FALSE;

  CJS_Context* pContext = (CJS_Context*)cc;
  ASSERT(pContext != NULL);
  CJS_EventHandler* pEvent = pContext->GetEventHandler();
  ASSERT(pEvent != NULL);

  if (pEvent->Modifier())
    vp << TRUE;
  else
    vp << FALSE;
  return TRUE;
}

FX_BOOL event::name(IFXJS_Context* cc,
                    CJS_PropValue& vp,
                    CFX_WideString& sError) {
  if (!vp.IsGetting())
    return FALSE;

  CJS_Context* pContext = (CJS_Context*)cc;
  ASSERT(pContext != NULL);
  CJS_EventHandler* pEvent = pContext->GetEventHandler();
  ASSERT(pEvent != NULL);

  vp << pEvent->Name();
  return TRUE;
}

FX_BOOL event::rc(IFXJS_Context* cc,
                  CJS_PropValue& vp,
                  CFX_WideString& sError) {
  CJS_Context* pContext = (CJS_Context*)cc;
  ASSERT(pContext != NULL);
  CJS_EventHandler* pEvent = pContext->GetEventHandler();
  ASSERT(pEvent != NULL);

  FX_BOOL& bRc = pEvent->Rc();
  if (vp.IsSetting()) {
    vp >> bRc;
  } else {
    vp << bRc;
  }
  return TRUE;
}

FX_BOOL event::richChange(IFXJS_Context* cc,
                          CJS_PropValue& vp,
                          CFX_WideString& sError) {
  return TRUE;
  if (vp.IsSetting()) {
  } else {
    ;
  }
  return TRUE;
}

FX_BOOL event::richChangeEx(IFXJS_Context* cc,
                            CJS_PropValue& vp,
                            CFX_WideString& sError) {
  return TRUE;
  if (vp.IsSetting()) {
  } else {
    ;
  }
  return TRUE;
}

FX_BOOL event::richValue(IFXJS_Context* cc,
                         CJS_PropValue& vp,
                         CFX_WideString& sError) {
  return TRUE;
  if (vp.IsSetting()) {
  } else {
    ;
  }
  return TRUE;
}

FX_BOOL event::selEnd(IFXJS_Context* cc,
                      CJS_PropValue& vp,
                      CFX_WideString& sError) {
  CJS_Context* pContext = (CJS_Context*)cc;
  ASSERT(pContext != NULL);
  CJS_EventHandler* pEvent = pContext->GetEventHandler();
  ASSERT(pEvent != NULL);

  if (wcscmp((const wchar_t*)pEvent->Name(), L"Keystroke") != 0) {
    return TRUE;
  }

  int& iSelEnd = pEvent->SelEnd();
  if (vp.IsSetting()) {
    vp >> iSelEnd;
  } else {
    vp << iSelEnd;
  }
  return TRUE;
}

FX_BOOL event::selStart(IFXJS_Context* cc,
                        CJS_PropValue& vp,
                        CFX_WideString& sError) {
  CJS_Context* pContext = (CJS_Context*)cc;
  ASSERT(pContext != NULL);
  CJS_EventHandler* pEvent = pContext->GetEventHandler();
  ASSERT(pEvent != NULL);

  if (wcscmp((const wchar_t*)pEvent->Name(), L"Keystroke") != 0) {
    return TRUE;
  }
  int& iSelStart = pEvent->SelStart();
  if (vp.IsSetting()) {
    vp >> iSelStart;
  } else {
    vp << iSelStart;
  }
  return TRUE;
}

FX_BOOL event::shift(IFXJS_Context* cc,
                     CJS_PropValue& vp,
                     CFX_WideString& sError) {
  if (!vp.IsGetting())
    return FALSE;

  CJS_Context* pContext = (CJS_Context*)cc;
  ASSERT(pContext != NULL);
  CJS_EventHandler* pEvent = pContext->GetEventHandler();
  ASSERT(pEvent != NULL);

  if (pEvent->Shift())
    vp << TRUE;
  else
    vp << FALSE;
  return TRUE;
}

FX_BOOL event::source(IFXJS_Context* cc,
                      CJS_PropValue& vp,
                      CFX_WideString& sError) {
  if (!vp.IsGetting())
    return FALSE;

  CJS_Context* pContext = (CJS_Context*)cc;
  ASSERT(pContext != NULL);
  CJS_EventHandler* pEvent = pContext->GetEventHandler();
  ASSERT(pEvent != NULL);

  vp << pEvent->Source()->GetJSObject();
  return TRUE;
}

FX_BOOL event::target(IFXJS_Context* cc,
                      CJS_PropValue& vp,
                      CFX_WideString& sError) {
  if (!vp.IsGetting())
    return FALSE;

  CJS_Context* pContext = (CJS_Context*)cc;
  ASSERT(pContext != NULL);
  CJS_EventHandler* pEvent = pContext->GetEventHandler();
  ASSERT(pEvent != NULL);

  vp << pEvent->Target_Field()->GetJSObject();
  return TRUE;
}

FX_BOOL event::targetName(IFXJS_Context* cc,
                          CJS_PropValue& vp,
                          CFX_WideString& sError) {
  if (!vp.IsGetting())
    return FALSE;

  CJS_Context* pContext = (CJS_Context*)cc;
  ASSERT(pContext != NULL);
  CJS_EventHandler* pEvent = pContext->GetEventHandler();
  ASSERT(pEvent != NULL);

  vp << pEvent->TargetName();
  return TRUE;
}

FX_BOOL event::type(IFXJS_Context* cc,
                    CJS_PropValue& vp,
                    CFX_WideString& sError) {
  if (!vp.IsGetting())
    return FALSE;

  CJS_Context* pContext = (CJS_Context*)cc;
  ASSERT(pContext != NULL);
  CJS_EventHandler* pEvent = pContext->GetEventHandler();
  ASSERT(pEvent != NULL);

  vp << pEvent->Type();
  return TRUE;
}

FX_BOOL event::value(IFXJS_Context* cc,
                     CJS_PropValue& vp,
                     CFX_WideString& sError) {
  CJS_Context* pContext = (CJS_Context*)cc;
  ASSERT(pContext != NULL);
  CJS_EventHandler* pEvent = pContext->GetEventHandler();
  ASSERT(pEvent != NULL);

  if (wcscmp((const wchar_t*)pEvent->Type(), L"Field") != 0)
    return FALSE;
  if (!pEvent->m_pValue)
    return FALSE;
  CFX_WideString& val = pEvent->Value();
  if (vp.IsSetting()) {
    vp >> val;
  } else {
    vp << val;
  }
  return TRUE;
}

FX_BOOL event::willCommit(IFXJS_Context* cc,
                          CJS_PropValue& vp,
                          CFX_WideString& sError) {
  if (!vp.IsGetting())
    return FALSE;

  CJS_Context* pContext = (CJS_Context*)cc;
  ASSERT(pContext != NULL);
  CJS_EventHandler* pEvent = pContext->GetEventHandler();
  ASSERT(pEvent != NULL);

  if (pEvent->WillCommit())
    vp << TRUE;
  else
    vp << FALSE;
  return TRUE;
}
