diff --git a/fpdfsdk/src/javascript/Document.cpp b/fpdfsdk/src/javascript/Document.cpp
index bf9f07c..2bf4f5e 100644
--- a/fpdfsdk/src/javascript/Document.cpp
+++ b/fpdfsdk/src/javascript/Document.cpp
@@ -326,7 +326,7 @@
 
 	if (params.size() < 1) return FALSE;
 
-	CFX_WideString wideName = params[0].operator CFX_WideString();
+	CFX_WideString wideName = params[0].ToCFXWideString();
 
 	CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm();
 	ASSERT(pInterForm != NULL);
@@ -364,7 +364,7 @@
 {
 	ASSERT(m_pDocument != NULL);
 
-	int nIndex = params.size() > 0 ? (int)params[0] : -1;
+	int nIndex = params.size() > 0 ? params[0].ToInt() : -1;
 	if (nIndex == -1) return FALSE;
 
 	CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm();
@@ -412,12 +412,12 @@
 
 	int iLength = params.size();
 
-	FX_BOOL bUI = iLength > 0 ? (FX_BOOL)params[0] : TRUE;
-	CFX_WideString cTo = iLength > 1 ? (FX_LPCWSTR)params[1].operator CFX_WideString() : L"";
-	CFX_WideString cCc = iLength > 2 ? (FX_LPCWSTR)params[2].operator CFX_WideString() : L"";
-	CFX_WideString cBcc = iLength > 3 ? (FX_LPCWSTR)params[3].operator CFX_WideString() : L"";
-	CFX_WideString cSubject = iLength > 4 ? (FX_LPCWSTR)params[4].operator CFX_WideString() : L"";
-	CFX_WideString cMsg = iLength > 5 ? (FX_LPCWSTR)params[5].operator CFX_WideString() : L"";
+	FX_BOOL bUI = iLength > 0 ? params[0].ToBool() : TRUE;
+	CFX_WideString cTo = iLength > 1 ? params[1].ToCFXWideString() : L"";
+	CFX_WideString cCc = iLength > 2 ? params[2].ToCFXWideString() : L"";
+	CFX_WideString cBcc = iLength > 3 ? params[3].ToCFXWideString() : L"";
+	CFX_WideString cSubject = iLength > 4 ? params[4].ToCFXWideString() : L"";
+	CFX_WideString cMsg = iLength > 5 ? params[5].ToCFXWideString() : L"";
 
 	CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
 	ASSERT(pInterForm != NULL);
@@ -460,11 +460,11 @@
 	{
 		if (params[8].GetType() == VT_fxobject)
 		{
-			JSFXObject pObj = (JSFXObject)params[8];
+			JSFXObject pObj = params[8].ToV8Object();
 			{
 				if (JS_GetObjDefnID(pObj) == JS_GetObjDefnID(*pRuntime, L"PrintParamsObj"))
 				{
-					if (CJS_Object* pJSObj = (CJS_Object*)params[8])
+					if (CJS_Object* pJSObj = params[8].ToCJSObject())
 					{
 							if (PrintParamsObj* pprintparamsObj = (PrintParamsObj*)pJSObj->GetEmbedObject())
 							{
@@ -485,21 +485,21 @@
 	else
 	{
 		if(nlength >= 1)
-			 bUI = params[0];
+			bUI = params[0].ToBool();
 		if(nlength >= 2)
-			 nStart = (int)params[1];
+			nStart = params[1].ToInt();
 		if(nlength >= 3)
-			nEnd = (int)params[2];
+			nEnd = params[2].ToInt();
 		if(nlength >= 4)
-			bSilent = params[3];
+			bSilent = params[3].ToBool();
 		if(nlength >= 5)
-			bShrinkToFit = params[4];
+			bShrinkToFit = params[4].ToBool();
 		if(nlength >= 6)
-			bPrintAsImage = params[5];
+			bPrintAsImage = params[5].ToBool();
 		if(nlength >= 7)
-			bReverse = params[6];
+			bReverse = params[6].ToBool();
 		if(nlength >= 8)
-			bAnnotations = params[7];
+			bAnnotations = params[7].ToBool();
 	}
 
 	ASSERT(m_pDocument != NULL);
@@ -526,7 +526,7 @@
 	if (params.size() < 1)
 		return TRUE;
 
-	CFX_WideString sFieldName = params[0].operator CFX_WideString();
+	CFX_WideString sFieldName = params[0].ToCFXWideString();
 
 	CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
 	ASSERT(pInterForm != NULL);
@@ -592,7 +592,7 @@
 		switch (params[0].GetType())
 		{
 		default:
-			aName.Attach(params[0]);
+			aName.Attach(params[0].ToV8Array());
 			break;
 		case VT_string:
 			aName.SetElement(0,params[0]);
@@ -605,7 +605,7 @@
 		{
 			CJS_Value valElement(isolate);
 			aName.GetElement(i,valElement);
-			CFX_WideString swVal = valElement.operator CFX_WideString();
+			CFX_WideString swVal = valElement.ToCFXWideString();
 
 			for (int j=0,jsz=pPDFForm->CountFields(swVal); j<jsz; j++)
 			{
@@ -656,26 +656,26 @@
 	CJS_Value v = params[0];
 	if (v.GetType() == VT_string)
 	{
-		strURL = params[0].operator CFX_WideString();
+		strURL = params[0].ToCFXWideString();
 		if (nSize > 1)
-			bFDF = params[1];
+			bFDF = params[1].ToBool();
 		if (nSize > 2)
-			bEmpty = params[2];
+			bEmpty = params[2].ToBool();
 		if (nSize > 3)
-			aFields.Attach(params[3]);
+			aFields.Attach(params[3].ToV8Array());
 	}
 	else if (v.GetType() == VT_object)
 	{
-		JSObject pObj = (JSObject)params[0];
-		v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj, L"cURL");
+		JSObject pObj = params[0].ToV8Object();
+		v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate, pObj, L"cURL");
 		if (!pValue.IsEmpty())
-			strURL = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue));
-		pValue = JS_GetObjectElement(isolate,pObj, L"bFDF");
-			bFDF = CJS_Value(isolate,pValue, GET_VALUE_TYPE(pValue));
-		pValue = JS_GetObjectElement(isolate,pObj, L"bEmpty");
-			bEmpty = CJS_Value(isolate,pValue, GET_VALUE_TYPE(pValue));
-		pValue = JS_GetObjectElement(isolate,pObj,L"aFields");
-			aFields.Attach(CJS_Value(isolate,pValue, GET_VALUE_TYPE(pValue)));
+			strURL = CJS_Value(isolate, pValue, GET_VALUE_TYPE(pValue)).ToCFXWideString();
+		pValue = JS_GetObjectElement(isolate, pObj, L"bFDF");
+		bFDF = CJS_Value(isolate, pValue, GET_VALUE_TYPE(pValue)).ToBool();
+		pValue = JS_GetObjectElement(isolate, pObj, L"bEmpty");
+		bEmpty = CJS_Value(isolate, pValue, GET_VALUE_TYPE(pValue)).ToBool();
+		pValue = JS_GetObjectElement(isolate, pObj,L"aFields");
+		aFields.Attach(CJS_Value(isolate, pValue, GET_VALUE_TYPE(pValue)).ToV8Array());
 	}
 
 	CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
@@ -710,7 +710,7 @@
 		{
 			CJS_Value valName(isolate);
 			aFields.GetElement(i, valName);
-			CFX_WideString sName = valName.operator CFX_WideString();
+			CFX_WideString sName = valName.ToCFXWideString();
 
 			CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
 			ASSERT(pPDFForm != NULL);
@@ -781,37 +781,42 @@
 	CFX_WideString cSubject = L"";
 	CFX_WideString cMsg = L"";
 
-
-	bUI = params.size()>=1?static_cast<FX_BOOL>(params[0]):TRUE;
-	cTo = params.size()>=2?(const wchar_t*)params[1].operator CFX_WideString():L"";
-	cCc = params.size()>=3?(const wchar_t*)params[2].operator CFX_WideString():L"";
-	cBcc = params.size()>=4?(const wchar_t*)params[3].operator CFX_WideString():L"";
-	cSubject = params.size()>=5?(const wchar_t*)params[4].operator CFX_WideString():L"";
-	cMsg = params.size()>=6?(const wchar_t*)params[5].operator CFX_WideString():L"";
+	if (params.size() >= 1)
+		bUI = params[0].ToBool();
+	if (params.size() >= 2)
+		cTo = params[1].ToCFXWideString();
+	if (params.size() >= 3)
+		cCc = params[2].ToCFXWideString();
+	if (params.size() >= 4)
+		cBcc = params[3].ToCFXWideString();
+	if (params.size() >= 5)
+		cSubject = params[4].ToCFXWideString();
+	if (params.size() >= 6)
+		cMsg = params[5].ToCFXWideString();
 
 	v8::Isolate* isolate = GetIsolate(cc);
 
-	if(params.size()>=1 && params[0].GetType() == VT_object)
+	if(params.size() >= 1 && params[0].GetType() == VT_object)
 	{
-		JSObject  pObj = (JSObject )params[0];
+		JSObject pObj = params[0].ToV8Object();
 
 		v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj, L"bUI");
-			bUI = (int)CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue));
+		bUI = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).ToInt();
 
 		pValue = JS_GetObjectElement(isolate,pObj, L"cTo");
-			cTo = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+		cTo = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).ToCFXWideString();
 
 		pValue = JS_GetObjectElement(isolate,pObj, L"cCc");
-			cCc = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+		cCc = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).ToCFXWideString();
 
 		pValue = JS_GetObjectElement(isolate,pObj, L"cBcc");
-			cBcc = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+		cBcc = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).ToCFXWideString();
 
 		pValue = JS_GetObjectElement(isolate,pObj, L"cSubject");
-			cSubject = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+		cSubject = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).ToCFXWideString();
 
 		pValue = JS_GetObjectElement(isolate,pObj, L"cMsg");
