// 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 _JS_VALUE_H_
#define _JS_VALUE_H_

class CJS_Array;
class CJS_Date;

class CJS_Value
{
public:
	CJS_Value(v8::Isolate* isolate);
	CJS_Value(v8::Isolate* isolate, v8::Handle<v8::Value> pValue,FXJSVALUETYPE t);
	CJS_Value(v8::Isolate* isolate, const int &iValue);
	CJS_Value(v8::Isolate* isolate, const double &dValue);
	CJS_Value(v8::Isolate* isolate, const float &fValue);	
	CJS_Value(v8::Isolate* isolate, const bool &bValue);
	CJS_Value(v8::Isolate* isolate, JSFXObject);
	CJS_Value(v8::Isolate* isolate, CJS_Object *);
	CJS_Value(v8::Isolate* isolate, FX_LPCSTR pStr);
	CJS_Value(v8::Isolate* isolate, FX_LPCWSTR pWstr);
	CJS_Value(v8::Isolate* isolate, CJS_Array& array);
	
	~CJS_Value();

	void SetNull();
    void Attach(v8::Handle<v8::Value> pValue,FXJSVALUETYPE t);
	void Attach(CJS_Value *pValue);
	void Detach();


	operator int() const;
	operator bool() const;
	operator double() const;
	operator float() const;
	operator CJS_Object *() const;
	//operator JSFXObject *() const;
	operator v8::Handle<v8::Object>() const;
	operator v8::Handle<v8::Array>() const;
	operator CFX_WideString() const;
	//operator FX_WCHAR *() const;
	operator CFX_ByteString() const;
	v8::Handle<v8::Value> ToJSValue();

	void operator = (int iValue);
	void operator = (bool bValue);	
	void operator = (double);	
	void operator = (float);	
	void operator = (CJS_Object *);	
	void operator = (v8::Handle<v8::Object>);
//	void operator = (JSObject *);
	void operator = (CJS_Array &);
	void operator = (CJS_Date &);
	void operator = (FX_LPCWSTR pWstr);	
	void operator = (FX_LPCSTR pStr);	
	void operator = (CJS_Value value);
	
	FX_BOOL IsArrayObject() const;
	FX_BOOL	IsDateObject() const;
	FXJSVALUETYPE GetType() const;

	FX_BOOL ConvertToArray(CJS_Array &) const;
	FX_BOOL ConvertToDate(CJS_Date &) const;

	v8::Isolate* GetIsolate() {return m_isolate;}
protected:	
	v8::Handle<v8::Value> m_pValue;
	FXJSVALUETYPE m_eType;
	v8::Isolate* m_isolate;
};

template<class TYPE> class CJS_ParametersTmpl : public CFX_ArrayTemplate<TYPE>
{
public:
	void push_back(TYPE newElement){CFX_ArrayTemplate<TYPE>::Add(newElement);}
	int size() const{return CFX_ArrayTemplate<TYPE>::GetSize();}
};
typedef CJS_ParametersTmpl<CJS_Value> CJS_Parameters;

class CJS_PropValue: public CJS_Value
{
public:
	CJS_PropValue(const CJS_Value &);
	CJS_PropValue(v8::Isolate* isolate);
	~CJS_PropValue();
public:
	FX_BOOL IsSetting();
	FX_BOOL IsGetting();
	void operator<<(int );
	void operator>>(int &) const;
	void operator<<(bool);
	void operator>>(bool &) const;
	void operator<<(double );
	void operator>>(double &) const;
	void operator<<(CJS_Object *pObj);
	void operator>>(CJS_Object *&ppObj) const;
	void operator<<(CFX_ByteString);
	void operator>>(CFX_ByteString &) const;
	void operator<<(CFX_WideString);
	void operator>>(CFX_WideString &) const;
	void operator<<(FX_LPCWSTR c_string);

	void operator<<(JSFXObject);
	void operator>>(JSFXObject &) const;

	void operator>>(CJS_Array &array) const;
	void operator<<(CJS_Array &array);

	void operator<<(CJS_Date &date);
	void operator>>(CJS_Date &date) const;

	operator v8::Handle<v8::Value>() const;

	void StartSetting();
	void StartGetting();
private:
	FX_BOOL m_bIsSetting;
};

class CJS_Array
{
public:
	CJS_Array(v8::Isolate* isolate);
	virtual ~CJS_Array();

	void Attach(v8::Handle<v8::Array> pArray);
	void GetElement(unsigned index,CJS_Value &value);
	void SetElement(unsigned index,CJS_Value value);
    int GetLength();
	FX_BOOL IsAttached();
	operator v8::Handle<v8::Array>();

	v8::Isolate* GetIsolate() {return m_isolate;}
private:
	v8::Handle<v8::Array> m_pArray;
	v8::Isolate* m_isolate;
};

class CJS_Date
{
friend class CJS_Value;
public:
	CJS_Date(v8::Isolate* isolate);
	CJS_Date(v8::Isolate* isolate,double dMsec_time);
	CJS_Date(v8::Isolate* isolate,int year, int mon, int day,int hour, int min, int sec);
	virtual ~CJS_Date();
	void Attach(v8::Handle<v8::Value> pDate);

	int     GetYear();
	void    SetYear(int iYear);

	int     GetMonth();
	void    SetMonth(int iMonth);

	int     GetDay();
	void    SetDay(int iDay);

	int     GetHours();
	void    SetHours(int iHours);

	int     GetMinutes();
	void    SetMinutes(int minutes);

	int     GetSeconds();
	void    SetSeconds(int seconds);

	operator v8::Handle<v8::Value>();
	operator double() const;

	CFX_WideString	ToString() const;

	static double	MakeDate(int year, int mon, int mday,int hour, int min, int sec,int ms);

	FX_BOOL	IsValidDate();

protected:
	v8::Handle<v8::Value> m_pDate;
	v8::Isolate* m_isolate;
};

#endif //_JS_VALUE_H_

