// 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_EventHandler.h"
//#include "../../include/javascript/JS_ResMgr.h"
#include "../../include/javascript/JS_Context.h"
#include "../../include/javascript/JS_Runtime.h"
#include "../../include/javascript/JS_Define.h"
#include "../../include/javascript/JS_Object.h"
#include "../../include/javascript/JS_Value.h"
#include "../../include/javascript/Document.h"
#include "../../include/javascript/Field.h"

/* ---------------------------- CJS_EventHandler ---------------------------- */

CJS_EventHandler::CJS_EventHandler(CJS_Context * pContext)	 :
	m_pJSContext(pContext),
	m_eEventType(JET_UNKNOWN),
	m_bValid(FALSE),
	m_pWideStrChange(NULL),
	m_nCommitKey(-1),
	m_bKeyDown(FALSE),
	m_bModifier(FALSE),
	m_bShift(FALSE),
	m_pISelEnd(NULL),
	m_nSelEndDu(0),
	m_pISelStart(NULL),
	m_nSelStartDu(0),
	m_bWillCommit(FALSE),
	m_pValue(NULL),
	m_bFieldFull(FALSE),
	m_pbRc(NULL),
	m_bRcDu(FALSE),
	m_pSourceDoc(NULL),
	m_pTargetBookMark(NULL),
	m_pTargetDoc(NULL),
	m_pTargetAnnot(NULL)
{
}

CJS_EventHandler::~CJS_EventHandler()
{
}

void CJS_EventHandler::OnApp_Init()
{
	Initial(JET_APP_INIT);
}

void CJS_EventHandler::OnDoc_Open(CPDFSDK_Document* pDoc, const CFX_WideString& strTargetName)
{
	Initial(JET_DOC_OPEN);

	m_pTargetDoc = pDoc;
	m_strTargetName = strTargetName;	
}

void CJS_EventHandler::OnDoc_WillPrint(CPDFSDK_Document* pDoc)
{
	Initial(JET_DOC_WILLPRINT);

	m_pTargetDoc = pDoc;	
}

void CJS_EventHandler::OnDoc_DidPrint(CPDFSDK_Document* pDoc)
{
	Initial(JET_DOC_DIDPRINT);
	
	m_pTargetDoc = pDoc;		
}

void CJS_EventHandler::OnDoc_WillSave(CPDFSDK_Document* pDoc)
{
	Initial(JET_DOC_WILLSAVE);
	m_pTargetDoc = pDoc;		
}

void CJS_EventHandler::OnDoc_DidSave(CPDFSDK_Document* pDoc)
{
	Initial(JET_DOC_DIDSAVE);	
	
	m_pTargetDoc = pDoc;	
}

void CJS_EventHandler::OnDoc_WillClose(CPDFSDK_Document* pDoc)
{
	Initial(JET_DOC_WILLCLOSE);

	m_pTargetDoc = pDoc;	
}

void CJS_EventHandler::OnPage_Open(CPDFSDK_Document* pDoc)
{
	Initial(JET_PAGE_OPEN);

	m_pTargetDoc = pDoc;
}

void CJS_EventHandler::OnPage_Close(CPDFSDK_Document* pDoc)
{
	Initial(JET_PAGE_CLOSE);
	
	m_pTargetDoc = pDoc;
}

void CJS_EventHandler::OnPage_InView(CPDFSDK_Document* pDoc)
{
	Initial(JET_PAGE_INVIEW);
	
	m_pTargetDoc = pDoc;
}

void CJS_EventHandler::OnPage_OutView(CPDFSDK_Document* pDoc)
{
	Initial(JET_PAGE_OUTVIEW);
	
	m_pTargetDoc = pDoc;
}

void CJS_EventHandler::OnField_MouseEnter(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget)
{
	Initial(JET_FIELD_MOUSEENTER);

	m_bModifier = bModifier;
	m_bShift = bShift;

	ASSERT(pTarget != NULL);
	m_strTargetName = pTarget->GetFullName();
}

void CJS_EventHandler::OnField_MouseExit(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget)
{
	Initial(JET_FIELD_MOUSEEXIT);

	m_bModifier = bModifier;
	m_bShift = bShift;
	ASSERT(pTarget != NULL);
	m_strTargetName = pTarget->GetFullName();	
}

void CJS_EventHandler::OnField_MouseDown(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget)
{
	Initial(JET_FIELD_MOUSEDOWN);
	m_eEventType = JET_FIELD_MOUSEDOWN;
	
	m_bModifier = bModifier;
	m_bShift = bShift;	
	ASSERT(pTarget != NULL);
	m_strTargetName = pTarget->GetFullName();
}