-			cMsg = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+		cMsg = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).ToCFXWideString();
 
 	}
 
@@ -1459,12 +1464,12 @@
 	CJS_Runtime* pRuntime = pContext->GetJSRuntime();
 	ASSERT(pRuntime != NULL);
 
-	CFX_WideString swIconName = params[0].operator CFX_WideString();
+	CFX_WideString swIconName = params[0].ToCFXWideString();
 
-	JSFXObject pJSIcon = (JSFXObject)params[1];
+	JSFXObject pJSIcon = params[1].ToV8Object();
 	if (JS_GetObjDefnID(pJSIcon) != JS_GetObjDefnID(*pRuntime, L"Icon")) return FALSE;
 
-	CJS_EmbedObj* pEmbedObj = ((CJS_Object*)params[1])->GetEmbedObject();
+	CJS_EmbedObj* pEmbedObj = params[1].ToCJSObject()->GetEmbedObject();
 	if (!pEmbedObj)return FALSE;
 	Icon* pIcon = (Icon*)pEmbedObj;
 
@@ -1527,7 +1532,7 @@
 	if (params.size() != 1)return FALSE;
 	if(!m_pIconTree)
 		return FALSE;
-	CFX_WideString swIconName = params[0].operator CFX_WideString();
+	CFX_WideString swIconName = params[0].ToCFXWideString();
 	int iIconCounts = m_pIconTree->GetLength();
 
 	CJS_Context* pContext = (CJS_Context *)cc;
@@ -1563,7 +1568,7 @@
 	if (params.size() != 1)return FALSE;
 	if(!m_pIconTree)
 		return FALSE;
-	CFX_WideString swIconName = params[0].operator CFX_WideString();
+	CFX_WideString swIconName = params[0].ToCFXWideString();
 	return TRUE;
 }
 
@@ -1603,9 +1608,9 @@
 
 	if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;
 
-	int nPageNo = params.GetSize() > 0 ? (int)params[0] : 0;
-	int nWordNo = params.GetSize() > 1 ? (int)params[1] : 0;
-	bool bStrip = params.GetSize() > 2 ? (bool)params[2] : true;
+	int nPageNo = params.GetSize() > 0 ? params[0].ToInt() : 0;
+	int nWordNo = params.GetSize() > 1 ? params[1].ToInt() : 0;
+	bool bStrip = params.GetSize() > 2 ? params[2].ToBool() : true;
 
 	CPDF_Document* pDocument = m_pDocument->GetDocument()->GetPDFDoc();
 	if (!pDocument) return FALSE;
@@ -1675,7 +1680,7 @@
 
 	if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;
 
-	int nPageNo = params.GetSize() > 0 ? (int)params[0] : 0;
+	int nPageNo = params.GetSize() > 0 ? params[0].ToInt() : 0;
 
 	CPDF_Document* pDocument = m_pDocument->GetDocument()->GetPDFDoc();
 	ASSERT(pDocument != NULL);
@@ -1847,22 +1852,22 @@
 	{
 		if (params[0].GetType() == VT_object)
 		{
-			JSObject  pObj = (JSObject )params[0];
-			v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj, L"nStart");
-				nStart = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));
+			JSObject pObj = params[0].ToV8Object();
+			v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate, pObj, L"nStart");
+            nStart = CJS_Value(m_isolate, pValue, GET_VALUE_TYPE(pValue)).ToInt();
 
-			pValue = JS_GetObjectElement(isolate,pObj, L"nEnd");
-				nEnd = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));
+			pValue = JS_GetObjectElement(isolate, pObj, L"nEnd");
+			nEnd = CJS_Value(m_isolate, pValue, GET_VALUE_TYPE(pValue)).ToInt();
 		}
 		else
 		{
-			nStart = (int)params[0];
+			nStart = params[0].ToInt();
 		}
 	}
 	else
 	{
-		nStart = (int)params[0];
-		nEnd = (int)params[1];
+		nStart = params[0].ToInt();
+		nEnd = params[1].ToInt();
 	}
 
 	int nTotal = m_pDocument->GetPageCount();
diff --git a/fpdfsdk/src/javascript/Field.cpp b/fpdfsdk/src/javascript/Field.cpp
index 94c5439..8f20ec8 100644
--- a/fpdfsdk/src/javascript/Field.cpp
+++ b/fpdfsdk/src/javascript/Field.cpp
@@ -1072,7 +1072,7 @@
 			for (int i=0,sz=SelArray.GetLength(); i<sz; i++)
 			{
 				SelArray.GetElement(i,SelValue);
-				iSelecting = (FX_INT32)SelValue;
+				iSelecting = SelValue.ToInt();
 				array.Add(iSelecting);
 			}
 		}
@@ -2375,10 +2375,10 @@
 		rcArray.GetElement(3, Lower_Righty);
 
 		FX_FLOAT pArray[4] = {0.0f,0.0f,0.0f,0.0f};
-		pArray[0] = (FX_FLOAT)(FX_INT32)Upper_Leftx;
-		pArray[1] = (FX_FLOAT)(FX_INT32)Lower_Righty;
-		pArray[2] = (FX_FLOAT)(FX_INT32)Lower_Rightx;
-		pArray[3] = (FX_FLOAT)(FX_INT32)Upper_Lefty;
+		pArray[0] = (FX_FLOAT)Upper_Leftx.ToInt();
+		pArray[1] = (FX_FLOAT)Lower_Righty.ToInt();
+		pArray[2] = (FX_FLOAT)Lower_Rightx.ToInt();
+		pArray[3] = (FX_FLOAT)Upper_Lefty.ToInt();
 
 		CPDF_Rect crRect(pArray);
 
@@ -3085,7 +3085,7 @@
 			{
 				CJS_Value ElementValue(m_isolate);
 				ValueArray.GetElement(i, ElementValue);
-				strArray.Add(ElementValue.operator CFX_WideString());
+				strArray.Add(ElementValue.ToCFXWideString());
 			}
 		}
 		else
@@ -3149,7 +3149,7 @@
 					{
 						iIndex = pFormField->GetSelectedIndex(i);
 						ElementValue = pFormField->GetOptionValue(iIndex);
-						if (FXSYS_wcslen((FX_LPCWSTR)ElementValue.operator CFX_WideString()) == 0)
+						if (FXSYS_wcslen(ElementValue.ToCFXWideString().c_str()) == 0)
 							ElementValue = pFormField->GetOptionLabel(iIndex);
 						ValueArray.SetElement(i, ElementValue);
 					}
