1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved.
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Use of this source code is governed by a BSD-style license that can be
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// found in the LICENSE file.
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../../core/include/fxcrt/fx_basic.h"
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../../core/include/fxcrt/fx_ext.h"
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/jsapi/fxjs_v8.h"
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/fsdk_define.h"
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "time.h"
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include <cmath>
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include <limits>
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define VALUE_NAME_STRING		L"string"
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define VALUE_NAME_NUMBER		L"number"
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define VALUE_NAME_BOOLEAN		L"boolean"
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define VALUE_NAME_DATE			L"date"
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define VALUE_NAME_OBJECT		L"object"
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define VALUE_NAME_FXOBJ		L"fxobj"
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define VALUE_NAME_NULL			L"null"
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define VALUE_NAME_UNDEFINED	L"undefined"
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic FX_DWORD g_nan[2] = {0,0x7FF80000 };
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovdouble g_NaN = (*(double *)g_nan);
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CJS_PrivateData: public CFX_Object
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CJS_PrivateData():ObjDefID(-1), pPrivate(NULL) {}
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	int ObjDefID;
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FX_LPVOID	pPrivate;
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CJS_ObjDefintion: public CFX_Object
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CJS_ObjDefintion(v8::Isolate* isolate, const wchar_t* sObjName, FXJSOBJTYPE eObjType, LP_CONSTRUCTOR pConstructor, LP_DESTRUCTOR pDestructor, unsigned bApplyNew):
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	  objName(sObjName), objType(eObjType), m_pConstructor(pConstructor), m_pDestructor(pDestructor),m_bApplyNew(bApplyNew),m_bSetAsGlobalObject(FALSE)
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	  {
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		  v8::Isolate::Scope isolate_scope(isolate);
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		  v8::HandleScope handle_scope(isolate);
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		  v8::Handle<v8::ObjectTemplate> objTemplate = v8::ObjectTemplate::New(isolate);
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		  objTemplate->SetInternalFieldCount(1);
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		  m_objTemplate.Reset(isolate, objTemplate);
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		 //Document as the global object.
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		  if(FXSYS_wcscmp(sObjName, L"Document") == 0)
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		  {
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			 m_bSetAsGlobalObject = TRUE;
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		  }
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	  }
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	  ~CJS_ObjDefintion()
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	  {
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		  m_objTemplate.Reset();
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		  m_StaticObj.Reset();
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	  }
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	const wchar_t* objName;
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FXJSOBJTYPE objType;
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	LP_CONSTRUCTOR m_pConstructor;
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	LP_DESTRUCTOR m_pDestructor;
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	unsigned m_bApplyNew;
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FX_BOOL	m_bSetAsGlobalObject;
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Persistent<v8::ObjectTemplate> m_objTemplate;
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Persistent<v8::Object> m_StaticObj;
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint JS_DefineObj(IJS_Runtime* pJSRuntime, const wchar_t* sObjName, FXJSOBJTYPE eObjType, LP_CONSTRUCTOR pConstructor, LP_DESTRUCTOR pDestructor, unsigned bApplyNew)
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate::Scope isolate_scope(isolate);
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::HandleScope handle_scope(isolate);
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(!pArray)
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pArray = FX_NEW CFX_PtrArray();
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		isolate->SetData(0, pArray);
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CJS_ObjDefintion* pObjDef = FX_NEW CJS_ObjDefintion(isolate, sObjName, eObjType, pConstructor, pDestructor, bApplyNew);
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pArray->Add(pObjDef);
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return pArray->GetSize()-1;
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint JS_DefineObjMethod(IJS_Runtime* pJSRuntime, int nObjDefnID, const wchar_t* sMethodName, v8::FunctionCallback pMethodCall, unsigned nParamNum)
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate::Scope isolate_scope(isolate);
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::HandleScope handle_scope(isolate);
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_WideString ws = CFX_WideString((FX_LPCWSTR)sMethodName);
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_ByteString bsMethodName = ws.UTF8Encode();
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(!pArray) return 0;
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return 0;
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID);
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Local<v8::ObjectTemplate> objTemp = v8::Local<v8::ObjectTemplate>::New(isolate, pObjDef->m_objTemplate);
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	objTemp->Set(v8::String::NewFromUtf8(isolate, FX_LPCSTR(bsMethodName)), v8::FunctionTemplate::New(isolate, pMethodCall), v8::ReadOnly);
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pObjDef->m_objTemplate.Reset(isolate,objTemp);
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return 0;
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint JS_DefineObjProperty(IJS_Runtime* pJSRuntime, int nObjDefnID, const wchar_t* sPropName, v8::AccessorGetterCallback pPropGet, v8::AccessorSetterCallback pPropPut)
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate::Scope isolate_scope(isolate);
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::HandleScope handle_scope(isolate);
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_WideString ws = CFX_WideString((FX_LPCWSTR)sPropName);
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_ByteString bsPropertyName = ws.UTF8Encode();
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(!pArray) return 0;
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return 0;
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID);
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Local<v8::ObjectTemplate> objTemp = v8::Local<v8::ObjectTemplate>::New(isolate, pObjDef->m_objTemplate);
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	objTemp->SetAccessor(v8::String::NewFromUtf8(isolate, FX_LPCSTR(bsPropertyName)), pPropGet, pPropPut);
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pObjDef->m_objTemplate.Reset(isolate,objTemp);
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return 0;
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint	JS_DefineObjAllProperties(IJS_Runtime* pJSRuntime, int nObjDefnID, v8::NamedPropertyQueryCallback pPropQurey, v8::NamedPropertyGetterCallback pPropGet, v8::NamedPropertySetterCallback pPropPut, v8::NamedPropertyDeleterCallback pPropDel)
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate::Scope isolate_scope(isolate);
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::HandleScope handle_scope(isolate);
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(!pArray) return 0;
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return 0;
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID);
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Local<v8::ObjectTemplate> objTemp = v8::Local<v8::ObjectTemplate>::New(isolate, pObjDef->m_objTemplate);
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	objTemp->SetNamedPropertyHandler(pPropGet, pPropPut, pPropQurey, pPropDel);
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pObjDef->m_objTemplate.Reset(isolate,objTemp);
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return 0;
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint JS_DefineObjConst(IJS_Runtime* pJSRuntime, int nObjDefnID, const wchar_t* sConstName, v8::Handle<v8::Value> pDefault)
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate::Scope isolate_scope(isolate);
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::HandleScope handle_scope(isolate);
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(!pArray) return 0;
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_WideString ws = CFX_WideString((FX_LPCWSTR)sConstName);
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_ByteString bsConstName = ws.UTF8Encode();
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return 0;
160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID);
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Local<v8::ObjectTemplate> objTemp = v8::Local<v8::ObjectTemplate>::New(isolate, pObjDef->m_objTemplate);
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	objTemp->Set(isolate, FX_LPCSTR(bsConstName), pDefault);
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pObjDef->m_objTemplate.Reset(isolate,objTemp);
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return 0;
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic v8::Persistent<v8::ObjectTemplate>& _getGlobalObjectTemplate(IJS_Runtime* pJSRuntime)
168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate::Scope isolate_scope(isolate);
171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::HandleScope handle_scope(isolate);
172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	ASSERT(pArray != NULL);
175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	for(int i=0; i<pArray->GetSize(); i++)
176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(i);
178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if(pObjDef->m_bSetAsGlobalObject)
179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return pObjDef->m_objTemplate;
180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static v8::Persistent<v8::ObjectTemplate> gloabalObjectTemplate;
182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return gloabalObjectTemplate;
183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint JS_DefineGlobalMethod(IJS_Runtime* pJSRuntime, const wchar_t* sMethodName, v8::FunctionCallback pMethodCall, unsigned nParamNum)
186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate::Scope isolate_scope(isolate);
189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::HandleScope handle_scope(isolate);
190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_WideString ws = CFX_WideString((FX_LPCWSTR)sMethodName);
192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_ByteString bsMethodName = ws.UTF8Encode();
193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Local<v8::FunctionTemplate> funTempl = v8::FunctionTemplate::New(isolate, pMethodCall);
195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Local<v8::ObjectTemplate> objTemp;
196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Persistent<v8::ObjectTemplate>& globalObjTemp = _getGlobalObjectTemplate(pJSRuntime);
198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(globalObjTemp.IsEmpty())
199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		objTemp = v8::ObjectTemplate::New(isolate);
200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	else
201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		objTemp = v8::Local<v8::ObjectTemplate>::New(isolate, globalObjTemp);
202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	objTemp->Set(v8::String::NewFromUtf8(isolate, FX_LPCSTR(bsMethodName)), funTempl, v8::ReadOnly);
203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	globalObjTemp.Reset(isolate,objTemp);
205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return 0;
207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint JS_DefineGlobalConst(IJS_Runtime* pJSRuntime, const wchar_t* sConstName, v8::Handle<v8::Value> pDefault)
210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate::Scope isolate_scope(isolate);
213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::HandleScope handle_scope(isolate);
214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_WideString ws = CFX_WideString((FX_LPCWSTR)sConstName);
216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_ByteString bsConst= ws.UTF8Encode();
217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Local<v8::ObjectTemplate> objTemp;
219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Persistent<v8::ObjectTemplate>& globalObjTemp = _getGlobalObjectTemplate(pJSRuntime);
221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(globalObjTemp.IsEmpty())
222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		objTemp = v8::ObjectTemplate::New(isolate);
223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	else
224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		objTemp = v8::Local<v8::ObjectTemplate>::New(isolate, globalObjTemp);
225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	objTemp->Set(v8::String::NewFromUtf8(isolate, FX_LPCSTR(bsConst)), pDefault, v8::ReadOnly);
226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	globalObjTemp.Reset(isolate,objTemp);
228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return 0;
230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid JS_InitialRuntime(IJS_Runtime* pJSRuntime,IFXJS_Runtime* pFXRuntime, IFXJS_Context* context, v8::Persistent<v8::Context>& v8PersistentContext)
234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate::Scope isolate_scope(isolate);
237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::HandleScope handle_scope(isolate);
238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Persistent<v8::ObjectTemplate>& globalObjTemp = _getGlobalObjectTemplate(pJSRuntime);
240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Handle<v8::Context> v8Context = v8::Context::New(isolate, NULL, v8::Local<v8::ObjectTemplate>::New(isolate, globalObjTemp));
241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Context::Scope context_scope(v8Context);
242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Handle<v8::External> ptr = v8::External::New(isolate, pFXRuntime);
244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8Context->SetEmbedderData(1, ptr);
245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(!pArray) return;
248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	for(int i=0; i<pArray->GetSize(); i++)
250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(i);
252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CFX_WideString ws = CFX_WideString(pObjDef->objName);
253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CFX_ByteString bs = ws.UTF8Encode();
254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		v8::Handle<v8::String> objName = v8::String::NewFromUtf8(isolate,(FX_LPCSTR)bs, v8::String::kNormalString, bs.GetLength());
255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if(pObjDef->objType == JS_DYNAMIC)
258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{
259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			//Document is set as global object, need to construct it first.
260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if(ws.Equal(L"Document"))
261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			{
262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				CJS_PrivateData* pPrivateData = FX_NEW CJS_PrivateData;
264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				pPrivateData->ObjDefID = i;
265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				v8::Handle<v8::External> ptr = v8::External::New(isolate, pPrivateData);
266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				v8Context->Global()->GetPrototype()->ToObject()->SetInternalField(0, ptr);
268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				if(pObjDef->m_pConstructor)
270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					pObjDef->m_pConstructor(context, v8Context->Global()->GetPrototype()->ToObject(), v8Context->Global()->GetPrototype()->ToObject());
271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		else
274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{
275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			v8::Handle<v8::Object> obj = JS_NewFxDynamicObj(pJSRuntime, context, i);
276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			v8Context->Global()->Set(objName, obj);
277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			pObjDef->m_StaticObj.Reset(isolate, obj);
278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8PersistentContext.Reset(isolate, v8Context);
281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid JS_ReleaseRuntime(IJS_Runtime* pJSRuntime, v8::Persistent<v8::Context>& v8PersistentContext)
284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate::Scope isolate_scope(isolate);
287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::HandleScope handle_scope(isolate);
288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate, v8PersistentContext);
289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Context::Scope context_scope(context);
290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(!pArray) return ;
293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	for(int i=0; i<pArray->GetSize(); i++)
295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(i);
297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if(!pObjDef->m_StaticObj.IsEmpty())
298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{
299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			v8::Local<v8::Object> pObj = v8::Local<v8::Object>::New(isolate, pObjDef->m_StaticObj);
300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if(pObjDef->m_pDestructor)
301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				pObjDef->m_pDestructor(pObj);
302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			JS_FreePrivate(pObj);
303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		delete pObjDef;
305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	delete pArray;
307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	isolate->SetData(0,NULL);
308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid JS_Initial()
311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef FOXIT_CHROME_BUILD
313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::V8::InitializeICU();
314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid JS_Release()
317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint JS_Parse(IJS_Runtime* pJSRuntime, IFXJS_Context* pJSContext, const wchar_t* script, long length, FXJSErr* perror)
321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate::Scope isolate_scope(isolate);
324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::TryCatch try_catch;
325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_WideString wsScript(script);
327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_ByteString bsScript = wsScript.UTF8Encode();
328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Handle<v8::Script> compiled_script = v8::Script::Compile(v8::String::NewFromUtf8(isolate,(FX_LPCSTR)bsScript,v8::String::kNormalString, bsScript.GetLength()));
331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (compiled_script.IsEmpty()) {
332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		v8::String::Utf8Value error(try_catch.Exception());
333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return -1;
334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return 0;
336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint JS_Execute(IJS_Runtime* pJSRuntime, IFXJS_Context* pJSContext, const wchar_t* script, long length, FXJSErr* perror)
339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate::Scope isolate_scope(isolate);
342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::TryCatch try_catch;
343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_WideString wsScript(script);
345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_ByteString bsScript = wsScript.UTF8Encode();
346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Handle<v8::Script> compiled_script = v8::Script::Compile(v8::String::NewFromUtf8(isolate,(FX_LPCSTR)bsScript,v8::String::kNormalString, bsScript.GetLength()));
348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (compiled_script.IsEmpty()) {
349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		v8::String::Utf8Value error(try_catch.Exception());
350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return -1;
351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Handle<v8::Value> result = compiled_script->Run();
354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (result.IsEmpty()) {
355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		v8::String::Utf8Value error(try_catch.Exception());
356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return -1;
357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return 0;
359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovv8::Handle<v8::Object> JS_NewFxDynamicObj(IJS_Runtime* pJSRuntime, IFXJS_Context* pJSContext, int nObjDefnID)
362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate::Scope isolate_scope(isolate);
365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(-1 == nObjDefnID)
366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		v8::Local<v8::ObjectTemplate> objTempl = v8::ObjectTemplate::New(isolate);
368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return objTempl->NewInstance();
369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(!pArray) return v8::Handle<v8::Object>();
373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return v8::Handle<v8::Object>();
376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID);
377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Local<v8::Context> context = isolate->GetCurrentContext();
379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Local<v8::ObjectTemplate> objTemp = v8::Local<v8::ObjectTemplate>::New(isolate, pObjDef->m_objTemplate);
380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Local<v8::Object> obj = objTemp->NewInstance();
382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CJS_PrivateData* pPrivateData = FX_NEW CJS_PrivateData;
384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pPrivateData->ObjDefID = nObjDefnID;
385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Handle<v8::External> ptr = v8::External::New(isolate, pPrivateData);
386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	obj->SetInternalField(0, ptr);
387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pObjDef->m_pConstructor)
389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pObjDef->m_pConstructor(pJSContext, obj, context->Global()->GetPrototype()->ToObject());
390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return obj;
392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovv8::Handle<v8::Object> JS_GetStaticObj(IJS_Runtime* pJSRuntime, int nObjDefnID)
395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate::Scope isolate_scope(isolate);
398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(!pArray) return v8::Handle<v8::Object>();
401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return v8::Handle<v8::Object>();
403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID);
404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Local<v8::Object> obj = v8::Local<v8::Object>::New(isolate,pObjDef->m_StaticObj);
405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return obj;
406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid JS_SetThisObj(IJS_Runtime* pJSRuntime, int nThisObjID)
409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	//Do nothing.
411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovv8::Handle<v8::Object>	JS_GetThisObj(IJS_Runtime * pJSRuntime)
413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	//Return the global object.
415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate::Scope isolate_scope(isolate);
417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(!pArray) return v8::Handle<v8::Object>();
420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Local<v8::Context> context = isolate->GetCurrentContext();
422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return context->Global()->GetPrototype()->ToObject();
423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint	JS_GetObjDefnID(v8::Handle<v8::Object> pObj)
426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pObj.IsEmpty() || !pObj->InternalFieldCount()) return -1;
428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(pObj->GetInternalField(0));
429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CJS_PrivateData* pPrivateData = (CJS_PrivateData*)field->Value();
430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pPrivateData)
431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return pPrivateData->ObjDefID;
432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return -1;
433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
435ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovIJS_Runtime* JS_GetRuntime(v8::Handle<v8::Object> pObj)
436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pObj.IsEmpty()) return NULL;
438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Local<v8::Context> context = pObj->CreationContext();
439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(context.IsEmpty()) return NULL;
440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return context->GetIsolate();
441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint JS_GetObjDefnID(IJS_Runtime * pJSRuntime, const wchar_t* pObjName)
444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate::Scope isolate_scope(isolate);
447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(!pArray) return -1;
450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	for(int i=0; i<pArray->GetSize(); i++)
452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(i);
454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if(FXSYS_wcscmp(pObjDef->objName, pObjName) == 0)
455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return i;
456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return -1;
458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid JS_Error(v8::Value * pError,const wchar_t * main,const wchar_t * sub)
461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovunsigned JS_CalcHash(const wchar_t* main, unsigned nLen)
466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return (unsigned)FX_HashCode_String_GetW(main, nLen);
468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovunsigned JS_CalcHash(const wchar_t* main)
471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return (unsigned)FX_HashCode_String_GetW(main, FXSYS_wcslen(main));
473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst wchar_t*	JS_GetTypeof(v8::Handle<v8::Value> pObj)
475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pObj.IsEmpty()) return NULL;
477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pObj->IsString())
478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return VALUE_NAME_STRING;
479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pObj->IsNumber())
480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return VALUE_NAME_NUMBER;
481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pObj->IsBoolean())
482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return VALUE_NAME_BOOLEAN;
483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pObj->IsDate())
484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return VALUE_NAME_DATE;
485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pObj->IsObject())
486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return VALUE_NAME_OBJECT;
487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pObj->IsNull())
488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return VALUE_NAME_NULL;
489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pObj->IsUndefined())
490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return VALUE_NAME_UNDEFINED;
491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return NULL;
492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst wchar_t*	JS_GetClassname(v8::Handle<v8::Object> pObj)
495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return NULL;
497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid JS_SetPrivate(v8::Handle<v8::Object> pObj, void* p)
500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	JS_SetPrivate(NULL, pObj, p);
502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid* JS_GetPrivate(v8::Handle<v8::Object> pObj)
505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return JS_GetPrivate(NULL,pObj);
507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid JS_SetPrivate(IJS_Runtime* pJSRuntime, v8::Handle<v8::Object> pObj, void* p)
510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pObj.IsEmpty() || !pObj->InternalFieldCount()) return;
512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Handle<v8::External> ptr = v8::Handle<v8::External>::Cast(pObj->GetInternalField(0));
513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CJS_PrivateData* pPrivateData  = (CJS_PrivateData*)ptr->Value();
514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(!pPrivateData) return;
515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pPrivateData->pPrivate = p;
516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid* JS_GetPrivate(IJS_Runtime* pJSRuntime, v8::Handle<v8::Object> pObj)
519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pObj.IsEmpty()) return NULL;
521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Local<v8::Value> value;
522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pObj->InternalFieldCount())
523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		value = pObj->GetInternalField(0);
524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	else
525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		//It could be a global proxy object.
527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		v8::Local<v8::Value> v = pObj->GetPrototype();
528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if(v->IsObject())
529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			value = v->ToObject()->GetInternalField(0);
530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(value.IsEmpty() || value->IsUndefined()) return NULL;
532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Handle<v8::External> ptr = v8::Handle<v8::External>::Cast(value);
533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CJS_PrivateData* pPrivateData  = (CJS_PrivateData*)ptr->Value();
534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(!pPrivateData) return NULL;
535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return pPrivateData->pPrivate;
536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid JS_FreePrivate(v8::Handle<v8::Object> pObj)
539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pObj.IsEmpty() || !pObj->InternalFieldCount()) return;
541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Handle<v8::External> ptr = v8::Handle<v8::External>::Cast(pObj->GetInternalField(0));
542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	delete (CJS_PrivateData*)ptr->Value();
543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Local<v8::Context> context = pObj->CreationContext();
544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pObj->SetInternalField(0, v8::External::New(context->GetIsolate(), NULL));
546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovv8::Handle<v8::Value> JS_GetObjectValue(v8::Handle<v8::Object> pObj)
550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return pObj;
552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovv8::Handle<v8::String> WSToJSString(IJS_Runtime* pJSRuntime, const wchar_t* PropertyName, int Len = -1)
555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_WideString ws = CFX_WideString(PropertyName,Len);
557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_ByteString bs = ws.UTF8Encode();
558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(!pJSRuntime) pJSRuntime = v8::Isolate::GetCurrent();
559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return v8::String::NewFromUtf8(pJSRuntime, (FX_LPCSTR)bs);
560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovv8::Handle<v8::Value> JS_GetObjectElement(IJS_Runtime* pJSRuntime, v8::Handle<v8::Object> pObj,const wchar_t* PropertyName)
563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pObj.IsEmpty()) return v8::Handle<v8::Value>();
565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return pObj->Get(WSToJSString(pJSRuntime,PropertyName));
566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovv8::Handle<v8::Array> JS_GetObjectElementNames(v8::Handle<v8::Object> pObj)
569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pObj.IsEmpty()) return v8::Handle<v8::Array>();
571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return pObj->GetPropertyNames();
572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid JS_PutObjectString(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, const wchar_t* sValue) //VT_string
575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pObj.IsEmpty()) return;
577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pObj->Set(WSToJSString(pJSRuntime, PropertyName), WSToJSString(pJSRuntime, sValue));
578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid JS_PutObjectNumber(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, int nValue)
581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pObj.IsEmpty()) return;
583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pObj->Set(WSToJSString(pJSRuntime,PropertyName),v8::Int32::New(pJSRuntime, nValue));
584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid JS_PutObjectNumber(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, float fValue)
587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pObj.IsEmpty()) return;
589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pObj->Set(WSToJSString(pJSRuntime,PropertyName),v8::Number::New(pJSRuntime, (double)fValue));
590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid JS_PutObjectNumber(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, double dValue)
593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pObj.IsEmpty()) return;
595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pObj->Set(WSToJSString(pJSRuntime,PropertyName),v8::Number::New(pJSRuntime, (double)dValue));
596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid JS_PutObjectBoolean(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, bool bValue)
599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pObj.IsEmpty()) return;
601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pObj->Set(WSToJSString(pJSRuntime,PropertyName),v8::Boolean::New(pJSRuntime, bValue));
602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid JS_PutObjectObject(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, v8::Handle<v8::Object> pPut)
605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pObj.IsEmpty()) return;
607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pObj->Set(WSToJSString(pJSRuntime,PropertyName),pPut);
608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid JS_PutObjectNull(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName)
611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pObj.IsEmpty()) return;
613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pObj->Set(WSToJSString(pJSRuntime,PropertyName),v8::Handle<v8::Object>());
614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovv8::Handle<v8::Array> JS_NewArray(IJS_Runtime* pJSRuntime)
617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return v8::Array::New(pJSRuntime);
619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovunsigned JS_PutArrayElement(v8::Handle<v8::Array> pArray,unsigned index,v8::Handle<v8::Value> pValue,FXJSVALUETYPE eType)
622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pArray.IsEmpty()) return 0;
624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pArray->Set(index, pValue);
625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return 1;
626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovv8::Handle<v8::Value> JS_GetArrayElemnet(v8::Handle<v8::Array> pArray,unsigned index)
629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pArray.IsEmpty()) return v8::Handle<v8::Value>();
631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return pArray->Get(index);
632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovunsigned JS_GetArrayLength(v8::Handle<v8::Array> pArray)
635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pArray.IsEmpty()) return 0;
637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return pArray->Length();
638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovv8::Handle<v8::Value> JS_NewNumber(IJS_Runtime* pJSRuntime,int number)
641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return v8::Int32::New(pJSRuntime, number);
643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovv8::Handle<v8::Value> JS_NewNumber(IJS_Runtime* pJSRuntime,double number)
646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return v8::Number::New(pJSRuntime, number);
648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovv8::Handle<v8::Value> JS_NewNumber(IJS_Runtime* pJSRuntime,float number)
651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return v8::Number::New(pJSRuntime, (float)number);
653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovv8::Handle<v8::Value> JS_NewBoolean(IJS_Runtime* pJSRuntime,bool b)
656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return v8::Boolean::New(pJSRuntime, b);
658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovv8::Handle<v8::Value> JS_NewObject(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj)
661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pObj.IsEmpty()) return v8::Handle<v8::Value>();
663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return pObj->Clone();
664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovv8::Handle<v8::Value> JS_NewObject2(IJS_Runtime* pJSRuntime,v8::Handle<v8::Array> pObj)
667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pObj.IsEmpty()) return v8::Handle<v8::Value>();
669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return pObj->Clone();
670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovv8::Handle<v8::Value> JS_NewString(IJS_Runtime* pJSRuntime,const wchar_t* string)
674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return WSToJSString(pJSRuntime, string);
676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovv8::Handle<v8::Value> JS_NewString(IJS_Runtime* pJSRuntime,const wchar_t* string, unsigned nLen)
679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return WSToJSString(pJSRuntime, string, nLen);
681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovv8::Handle<v8::Value> JS_NewNull()
684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return v8::Handle<v8::Value>();
686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovv8::Handle<v8::Value> JS_NewDate(IJS_Runtime* pJSRuntime,double d)
689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return v8::Date::New(pJSRuntime, d);
691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovv8::Handle<v8::Value> JS_NewValue(IJS_Runtime* pJSRuntime)
694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return v8::Handle<v8::Value>();
696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovv8::Handle<v8::Value> JS_GetListValue(v8::Handle<v8::Value> pList, int index)
699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(!pList.IsEmpty() && pList->IsObject())
702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		v8::Local<v8::Object> obj = pList->ToObject();
704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return obj->Get(index);
705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return v8::Handle<v8::Value>();
707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint	JS_ToInt32(v8::Handle<v8::Value> pValue)
710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pValue.IsEmpty()) return 0;
712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return pValue->ToInt32()->Value();
713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovbool JS_ToBoolean(v8::Handle<v8::Value> pValue)
716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pValue.IsEmpty()) return false;
718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return pValue->ToBoolean()->Value();
719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovdouble JS_ToNumber(v8::Handle<v8::Value> pValue)
722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pValue.IsEmpty()) return 0.0;
724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return pValue->ToNumber()->Value();
725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovv8::Handle<v8::Object> JS_ToObject(v8::Handle<v8::Value> pValue)
728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pValue.IsEmpty()) return v8::Handle<v8::Object>();
730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return pValue->ToObject();
731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
733ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_WideString	JS_ToString(v8::Handle<v8::Value> pValue)
734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pValue.IsEmpty()) return L"";
736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::String::Utf8Value s(pValue->ToString());
737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return CFX_WideString::FromUTF8(*s);
738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovv8::Handle<v8::Array> JS_ToArray(v8::Handle<v8::Value> pValue)
741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
742ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pValue.IsEmpty()) return v8::Handle<v8::Array>();
743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return v8::Handle<v8::Array>::Cast(pValue->ToObject());
744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid JS_ValueCopy(v8::Handle<v8::Value>& pTo, v8::Handle<v8::Value> pFrom)
747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pTo = pFrom;
749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//JavaScript time implement begin.
753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovdouble _getLocalTZA()
755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS))
757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return 0;
758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	time_t t = 0;
759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	time(&t);
760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	localtime(&t);
761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return (double)(-(timezone * 1000));
762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint _getDaylightSavingTA(double d)
765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS))
767ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return 0;
768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	time_t t = (time_t)(d/1000);
769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	struct tm * tmp = localtime(&t);
770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (tmp == NULL)
771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return 0;
772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (tmp->tm_isdst > 0)
773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		//One hour.
774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return (int)60*60*1000;
775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return 0;
776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovdouble _Mod(double x, double y)
779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	double r = fmod(x, y);
781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (r < 0) r += y;
782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return r;
783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint _isfinite(double v)
786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if _MSC_VER
788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return ::_finite(v);
789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
790ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return std::fabs(v) < std::numeric_limits<double>::max();
791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovdouble _toInteger(double n)
795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return (n >= 0)? FXSYS_floor(n): -FXSYS_floor(-n);
797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
798ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovbool _isLeapYear(int year)
800ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return (year%4==0)&&((year%100!=0)||(year%400!=0));
802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
804ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint _DayFromYear(int y)
805ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
806ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return (int)(365*(y - 1970.0) + FXSYS_floor((y - 1969.0)/4) - FXSYS_floor((y - 1901.0)/100)+FXSYS_floor((y - 1601.0)/400));
807ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
808ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
809ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovdouble _TimeFromYear(int y)
810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
811ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return  ((double)86400000) * _DayFromYear(y);
812ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
813ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
814ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovdouble _TimeFromYearMonth(int y, int m)
815ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
816ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static int daysMonth[12] ={ 0,31,59,90,120,151,181,212,243,273,304,334};
817ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	static int leapDaysMonth[12] = { 0,31,60,91,121,152,182,213,244,274,305,335};
818ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	int* pMonth = daysMonth;
819ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(_isLeapYear(y))
820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pMonth = leapDaysMonth;
821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return _TimeFromYear(y) + ((double)pMonth[m])*86400000;
822ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
823ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
824ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint _Day(double t)
825ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
826ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return (int)FXSYS_floor(t / 86400000);
827ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
828ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
829ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint _YearFromTime(double t)
830ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
831ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	//estimate the time.
832ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	int y = 1970 +(int)(t/(365.0*86400000));
833ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (_TimeFromYear(y) <= t)
834ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
835ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		while(_TimeFromYear(y+1) <= t) y++;
836ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
837ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	else
838ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		while(_TimeFromYear(y-1) > t) y--;
839ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return y;
840ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
841ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
842ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint _DayWithinYear(double t)
843ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
844ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	int year = _YearFromTime(t);
845ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	int day = _Day(t);
846ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return day-_DayFromYear(year);
847ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
848ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
849ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint _MonthFromTime(double t)
850ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
851ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	int day = _DayWithinYear(t);
852ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	int year = _YearFromTime(t);
853ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(0<=day && day <31)
854ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return 0;
855ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(31<=day && day< 59+_isLeapYear(year))
856ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return 1;
857ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if((59+_isLeapYear(year))<=day && day<(90+_isLeapYear(year)))
858ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return 2;
859ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if((90+_isLeapYear(year))<=day && day<(120+_isLeapYear(year)))
860ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return 3;
861ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if((120+_isLeapYear(year))<=day && day<(151+_isLeapYear(year)))
862ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return 4;
863ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if((151+_isLeapYear(year))<=day && day<(181+_isLeapYear(year)))
864ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return 5;
865ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if((181+_isLeapYear(year))<=day && day<(212+_isLeapYear(year)))
866ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return 6;
867ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if((212+_isLeapYear(year))<=day && day<(243+_isLeapYear(year)))
868ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return 7;
869ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if((243+_isLeapYear(year))<=day && day<(273+_isLeapYear(year)))
870ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return 8;
871ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if((273+_isLeapYear(year))<=day && day<(304+_isLeapYear(year)))
872ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return 9;
873ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if((304+_isLeapYear(year))<=day && day<(334+_isLeapYear(year)))
874ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return 10;
875ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if((334+_isLeapYear(year))<=day && day<(365+_isLeapYear(year)))
876ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return 11;
877ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
878ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return -1;
879ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
880ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
881ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint _DateFromTime(double t)
882ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
883ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	int day = _DayWithinYear(t);
884ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	int year = _YearFromTime(t);
885ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	bool leap = _isLeapYear(year);
886ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	int month = _MonthFromTime(t);
887ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	switch (month)
888ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
889ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case 0:
890ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return day+1;
891ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case 1:
892ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return day-30;
893ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case 2:
894ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return day-58-leap;
895ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case 3:
896ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return day-89-leap;
897ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case 4:
898ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return day-119-leap;
899ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case 5:
900ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return day-150-leap;
901ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case 6:
902ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return day-180-leap;
903ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case 7:
904ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return day-211-leap;
905ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case 8:
906ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return day-242-leap;
907ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case 9:
908ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return day-272-leap;
909ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case 10:
910ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return day-303-leap;
911ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case 11:
912ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return day-333-leap;
913ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	default:
914ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return 0;
915ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
916ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
917ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
918ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovdouble JS_GetDateTime()
919ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
920ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS))
921ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return 0;
922ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	time_t t = time(NULL);
923ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	struct tm* pTm = localtime(&t);
924ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
925ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	int year = pTm->tm_year+1900;
926ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	double t1 = _TimeFromYear(year);
927ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
928ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return t1 + pTm->tm_yday*86400000.0 + pTm->tm_hour*3600000.0+pTm->tm_min*60000.0+pTm->tm_sec*1000.0;
929ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
930ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
931ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint JS_GetYearFromTime(double dt)
932ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
933ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return _YearFromTime(dt);
934ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
935ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
936ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint JS_GetMonthFromTime(double dt)
937ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
938ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return _MonthFromTime(dt);
939ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
940ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
941ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint JS_GetDayFromTime(double dt)
942ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
943ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return _DateFromTime(dt);
944ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
945ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
946ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint JS_GetHourFromTime(double dt)
947ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
948ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return (int)_Mod(FXSYS_floor((double)(dt/(60*60*1000))), 24);
949ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
950ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
951ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint JS_GetMinFromTime(double dt)
952ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
953ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return (int)_Mod(FXSYS_floor((double)(dt/(60*1000))), 60);
954ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
955ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
956ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint JS_GetSecFromTime(double dt)
957ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
958ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return (int)_Mod(FXSYS_floor((double)(dt/1000)), 60);
959ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
960ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
961ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovdouble JS_DateParse(const wchar_t* string)
962ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
963ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate* pIsolate = v8::Isolate::GetCurrent();
964ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Isolate::Scope isolate_scope(pIsolate);
965ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::HandleScope scope(pIsolate);
966ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
967ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Local<v8::Context> context = pIsolate->GetCurrentContext();
968ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
969ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	//Use the built-in object method.
970ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	v8::Local<v8::Value> v = context->Global()->Get(v8::String::NewFromUtf8(pIsolate, "Date"));
971ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(v->IsObject())
972ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
973ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		v8::Local<v8::Object> o = v->ToObject();
974ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		v = o->Get(v8::String::NewFromUtf8(pIsolate, "parse"));
975ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if(v->IsFunction())
976ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{
977ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			v8::Local<v8::Function> funC = v8::Handle<v8::Function>::Cast(v);
978ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
979ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			const int argc = 1;
980ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			v8::Local<v8::String> timeStr = WSToJSString(pIsolate, string);
981ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			v8::Handle<v8::Value> argv[argc] = {timeStr};
982ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			v = funC->Call(context->Global(), argc, argv);
983ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if(v->IsNumber())
984ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			{
985ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				double date =  v->ToNumber()->Value();
986ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				if(!_isfinite(date)) return date;
987ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				return date + _getLocalTZA() + _getDaylightSavingTA(date);
988ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
989ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
990ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
991ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
992ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return 0;
993ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
994ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
995ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovdouble JS_MakeDay(int nYear, int nMonth, int nDate)
996ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
997ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!_isfinite(nYear) || !_isfinite(nMonth) ||!_isfinite(nDate))
998ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return g_NaN;
999ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	double y = _toInteger(nYear);
1000ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	double m = _toInteger(nMonth);
1001ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	double dt = _toInteger(nDate);
1002ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	double ym = y + FXSYS_floor((double)m/12);
1003ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	double mn = _Mod(m ,12);
1004ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1005ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	double t = _TimeFromYearMonth((int)ym,(int)mn);
1006ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1007ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (_YearFromTime(t) != ym || _MonthFromTime(t) != mn ||_DateFromTime(t) != 1)
1008ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return g_NaN;
1009ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return _Day(t)+dt-1;
1010ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1011ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1012ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovdouble JS_MakeTime(int nHour, int nMin, int nSec, int nMs)
1013ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1014ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!_isfinite(nHour) ||!_isfinite(nMin) ||!_isfinite(nSec) ||!_isfinite(nMs))
1015ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return g_NaN;
1016ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1017ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	double h = _toInteger(nHour);
1018ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	double m = _toInteger(nMin);
1019ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	double s = _toInteger(nSec);
1020ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	double milli = _toInteger(nMs);
1021ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1022ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return h * 3600000 + m * 60000 + s * 1000 + milli;
1023ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1024ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1025ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovdouble JS_MakeDate(double day, double time)
1026ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1027ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!_isfinite(day) ||!_isfinite(time))
1028ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return g_NaN;
1029ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1030ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return day * 86400000 + time;
1031ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1032ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1033ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovbool JS_PortIsNan(double d)
1034ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1035ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return d != d;
1036ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1037ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1038ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovdouble JS_LocalTime(double d)
1039ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1040ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return JS_GetDateTime() + _getDaylightSavingTA(d);
1041ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1042ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
1043ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//JavaScript time implement End.
1044