void CJS_EventHandler::OnField_MouseUp(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget)
{
	Initial(JET_FIELD_MOUSEUP);

	m_bModifier = bModifier;
	m_bShift = bShift;
	ASSERT(pTarget != NULL);
	m_strTargetName = pTarget->GetFullName();
}

void CJS_EventHandler::OnField_Focus(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget, 
									 const CFX_WideString& Value)
{
	Initial(JET_FIELD_FOCUS);

	m_bModifier = bModifier;
	m_bShift = bShift;  
	ASSERT(pTarget != NULL);
	m_strTargetName = pTarget->GetFullName();
	m_pValue = (CFX_WideString*)&Value;
}

void CJS_EventHandler::OnField_Blur(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget,
									const CFX_WideString& Value)
{
	Initial(JET_FIELD_BLUR);

	m_bModifier = bModifier;
	m_bShift = bShift;
	ASSERT(pTarget != NULL);
	m_strTargetName = pTarget->GetFullName();
	m_pValue = (CFX_WideString*)&Value;	
}

void CJS_EventHandler::OnField_Keystroke(CFX_WideString &strChange,
										 const CFX_WideString& strChangeEx, FX_BOOL KeyDown,
										 FX_BOOL bModifier, int& nSelEnd, int& nSelStart,
										 FX_BOOL bShift, CPDF_FormField* pTarget,
										 CFX_WideString& Value, FX_BOOL bWillCommit,
										  FX_BOOL bFieldFull, FX_BOOL& bRc)
{
	Initial(JET_FIELD_KEYSTROKE);
	
	m_nCommitKey = 0;
	m_pWideStrChange = &strChange;
	m_WideStrChangeEx = strChangeEx;
	m_bKeyDown = KeyDown;
	m_bModifier = bModifier;
	m_pISelEnd = &nSelEnd;
	m_pISelStart = &nSelStart;
	m_bShift = bShift;	
	ASSERT(pTarget != NULL);
	m_strTargetName = pTarget->GetFullName();
	m_pValue = &Value;
	m_bWillCommit = bWillCommit;	
	m_pbRc = &bRc;
	m_bFieldFull = bFieldFull;
}

void CJS_EventHandler::OnField_Validate(CFX_WideString& strChange, const CFX_WideString& strChangeEx,
										FX_BOOL bKeyDown, FX_BOOL bModifier, FX_BOOL bShift,
										CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL& bRc)
{
	Initial(JET_FIELD_VALIDATE);
	
	m_pWideStrChange = &strChange;
	m_WideStrChangeEx = strChangeEx;	
	m_bKeyDown = bKeyDown;
	m_bModifier = bModifier;
	m_bShift = bShift;
	ASSERT(pTarget != NULL);
	m_strTargetName = pTarget->GetFullName();
	m_pValue = &Value;	
	m_pbRc = &bRc;	
}

void CJS_EventHandler::OnField_Calculate(CPDF_FormField* pSource, CPDF_FormField* pTarget, 
										 CFX_WideString& Value, FX_BOOL& bRc)
{
	Initial(JET_FIELD_CALCULATE);

	if (pSource)
		m_strSourceName = pSource->GetFullName();
	ASSERT(pTarget != NULL);
	m_strTargetName = pTarget->GetFullName();
    m_pValue = &Value;
	m_pbRc = &bRc;
}

void CJS_EventHandler::OnField_Format(CPDF_FormField* pTarget,
                                      CFX_WideString& Value,
                                      FX_BOOL bWillCommit)
{
	Initial(JET_FIELD_FORMAT);
	
	m_nCommitKey = 0;
	ASSERT(pTarget != NULL);
	m_strTargetName = pTarget->GetFullName();
	m_pValue = &Value;
	m_bWillCommit = bWillCommit;
}