@@ -3374,8 +3374,8 @@
 
 	int nface = 0;
 	int iSize = params.size();
-	if ( iSize >= 1)
-		nface = (FX_INT32) params[0];
+	if (iSize >= 1)
+		nface = params[0].ToInt();
 
 	CFX_PtrArray FieldArray;
 	GetFormFields(m_FieldName,FieldArray);
@@ -3410,8 +3410,8 @@
 
 	int nface = 0;
 	int iSize = params.size();
-	if ( iSize >= 1)
-		nface = (FX_INT32) params[0];
+	if (iSize >= 1)
+		nface = params[0].ToInt();
 	
 	CFX_PtrArray FieldArray;
 	GetFormFields(m_FieldName,FieldArray);
@@ -3519,15 +3519,14 @@
 	if (!m_bCanSet) return FALSE;
 
 	int iSize = params.size();
-	int nWidget = -1;
-	if ( iSize >= 1)
-		nWidget= (FX_INT32) params[0];
-	else
+	if (iSize < 1)
 		return FALSE;
-	FX_BOOL bCheckit = TRUE;
-	if ( iSize >= 2)
-		bCheckit = params[1];
 
+	int nWidget = params[0].ToInt();
+
+	FX_BOOL bCheckit = TRUE;
+	if (iSize >= 2)
+		bCheckit = params[1].ToBool();
 
 	CFX_PtrArray FieldArray;
 	GetFormFields(m_FieldName,FieldArray);
@@ -3535,9 +3534,9 @@
 
 	CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
 	ASSERT(pFormField != NULL);
-	
+
 	if (pFormField->GetFieldType() != FIELDTYPE_CHECKBOX && pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON)
-		return FALSE;	
+		return FALSE;
 	if(nWidget <0 || nWidget >= pFormField->CountControls())
 		return FALSE;
 	if (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON)
@@ -3546,7 +3545,6 @@
 		pFormField->CheckControl(nWidget, bCheckit, TRUE);
 
 	UpdateFormField(m_pDocument, pFormField, TRUE, TRUE, TRUE);
-
 	return TRUE;
 }
 
@@ -3562,14 +3560,10 @@
 	if (!m_bCanSet) return FALSE;
 
 	int iSize = params.size();
-	int nWidget = -1;
-	if ( iSize >= 1)
-		nWidget= (FX_INT32) params[0];
-	else
+	if (iSize < 1)
 		return FALSE;
-	//FX_BOOL bIsDefaultChecked = TRUE;
-	//if ( iSize >= 2)
-	//	bIsDefaultChecked =  params[1];
+
+	int nWidget = params[0].ToInt();
 
 	CFX_PtrArray FieldArray;
 	GetFormFields(m_FieldName,FieldArray);
@@ -3665,16 +3659,15 @@
 FX_BOOL Field::getItemAt(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
 	ASSERT(m_pDocument != NULL);
+	int iSize = params.size();
 
 	int nIdx = -1;
-	if (params.size() >=1)
-		nIdx = (FX_INT32) params[0];
+	if (iSize >= 1)
+		nIdx = params[0].ToInt();
+
 	FX_BOOL bExport = TRUE;
-	int iSize = params.size();
-	if ( iSize >= 2)
-	{
-		bExport =(FX_BOOL) params[1];
-	}
+	if (iSize >= 2)
+		bExport = params[1].ToBool();
 
 	CFX_PtrArray FieldArray;
 	GetFormFields(m_FieldName,FieldArray);
@@ -3720,8 +3713,8 @@
 	ASSERT(m_pDocument != NULL);
 
 	int nIndex = -1;
-	if (params.size() >=1)
-		nIndex = (FX_INT32) params[0];
+	if (params.size() >= 1)
+		nIndex = params[0].ToInt();
 
 	CFX_PtrArray FieldArray;
 	GetFormFields(m_FieldName,FieldArray);
@@ -3755,8 +3748,8 @@
 	ASSERT(m_pDocument != NULL);
 
 	int nIndex = -1;
-	if (params.size() >=1)
-		nIndex = (FX_INT32) params[0];
+	if (params.size() >= 1)
+		nIndex = params[0].ToInt();
 
 	CFX_PtrArray FieldArray;
 	GetFormFields(m_FieldName,FieldArray);
diff --git a/fpdfsdk/src/javascript/JS_Value.cpp b/fpdfsdk/src/javascript/JS_Value.cpp
index 6743daa..be37489 100644
--- a/fpdfsdk/src/javascript/JS_Value.cpp
+++ b/fpdfsdk/src/javascript/JS_Value.cpp
@@ -85,7 +85,7 @@
 void CJS_Value::Attach(CJS_Value *pValue)
 {
 	if (pValue)
-		Attach(pValue->ToJSValue(),pValue->GetType());
+		Attach(pValue->ToV8Value(), pValue->GetType());
 }
 
 void CJS_Value::Detach()
@@ -96,63 +96,53 @@
 
 /* ---------------------------------------------------------------------------------------- */
 
-CJS_Value::operator int() const
+int CJS_Value::ToInt() const
 {
-
 	return JS_ToInt32(m_pValue);
-
 }
 
-CJS_Value::operator bool() const
+bool CJS_Value::ToBool() const
 {
-
 	return JS_ToBoolean(m_pValue);
-	
 }
 
-CJS_Value::operator double() const
+double CJS_Value::ToDouble() const
 {
-
 	return JS_ToNumber(m_pValue);
-	
 }
 
-CJS_Value::operator float() const
+float CJS_Value::ToFloat() const
 {
-
-	return (float)JS_ToNumber(m_pValue);
-
+	return (float)ToDouble();
 }
 
-CJS_Value::operator CJS_Object *() const
+CJS_Object* CJS_Value::ToCJSObject() const
 {
-
 	v8::Handle<v8::Object>	pObj = JS_ToObject(m_pValue);
 	return (CJS_Object*)JS_GetPrivate(m_isolate, pObj);
 }
 
-CJS_Value::operator v8::Handle<v8::Object>() const
+v8::Handle<v8::Object> CJS_Value::ToV8Object() const
 {
 	return JS_ToObject(m_pValue);
 }
 
-CJS_Value::operator CFX_WideString() const
+CFX_WideString CJS_Value::ToCFXWideString() const
 {
 	return JS_ToString(m_pValue);
 }
 
-CJS_Value::operator CFX_ByteString() const
+CFX_ByteString CJS_Value::ToCFXByteString() const
 {
-	return CFX_ByteString::FromUnicode(operator CFX_WideString());
+	return CFX_ByteString::FromUnicode(ToCFXWideString());
 }
 
-v8::Handle<v8::Value> CJS_Value::ToJSValue()
+v8::Handle<v8::Value> CJS_Value::ToV8Value() const
 {
 	return m_pValue;
 }
 
-
-CJS_Value::operator v8::Handle<v8::Array>() const
+v8::Handle<v8::Array>CJS_Value::ToV8Array() const
 {
 	if (IsArrayObject())
 		return v8::Handle<v8::Array>::Cast(JS_ToObject(m_pValue));
@@ -245,7 +235,7 @@
 
 void CJS_Value::operator = (CJS_Value value)
 {
-	m_pValue = value.ToJSValue();
+	m_pValue = value.ToV8Value();
 
 	m_eType = value.m_eType;
 }
@@ -342,7 +332,7 @@
 void CJS_PropValue::operator >>(int & iValue) const
 {
 	ASSERT(m_bIsSetting);
-	iValue = CJS_Value::operator int();
+	iValue = CJS_Value::ToInt();
 }
 
 
@@ -355,8 +345,7 @@
 void CJS_PropValue::operator >>(bool& bValue) const
 {
 	ASSERT(m_bIsSetting);
-	bValue = CJS_Value::operator bool();
-
+	bValue = CJS_Value::ToBool();
 }
 
 void CJS_PropValue::operator <<(double dValue)
@@ -368,7 +357,7 @@
 void CJS_PropValue::operator >>(double& dValue) const
 {
 	ASSERT(m_bIsSetting);
-	dValue = CJS_Value::operator double();
+	dValue = CJS_Value::ToDouble();
 }
 
 void CJS_PropValue::operator <<(CJS_Object* pObj)
@@ -380,7 +369,7 @@
 void CJS_PropValue::operator >>(CJS_Object*& ppObj) const
 {
 	ASSERT(m_bIsSetting);
-	ppObj = CJS_Value::operator CJS_Object *();
+	ppObj = CJS_Value::ToCJSObject();
 }
 
 void CJS_PropValue::operator <<(CJS_Document* pJsDoc)
@@ -392,7 +381,7 @@
 void CJS_PropValue::operator >>(CJS_Document*& ppJsDoc) const
 {
 	ASSERT(m_bIsSetting);
-	ppJsDoc = static_cast<CJS_Document*>(CJS_Value::operator CJS_Object *());
+	ppJsDoc = static_cast<CJS_Document*>(CJS_Value::ToCJSObject());
 }
 
 void CJS_PropValue::operator<<(JSFXObject pObj)
@@ -404,7 +393,7 @@
 void CJS_PropValue::operator>>(JSFXObject &ppObj) const
 {
 	ASSERT(m_bIsSetting);
-	ppObj = CJS_Value::operator JSFXObject ();
+	ppObj = CJS_Value::ToV8Object();
 }
 
 
@@ -426,7 +415,7 @@
 void CJS_PropValue::operator >>(CFX_ByteString &string) const
 {
 	ASSERT(m_bIsSetting);
-	string = CJS_Value::operator CFX_ByteString();
+	string = CJS_Value::ToCFXByteString();
 }
 
 void CJS_PropValue::operator <<(FX_LPCWSTR c_string)
@@ -438,7 +427,7 @@
 void CJS_PropValue::operator >>(CFX_WideString &wide_string) const
 {
 	ASSERT(m_bIsSetting);
-	wide_string = CJS_Value::operator CFX_WideString();
+	wide_string = CJS_Value::ToCFXWideString();
 }
 
 void CJS_PropValue::operator <<(CFX_WideString wide_string)
@@ -508,7 +497,7 @@
 	if (m_pArray.IsEmpty())
 		m_pArray = JS_NewArray(m_isolate);
 
-	JS_PutArrayElement(m_pArray,index,value.ToJSValue(),value.GetType());
+	JS_PutArrayElement(m_pArray, index, value.ToV8Value(), value.GetType());
 }
 
 int CJS_Array::GetLength()
diff --git a/fpdfsdk/src/javascript/PublicMethods.cpp b/fpdfsdk/src/javascript/PublicMethods.cpp
index e3479f1..ff5b9a7 100644
--- a/fpdfsdk/src/javascript/PublicMethods.cpp
+++ b/fpdfsdk/src/javascript/PublicMethods.cpp
@@ -430,7 +430,7 @@
 		val.ConvertToArray(StrArray);
 		return StrArray;
 	}
-	CFX_WideString wsStr = val.operator CFX_WideString();
+	CFX_WideString wsStr = val.ToCFXWideString();
 	CFX_ByteString t = CFX_ByteString::FromUnicode(wsStr);
 	const char * p = (const char *)t;
 
@@ -1071,12 +1071,12 @@
 	
 	if (strValue.IsEmpty()) return TRUE;
 	
-	int iDec = params[0];
-	int iSepStyle = params[1];
-	int iNegStyle = params[2];
+	int iDec = params[0].ToInt();
+	int iSepStyle = params[1].ToInt();
+	int iNegStyle = params[2].ToInt();
 	// params[3] is iCurrStyle, it's not used.
-	std::wstring wstrCurrency(params[4].operator CFX_WideString());
-	FX_BOOL bCurrencyPrepend = params[5];
+	std::wstring wstrCurrency(params[4].ToCFXWideString());
+	FX_BOOL bCurrencyPrepend = params[5].ToBool();
 	
 	if (iDec < 0) iDec = -iDec;
 	
@@ -1268,7 +1268,7 @@
 	
 	if(params.size() < 2)
 		return FALSE;
-	int iSepStyle = params[1];
+	int iSepStyle = params[1].ToInt();
 	
 	if (iSepStyle < 0 || iSepStyle > 3)
 		iSepStyle = 0;
@@ -1406,30 +1406,20 @@
 	}
 	if(!pEvent->m_pValue)
 		return FALSE;
+
 	CFX_WideString& Value = pEvent->Value();
-	
-//     HWND hMainFrame = NULL;
-// 	
-// 	CPDFSDK_FormFillApp *pApp = pContext->GetReaderApp();
-// 	ASSERT(pApp);
-// 	hMainFrame = pApp->GetMainFrameWnd();
-		
 	CFX_ByteString strValue = StrTrim(CFX_ByteString::FromUnicode(Value));
-	
 	if (strValue.IsEmpty())
 		return TRUE;
-	
-	int iDec = params[0];
-	int iSepStyle = params[1];
-	
-	//ASSERT(iDec > 0);
+
+	int iDec = params[0].ToInt();
 	if (iDec < 0)
 		iDec = -iDec;
-	
+
+	int iSepStyle = params[1].ToInt();
 	if (iSepStyle < 0 || iSepStyle > 3)
 		iSepStyle = 0;
-	
-	
+
 	//////////////////////////////////////////////////////
 	//for processing decimal places
 	double dValue = atof(strValue);
@@ -1527,16 +1517,16 @@
 	{
 		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
 		return FALSE;
-	}	
+	}
 	if(!pEvent->m_pValue)
 		return FALSE;
+
 	CFX_WideString& val = pEvent->Value();
-	
-	CFX_WideString strValue = val;	
-	if (strValue.IsEmpty()) return TRUE;		
+	CFX_WideString strValue = val;
+	if (strValue.IsEmpty())
+		return TRUE;
 
-	CFX_WideString sFormat = params[0].operator CFX_WideString();
-
+	CFX_WideString sFormat = params[0].ToCFXWideString();
 	FX_BOOL bWrongFormat = FALSE;
 	double dDate = 0.0f;
 
@@ -1558,9 +1548,8 @@
 		Alert(pContext, swMsg);
 		return FALSE;
 	}
-	
-	val =  MakeFormatDate(dDate,sFormat);
 
+	val =  MakeFormatDate(dDate,sFormat);
 	return TRUE;
 }
 
@@ -1636,17 +1625,17 @@
 	{
 		sError = L"AFDate_KeystrokeEx's parameters' size r not correct";
 		return FALSE;
-	}	
-	
+	}
+
 	if (pEvent->WillCommit())
 	{
 		if(!pEvent->m_pValue)
 			return FALSE;
 		CFX_WideString strValue = pEvent->Value();
-		if (strValue.IsEmpty()) return TRUE;
+		if (strValue.IsEmpty())
+			return TRUE;
 
-		CFX_WideString sFormat = params[0].operator CFX_WideString();
-
+		CFX_WideString sFormat = params[0].ToCFXWideString();
 		FX_BOOL bWrongFormat = FALSE;
 		double dRet = MakeRegularDate(strValue,sFormat,bWrongFormat);
 		if (bWrongFormat || JS_PortIsNan(dRet))
@@ -1674,7 +1663,7 @@
 		return FALSE;
 	}
 
-	int iIndex = params[0];
+	int iIndex = params[0].ToInt();
 	FX_LPCWSTR cFormats[] =  {L"m/d", L"m/d/yy", L"mm/dd/yy", L"mm/yy", L"d-mmm", L"d-mmm-yy", L"dd-mmm-yy",
 		L"yy-mm-dd", L"mmm-yy", L"mmmm-yy", L"mmm d, yyyy", L"mmmm d, yyyy",
 		L"m/d/yy h:MM tt", L"m/d/yy HH:MM" };
@@ -1705,7 +1694,7 @@
 		return FALSE;
 	}
 