void CJS_EventHandler::OnScreen_Focus(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
{
	Initial(JET_SCREEN_FOCUS);

	m_bModifier = bModifier;
	m_bShift = bShift;
	m_pTargetAnnot = pScreen;
}

void CJS_EventHandler::OnScreen_Blur(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
{
	Initial(JET_SCREEN_BLUR);

	m_bModifier = bModifier;
	m_bShift = bShift;
	m_pTargetAnnot = pScreen;
}

void CJS_EventHandler::OnScreen_Open(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
{
	Initial(JET_SCREEN_OPEN);

	m_bModifier = bModifier;
	m_bShift = bShift;
	m_pTargetAnnot = pScreen;
}

void CJS_EventHandler::OnScreen_Close(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
{
	Initial(JET_SCREEN_CLOSE);

	m_bModifier = bModifier;
	m_bShift = bShift;
	m_pTargetAnnot = pScreen;
}

void CJS_EventHandler::OnScreen_MouseDown(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
{
	Initial(JET_SCREEN_MOUSEDOWN);

	m_bModifier = bModifier;
	m_bShift = bShift;
	m_pTargetAnnot = pScreen;
}

void CJS_EventHandler::OnScreen_MouseUp(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
{
	Initial(JET_SCREEN_MOUSEUP);

	m_bModifier = bModifier;
	m_bShift = bShift;
	m_pTargetAnnot = pScreen;
}

void CJS_EventHandler::OnScreen_MouseEnter(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
{
	Initial(JET_SCREEN_MOUSEENTER);

	m_bModifier = bModifier;
	m_bShift = bShift;
	m_pTargetAnnot = pScreen;
}

void CJS_EventHandler::OnScreen_MouseExit(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
{
	Initial(JET_SCREEN_MOUSEEXIT);

	m_bModifier = bModifier;
	m_bShift = bShift;
	m_pTargetAnnot = pScreen;
}

void CJS_EventHandler::OnScreen_InView(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
{
	Initial(JET_SCREEN_INVIEW);

	m_bModifier = bModifier;
	m_bShift = bShift;
	m_pTargetAnnot = pScreen;
}

void CJS_EventHandler::OnScreen_OutView(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
{
	Initial(JET_SCREEN_OUTVIEW);

	m_bModifier = bModifier;
	m_bShift = bShift;
	m_pTargetAnnot = pScreen;
}

void CJS_EventHandler::OnLink_MouseUp(CPDFSDK_Document* pTarget)
{
	Initial(JET_LINK_MOUSEUP);
	
	m_pTargetDoc = pTarget;	
}

void CJS_EventHandler::OnBookmark_MouseUp(CPDF_Bookmark* pBookMark)
{
	Initial(JET_BOOKMARK_MOUSEUP);

	m_pTargetBookMark = pBookMark;	
}

void CJS_EventHandler::OnMenu_Exec(CPDFSDK_Document* pTarget, const CFX_WideString& strTargetName)
{
	Initial(JET_MENU_EXEC);

	m_pTargetDoc = pTarget;
	m_strTargetName = strTargetName;
}

void CJS_EventHandler::OnExternal_Exec()
{
	Initial(JET_EXTERNAL_EXEC);
}

void CJS_EventHandler::OnBatchExec(CPDFSDK_Document* pTarget)
{
	Initial(JET_BATCH_EXEC);

	m_pTargetDoc = pTarget;	
}

void CJS_EventHandler::OnConsole_Exec()
{
	Initial(JET_CONSOLE_EXEC);
}


void CJS_EventHandler::Initial(JS_EVENT_T type)
{
	m_eEventType = type;

	m_strTargetName = L"";
	m_strSourceName = L"";
	m_pWideStrChange = NULL;
	m_WideStrChangeDu = L"";
	m_WideStrChangeEx = L"";
	m_nCommitKey = -1;
	m_bKeyDown = FALSE;
	m_bModifier = FALSE;
	m_bShift = FALSE;
	m_pISelEnd = NULL;
	m_nSelEndDu = 0;
	m_pISelStart = NULL;
	m_nSelStartDu = 0;
	m_bWillCommit = FALSE;
	m_pValue = NULL;
	m_bFieldFull = FALSE;
	m_pbRc = NULL;
	m_bRcDu = FALSE;

	m_pSourceDoc = NULL;
	m_pTargetBookMark = NULL;
	m_pTargetDoc = NULL;
	m_pTargetAnnot = NULL;

	m_bValid = TRUE;
}

void CJS_EventHandler::Destroy()
{
	m_bValid = FALSE;
}

FX_BOOL CJS_EventHandler::IsValid()
{
	return m_bValid;
}

CFX_WideString & CJS_EventHandler::Change()
{
	if (m_pWideStrChange != NULL)
		return *m_pWideStrChange;
	else
	{
		return m_WideStrChangeDu;
	}
}

CFX_WideString CJS_EventHandler::ChangeEx()
{
	return m_WideStrChangeEx;
}

int CJS_EventHandler::CommitKey()
{
	return m_nCommitKey;
}

FX_BOOL CJS_EventHandler::FieldFull()
{
	return m_bFieldFull;
}

FX_BOOL CJS_EventHandler::KeyDown()
{
	return m_bKeyDown;
}

FX_BOOL CJS_EventHandler::Modifier()
{
	return m_bModifier;
}

const FX_WCHAR* CJS_EventHandler::Name()
{
	switch (m_eEventType)
	{
	case JET_APP_INIT:			return L"Init";
	case JET_BATCH_EXEC:		return L"Exec";
	case JET_BOOKMARK_MOUSEUP:	return L"Mouse Up";
	case JET_CONSOLE_EXEC:		return L"Exec";
	case JET_DOC_DIDPRINT:		return L"DidPrint";
	case JET_DOC_DIDSAVE:		return L"DidSave";
	case JET_DOC_OPEN:			return L"Open";
	case JET_DOC_WILLCLOSE:		return L"WillClose";
	case JET_DOC_WILLPRINT:		return L"WillPrint";
	case JET_DOC_WILLSAVE:		return L"WillSave";
	case JET_EXTERNAL_EXEC:		return L"Exec";
	case JET_FIELD_FOCUS:		
	case JET_SCREEN_FOCUS:		return L"Focus";
	case JET_FIELD_BLUR:		
	case JET_SCREEN_BLUR:		return L"Blur";
	case JET_FIELD_MOUSEDOWN:
	case JET_SCREEN_MOUSEDOWN:	return L"Mouse Down";
	case JET_FIELD_MOUSEUP:		
	case JET_SCREEN_MOUSEUP:	return L"Mouse Up";
	case JET_FIELD_MOUSEENTER:
	case JET_SCREEN_MOUSEENTER:	return L"Mouse Enter";
	case JET_FIELD_MOUSEEXIT:
	case JET_SCREEN_MOUSEEXIT:	return L"Mouse Exit";
	case JET_FIELD_CALCULATE:	return L"Calculate";
	case JET_FIELD_FORMAT:		return L"Format";
	case JET_FIELD_KEYSTROKE:	return L"Keystroke";
	case JET_FIELD_VALIDATE:	return L"Validate";
	case JET_LINK_MOUSEUP:		return L"Mouse Up";
	case JET_MENU_EXEC:			return L"Exec";
	case JET_PAGE_OPEN:		
	case JET_SCREEN_OPEN:		return L"Open";
	case JET_PAGE_CLOSE:
	case JET_SCREEN_CLOSE:		return L"Close";
	case JET_SCREEN_INVIEW:	
	case JET_PAGE_INVIEW:		return L"InView";
	case JET_PAGE_OUTVIEW:
	case JET_SCREEN_OUTVIEW:	return L"OutView";
	default:
		return L"";
	}

	return L"";
}

const FX_WCHAR* CJS_EventHandler::Type()
{
	switch (m_eEventType)
	{
	case JET_APP_INIT:			return L"App";
	case JET_BATCH_EXEC:		return L"Batch";
	case JET_BOOKMARK_MOUSEUP:	return L"BookMark";	
	case JET_CONSOLE_EXEC:		return L"Console";
	case JET_DOC_DIDPRINT:
	case JET_DOC_DIDSAVE:
	case JET_DOC_OPEN:
	case JET_DOC_WILLCLOSE:
	case JET_DOC_WILLPRINT:
	case JET_DOC_WILLSAVE:		return L"Doc";
	case JET_EXTERNAL_EXEC:		return L"External";
	case JET_FIELD_BLUR:
	case JET_FIELD_FOCUS:
	case JET_FIELD_MOUSEDOWN:
	case JET_FIELD_MOUSEENTER:
	case JET_FIELD_MOUSEEXIT:
	case JET_FIELD_MOUSEUP:
	case JET_FIELD_CALCULATE:
	case JET_FIELD_FORMAT:
	case JET_FIELD_KEYSTROKE:
	case JET_FIELD_VALIDATE:	return L"Field";
	case JET_SCREEN_FOCUS:
	case JET_SCREEN_BLUR:
	case JET_SCREEN_OPEN:
	case JET_SCREEN_CLOSE:
	case JET_SCREEN_MOUSEDOWN:
	case JET_SCREEN_MOUSEUP:
	case JET_SCREEN_MOUSEENTER:
	case JET_SCREEN_MOUSEEXIT:
	case JET_SCREEN_INVIEW:
	case JET_SCREEN_OUTVIEW:	return L"Screen";
	case JET_LINK_MOUSEUP:		return L"Link";	
	case JET_MENU_EXEC:			return L"Menu";
	case JET_PAGE_OPEN:
	case JET_PAGE_CLOSE:
	case JET_PAGE_INVIEW:
	case JET_PAGE_OUTVIEW:return L"Page";
	default:
		return L"";
	}

	return L"";
}

FX_BOOL& CJS_EventHandler::Rc()
{
	if (m_pbRc != NULL)
		return *m_pbRc;
	else
	{	    
		return m_bRcDu;
	}
}

int & CJS_EventHandler::SelEnd()
{
	if (m_pISelEnd != NULL)
	{
		return *m_pISelEnd;
	}
	else
	{
		return m_nSelEndDu;
	}
}

int & CJS_EventHandler::SelStart()
{
	if (m_pISelStart != NULL)
		return * m_pISelStart;
	else
	{
		return m_nSelStartDu;
	}
}

FX_BOOL CJS_EventHandler::Shift()
{
	return m_bShift;
}

Field* CJS_EventHandler::Source()
{
	ASSERT(m_pJSContext != NULL);

	CJS_Runtime* pRuntime = m_pJSContext->GetJSRuntime();

	JSFXObject  pDocObj = JS_NewFxDynamicObj(*pRuntime, m_pJSContext, JS_GetObjDefnID(*pRuntime, L"Document"));
	ASSERT(pDocObj.IsEmpty() == FALSE);
	JSFXObject  pFieldObj = JS_NewFxDynamicObj(*pRuntime, m_pJSContext, JS_GetObjDefnID(*pRuntime, L"Field"));
	ASSERT(pFieldObj.IsEmpty() == FALSE);

	CJS_Document* pJSDocument = (CJS_Document*)JS_GetPrivate(pDocObj);
	ASSERT(pJSDocument != NULL);
	Document* pDocument = (Document*)pJSDocument->GetEmbedObject();
	ASSERT(pDocument != NULL);
 	if (m_pTargetDoc != NULL)
 		pDocument->AttachDoc(m_pTargetDoc);
 	else
 		pDocument->AttachDoc(m_pJSContext->GetReaderDocument());
	
	//if (m_pSourceField == NULL)
	//	return NULL;
	//CRAO_Widget *pWidget = IBCL_Widget::GetWidget(m_pSourceField);
	//CPDF_FormField* pFormField = pWidget->GetFormField();
	//ASSERT(pFormField);
	//CFX_WideString csFieldName = pFormField->GetFullName();
	CJS_Field * pJSField = (CJS_Field*)JS_GetPrivate(pFieldObj);
	ASSERT(pJSField != NULL);
	Field * pField = (Field *)pJSField->GetEmbedObject(); 
	ASSERT(pField != NULL);
	pField->AttachField(pDocument, m_strSourceName);
	return pField;	
}

Field* CJS_EventHandler::Target_Field()
{
	ASSERT(m_pJSContext != NULL);

	CJS_Runtime* pRuntime = m_pJSContext->GetJSRuntime();

	JSFXObject pDocObj = JS_NewFxDynamicObj(*pRuntime, m_pJSContext, JS_GetObjDefnID(*pRuntime, L"Document"));
	ASSERT(pDocObj.IsEmpty() == FALSE);
	JSFXObject pFieldObj = JS_NewFxDynamicObj(*pRuntime, m_pJSContext, JS_GetObjDefnID(*pRuntime, L"Field"));
	ASSERT(pFieldObj.IsEmpty() == FALSE);

	CJS_Document* pJSDocument = (CJS_Document*)JS_GetPrivate(pDocObj);
	ASSERT(pJSDocument != NULL);
	Document* pDocument = (Document*)pJSDocument->GetEmbedObject();
 	ASSERT(pDocument != NULL);
 	if (m_pTargetDoc != NULL)
 		pDocument->AttachDoc(m_pTargetDoc);
 	else
 		pDocument->AttachDoc(m_pJSContext->GetReaderDocument());
	
	CJS_Field* pJSField = (CJS_Field*)JS_GetPrivate(pFieldObj);
	ASSERT(pJSField != NULL);

	Field* pField = (Field *)pJSField->GetEmbedObject(); 
	ASSERT(pField != NULL);

	pField->AttachField(pDocument, m_strTargetName);
	return pField;	
}

CFX_WideString& CJS_EventHandler::Value()
{
	return *m_pValue;
}

FX_BOOL CJS_EventHandler::WillCommit()
{
	return m_bWillCommit;
}

CFX_WideString CJS_EventHandler::TargetName()
{
	return m_strTargetName;
}