-	int iIndex = params[0];
+	int iIndex = params[0].ToInt();
 	FX_LPCWSTR cFormats[] =  {L"m/d", L"m/d/yy", L"mm/dd/yy", L"mm/yy", L"d-mmm", L"d-mmm-yy", L"dd-mmm-yy",
 		L"yy-mm-dd", L"mmm-yy", L"mmmm-yy", L"mmm d, yyyy", L"mmmm d, yyyy",
 		L"m/d/yy h:MM tt", L"m/d/yy HH:MM" };
@@ -1735,7 +1724,7 @@
 		return FALSE;
 	}
 
-	int iIndex = params[0];
+	int iIndex = params[0].ToInt();
 	FX_LPCWSTR cFormats[] = {L"HH:MM", L"h:MM tt", L"HH:MM:ss", L"h:MM:ss tt"};
 
 	ASSERT(iIndex<FX_ArraySize(cFormats));
@@ -1761,7 +1750,7 @@
 		return FALSE;
 	}
 
-	int iIndex = params[0];
+	int iIndex = params[0].ToInt();
 	FX_LPCWSTR cFormats[] = {L"HH:MM", L"h:MM tt", L"HH:MM:ss", L"h:MM:ss tt"};
 
 	ASSERT(iIndex<FX_ArraySize(cFormats));
@@ -1799,7 +1788,7 @@
 	}
 
 	std::string cFormat;
-	int iIndex = params[0];
+	int iIndex = params[0].ToInt();
 
 	CJS_EventHandler* pEvent = pContext->GetEventHandler();
 	ASSERT(pEvent != NULL);
@@ -1858,11 +1847,12 @@
 		return FALSE;
 	CFX_WideString& valEvent = pEvent->Value();
 
-	CFX_WideString wstrMask = params[0].operator CFX_WideString();
-	if (wstrMask.IsEmpty()) return TRUE;
-	
+	CFX_WideString wstrMask = params[0].ToCFXWideString();
+	if (wstrMask.IsEmpty())
+		return TRUE;
+
 	std::wstring wstrValue(valEvent);
-	
+
 	if (pEvent->WillCommit())
 	{
 		if (wstrValue.empty())
@@ -1871,7 +1861,7 @@
 		for (std::wstring::iterator it = wstrValue.begin(); it != wstrValue.end(); it++)
 		{
 			wchar_t w_Value = *it;
-            if (!maskSatisfied(w_Value,wstrMask[iIndexMask]))
+			if (!maskSatisfied(w_Value,wstrMask[iIndexMask]))
 				break;
 			iIndexMask++;
 		}
@@ -1884,31 +1874,27 @@
 		return TRUE;
 	}
 
-	
 	CFX_WideString &wideChange = pEvent->Change();
 	std::wstring wChange(wideChange);
-	
 	if (wChange.empty())
 		return TRUE;
-    int iIndexMask = pEvent->SelStart();
-	//iIndexMask++;
-	
-	
+
+	int iIndexMask = pEvent->SelStart();
+
 	if (wstrValue.length() - (pEvent->SelEnd()-pEvent->SelStart()) + wChange.length() > (FX_DWORD)wstrMask.GetLength())
 	{
 		Alert(pContext, JSGetStringFromID(pContext, IDS_STRING_JSPARAM_TOOLONG));
 		pEvent->Rc() = FALSE;
 		return TRUE;
 	}
-	
-	
+
 	if (iIndexMask >= wstrMask.GetLength() && (!wChange.empty()))
 	{
 		Alert(pContext, JSGetStringFromID(pContext, IDS_STRING_JSPARAM_TOOLONG));
 		pEvent->Rc() = FALSE;
 		return TRUE;
 	}
-	
+
 	for (std::wstring::iterator it = wChange.begin(); it != wChange.end(); it++)
 	{
 		if (iIndexMask >= wstrMask.GetLength())
@@ -1920,21 +1906,18 @@
 		wchar_t w_Mask = wstrMask[iIndexMask];
 		if (!isReservedMaskChar(w_Mask))
 		{
-			//wChange.insert(it,w_Mask);				
 			*it = w_Mask;
 		}
 		wchar_t w_Change = *it;
-		
-        if (!maskSatisfied(w_Change,w_Mask))
+		if (!maskSatisfied(w_Change,w_Mask))
 		{
 			pEvent->Rc() = FALSE;
 			return TRUE;
 		}
 		iIndexMask++;
 	}
-	
-	wideChange = wChange.c_str();	
-	
+
+	wideChange = wChange.c_str();
 	return TRUE;
 }
 
@@ -1956,7 +1939,7 @@
 	}
 
 	std::string cFormat;
-	int iIndex = (int)params[0];	
+	int iIndex = params[0].ToInt();
 
 	if(!pEvent->m_pValue)
 		return FALSE;
@@ -2050,8 +2033,8 @@
 		return FALSE;
 	}
 
-	CFX_WideString sValue = params[0].operator CFX_WideString();
-	CFX_WideString sFormat = params[1].operator CFX_WideString();
+	CFX_WideString sValue = params[0].ToCFXWideString();
+	CFX_WideString sFormat = params[1].ToCFXWideString();
 
 	FX_BOOL bWrongFormat = FALSE;
 	double dDate = MakeRegularDate(sValue,sFormat,bWrongFormat);
@@ -2063,9 +2046,8 @@
 		Alert((CJS_Context *)cc, swMsg);
 		return FALSE;
 	}
-	
-	vRet = dDate;
 
+	vRet = dDate;
 	return TRUE;
 }
 
@@ -2080,7 +2062,7 @@
 		return FALSE;
 	}
 
-	vRet = (double)AF_Simple(params[0].operator CFX_WideString(), (double)params[1], (double)params[2]);
+	vRet = (double)AF_Simple(params[0].ToCFXWideString(), params[1].ToDouble(), params[2].ToDouble());
 	return TRUE;
 }
 
@@ -2094,7 +2076,7 @@
 		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
 		return FALSE;
 	}
-    vRet = ParseStringToNumber(params[0].operator CFX_WideString());
+	vRet = ParseStringToNumber(params[0].ToCFXWideString());
 	return TRUE;
 }
 
@@ -2118,7 +2100,7 @@
 		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
 		return FALSE;
 	}
-	
+
 	CPDFSDK_Document* pReaderDoc = pContext->GetReaderDocument();
     ASSERT(pReaderDoc != NULL);
 
@@ -2129,7 +2111,7 @@
 	ASSERT(pInterForm != NULL);
 
 	double dValue;
-	CFX_WideString sFunction = params[0].operator CFX_WideString();
+	CFX_WideString sFunction = params[0].ToCFXWideString();
 	if (wcscmp(sFunction, L"PRD") == 0)
     	dValue = 1.0;
 	else
@@ -2143,7 +2125,7 @@
 	{
 		CJS_Value jsValue(isolate);
 		FieldNameArray.GetElement(i,jsValue);
-        CFX_WideString wsFieldName = jsValue.operator CFX_WideString();
+		CFX_WideString wsFieldName = jsValue.ToCFXWideString();
 
         for (int j=0,jsz=pInterForm->CountFields(wsFieldName); j<jsz; j++)
 		{
@@ -2214,7 +2196,7 @@
 	dValue = (double)floor(dValue * FXSYS_pow((double)10,(double)6) + 0.49) / FXSYS_pow((double)10,(double)6);
 	CJS_Value jsValue(isolate,dValue);
 	if((CJS_EventHandler*)pContext->GetEventHandler()->m_pValue)
-		((CJS_EventHandler*)pContext->GetEventHandler())->Value() = jsValue;
+		((CJS_EventHandler*)pContext->GetEventHandler())->Value() = jsValue.ToCFXWideString();
 
 	return TRUE;
 }
@@ -2240,28 +2222,30 @@
 	if (pEvent->Value().IsEmpty() )
 		return TRUE;
 	double dEentValue = atof(CFX_ByteString::FromUnicode(pEvent->Value()));
-	FX_BOOL bGreaterThan, bLessThan;
-	double  dGreaterThan, dLessThan;
-    bGreaterThan = (FX_BOOL)params[0];
+	FX_BOOL bGreaterThan = params[0].ToBool();
+	double dGreaterThan = params[1].ToDouble();
+	FX_BOOL bLessThan = params[2].ToBool();
+	double dLessThan = params[3].ToDouble();
 	CFX_WideString swMsg;
-	dGreaterThan = (double)params[1];
-	bLessThan = (FX_BOOL)params[2];
-	dLessThan = (double)params[3];
 
 	if (bGreaterThan && bLessThan)
 	{
 		if (dEentValue < dGreaterThan || dEentValue > dLessThan)
-			swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE1),(FX_LPCWSTR)params[1].operator CFX_WideString(), (FX_LPCWSTR)params[3].operator CFX_WideString());
+			swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE1),
+						 params[1].ToCFXWideString().c_str(),
+						 params[3].ToCFXWideString().c_str());
 	}
 	else if (bGreaterThan)
 	{
 		if (dEentValue < dGreaterThan)
-			swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE2), (FX_LPCWSTR)params[1].operator CFX_WideString());
+			swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE2),
+						 params[1].ToCFXWideString().c_str());
 	}
 	else if (bLessThan)
 	{
 		if (dEentValue > dLessThan)
-			swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE3), (FX_LPCWSTR)params[3].operator CFX_WideString());
+			swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE3),
+						 params[3].ToCFXWideString().c_str());
 	}
 
 	if (!swMsg.IsEmpty())
@@ -2286,7 +2270,7 @@
 
 	CJS_Array nums(isolate);
 
-	CFX_WideString str = params[0].operator CFX_WideString();
+	CFX_WideString str = params[0].ToCFXWideString();
 	CFX_WideString sPart;
 
 	if (str.GetAt(0) == L'.' || str.GetAt(0) == L',')
diff --git a/fpdfsdk/src/javascript/app.cpp b/fpdfsdk/src/javascript/app.cpp
index ec910e8..45998b0 100644
--- a/fpdfsdk/src/javascript/app.cpp
+++ b/fpdfsdk/src/javascript/app.cpp
@@ -338,19 +338,19 @@
 	{
 		if (params[0].GetType() == VT_object)
 		{
-			JSObject pObj = params[0];
+			JSObject pObj = params[0].ToV8Object();
 			{
 				v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate, pObj, L"cMsg");
-				swMsg = CJS_Value(isolate,pValue,VT_unknown).operator CFX_WideString();
+				swMsg = CJS_Value(isolate, pValue, VT_unknown).ToCFXWideString();
 
-				pValue = JS_GetObjectElement(isolate,pObj,L"cTitle");
-				swTitle = CJS_Value(isolate, pValue,VT_unknown).operator CFX_WideString();
+				pValue = JS_GetObjectElement(isolate, pObj, L"cTitle");
+				swTitle = CJS_Value(isolate, pValue, VT_unknown).ToCFXWideString();
 
-				pValue = JS_GetObjectElement(isolate,pObj,L"nIcon");
-				iIcon = (int)CJS_Value(isolate,pValue,VT_unknown);
+				pValue = JS_GetObjectElement(isolate, pObj, L"nIcon");
+				iIcon = CJS_Value(isolate, pValue, VT_unknown).ToInt();
 
-				pValue = JS_GetObjectElement(isolate,pObj,L"nType");
-				iType = (int)CJS_Value(isolate,pValue,VT_unknown);
+				pValue = JS_GetObjectElement(isolate, pObj, L"nType");
+				iType = CJS_Value(isolate, pValue, VT_unknown).ToInt();
 			}
 
 			if (swMsg == L"")
@@ -368,22 +368,12 @@
 					for(int i = 0; i < iLenth; i++)
 					{
 						carray.GetElement(i, *pValue);
-						swMsg += (*pValue).operator CFX_WideString();
+						swMsg += (*pValue).ToCFXWideString();
 						if (i < iLenth - 1)
 							swMsg += L",  ";
 					}
 
 					if(pValue) delete pValue;
-//					if ((iLenth > 1) && pValue)
-//					{
-//						delete[]pValue;
-//						pValue = NULL;
-//					}
-//					else if ((iLenth == 1) && pValue)
-//					{
-//						delete pValue;
-//						pValue = NULL;
-//					}
 				}
 			}
 
@@ -392,7 +382,7 @@
 		}
 		else if (params[0].GetType() == VT_boolean)
 		{
-			FX_BOOL bGet = (FX_BOOL)params[0];
+			FX_BOOL bGet = params[0].ToBool();
 			if (bGet)
 				swMsg = L"true";
 			else
@@ -402,7 +392,7 @@
 		}
 		else
 		{
-			swMsg = params[0];
+			swMsg = params[0].ToCFXWideString();
 			swTitle = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSALERT);
 		}
 	}
@@ -410,7 +400,7 @@
 	{
 		if (params[0].GetType() == VT_boolean)
 		{
-			FX_BOOL bGet = (FX_BOOL)params[0];
+			FX_BOOL bGet = params[0].ToBool();
 			if (bGet)
 				swMsg = L"true";
 			else
@@ -418,18 +408,18 @@
 		}
 		else
 		{
-			swMsg = params[0];
+			swMsg = params[0].ToCFXWideString();
 		}
 		swTitle = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSALERT);
 
 		for(int i = 1;i<iSize;i++)
 		{
 			if (i == 1)
-				iIcon = int(params[i]);
+				iIcon = params[i].ToInt();
 			if (i == 2)
-				iType = int(params[i]);
+				iType = params[i].ToInt();
 			if (i == 3)
-				swTitle = params[i];
+				swTitle = params[i].ToCFXWideString();
 		}
 	}
 
@@ -453,15 +443,12 @@
 		CJS_Context* pContext = (CJS_Context*)cc;
 		CJS_Runtime* pRuntime = pContext->GetJSRuntime();
 		CPDFDoc_Environment * pEnv = pRuntime->GetReaderApp();
-		pEnv->JS_appBeep((int)params[0]);
-
+		pEnv->JS_appBeep(params[0].ToInt());
 		return TRUE;
 	}
-	else
-	{
-		sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);
-		return FALSE;
-	}
+
+	sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);
+	return FALSE;
 }
 
 FX_BOOL app::findComponent(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
@@ -492,14 +479,14 @@
 	CJS_Runtime* pRuntime = pContext->GetJSRuntime();
 	ASSERT(pRuntime != NULL);
 
-	CFX_WideString script = params.size() > 0 ?  (FX_LPCWSTR)(params[0].operator CFX_WideString()) : L"";
+	CFX_WideString script = params.size() > 0 ?  (FX_LPCWSTR)(params[0].ToCFXWideString()) : L"";
 	if (script.IsEmpty())
 	{
 		sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSAFNUMBER_KEYSTROKE);
 		return TRUE;
 	}
 
-	FX_DWORD dwInterval = params.size() > 1 ? (int)params[1] : 1000;
+	FX_DWORD dwInterval = params.size() > 1 ? params[1].ToInt() : 1000;
 
 	CPDFDoc_Environment* pApp = pRuntime->GetReaderApp();
 	ASSERT(pApp);
@@ -541,17 +528,18 @@
 	CJS_Runtime* pRuntime = pContext->GetJSRuntime();
 	ASSERT(pRuntime != NULL);
 
-	CFX_WideString script = params.size() > 0 ?  (FX_LPCWSTR)(params[0].operator CFX_WideString()) : L"";
+	CFX_WideString script = params.size() > 0 ?  (FX_LPCWSTR)(params[0].ToCFXWideString()) : L"";
 	if (script.IsEmpty())
 	{
 		sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSAFNUMBER_KEYSTROKE);
 		return TRUE;
 	}
 
-	FX_DWORD dwTimeOut = params.size() > 1 ? (int)params[1] : 1000;
+	FX_DWORD dwTimeOut = params.size() > 1 ? params[1].ToInt() : 1000;
 
 	CPDFDoc_Environment* pApp = pRuntime->GetReaderApp();
 	ASSERT(pApp);
+
 	CJS_Timer* pTimer = new CJS_Timer(this, pApp);
 	m_aTimer.Add(pTimer);
 
@@ -559,12 +547,9 @@
 	pTimer->SetRuntime(pRuntime);
 	pTimer->SetJScript(script);
 	pTimer->SetTimeOut(dwTimeOut);
-//	pTimer->SetStartTime(GetTickCount());
-//	pTimer->SetJSTimer(1000);
 	pTimer->SetJSTimer(dwTimeOut);
 
 	JSFXObject pRetObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"TimerObj"));
-//	ASSERT(pRetObj != NULL);
 
 	CJS_TimerObj* pJS_TimerObj = (CJS_TimerObj*)JS_GetPrivate(pRuntime->GetIsolate(),pRetObj);
 	ASSERT(pJS_TimerObj != NULL);
@@ -594,11 +579,11 @@
 
 	if (params[0].GetType() == VT_fxobject)
 	{
-		JSFXObject pObj = (JSFXObject)params[0];
+		JSFXObject pObj = params[0].ToV8Object();
 		{
 			if (JS_GetObjDefnID(pObj) == JS_GetObjDefnID(*pRuntime, L"TimerObj"))
 			{
-				if (CJS_Object* pJSObj = (CJS_Object*)params[0])
+				if (CJS_Object* pJSObj = params[0].ToCJSObject())
 				{
 					if (TimerObj* pTimerObj = (TimerObj*)pJSObj->GetEmbedObject())
 					{
@@ -642,11 +627,11 @@
 
 	if (params[0].GetType() == VT_fxobject)
 	{
-		JSFXObject pObj = (JSFXObject)params[0];
+		JSFXObject pObj = params[0].ToV8Object();
 		{
 			if (JS_GetObjDefnID(pObj) == JS_GetObjDefnID(*pRuntime, L"TimerObj"))
 			{
-				if (CJS_Object* pJSObj = (CJS_Object*)params[0])
+				if (CJS_Object* pJSObj = params[0].ToCJSObject())
 				{
 					if (TimerObj* pTimerObj = (TimerObj*)pJSObj->GetEmbedObject())
 					{
@@ -730,8 +715,6 @@
 FX_BOOL app::mailMsg(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
 	CJS_Context* pContext = (CJS_Context*)cc;
-	ASSERT(pContext != NULL);
-
 	v8::Isolate* isolate = GetIsolate(cc);
 
 	FX_BOOL bUI = TRUE;
@@ -740,42 +723,48 @@
 	CFX_WideString cBcc = L"";
 	CFX_WideString cSubject = L"";
 	CFX_WideString cMsg = L"";
-	if(params.size() < 2)
+
+	if (params.size() < 1)
 		return FALSE;
 
-	bUI = params.size()>=1?(int)params[0]:TRUE;
-	cTo = params.size()>=2?(const wchar_t*)(FX_LPCWSTR)params[1].operator CFX_WideString():L"";
-	cCc = params.size()>=3?(const wchar_t*)(FX_LPCWSTR)params[2].operator CFX_WideString():L"";
-	cBcc = params.size()>=4?(const wchar_t*)(FX_LPCWSTR)params[3].operator CFX_WideString():L"";
-	cSubject = params.size()>=5?(const wchar_t*)(FX_LPCWSTR)params[4].operator CFX_WideString():L"";
-	cMsg = params.size()>=6?(const wchar_t*)(FX_LPCWSTR)params[5].operator CFX_WideString():L"";
-
-
 	if (params[0].GetType() == VT_object)
 	{
-		JSObject pObj = (JSObject)params[0];
+		JSObject pObj = params[0].ToV8Object();
 
-		v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj, L"bUI");
-			bUI = (int)CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue));
+		v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate, pObj, L"bUI");
+		bUI = CJS_Value(isolate, pValue, GET_VALUE_TYPE(pValue)).ToBool();
 
 		pValue = JS_GetObjectElement(isolate, pObj, L"cTo");
-			cTo = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+		cTo = CJS_Value(isolate, pValue, GET_VALUE_TYPE(pValue)).ToCFXWideString();
 
-		pValue = JS_GetObjectElement(isolate,pObj, L"cCc");
-			cCc = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+		pValue = JS_GetObjectElement(isolate, pObj, L"cCc");
+		cCc = CJS_Value(isolate, pValue, GET_VALUE_TYPE(pValue)).ToCFXWideString();
 
-		pValue = JS_GetObjectElement(isolate,pObj, L"cBcc");
-			cBcc = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+		pValue = JS_GetObjectElement(isolate, pObj, L"cBcc");
+		cBcc = CJS_Value(isolate, pValue, GET_VALUE_TYPE(pValue)).ToCFXWideString();
 
-		pValue = JS_GetObjectElement(isolate,pObj, L"cSubject");
-			cSubject = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+		pValue = JS_GetObjectElement(isolate, pObj, L"cSubject");
+		cSubject = CJS_Value(isolate, pValue, GET_VALUE_TYPE(pValue)).ToCFXWideString();
 
-		pValue = JS_GetObjectElement(isolate,pObj, L"cMsg");
-			cMsg = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+		pValue = JS_GetObjectElement(isolate, pObj, L"cMsg");
+		cMsg = CJS_Value(isolate, pValue, GET_VALUE_TYPE(pValue)).ToCFXWideString();
+	} else {
+		if (params.size() < 2)
+			return FALSE;
+
+		bUI = params[0].ToBool();
+		cTo = params[1].ToCFXWideString();
+
+		if (params.size() >= 3)
+			cCc = params[2].ToCFXWideString();
+		if (params.size() >= 4)
+			cBcc = params[3].ToCFXWideString();
+		if (params.size() >= 5)
+			cSubject = params[4].ToCFXWideString();
+		if (params.size() >= 6)
+			cMsg = params[5].ToCFXWideString();
 	}
 
-
-
 	CJS_Runtime* pRuntime = pContext->GetJSRuntime();
 	ASSERT(pRuntime != NULL);
 
@@ -784,10 +773,8 @@
 
 	pRuntime->BeginBlock();
 	pApp->JS_docmailForm(NULL, 0, bUI, cTo.c_str(), cSubject.c_str(), cCc.c_str(), cBcc.c_str(), cMsg.c_str());
-	///////////////////////////////////////////////////////////////////////////////////////////////
 	pRuntime->EndBlock();
 
-	//return bRet;
 	return FALSE;
 }
 
@@ -877,40 +864,40 @@
 	int iLength = params.size();
 	if (iLength > 0 && params[0].GetType() == VT_object)
 	{
-		JSObject pObj = (JSObject )params[0];
+		JSObject pObj = params[0].ToV8Object();
 		v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj,L"cQuestion");
-		swQuestion = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+		swQuestion = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).ToCFXWideString();
 
 		pValue = JS_GetObjectElement(isolate,pObj,L"cTitle");
-		swTitle = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+		swTitle = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).ToCFXWideString();
 
 		pValue = JS_GetObjectElement(isolate,pObj,L"cDefault");
-		swDefault = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+		swDefault = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).ToCFXWideString();
 
 		pValue = JS_GetObjectElement(isolate,pObj,L"cLabel");
-		swLabel = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+		swLabel = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).ToCFXWideString();
 
 		pValue = JS_GetObjectElement(isolate,pObj,L"bPassword");
-		bPassWord = (bool)CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue));
+		bPassWord = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).ToBool();
 	}
 	else
 	{
 		switch(iLength)
 		{
 		case 5:
-			swLabel = params[4];
+			swLabel = params[4].ToCFXWideString();
 			// FALLTHROUGH
 		case 4:
-			bPassWord = params[3];
+			bPassWord = params[3].ToBool();
 			// FALLTHROUGH
 		case 3:
-			swDefault = params[2];
+			swDefault = params[2].ToCFXWideString();
 			// FALLTHROUGH
 		case 2:
-			swTitle = params[1];
+			swTitle = params[1].ToCFXWideString();
 			// FALLTHROUGH
 		case 1:
-			swQuestion = params[0];
+			swQuestion = params[0].ToCFXWideString();
 			// FALLTHROUGH
 		default:
 			break;
diff --git a/fpdfsdk/src/javascript/color.cpp b/fpdfsdk/src/javascript/color.cpp
index a338624..ddf6ed4 100644
--- a/fpdfsdk/src/javascript/color.cpp
+++ b/fpdfsdk/src/javascript/color.cpp
@@ -104,9 +104,8 @@
 	if (nArrayLen < 1) return;
 
 	CJS_Value value(array.GetIsolate());
-	CFX_ByteString sSpace;
 	array.GetElement(0, value);
-	sSpace = value;
+	CFX_ByteString sSpace = value.ToCFXByteString();
 
 	double d1 = 0;
 	double d2 = 0;
@@ -116,25 +115,25 @@
 	if (nArrayLen > 1)
 	{
 		array.GetElement(1, value);
-		d1 = value;
+		d1 = value.ToDouble();
 	}
 
 	if (nArrayLen > 2)
 	{
 		array.GetElement(2, value);
-		d2 = value;
+		d2 = value.ToDouble();
 	}
 
 	if (nArrayLen > 3)
 	{
 		array.GetElement(3, value);
-		d3 = value;
+		d3 = value.ToDouble();
 	}
 
 	if (nArrayLen > 4)
 	{
 		array.GetElement(4, value);
-		d4 = value;
+		d4 = value.ToDouble();
 	}
 
 	if (sSpace == "T")
@@ -199,10 +198,9 @@
 	CPWL_Color crSource;
 	ConvertArrayToPWLColor(aSource, crSource);
 
-	CFX_ByteString sDestSpace = params[1];
-
+	CFX_ByteString sDestSpace = params[1].ToCFXByteString();
 	int nColorType = COLORTYPE_TRANSPARENT;
-	
+
 	if (sDestSpace == "T")
 	{
 		nColorType = COLORTYPE_TRANSPARENT;
diff --git a/fpdfsdk/src/javascript/event.cpp b/fpdfsdk/src/javascript/event.cpp
index 620b43e..fb57e74 100644
--- a/fpdfsdk/src/javascript/event.cpp
+++ b/fpdfsdk/src/javascript/event.cpp
@@ -352,7 +352,7 @@
 	CFX_WideString & val = pEvent->Value();
 	if (vp.IsSetting())
 	{
-		val = vp;
+		vp >> val;
 	}
 	else
 	{
diff --git a/fpdfsdk/src/javascript/global.cpp b/fpdfsdk/src/javascript/global.cpp
index 1a59e25..b778239 100644
--- a/fpdfsdk/src/javascript/global.cpp
+++ b/fpdfsdk/src/javascript/global.cpp
@@ -175,7 +175,7 @@
 			{
 				bool bData;
 				vp >> bData;
-				return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_BOOLEAN, 0, (bool)vp, "", v8::Handle<v8::Object>(), FALSE);
+				return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_BOOLEAN, 0, bData, "", v8::Handle<v8::Object>(), FALSE);
 			}
 		case VT_string:
 			{
@@ -185,20 +185,9 @@
 			}
 		case VT_object:
 			{
-				JSObject pData = (JSObject)vp;
+				JSObject pData;
+				vp >> pData;
 				return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_OBJECT, 0, false, "", pData, FALSE);
-// 				else
-// 				{
-// 					if (vp.IsArrayObject())
-// 					{
-// 						CJS_Array array;
-// 						vp.ConvertToArray(array);
-// 						return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_OBJECT, 0, false, "", 
-// 							(Dobject*)(Darray*)array, FALSE);
-// 					}
-// 					else
-// 						return FALSE;
-// 				}
 			}
 		case VT_null:
 			{
@@ -279,14 +268,14 @@
 		return FALSE;
 	}
 
-	CFX_ByteString sName = params[0];
+	CFX_ByteString sName = params[0].ToCFXByteString();
 
 	js_global_data* pData = NULL;
 	if (m_mapGlobal.Lookup(sName, (FX_LPVOID&)pData))
 	{
 		if (pData && !pData->bDeleted)
 		{
-			pData->bPersistent = (bool)params[1];
+			pData->bPersistent = params[1].ToBool();
 			return TRUE;
 		}
 	}
@@ -435,7 +424,7 @@
 			break;
 		case VT_string:
 			{
-				CFX_ByteString sValue = CJS_Value(isolate, v, VT_string);
+				CFX_ByteString sValue = CJS_Value(isolate, v, VT_string).ToCFXByteString();
 				CJS_KeyValue* pObjElement = new CJS_KeyValue;
 				pObjElement->nType = JS_GLOBALDATA_TYPE_STRING;
 				pObjElement->sKey = sKey;
diff --git a/fpdfsdk/src/javascript/util.cpp b/fpdfsdk/src/javascript/util.cpp
index 0ac98dd..6898d0c 100644
--- a/fpdfsdk/src/javascript/util.cpp
+++ b/fpdfsdk/src/javascript/util.cpp
@@ -142,7 +142,7 @@
 	int iSize = params.size();
 	if (iSize < 1)
 		return FALSE;
-	std::wstring  c_ConvChar((const wchar_t*)(FX_LPCWSTR)params[0].operator CFX_WideString());
+	std::wstring c_ConvChar(params[0].ToCFXWideString().c_str());
 	std::vector<std::wstring> c_strConvers;
 	int iOffset = 0;
 	int iOffend = 0;
@@ -182,13 +182,13 @@
 		switch (ParstDataType(&c_strFormat))
 		{
 			case UTIL_INT:
-				strSegment.Format(c_strFormat.c_str(),(int)params[iIndex]);
+				strSegment.Format(c_strFormat.c_str(), params[iIndex].ToInt());
 				break;
 			case UTIL_DOUBLE:
-				strSegment.Format(c_strFormat.c_str(),(double)params[iIndex]);
+				strSegment.Format(c_strFormat.c_str(), params[iIndex].ToDouble());
 				break;
 			case UTIL_STRING:
-				strSegment.Format(c_strFormat.c_str(),(FX_LPCWSTR)params[iIndex].operator CFX_WideString());
+				strSegment.Format(c_strFormat.c_str(), params[iIndex].ToCFXWideString().c_str());
 				break;
 			default:
 				strSegment.Format(L"%S", c_strFormat.c_str());
@@ -229,8 +229,7 @@
 
 	if (p1.GetType() == VT_number)
 	{
-		int nFormat = p1;
-
+		int nFormat = p1.ToInt();
 		CFX_WideString swResult;
 
 		switch (nFormat)
@@ -271,13 +270,12 @@
 	}
 	else if (p1.GetType() == VT_string)
 	{
-		std::basic_string<wchar_t> cFormat = (FX_LPCWSTR)p1.operator CFX_WideString();		
+		std::basic_string<wchar_t> cFormat = p1.ToCFXWideString().c_str();
 
 		bool bXFAPicture = false;
 		if (iSize > 2)
 		{
-			//CJS_Value value;
-			bXFAPicture = params[2];
+			bXFAPicture = params[2].ToBool();
 		}
 
 		if (bXFAPicture)
@@ -467,8 +465,8 @@
 	int iSize = params.size();
 	if (iSize<2)
 		return FALSE;
-	CFX_WideString sFormat = params[0].operator CFX_WideString();
-	CFX_WideString sSource = params[1].operator CFX_WideString();
+	CFX_WideString sFormat = params[0].ToCFXWideString();
+	CFX_WideString sSource = params[1].ToCFXWideString();
 	std::string cFormat = CFX_ByteString::FromUnicode(sFormat).c_str();
 	std::string cSource = CFX_ByteString::FromUnicode(sSource).c_str();
 	std::string cDest;
@@ -582,9 +580,9 @@
 	int iSize = params.size();
 	if (iSize < 2)
 		return FALSE;
-	CFX_WideString sFormat = params[0].operator CFX_WideString();
-	CFX_WideString sDate = params[1].operator CFX_WideString();
 
+	CFX_WideString sFormat = params[0].ToCFXWideString();
+	CFX_WideString sDate = params[1].ToCFXWideString();
 	double dDate = JS_GetDateTime();
 	if (sDate.GetLength() > 0)
 	{
@@ -638,7 +636,7 @@
 	int iSize = params.size();
 	if (iSize == 0)
 		return FALSE;
-	int nByte = (int)params[0];
+	int nByte = params[0].ToInt();
 	unsigned char cByte = (unsigned char)nByte;
 	CFX_WideString csValue;
 	csValue.Format(L"%c", cByte);
