diff --git a/fpdfsdk/src/formfiller/FFL_ComboBox.cpp b/fpdfsdk/src/formfiller/FFL_ComboBox.cpp
index b0c7b2d..96574d6 100644
--- a/fpdfsdk/src/formfiller/FFL_ComboBox.cpp
+++ b/fpdfsdk/src/formfiller/FFL_ComboBox.cpp
@@ -14,7 +14,7 @@
 /* ------------------------------- CFFL_ComboBox ------------------------------- */
 
 CFFL_ComboBox::CFFL_ComboBox(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot) :
-	CFFL_FormFiller(pApp, pAnnot), m_pFontMap( NULL )
+    CFFL_FormFiller(pApp, pAnnot), m_pFontMap( NULL )
 {
         m_State.nIndex = 0;
         m_State.nStart = 0;
@@ -28,299 +28,287 @@
 
 PWL_CREATEPARAM CFFL_ComboBox::GetCreateParam()
 {
-	PWL_CREATEPARAM cp = CFFL_FormFiller::GetCreateParam();
+    PWL_CREATEPARAM cp = CFFL_FormFiller::GetCreateParam();
 
-	ASSERT(m_pWidget != NULL);
+    ASSERT(m_pWidget != NULL);
 
-	int nFlags = m_pWidget->GetFieldFlags();
+    int nFlags = m_pWidget->GetFieldFlags();
 
-	if (nFlags & FIELDFLAG_EDIT)
-	{
-		cp.dwFlags |= PCBS_ALLOWCUSTOMTEXT;
-	}
+    if (nFlags & FIELDFLAG_EDIT)
+    {
+        cp.dwFlags |= PCBS_ALLOWCUSTOMTEXT;
+    }
 
-	if (!m_pFontMap)
-	{
-		m_pFontMap = new CBA_FontMap(m_pWidget, GetSystemHandler());
-		m_pFontMap->Initial();
-	}
+    if (!m_pFontMap)
+    {
+        m_pFontMap = new CBA_FontMap(m_pWidget, GetSystemHandler());
+        m_pFontMap->Initial();
+    }
 
-	cp.pFontMap = m_pFontMap;
-	cp.pFocusHandler = this;
+    cp.pFontMap = m_pFontMap;
+    cp.pFocusHandler = this;
 
-	return cp;
+    return cp;
 }
 
 CPWL_Wnd* CFFL_ComboBox::NewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView)
 {
-	CPWL_ComboBox * pWnd = new CPWL_ComboBox();
-	pWnd->AttachFFLData(this);
-	pWnd->Create(cp);
+    CPWL_ComboBox * pWnd = new CPWL_ComboBox();
+    pWnd->AttachFFLData(this);
+    pWnd->Create(cp);
 
-	CFFL_IFormFiller* pFormFiller = m_pApp->GetIFormFiller();
-	pWnd->SetFillerNotify(pFormFiller);
+    CFFL_IFormFiller* pFormFiller = m_pApp->GetIFormFiller();
+    pWnd->SetFillerNotify(pFormFiller);
 
-	int32_t nCurSel = m_pWidget->GetSelectedIndex(0);
-	CFX_WideString swText;
-	if (nCurSel < 0)
-		swText = m_pWidget->GetValue();
-	else
-		swText = m_pWidget->GetOptionLabel(nCurSel);
+    int32_t nCurSel = m_pWidget->GetSelectedIndex(0);
+    CFX_WideString swText;
+    if (nCurSel < 0)
+        swText = m_pWidget->GetValue();
+    else
+        swText = m_pWidget->GetOptionLabel(nCurSel);
 
-	for (int32_t i=0,sz=m_pWidget->CountOptions(); i<sz; i++)
-	{
-		pWnd->AddString(m_pWidget->GetOptionLabel(i).c_str());
-	}
+    for (int32_t i=0,sz=m_pWidget->CountOptions(); i<sz; i++)
+    {
+        pWnd->AddString(m_pWidget->GetOptionLabel(i).c_str());
+    }
 
-	pWnd->SetSelect(nCurSel);
-	pWnd->SetText(swText.c_str());
-	return pWnd;
+    pWnd->SetSelect(nCurSel);
+    pWnd->SetText(swText.c_str());
+    return pWnd;
 }
 
 
-FX_BOOL	CFFL_ComboBox::OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags)
+FX_BOOL CFFL_ComboBox::OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags)
 {
-	return CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags);
+    return CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags);
 }
 
-FX_BOOL	CFFL_ComboBox::IsDataChanged(CPDFSDK_PageView* pPageView)
+FX_BOOL CFFL_ComboBox::IsDataChanged(CPDFSDK_PageView* pPageView)
 {
-	if (CPWL_ComboBox * pWnd = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))
-	{
-		int32_t nCurSel = pWnd->GetSelect();
+    CPWL_ComboBox* pWnd = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE);
+    if (!pWnd)
+        return FALSE;
 
-		ASSERT(m_pWidget != NULL);
+    int32_t nCurSel = pWnd->GetSelect();
+    if (!(m_pWidget->GetFieldFlags() & FIELDFLAG_EDIT))
+        return nCurSel != m_pWidget->GetSelectedIndex(0);
 
-		if (m_pWidget->GetFieldFlags() & FIELDFLAG_EDIT)
-		{
-			if (nCurSel >= 0)
-			{
-				return nCurSel != m_pWidget->GetSelectedIndex(0);
-			}
-			else
-			{
-				return pWnd->GetText() != m_pWidget->GetValue();
-			}
-		}
-		else
-		{
-			return nCurSel != m_pWidget->GetSelectedIndex(0);
-		}
-	}
+    if (nCurSel >= 0)
+        return nCurSel != m_pWidget->GetSelectedIndex(0);
 
-	return FALSE;
+    return pWnd->GetText() != m_pWidget->GetValue();
 }
 
 void CFFL_ComboBox::SaveData(CPDFSDK_PageView* pPageView)
 {
-	ASSERT(m_pWidget != NULL);
+    ASSERT(m_pWidget != NULL);
 
-	if (CPWL_ComboBox* pWnd = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))
-	{
-		CFX_WideString swText = pWnd->GetText();
-		int32_t nCurSel = pWnd->GetSelect();
+    if (CPWL_ComboBox* pWnd = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))
+    {
+        CFX_WideString swText = pWnd->GetText();
+        int32_t nCurSel = pWnd->GetSelect();
 
-		//mantis:0004157
-		FX_BOOL bSetValue = TRUE;
+        //mantis:0004157
+        FX_BOOL bSetValue = TRUE;
 
-		if (m_pWidget->GetFieldFlags() & FIELDFLAG_EDIT)
-		{
-			if (nCurSel >= 0)
-			{
-				if (swText != m_pWidget->GetOptionLabel(nCurSel))
-					bSetValue = TRUE;
-				else
-					bSetValue = FALSE;
-			}
-			else
-				bSetValue = TRUE;
-		}
-		else
-			bSetValue = FALSE;
+        if (m_pWidget->GetFieldFlags() & FIELDFLAG_EDIT)
+        {
+            if (nCurSel >= 0)
+            {
+                if (swText != m_pWidget->GetOptionLabel(nCurSel))
+                    bSetValue = TRUE;
+                else
+                    bSetValue = FALSE;
+            }
+            else
+                bSetValue = TRUE;
+        }
+        else
+            bSetValue = FALSE;
 
-		CFX_WideString sOldValue;
+        CFX_WideString sOldValue;
 
 
-		if (bSetValue)
-		{
-			sOldValue = m_pWidget->GetValue();
-			m_pWidget->SetValue(swText, FALSE);
-		}
-		else
-		{
-			m_pWidget->GetSelectedIndex(0);
-			m_pWidget->SetOptionSelection(nCurSel, TRUE, FALSE);
-		}
+        if (bSetValue)
+        {
+            sOldValue = m_pWidget->GetValue();
+            m_pWidget->SetValue(swText, FALSE);
+        }
+        else
+        {
+            m_pWidget->GetSelectedIndex(0);
+            m_pWidget->SetOptionSelection(nCurSel, TRUE, FALSE);
+        }
 
-		m_pWidget->ResetFieldAppearance(TRUE);
-		m_pWidget->UpdateField();
-		SetChangeMark();
+        m_pWidget->ResetFieldAppearance(TRUE);
+        m_pWidget->UpdateField();
+        SetChangeMark();
 
-		m_pWidget->GetPDFPage();
+        m_pWidget->GetPDFPage();
 
 
-	}
+    }
 }
 
  void CFFL_ComboBox::GetActionData( CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type, PDFSDK_FieldAction& fa)
 {
-	switch (type)
-	{
-	case CPDF_AAction::KeyStroke:
-		if (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))
-		{
-			if (CPWL_Edit* pEdit = (CPWL_Edit*)*pComboBox)
-			{
-				fa.bFieldFull = pEdit->IsTextFull();
-				int nSelStart = 0;
-				int nSelEnd = 0;
-				pEdit->GetSel(nSelStart, nSelEnd);
-				fa.nSelEnd = nSelEnd;
-				fa.nSelStart = nSelStart;
-				fa.sValue = pEdit->GetText();
-				fa.sChangeEx = GetSelectExportText();
+    switch (type)
+    {
+    case CPDF_AAction::KeyStroke:
+        if (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))
+        {
+            if (CPWL_Edit* pEdit = (CPWL_Edit*)*pComboBox)
+            {
+                fa.bFieldFull = pEdit->IsTextFull();
+                int nSelStart = 0;
+                int nSelEnd = 0;
+                pEdit->GetSel(nSelStart, nSelEnd);
+                fa.nSelEnd = nSelEnd;
+                fa.nSelStart = nSelStart;
+                fa.sValue = pEdit->GetText();
+                fa.sChangeEx = GetSelectExportText();
 
-				if (fa.bFieldFull)
-				{
-					fa.sChange = L"";
-					fa.sChangeEx = L"";
-				}
-			}
-		}
-		break;
-	case CPDF_AAction::Validate:
-		if (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))
-		{
-			if (CPWL_Edit* pEdit = (CPWL_Edit*)*pComboBox)
-			{
-				fa.sValue = pEdit->GetText();
-			}
-		}
-		break;
-	case CPDF_AAction::LoseFocus:
-	case CPDF_AAction::GetFocus:
-		ASSERT(m_pWidget != NULL);
-		fa.sValue = m_pWidget->GetValue();
-		break;
-	default:
-		break;
-	}
+                if (fa.bFieldFull)
+                {
+                    fa.sChange = L"";
+                    fa.sChangeEx = L"";
+                }
+            }
+        }
+        break;
+    case CPDF_AAction::Validate:
+        if (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))
+        {
+            if (CPWL_Edit* pEdit = (CPWL_Edit*)*pComboBox)
+            {
+                fa.sValue = pEdit->GetText();
+            }
+        }
+        break;
+    case CPDF_AAction::LoseFocus:
+    case CPDF_AAction::GetFocus:
+        ASSERT(m_pWidget != NULL);
+        fa.sValue = m_pWidget->GetValue();
+        break;
+    default:
+        break;
+    }
 }
 
 
 
 void CFFL_ComboBox::SetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
-									const PDFSDK_FieldAction& fa)
+                                    const PDFSDK_FieldAction& fa)
 {
-	switch (type)
-	{
-	case CPDF_AAction::KeyStroke:
-		if (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))
-		{
-			if (CPWL_Edit* pEdit = (CPWL_Edit*)*pComboBox)
-			{
-				pEdit->SetSel(fa.nSelStart, fa.nSelEnd);
-				pEdit->ReplaceSel(fa.sChange.c_str());
-			}
-		}
-		break;
-	default:
-		break;
-	}
+    switch (type)
+    {
+    case CPDF_AAction::KeyStroke:
+        if (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))
+        {
+            if (CPWL_Edit* pEdit = (CPWL_Edit*)*pComboBox)
+            {
+                pEdit->SetSel(fa.nSelStart, fa.nSelEnd);
+                pEdit->ReplaceSel(fa.sChange.c_str());
+            }
+        }
+        break;
+    default:
+        break;
+    }
 }
 
-FX_BOOL	CFFL_ComboBox::IsActionDataChanged(CPDF_AAction::AActionType type, const PDFSDK_FieldAction& faOld,
-									const PDFSDK_FieldAction& faNew)
+FX_BOOL CFFL_ComboBox::IsActionDataChanged(CPDF_AAction::AActionType type, const PDFSDK_FieldAction& faOld,
+                                    const PDFSDK_FieldAction& faNew)
 {
-	switch (type)
-	{
-	case CPDF_AAction::KeyStroke:
-		return (!faOld.bFieldFull && faOld.nSelEnd != faNew.nSelEnd) || faOld.nSelStart != faNew.nSelStart ||
-			faOld.sChange != faNew.sChange;
-	default:
-		break;
-	}
+    switch (type)
+    {
+    case CPDF_AAction::KeyStroke:
+        return (!faOld.bFieldFull && faOld.nSelEnd != faNew.nSelEnd) || faOld.nSelStart != faNew.nSelStart ||
+            faOld.sChange != faNew.sChange;
+    default:
+        break;
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
 void CFFL_ComboBox::SaveState(CPDFSDK_PageView* pPageView)
 {
-	ASSERT(pPageView != NULL);
+    ASSERT(pPageView != NULL);
 
-	if (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))
-	{
-		m_State.nIndex = pComboBox->GetSelect();
+    if (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))
+    {
+        m_State.nIndex = pComboBox->GetSelect();
 
-		if (CPWL_Edit* pEdit = (CPWL_Edit*)*pComboBox)
-		{
-			pEdit->GetSel(m_State.nStart, m_State.nEnd);
-			m_State.sValue = pEdit->GetText();
-		}
-	}
+        if (CPWL_Edit* pEdit = (CPWL_Edit*)*pComboBox)
+        {
+            pEdit->GetSel(m_State.nStart, m_State.nEnd);
+            m_State.sValue = pEdit->GetText();
+        }
+    }
 }
 
 void CFFL_ComboBox::RestoreState(CPDFSDK_PageView* pPageView)
 {
-	ASSERT(pPageView != NULL);
+    ASSERT(pPageView != NULL);
 
-	if (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, TRUE))
-	{
-		if (m_State.nIndex >= 0)
-			pComboBox->SetSelect(m_State.nIndex);
-		else
-		{
-			if (CPWL_Edit* pEdit = (CPWL_Edit*)*pComboBox)
-			{
-				pEdit->SetText(m_State.sValue.c_str());
-				pEdit->SetSel(m_State.nStart, m_State.nEnd);
-			}
-		}
-	}
+    if (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, TRUE))
+    {
+        if (m_State.nIndex >= 0)
+            pComboBox->SetSelect(m_State.nIndex);
+        else
+        {
+            if (CPWL_Edit* pEdit = (CPWL_Edit*)*pComboBox)
+            {
+                pEdit->SetText(m_State.sValue.c_str());
+                pEdit->SetSel(m_State.nStart, m_State.nEnd);
+            }
+        }
+    }
 }
 
 CPWL_Wnd* CFFL_ComboBox::ResetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bRestoreValue)
 {
-	if (bRestoreValue)
-		SaveState(pPageView);
+    if (bRestoreValue)
+        SaveState(pPageView);
 
-	DestroyPDFWindow(pPageView);
+    DestroyPDFWindow(pPageView);
 
-	CPWL_Wnd* pRet = NULL;
+    CPWL_Wnd* pRet = NULL;
 
-	if (bRestoreValue)
-	{
-		RestoreState(pPageView);
-		pRet = GetPDFWindow(pPageView, FALSE);
-	}
-	else
-		pRet = GetPDFWindow(pPageView, TRUE);
+    if (bRestoreValue)
+    {
+        RestoreState(pPageView);
+        pRet = GetPDFWindow(pPageView, FALSE);
+    }
+    else
+        pRet = GetPDFWindow(pPageView, TRUE);
 
-	m_pWidget->UpdateField();
+    m_pWidget->UpdateField();
 
-	return pRet;
+    return pRet;
 }
 
 void CFFL_ComboBox::OnKeyStroke(FX_BOOL bKeyDown, FX_UINT nFlag)
 {
-	ASSERT(m_pWidget != NULL);
+    ASSERT(m_pWidget != NULL);
 
-	int nFlags = m_pWidget->GetFieldFlags();
+    int nFlags = m_pWidget->GetFieldFlags();
 
-	if (nFlags & FIELDFLAG_COMMITONSELCHANGE)
-	{
-		if (m_bValid)
-		{
-			CPDFSDK_PageView* pPageView = GetCurPageView();
-			ASSERT(pPageView != NULL);
+    if (nFlags & FIELDFLAG_COMMITONSELCHANGE)
+    {
+        if (m_bValid)
+        {
+            CPDFSDK_PageView* pPageView = GetCurPageView();
+            ASSERT(pPageView != NULL);
 
-			if (CommitData(pPageView, nFlag))
-			{
-				DestroyPDFWindow(pPageView);
-				m_bValid = FALSE;
-			}
-		}
-	}
+            if (CommitData(pPageView, nFlag))
+            {
+                DestroyPDFWindow(pPageView);
+                m_bValid = FALSE;
+            }
+        }
+    }
 }
 
 FX_BOOL	CFFL_ComboBox::IsFieldFull(CPDFSDK_PageView* pPageView)
@@ -338,51 +326,51 @@
 
 void CFFL_ComboBox::OnSetFocus(CPWL_Wnd* pWnd)
 {
-	ASSERT(m_pApp != NULL);
+    ASSERT(m_pApp != NULL);
 
-	ASSERT(pWnd != NULL);
+    ASSERT(pWnd != NULL);
 
-	if (pWnd->GetClassName() == PWL_CLASSNAME_EDIT)
-	{
-		CPWL_Edit* pEdit = (CPWL_Edit*)pWnd;
-		pEdit->SetCharSet(134);
-		pEdit->SetCodePage(936);
+    if (pWnd->GetClassName() == PWL_CLASSNAME_EDIT)
+    {
+        CPWL_Edit* pEdit = (CPWL_Edit*)pWnd;
+        pEdit->SetCharSet(134);
+        pEdit->SetCodePage(936);
 
-		pEdit->SetReadyToInput();
-		CFX_WideString wsText = pEdit->GetText();
-		int nCharacters = wsText.GetLength();
-		CFX_ByteString bsUTFText = wsText.UTF16LE_Encode();
-		unsigned short* pBuffer = (unsigned short*)bsUTFText.c_str();
-		m_pApp->FFI_OnSetFieldInputFocus(m_pWidget->GetFormField(), pBuffer, nCharacters, TRUE);
+        pEdit->SetReadyToInput();
+        CFX_WideString wsText = pEdit->GetText();
+        int nCharacters = wsText.GetLength();
+        CFX_ByteString bsUTFText = wsText.UTF16LE_Encode();
+        unsigned short* pBuffer = (unsigned short*)bsUTFText.c_str();
+        m_pApp->FFI_OnSetFieldInputFocus(m_pWidget->GetFormField(), pBuffer, nCharacters, TRUE);
 
- 		pEdit->SetEditNotify(this);
-	}
+        pEdit->SetEditNotify(this);
+    }
 }
 
 void CFFL_ComboBox::OnKillFocus(CPWL_Wnd* pWnd)
 {
-	ASSERT(m_pApp != NULL);
+    ASSERT(m_pApp != NULL);
 }
 
-FX_BOOL	CFFL_ComboBox::CanCopy(CPDFSDK_Document* pDocument)
+FX_BOOL CFFL_ComboBox::CanCopy(CPDFSDK_Document* pDocument)
 {
-	ASSERT(pDocument != NULL);
+    ASSERT(pDocument != NULL);
 
-	return FALSE;
+    return FALSE;
 }
 
 FX_BOOL CFFL_ComboBox::CanCut(CPDFSDK_Document* pDocument)
 {
-	ASSERT(pDocument != NULL);
+    ASSERT(pDocument != NULL);
 
-	return FALSE;
+    return FALSE;
 }
 
-FX_BOOL	CFFL_ComboBox::CanPaste(CPDFSDK_Document* pDocument)
+FX_BOOL CFFL_ComboBox::CanPaste(CPDFSDK_Document* pDocument)
 {
-	ASSERT(pDocument != NULL);
+    ASSERT(pDocument != NULL);
 
-	return FALSE;
+    return FALSE;
 }
 
 void CFFL_ComboBox::DoCopy(CPDFSDK_Document* pDocument)
@@ -402,29 +390,29 @@
 
 void CFFL_ComboBox::OnAddUndo(CPWL_Edit* pEdit)
 {
-	ASSERT(pEdit != NULL);
+    ASSERT(pEdit != NULL);
 }
 
 CFX_WideString CFFL_ComboBox::GetSelectExportText()
 {
-	CFX_WideString swRet;
+    CFX_WideString swRet;
 
-	int nExport = -1;
-	CPDFSDK_PageView *pPageView = GetCurPageView();
-	if (CPWL_ComboBox * pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))
-	{
-		nExport = pComboBox->GetSelect();
-	}
+    int nExport = -1;
+    CPDFSDK_PageView *pPageView = GetCurPageView();
+    if (CPWL_ComboBox * pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))
+    {
+        nExport = pComboBox->GetSelect();
+    }
 
-	if (nExport >= 0)
-	{
-		if (CPDF_FormField * pFormField = m_pWidget->GetFormField())
-		{
-			swRet = pFormField->GetOptionValue(nExport);
-			if (swRet.IsEmpty())
-				swRet = pFormField->GetOptionLabel(nExport);
-		}
-	}
+    if (nExport >= 0)
+    {
+        if (CPDF_FormField * pFormField = m_pWidget->GetFormField())
+        {
+            swRet = pFormField->GetOptionValue(nExport);
+            if (swRet.IsEmpty())
+                swRet = pFormField->GetOptionLabel(nExport);
+        }
+    }
 
-	return swRet;
+    return swRet;
 }
diff --git a/fpdfsdk/src/formfiller/FFL_IFormFiller.cpp b/fpdfsdk/src/formfiller/FFL_IFormFiller.cpp
index dccb040..bb9316d 100644
--- a/fpdfsdk/src/formfiller/FFL_IFormFiller.cpp
+++ b/fpdfsdk/src/formfiller/FFL_IFormFiller.cpp
@@ -13,7 +13,7 @@
 #include "../../include/formfiller/FFL_RadioButton.h"
 #include "../../include/formfiller/FFL_TextField.h"
 
-#define FFL_MAXLISTBOXHEIGHT		140.0f
+#define FFL_MAXLISTBOXHEIGHT        140.0f
 
 // HHOOK CFFL_IFormFiller::m_hookSheet = NULL;
 // MSG CFFL_IFormFiller::g_Msg;
@@ -21,8 +21,8 @@
 /* ----------------------------- CFFL_IFormFiller ----------------------------- */
 
 CFFL_IFormFiller::CFFL_IFormFiller(CPDFDoc_Environment* pApp) :
-	m_pApp(pApp),
-	m_bNotifying(FALSE)
+    m_pApp(pApp),
+    m_bNotifying(FALSE)
 {
 }
 
@@ -33,439 +33,425 @@
     m_Maps.clear();
 }
 
-FX_BOOL	CFFL_IFormFiller::Annot_HitTest(CPDFSDK_PageView* pPageView,CPDFSDK_Annot* pAnnot, CPDF_Point point)
+FX_BOOL CFFL_IFormFiller::Annot_HitTest(CPDFSDK_PageView* pPageView,CPDFSDK_Annot* pAnnot, CPDF_Point point)
 {
-	CPDF_Rect rc = pAnnot->GetRect();
-	if(rc.Contains(point.x, point.y))
-		return TRUE;
-	return FALSE;
+    CPDF_Rect rc = pAnnot->GetRect();
+    if(rc.Contains(point.x, point.y))
+        return TRUE;
+    return FALSE;
 }
 
 FX_RECT CFFL_IFormFiller::GetViewBBox(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot)
 {
-	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
-	{
-		return pFormFiller->GetViewBBox(pPageView, pAnnot);
-	}
-	else
-	{
-		ASSERT(pPageView != NULL);
-		ASSERT(pAnnot != NULL);
+    if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+        return pFormFiller->GetViewBBox(pPageView, pAnnot);
 
-		CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot();
-		ASSERT(pPDFAnnot != NULL);
+    ASSERT(pPageView != NULL);
 
-		CPDF_Rect rcAnnot;
-		pPDFAnnot->GetRect(rcAnnot);
+    CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot();
+    CPDF_Rect rcAnnot;
+    pPDFAnnot->GetRect(rcAnnot);
 
-// 		CRect rcWin;
-// 		pPageView->DocToWindow(rcAnnot, rcWin);
-		CPDF_Rect rcWin = CPWL_Utils::InflateRect(rcAnnot,1);
-//		rcWin.InflateRect(1, 1);
-
-		return rcWin.GetOutterRect();
-	}
+    CPDF_Rect rcWin = CPWL_Utils::InflateRect(rcAnnot, 1);
+    return rcWin.GetOutterRect();
 }
 
 void CFFL_IFormFiller::OnDraw(CPDFSDK_PageView* pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot,
-						CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
-						/*const CRect& rcWindow,*/ FX_DWORD dwFlags)
+                        CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+                        /*const CRect& rcWindow,*/ FX_DWORD dwFlags)
 {
-	ASSERT(pPageView != NULL);
-	CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
+    ASSERT(pPageView != NULL);
+    CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
 
-	if (IsVisible(pWidget))
-	{
-		if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
-		{
- 			if (pFormFiller->IsValid())
- 			{
-				pFormFiller->OnDraw(pPageView, pAnnot, pDevice, pUser2Device, dwFlags);
-				pAnnot->GetPDFPage();
+    if (IsVisible(pWidget))
+    {
+        if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+        {
+            if (pFormFiller->IsValid())
+            {
+                pFormFiller->OnDraw(pPageView, pAnnot, pDevice, pUser2Device, dwFlags);
+                pAnnot->GetPDFPage();
 
-				CPDFSDK_Document* pDocument = m_pApp->GetSDKDocument();
-				if (pDocument->GetFocusAnnot() == pAnnot)
-				{
-					CPDF_Rect rcFocus = pFormFiller->GetFocusBox(pPageView);
-					if (!rcFocus.IsEmpty())
-					{
-						CFX_PathData path;
-						path.SetPointCount(5);
-						path.SetPoint(0, rcFocus.left,  rcFocus.top, FXPT_MOVETO);
-						path.SetPoint(1, rcFocus.left,  rcFocus.bottom, FXPT_LINETO);
-						path.SetPoint(2, rcFocus.right,  rcFocus.bottom, FXPT_LINETO);
-						path.SetPoint(3, rcFocus.right,  rcFocus.top, FXPT_LINETO);
-						path.SetPoint(4, rcFocus.left,  rcFocus.top, FXPT_LINETO);
+                CPDFSDK_Document* pDocument = m_pApp->GetSDKDocument();
+                if (pDocument->GetFocusAnnot() == pAnnot)
+                {
+                    CPDF_Rect rcFocus = pFormFiller->GetFocusBox(pPageView);
+                    if (!rcFocus.IsEmpty())
+                    {
+                        CFX_PathData path;
+                        path.SetPointCount(5);
+                        path.SetPoint(0, rcFocus.left,  rcFocus.top, FXPT_MOVETO);
+                        path.SetPoint(1, rcFocus.left,  rcFocus.bottom, FXPT_LINETO);
+                        path.SetPoint(2, rcFocus.right,  rcFocus.bottom, FXPT_LINETO);
+                        path.SetPoint(3, rcFocus.right,  rcFocus.top, FXPT_LINETO);
+                        path.SetPoint(4, rcFocus.left,  rcFocus.top, FXPT_LINETO);
 
-						CFX_GraphStateData gsd;
-						gsd.SetDashCount(1);
-						gsd.m_DashArray[0] = 1.0f;
-						gsd.m_DashPhase = 0;
-						gsd.m_LineWidth = 1.0f;
-						pDevice->DrawPath(&path, pUser2Device, &gsd, 0, ArgbEncode(255,0,0,0), FXFILL_ALTERNATE);
-					}
-				}
-				return;
-			}
-		}
+                        CFX_GraphStateData gsd;
+                        gsd.SetDashCount(1);
+                        gsd.m_DashArray[0] = 1.0f;
+                        gsd.m_DashPhase = 0;
+                        gsd.m_LineWidth = 1.0f;
+                        pDevice->DrawPath(&path, pUser2Device, &gsd, 0, ArgbEncode(255,0,0,0), FXFILL_ALTERNATE);
+                    }
+                }
+                return;
+            }
+        }
 
-		if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
-			pFormFiller->OnDrawDeactive(pPageView, pAnnot, pDevice, pUser2Device, dwFlags);
-		else
-			pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
+        if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+            pFormFiller->OnDrawDeactive(pPageView, pAnnot, pDevice, pUser2Device, dwFlags);
+        else
+            pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
 
-		if (!IsReadOnly(pWidget) && IsFillingAllowed(pWidget))
-			pWidget->DrawShadow(pDevice, pPageView);
-	}
+        if (!IsReadOnly(pWidget) && IsFillingAllowed(pWidget))
+            pWidget->DrawShadow(pDevice, pPageView);
+    }
 }
 
 void CFFL_IFormFiller::OnCreate(CPDFSDK_Annot* pAnnot)
 {
-	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
-	{
-		pFormFiller->OnCreate(pAnnot);
-	}
+    if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+    {
+        pFormFiller->OnCreate(pAnnot);
+    }
 }
 
 void CFFL_IFormFiller::OnLoad(CPDFSDK_Annot* pAnnot)
 {
-	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
-	{
-		pFormFiller->OnLoad(pAnnot);
-	}
+    if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+    {
+        pFormFiller->OnLoad(pAnnot);
+    }
 }
 
 void CFFL_IFormFiller::OnDelete(CPDFSDK_Annot* pAnnot)
 {
-	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
-	{
-		pFormFiller->OnDelete(pAnnot);
-	}
+    if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+    {
+        pFormFiller->OnDelete(pAnnot);
+    }
 
-	UnRegisterFormFiller(pAnnot);
+    UnRegisterFormFiller(pAnnot);
 }
 
 void CFFL_IFormFiller::OnMouseEnter(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlag)
 {
-	ASSERT(pAnnot != NULL);
-	ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+    ASSERT(pAnnot != NULL);
+    ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
 
-	if (!m_bNotifying)
-	{
-		CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
-		if (pWidget->GetAAction(CPDF_AAction::CursorEnter))
-		{
-			m_bNotifying = TRUE;
+    if (!m_bNotifying)
+    {
+        CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
+        if (pWidget->GetAAction(CPDF_AAction::CursorEnter))
+        {
+            m_bNotifying = TRUE;
 
-			int nValueAge = pWidget->GetValueAge();
+            int nValueAge = pWidget->GetValueAge();
 
-			pWidget->ClearAppModified();
+            pWidget->ClearAppModified();
 
-			ASSERT(pPageView != NULL);
+            ASSERT(pPageView != NULL);
 
 
 
-			PDFSDK_FieldAction fa;
-			fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
- 			fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
-			pWidget->OnAAction(CPDF_AAction::CursorEnter, fa, pPageView );
-			m_bNotifying = FALSE;
+            PDFSDK_FieldAction fa;
+            fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
+            fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
+            pWidget->OnAAction(CPDF_AAction::CursorEnter, fa, pPageView );
+            m_bNotifying = FALSE;
 
-			//if ( !IsValidAnnot(pPageView, pAnnot) ) return;
+            //if ( !IsValidAnnot(pPageView, pAnnot) ) return;
 
-			if (pWidget->IsAppModified())
-			{
-				if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE))
-				{
-					pFormFiller->ResetPDFWindow(pPageView, pWidget->GetValueAge() == nValueAge);
-				}
-			}
-		}
-	}
+            if (pWidget->IsAppModified())
+            {
+                if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE))
+                {
+                    pFormFiller->ResetPDFWindow(pPageView, pWidget->GetValueAge() == nValueAge);
+                }
+            }
+        }
+    }
 
-	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, TRUE))
-	{
-		pFormFiller->OnMouseEnter(pPageView, pAnnot);
-	}
+    if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, TRUE))
+    {
+        pFormFiller->OnMouseEnter(pPageView, pAnnot);
+    }
 }
 
 void CFFL_IFormFiller::OnMouseExit(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlag)
 {
-	ASSERT(pAnnot != NULL);
-	ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+    ASSERT(pAnnot != NULL);
+    ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
 
-	if (!m_bNotifying)
-	{
-		CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
-		if (pWidget->GetAAction(CPDF_AAction::CursorExit))
-		{
-			m_bNotifying = TRUE;
-			pWidget->GetAppearanceAge();
-			int nValueAge = pWidget->GetValueAge();
-			pWidget->ClearAppModified();
+    if (!m_bNotifying)
+    {
+        CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
+        if (pWidget->GetAAction(CPDF_AAction::CursorExit))
+        {
+            m_bNotifying = TRUE;
+            pWidget->GetAppearanceAge();
+            int nValueAge = pWidget->GetValueAge();
+            pWidget->ClearAppModified();
 
-			ASSERT(pPageView != NULL);
+            ASSERT(pPageView != NULL);
 
 
 
-			PDFSDK_FieldAction fa;
-			fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
- 			fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
+            PDFSDK_FieldAction fa;
+            fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
+            fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
 
-			pWidget->OnAAction(CPDF_AAction::CursorExit, fa, pPageView);
-			m_bNotifying = FALSE;
+            pWidget->OnAAction(CPDF_AAction::CursorExit, fa, pPageView);
+            m_bNotifying = FALSE;
 
-			//if (!IsValidAnnot(pPageView, pAnnot)) return;
+            //if (!IsValidAnnot(pPageView, pAnnot)) return;
 
-			if (pWidget->IsAppModified())
-			{
-				if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE))
-				{
-					pFormFiller->ResetPDFWindow(pPageView, nValueAge == pWidget->GetValueAge());
-				}
-			}
-		}
-	}
+            if (pWidget->IsAppModified())
+            {
+                if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE))
+                {
+                    pFormFiller->ResetPDFWindow(pPageView, nValueAge == pWidget->GetValueAge());
+                }
+            }
+        }
+    }
 
-	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
-	{
-		pFormFiller->OnMouseExit(pPageView, pAnnot);
-	}
+    if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+    {
+        pFormFiller->OnMouseExit(pPageView, pAnnot);
+    }
 }
 
-FX_BOOL	CFFL_IFormFiller::OnLButtonDown(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
+FX_BOOL CFFL_IFormFiller::OnLButtonDown(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
 {
-	ASSERT(pAnnot != NULL);
-	ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+    ASSERT(pAnnot != NULL);
+    ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
 
-	if (!m_bNotifying)
-	{
-		CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
-		if (Annot_HitTest(pPageView, pAnnot, point) && pWidget->GetAAction(CPDF_AAction::ButtonDown))
-		{
-			m_bNotifying = TRUE;
-			pWidget->GetAppearanceAge();
-			int nValueAge = pWidget->GetValueAge();
-			pWidget->ClearAppModified();
+    if (!m_bNotifying)
+    {
+        CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
+        if (Annot_HitTest(pPageView, pAnnot, point) && pWidget->GetAAction(CPDF_AAction::ButtonDown))
+        {
+            m_bNotifying = TRUE;
+            pWidget->GetAppearanceAge();
+            int nValueAge = pWidget->GetValueAge();
+            pWidget->ClearAppModified();
 
-			ASSERT(pPageView != NULL);
+            ASSERT(pPageView != NULL);
 
 
 
-			PDFSDK_FieldAction fa;
-			fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlags);
- 			fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlags);
-			pWidget->OnAAction(CPDF_AAction::ButtonDown, fa, pPageView);
-			m_bNotifying = FALSE;
+            PDFSDK_FieldAction fa;
+            fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlags);
+            fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlags);
+            pWidget->OnAAction(CPDF_AAction::ButtonDown, fa, pPageView);
+            m_bNotifying = FALSE;
 
-			if (!IsValidAnnot(pPageView, pAnnot)) return TRUE;
+            if (!IsValidAnnot(pPageView, pAnnot)) return TRUE;
 
-			if (pWidget->IsAppModified())
-			{
-				if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE))
-				{
-					pFormFiller->ResetPDFWindow(pPageView, nValueAge == pWidget->GetValueAge());
-				}
-			}
-		}
-	}
+            if (pWidget->IsAppModified())
+            {
+                if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE))
+                {
+                    pFormFiller->ResetPDFWindow(pPageView, nValueAge == pWidget->GetValueAge());
+                }
+            }
+        }
+    }
 
-	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
-	{
-		return pFormFiller->OnLButtonDown(pPageView, pAnnot, nFlags, point);
-	}
+    if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+    {
+        return pFormFiller->OnLButtonDown(pPageView, pAnnot, nFlags, point);
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
-FX_BOOL	CFFL_IFormFiller::OnLButtonUp(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
+FX_BOOL CFFL_IFormFiller::OnLButtonUp(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
 {
-	ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
-	CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
-	CPDFSDK_Document* pDocument = m_pApp->GetSDKDocument();
+    ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+    CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
+    CPDFSDK_Document* pDocument = m_pApp->GetSDKDocument();
 
-	switch (pWidget->GetFieldType())
-	{
-	case FIELDTYPE_PUSHBUTTON:
-	case FIELDTYPE_CHECKBOX:
-	case FIELDTYPE_RADIOBUTTON:
-		if (GetViewBBox(pPageView, pAnnot).Contains((int)point.x, (int)point.y))
-			pDocument->SetFocusAnnot(pAnnot);
-		break;
-	default:
-		pDocument->SetFocusAnnot(pAnnot);
-		break;
-	}
+    switch (pWidget->GetFieldType())
+    {
+    case FIELDTYPE_PUSHBUTTON:
+    case FIELDTYPE_CHECKBOX:
+    case FIELDTYPE_RADIOBUTTON:
+        if (GetViewBBox(pPageView, pAnnot).Contains((int)point.x, (int)point.y))
+            pDocument->SetFocusAnnot(pAnnot);
+        break;
+    default:
+        pDocument->SetFocusAnnot(pAnnot);
+        break;
+    }
 
-	FX_BOOL bRet = FALSE;
+    FX_BOOL bRet = FALSE;
 
-	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
-	{
-		bRet = pFormFiller->OnLButtonUp(pPageView, pAnnot, nFlags, point);
-	}
+    if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+    {
+        bRet = pFormFiller->OnLButtonUp(pPageView, pAnnot, nFlags, point);
+    }
 
-	if (pDocument->GetFocusAnnot() == pAnnot)
-	{
-		FX_BOOL bExit = FALSE;
-		FX_BOOL bReset = FALSE;
-		OnButtonUp(pWidget, pPageView, bReset, bExit,nFlags);
-		if (bExit) return TRUE;
+    if (pDocument->GetFocusAnnot() == pAnnot)
+    {
+        FX_BOOL bExit = FALSE;
+        FX_BOOL bReset = FALSE;
+        OnButtonUp(pWidget, pPageView, bReset, bExit,nFlags);
+        if (bExit) return TRUE;
 
-		OnClick(pWidget, pPageView, bReset, bExit, nFlags);
-		if (bExit) return TRUE;
-	}
-	return bRet;
+        OnClick(pWidget, pPageView, bReset, bExit, nFlags);
+        if (bExit) return TRUE;
+    }
+    return bRet;
 }
 
 void CFFL_IFormFiller::OnButtonUp(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bReset, FX_BOOL& bExit,FX_UINT nFlag)
 {
-	ASSERT(pWidget != NULL);
+    ASSERT(pWidget != NULL);
 
-	if (!m_bNotifying)
-	{
-		if (pWidget->GetAAction(CPDF_AAction::ButtonUp))
-		{
-			m_bNotifying = TRUE;
-			int nAge = pWidget->GetAppearanceAge();
-			int nValueAge = pWidget->GetValueAge();
+    if (!m_bNotifying)
+    {
+        if (pWidget->GetAAction(CPDF_AAction::ButtonUp))
+        {
+            m_bNotifying = TRUE;
+            int nAge = pWidget->GetAppearanceAge();
+            int nValueAge = pWidget->GetValueAge();
 
-			ASSERT(pPageView != NULL);
-// 			CReader_DocView* pDocView = pPageView->GetDocView();
-// 			ASSERT(pDocView != NULL);
+            ASSERT(pPageView != NULL);
+//          CReader_DocView* pDocView = pPageView->GetDocView();
+//          ASSERT(pDocView != NULL);
 
 
 
-			PDFSDK_FieldAction fa;
-			fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
- 			fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
+            PDFSDK_FieldAction fa;
+            fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
+            fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
 
-			pWidget->OnAAction(CPDF_AAction::ButtonUp, fa, pPageView);
-			m_bNotifying = FALSE;
+            pWidget->OnAAction(CPDF_AAction::ButtonUp, fa, pPageView);
+            m_bNotifying = FALSE;
 
-			if (!IsValidAnnot(pPageView, pWidget))
-			{
-				bExit = TRUE;
-				return;
-			}
+            if (!IsValidAnnot(pPageView, pWidget))
+            {
+                bExit = TRUE;
+                return;
+            }
 
-			if (nAge != pWidget->GetAppearanceAge())
-			{
-				if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE))
-				{
-					pFormFiller->ResetPDFWindow(pPageView, nValueAge == pWidget->GetValueAge());
-				}
+            if (nAge != pWidget->GetAppearanceAge())
+            {
+                if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE))
+                {
+                    pFormFiller->ResetPDFWindow(pPageView, nValueAge == pWidget->GetValueAge());
+                }
 
-				bReset = TRUE;
-			}
-		}
-	}
+                bReset = TRUE;
+            }
+        }
+    }
 }
 
-FX_BOOL	CFFL_IFormFiller::OnLButtonDblClk(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
+FX_BOOL CFFL_IFormFiller::OnLButtonDblClk(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
 {
-	ASSERT(pAnnot != NULL);
-	ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+    ASSERT(pAnnot != NULL);
+    ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
 
-	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
-	{
-		return pFormFiller->OnLButtonDblClk(pPageView, pAnnot, nFlags, point);
-	}
+    if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+    {
+        return pFormFiller->OnLButtonDblClk(pPageView, pAnnot, nFlags, point);
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
-FX_BOOL	CFFL_IFormFiller::OnMouseMove(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
+FX_BOOL CFFL_IFormFiller::OnMouseMove(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
 {
-	ASSERT(pAnnot != NULL);
-	ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+    ASSERT(pAnnot != NULL);
+    ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
 
-	//change cursor
-	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, TRUE))
-	{
-		return pFormFiller->OnMouseMove(pPageView, pAnnot, nFlags, point);
-	}
+    //change cursor
+    if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, TRUE))
+    {
+        return pFormFiller->OnMouseMove(pPageView, pAnnot, nFlags, point);
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
-FX_BOOL	CFFL_IFormFiller::OnMouseWheel(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, short zDelta, const CPDF_Point& point)
+FX_BOOL CFFL_IFormFiller::OnMouseWheel(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, short zDelta, const CPDF_Point& point)
 {
-	ASSERT(pAnnot != NULL);
-	ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+    ASSERT(pAnnot != NULL);
+    ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
 
-	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
-	{
-		return pFormFiller->OnMouseWheel(pPageView, pAnnot, nFlags, zDelta, point);
-	}
+    if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+    {
+        return pFormFiller->OnMouseWheel(pPageView, pAnnot, nFlags, zDelta, point);
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
-FX_BOOL	CFFL_IFormFiller::OnRButtonDown(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
+FX_BOOL CFFL_IFormFiller::OnRButtonDown(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
 {
-	ASSERT(pAnnot != NULL);
-	ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+    ASSERT(pAnnot != NULL);
+    ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
 
-	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
-	{
-		return pFormFiller->OnRButtonDown(pPageView, pAnnot, nFlags, point);
-	}
+    if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+    {
+        return pFormFiller->OnRButtonDown(pPageView, pAnnot, nFlags, point);
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
-FX_BOOL	CFFL_IFormFiller::OnRButtonUp(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
+FX_BOOL CFFL_IFormFiller::OnRButtonUp(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
 {
-	ASSERT(pAnnot != NULL);
-	ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+    ASSERT(pAnnot != NULL);
+    ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
 
-	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
-	{
-		return pFormFiller->OnRButtonUp(pPageView, pAnnot, nFlags, point);
-	}
+    if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+    {
+        return pFormFiller->OnRButtonUp(pPageView, pAnnot, nFlags, point);
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
-FX_BOOL	CFFL_IFormFiller::OnRButtonDblClk(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
+FX_BOOL CFFL_IFormFiller::OnRButtonDblClk(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
 {
-	ASSERT(pAnnot != NULL);
-	ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+    ASSERT(pAnnot != NULL);
+    ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
 
-	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
-	{
-		return pFormFiller->OnRButtonDblClk(pPageView, pAnnot, nFlags, point);
-	}
+    if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+    {
+        return pFormFiller->OnRButtonDblClk(pPageView, pAnnot, nFlags, point);
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
-FX_BOOL	CFFL_IFormFiller::OnKeyDown(CPDFSDK_Annot* pAnnot, FX_UINT nKeyCode, FX_UINT nFlags)
+FX_BOOL CFFL_IFormFiller::OnKeyDown(CPDFSDK_Annot* pAnnot, FX_UINT nKeyCode, FX_UINT nFlags)
 {
-	ASSERT(pAnnot != NULL);
-	ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+    ASSERT(pAnnot != NULL);
+    ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
 
-	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
-	{
-		return pFormFiller->OnKeyDown(pAnnot, nKeyCode, nFlags);
-	}
+    if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+    {
+        return pFormFiller->OnKeyDown(pAnnot, nKeyCode, nFlags);
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
-FX_BOOL	CFFL_IFormFiller::OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags)
+FX_BOOL CFFL_IFormFiller::OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags)
 {
-	ASSERT(pAnnot != NULL);
-	ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+    ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+    if (nChar == FWL_VKEY_Tab)
+        return TRUE;
 
-	if (nChar == FWL_VKEY_Tab) return TRUE;
+    if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+        return pFormFiller->OnChar(pAnnot, nChar, nFlags);
 
-	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
-	{
-		return pFormFiller->OnChar(pAnnot, nChar, nFlags);
-	}
-
-	return FALSE;
+    return FALSE;
 }
 
 void CFFL_IFormFiller::OnDeSelected(CPDFSDK_Annot* pAnnot)
@@ -492,133 +478,115 @@
 
 FX_BOOL CFFL_IFormFiller::OnSetFocus(CPDFSDK_Annot* pAnnot,FX_UINT nFlag)
 {
-	if(!pAnnot) return FALSE;
-	ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+    if (!pAnnot)
+        return FALSE;
 
-	if (!m_bNotifying)
-	{
-		CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
- 		if (pWidget->GetAAction(CPDF_AAction::GetFocus))
- 		{
-  			m_bNotifying = TRUE;
-			pWidget->GetAppearanceAge();
-			int nValueAge = pWidget->GetValueAge();
- 			pWidget->ClearAppModified();
+    ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
 
+    if (!m_bNotifying)
+    {
+        CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
+        if (pWidget->GetAAction(CPDF_AAction::GetFocus))
+        {
+            m_bNotifying = TRUE;
+            pWidget->GetAppearanceAge();
 
- 			CPDFSDK_PageView* pPageView = pAnnot->GetPageView();
- 			ASSERT(pPageView != NULL);
+            int nValueAge = pWidget->GetValueAge();
+            pWidget->ClearAppModified();
 
- 			PDFSDK_FieldAction fa;
-			fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
- 			fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
+            CPDFSDK_PageView* pPageView = pAnnot->GetPageView();
+            ASSERT(pPageView != NULL);
 
+            PDFSDK_FieldAction fa;
+            fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
+            fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
 
- 			CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, TRUE);
- 			if(!pFormFiller) return FALSE;
- 			pFormFiller->GetActionData(pPageView, CPDF_AAction::GetFocus, fa);
+            CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, TRUE);
+            if(!pFormFiller) return FALSE;
+            pFormFiller->GetActionData(pPageView, CPDF_AAction::GetFocus, fa);
+            pWidget->OnAAction(CPDF_AAction::GetFocus, fa, pPageView);
+            m_bNotifying = FALSE;
 
- 			pWidget->OnAAction(CPDF_AAction::GetFocus, fa, pPageView);
- 			m_bNotifying = FALSE;
+            if (pWidget->IsAppModified())
+            {
+                if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE))
+                {
+                    pFormFiller->ResetPDFWindow(pPageView, nValueAge == pWidget->GetValueAge());
+                }
+            }
+        }
+    }
 
- //			if (!IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pAnnot)) return FALSE;
+    if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, TRUE))
+        return pFormFiller->OnSetFocus(pAnnot, nFlag);
 
- 			if (pWidget->IsAppModified())
- 			{
- 				if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE))
- 				{
- 					pFormFiller->ResetPDFWindow(pPageView, nValueAge == pWidget->GetValueAge());
- 				}
- 			}
-		}
-	}
-
-	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, TRUE))
-	{
-		if (pFormFiller->OnSetFocus(pAnnot, nFlag))
-		{
-			return TRUE;
-		}
-		else
-			return FALSE;
-	}
-
-	return TRUE;
+    return TRUE;
 }
 
-FX_BOOL	CFFL_IFormFiller::OnKillFocus(CPDFSDK_Annot* pAnnot,FX_UINT nFlag)
+FX_BOOL CFFL_IFormFiller::OnKillFocus(CPDFSDK_Annot* pAnnot,FX_UINT nFlag)
 {
-	if(!pAnnot) return FALSE;
-	ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+    if(!pAnnot) return FALSE;
+    ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
 
-	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
-	{
-		if (pFormFiller->OnKillFocus(pAnnot, nFlag))
-		{
- 			if (!m_bNotifying)
- 			{
- 				CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
- 				if (pWidget->GetAAction(CPDF_AAction::LoseFocus))
- 				{
- 					m_bNotifying = TRUE;
- 					pWidget->ClearAppModified();
+    if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+    {
+        if (pFormFiller->OnKillFocus(pAnnot, nFlag))
+        {
+            if (!m_bNotifying)
+            {
+                CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
+                if (pWidget->GetAAction(CPDF_AAction::LoseFocus))
+                {
+                    m_bNotifying = TRUE;
+                    pWidget->ClearAppModified();
 
- 					CPDFSDK_PageView* pPageView = pWidget->GetPageView();
- 					ASSERT(pPageView != NULL);
+                    CPDFSDK_PageView* pPageView = pWidget->GetPageView();
+                    ASSERT(pPageView != NULL);
 
- 					PDFSDK_FieldAction fa;
-					fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
- 					fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
+                    PDFSDK_FieldAction fa;
+                    fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
+                    fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
 
- 					pFormFiller->GetActionData(pPageView, CPDF_AAction::LoseFocus, fa);
+                    pFormFiller->GetActionData(pPageView, CPDF_AAction::LoseFocus, fa);
 
- 					pWidget->OnAAction(CPDF_AAction::LoseFocus, fa, pPageView);
- 					m_bNotifying = FALSE;
+                    pWidget->OnAAction(CPDF_AAction::LoseFocus, fa, pPageView);
+                    m_bNotifying = FALSE;
 
- 				}
- 			}
-		}
-		else
-			return FALSE;
-	}
+                }
+            }
+        }
+        else
+            return FALSE;
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
-FX_BOOL	CFFL_IFormFiller::IsVisible(CPDFSDK_Widget* pWidget)
+FX_BOOL CFFL_IFormFiller::IsVisible(CPDFSDK_Widget* pWidget)
 {
-	return pWidget->IsVisible();
+    return pWidget->IsVisible();
 }
 
-FX_BOOL	CFFL_IFormFiller::IsReadOnly(CPDFSDK_Widget* pWidget)
+FX_BOOL CFFL_IFormFiller::IsReadOnly(CPDFSDK_Widget* pWidget)
 {
-	ASSERT(pWidget != NULL);
+    ASSERT(pWidget != NULL);
 
-	int nFieldFlags = pWidget->GetFieldFlags();
+    int nFieldFlags = pWidget->GetFieldFlags();
 
-	return (nFieldFlags & FIELDFLAG_READONLY) == FIELDFLAG_READONLY;
+    return (nFieldFlags & FIELDFLAG_READONLY) == FIELDFLAG_READONLY;
 }
 
-FX_BOOL	CFFL_IFormFiller::IsFillingAllowed(CPDFSDK_Widget* pWidget)
+FX_BOOL CFFL_IFormFiller::IsFillingAllowed(CPDFSDK_Widget* pWidget)
 {
-	ASSERT(pWidget != NULL);
+    if (pWidget->GetFieldType() == FIELDTYPE_PUSHBUTTON)
+        return TRUE;
 
-	if (pWidget->GetFieldType() == FIELDTYPE_PUSHBUTTON)
-		return TRUE;
- 	else
- 	{
- 		CPDF_Page* pPage = pWidget->GetPDFPage();
- 		ASSERT(pPage != NULL);
-
- 		CPDF_Document* pDocument = pPage->m_pDocument;
- 		ASSERT(pDocument != NULL);
-
-		FX_DWORD dwPermissions = pDocument->GetUserPermissions();
- 		return (dwPermissions&FPDFPERM_FILL_FORM) ||
- 				(dwPermissions&FPDFPERM_ANNOT_FORM) ||
- 			(dwPermissions&FPDFPERM_MODIFY);
- 	}
-	return TRUE;
+    CPDF_Page* pPage = pWidget->GetPDFPage();
+    CPDF_Document* pDocument = pPage->m_pDocument;
+    FX_DWORD dwPermissions = pDocument->GetUserPermissions();
+    return (dwPermissions & FPDFPERM_FILL_FORM) ||
+            (dwPermissions & FPDFPERM_ANNOT_FORM) ||
+            (dwPermissions & FPDFPERM_MODIFY);
 }
 
 CFFL_FormFiller* CFFL_IFormFiller::GetFormFiller(CPDFSDK_Annot* pAnnot, FX_BOOL bRegister)
@@ -667,10 +635,10 @@
 
 void CFFL_IFormFiller::RemoveFormFiller(CPDFSDK_Annot* pAnnot)
 {
-	if ( pAnnot != NULL )
-	{
-		UnRegisterFormFiller( pAnnot );
-	}
+    if ( pAnnot != NULL )
+    {
+        UnRegisterFormFiller( pAnnot );
+    }
 }
 
 void CFFL_IFormFiller::UnRegisterFormFiller(CPDFSDK_Annot* pAnnot)
@@ -690,93 +658,93 @@
 
 void CFFL_IFormFiller::QueryWherePopup(void* pPrivateData, FX_FLOAT fPopupMin,FX_FLOAT fPopupMax, int32_t & nRet, FX_FLOAT & fPopupRet)
 {
-	ASSERT(pPrivateData != NULL);
+    ASSERT(pPrivateData != NULL);
 
-	CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData;
+    CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData;
 
 
 
 
-	CPDF_Rect rcPageView(0,0,0,0);
-	rcPageView.right = pData->pWidget->GetPDFPage()->GetPageWidth();
-	rcPageView.bottom = pData->pWidget->GetPDFPage()->GetPageHeight();
-	rcPageView.Normalize();
+    CPDF_Rect rcPageView(0,0,0,0);
+    rcPageView.right = pData->pWidget->GetPDFPage()->GetPageWidth();
+    rcPageView.bottom = pData->pWidget->GetPDFPage()->GetPageHeight();
+    rcPageView.Normalize();
 
 
-	ASSERT(pData->pWidget != NULL);
-	CPDF_Rect rcAnnot = pData->pWidget->GetRect();
+    ASSERT(pData->pWidget != NULL);
+    CPDF_Rect rcAnnot = pData->pWidget->GetRect();
 
-	FX_FLOAT fTop = 0.0f;
-	FX_FLOAT fBottom = 0.0f;
+    FX_FLOAT fTop = 0.0f;
+    FX_FLOAT fBottom = 0.0f;
 
-	CPDFSDK_Widget * pWidget = (CPDFSDK_Widget*)pData->pWidget;
-	switch (pWidget->GetRotate() / 90)
-	{
-	default:
-	case 0:
-		fTop = rcPageView.top - rcAnnot.top;
-		fBottom = rcAnnot.bottom - rcPageView.bottom;
-		break;
-	case 1:
-		fTop = rcAnnot.left - rcPageView.left;
-		fBottom = rcPageView.right - rcAnnot.right;
-		break;
-	case 2:
-		fTop = rcAnnot.bottom - rcPageView.bottom;
-		fBottom = rcPageView.top - rcAnnot.top;
-		break;
-	case 3:
-		fTop = rcPageView.right - rcAnnot.right;
-		fBottom = rcAnnot.left - rcPageView.left;
-		break;
-	}
+    CPDFSDK_Widget * pWidget = (CPDFSDK_Widget*)pData->pWidget;
+    switch (pWidget->GetRotate() / 90)
+    {
+    default:
+    case 0:
+        fTop = rcPageView.top - rcAnnot.top;
+        fBottom = rcAnnot.bottom - rcPageView.bottom;
+        break;
+    case 1:
+        fTop = rcAnnot.left - rcPageView.left;
+        fBottom = rcPageView.right - rcAnnot.right;
+        break;
+    case 2:
+        fTop = rcAnnot.bottom - rcPageView.bottom;
+        fBottom = rcPageView.top - rcAnnot.top;
+        break;
+    case 3:
+        fTop = rcPageView.right - rcAnnot.right;
+        fBottom = rcAnnot.left - rcPageView.left;
+        break;
+    }
 
-	FX_FLOAT fFactHeight = 0;
-	FX_BOOL bBottom = TRUE;
-	FX_FLOAT fMaxListBoxHeight = 0;
-	if (fPopupMax > FFL_MAXLISTBOXHEIGHT)
-	{
-		if (fPopupMin > FFL_MAXLISTBOXHEIGHT)
-		{
-			fMaxListBoxHeight = fPopupMin;
-		}
-		else
-		{
-			fMaxListBoxHeight = FFL_MAXLISTBOXHEIGHT;
-		}
-	}
-	else
-		fMaxListBoxHeight = fPopupMax;
+    FX_FLOAT fFactHeight = 0;
+    FX_BOOL bBottom = TRUE;
+    FX_FLOAT fMaxListBoxHeight = 0;
+    if (fPopupMax > FFL_MAXLISTBOXHEIGHT)
+    {
+        if (fPopupMin > FFL_MAXLISTBOXHEIGHT)
+        {
+            fMaxListBoxHeight = fPopupMin;
+        }
+        else
+        {
+            fMaxListBoxHeight = FFL_MAXLISTBOXHEIGHT;
+        }
+    }
+    else
+        fMaxListBoxHeight = fPopupMax;
 
-	if (fBottom > fMaxListBoxHeight)
-	{
-		fFactHeight = fMaxListBoxHeight;
-		bBottom = TRUE;
-	}
-	else
-	{
-		if (fTop > fMaxListBoxHeight)
-		{
-			fFactHeight = fMaxListBoxHeight;
-			bBottom = FALSE;
-		}
-		else
-		{
-			if (fTop > fBottom)
-			{
-				fFactHeight = fTop;
-				bBottom = FALSE;
-			}
-			else
-			{
-				fFactHeight = fBottom;
-				bBottom = TRUE;
-			}
-		}
-	}
+    if (fBottom > fMaxListBoxHeight)
+    {
+        fFactHeight = fMaxListBoxHeight;
+        bBottom = TRUE;
+    }
+    else
+    {
+        if (fTop > fMaxListBoxHeight)
+        {
+            fFactHeight = fMaxListBoxHeight;
+            bBottom = FALSE;
+        }
+        else
+        {
+            if (fTop > fBottom)
+            {
+                fFactHeight = fTop;
+                bBottom = FALSE;
+            }
+            else
+            {
+                fFactHeight = fBottom;
+                bBottom = TRUE;
+            }
+        }
+    }
 
-	nRet = bBottom ? 0 : 1;
-	fPopupRet = fFactHeight;
+    nRet = bBottom ? 0 : 1;
+    fPopupRet = fFactHeight;
 }
 
 void CFFL_IFormFiller::OnSetWindowRect(void* pPrivateData, const CPDF_Rect & rcWindow)
@@ -819,210 +787,206 @@
 
 void CFFL_IFormFiller::OnKeyStrokeCommit(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bRC, FX_BOOL& bExit, FX_DWORD nFlag)
 {
-	if (!m_bNotifying)
-	{
-		ASSERT(pWidget != NULL);
-		if (pWidget->GetAAction(CPDF_AAction::KeyStroke))
-		{
-			m_bNotifying = TRUE;
-			pWidget->ClearAppModified();
+    if (!m_bNotifying)
+    {
+        ASSERT(pWidget != NULL);
+        if (pWidget->GetAAction(CPDF_AAction::KeyStroke))
+        {
+            m_bNotifying = TRUE;
+            pWidget->ClearAppModified();
 
-			ASSERT(pPageView != NULL);
-// 			CReader_DocView* pDocView = pPageView->GetDocView();
-// 			ASSERT(pDocView != NULL);
+            ASSERT(pPageView != NULL);
 
+            PDFSDK_FieldAction fa;
+            fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
+            fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
+            fa.bWillCommit = TRUE;
+            fa.bKeyDown = TRUE;
+            fa.bRC = TRUE;
 
+            CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE);
+            ASSERT(pFormFiller != NULL);
 
-			PDFSDK_FieldAction fa;
-			fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
- 			fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
-			fa.bWillCommit = TRUE;
-			fa.bKeyDown = TRUE;
-			fa.bRC = TRUE;
+            pFormFiller->GetActionData(pPageView, CPDF_AAction::KeyStroke, fa);
+            pFormFiller->SaveState(pPageView);
 
-			CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE);
-			ASSERT(pFormFiller != NULL);
+            PDFSDK_FieldAction faOld = fa;
+            pWidget->OnAAction(CPDF_AAction::KeyStroke, fa, pPageView);
 
-			pFormFiller->GetActionData(pPageView, CPDF_AAction::KeyStroke, fa);
-			pFormFiller->SaveState(pPageView);
+            bRC = fa.bRC;
+//          bExit = !IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pWidget);
 
-			PDFSDK_FieldAction faOld = fa;
-			pWidget->OnAAction(CPDF_AAction::KeyStroke, fa, pPageView);
-
-			bRC = fa.bRC;
-//			bExit = !IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pWidget);
-
-			m_bNotifying = FALSE;
-		}
-	}
+            m_bNotifying = FALSE;
+        }
+    }
 }
 
 void CFFL_IFormFiller::OnValidate(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bRC, FX_BOOL& bExit, FX_DWORD nFlag)
 {
-	if (!m_bNotifying)
-	{
-		ASSERT(pWidget != NULL);
-		if (pWidget->GetAAction(CPDF_AAction::Validate))
-		{
-			m_bNotifying = TRUE;
-			pWidget->ClearAppModified();
+    if (!m_bNotifying)
+    {
+        ASSERT(pWidget != NULL);
+        if (pWidget->GetAAction(CPDF_AAction::Validate))
+        {
+            m_bNotifying = TRUE;
+            pWidget->ClearAppModified();
 
-			ASSERT(pPageView != NULL);
-// 			CReader_DocView* pDocView = pPageView->GetDocView();
-// 			ASSERT(pDocView != NULL);
+            ASSERT(pPageView != NULL);
+//          CReader_DocView* pDocView = pPageView->GetDocView();
+//          ASSERT(pDocView != NULL);
 
 
 
-			PDFSDK_FieldAction fa;
-			fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
- 			fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
-			fa.bKeyDown = TRUE;
-			fa.bRC = TRUE;
+            PDFSDK_FieldAction fa;
+            fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
+            fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
+            fa.bKeyDown = TRUE;
+            fa.bRC = TRUE;
 
-			CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE);
-			ASSERT(pFormFiller != NULL);
+            CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE);
+            ASSERT(pFormFiller != NULL);
 
-			pFormFiller->GetActionData(pPageView, CPDF_AAction::Validate, fa);
-			pFormFiller->SaveState(pPageView);
+            pFormFiller->GetActionData(pPageView, CPDF_AAction::Validate, fa);
+            pFormFiller->SaveState(pPageView);
 
-			PDFSDK_FieldAction faOld = fa;
-			pWidget->OnAAction(CPDF_AAction::Validate, fa, pPageView);
+            PDFSDK_FieldAction faOld = fa;
+            pWidget->OnAAction(CPDF_AAction::Validate, fa, pPageView);
 
-			bRC = fa.bRC;
-//			bExit = !IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pWidget);
+            bRC = fa.bRC;
+//          bExit = !IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pWidget);
 
-			m_bNotifying = FALSE;
-		}
-	}
+            m_bNotifying = FALSE;
+        }
+    }
 }
 
 void CFFL_IFormFiller::OnCalculate(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bExit, FX_DWORD nFlag)
 {
-	if (!m_bNotifying)
-	{
-		ASSERT(pWidget != NULL);
-		ASSERT(pPageView != NULL);
-// 		CReader_DocView* pDocView = pPageView->GetDocView();
-// 		ASSERT(pDocView != NULL);
-		CPDFSDK_Document* pDocument = pPageView->GetSDKDocument();
-		ASSERT(pDocument != NULL);
+    if (!m_bNotifying)
+    {
+        ASSERT(pWidget != NULL);
+        ASSERT(pPageView != NULL);
+//      CReader_DocView* pDocView = pPageView->GetDocView();
+//      ASSERT(pDocView != NULL);
+        CPDFSDK_Document* pDocument = pPageView->GetSDKDocument();
+        ASSERT(pDocument != NULL);
 
-		CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
-		ASSERT(pInterForm != NULL);
+        CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
+        ASSERT(pInterForm != NULL);
 
-		pInterForm->OnCalculate(pWidget->GetFormField());
+        pInterForm->OnCalculate(pWidget->GetFormField());
 
-//		bExit = !IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pWidget);
+//      bExit = !IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pWidget);
 
-		m_bNotifying = FALSE;
-	}
+        m_bNotifying = FALSE;
+    }
 }
 
 void CFFL_IFormFiller::OnFormat(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bExit, FX_DWORD nFlag)
 {
-	if (!m_bNotifying)
-	{
-		ASSERT(pWidget != NULL);
-		ASSERT(pPageView != NULL);
-// 		CReader_DocView* pDocView = pPageView->GetDocView();
-// 		ASSERT(pDocView != NULL);
-		CPDFSDK_Document* pDocument = pPageView->GetSDKDocument();
-		ASSERT(pDocument != NULL);
+    if (!m_bNotifying)
+    {
+        ASSERT(pWidget != NULL);
+        ASSERT(pPageView != NULL);
+//      CReader_DocView* pDocView = pPageView->GetDocView();
+//      ASSERT(pDocView != NULL);
+        CPDFSDK_Document* pDocument = pPageView->GetSDKDocument();
+        ASSERT(pDocument != NULL);
 
-		CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
-		ASSERT(pInterForm != NULL);
+        CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
+        ASSERT(pInterForm != NULL);
 
-		FX_BOOL bFormated = FALSE;
-		CFX_WideString sValue = pInterForm->OnFormat(pWidget->GetFormField(), bFormated);
+        FX_BOOL bFormated = FALSE;
+        CFX_WideString sValue = pInterForm->OnFormat(pWidget->GetFormField(), bFormated);
 
-//		bExit = !IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pWidget);
+//      bExit = !IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pWidget);
 
-		if (bExit) return;
+        if (bExit) return;
 
-		if (bFormated)
-		{
-			pInterForm->ResetFieldAppearance(pWidget->GetFormField(), sValue.c_str(), TRUE);
-			pInterForm->UpdateField(pWidget->GetFormField());
-		}
+        if (bFormated)
+        {
+            pInterForm->ResetFieldAppearance(pWidget->GetFormField(), sValue.c_str(), TRUE);
+            pInterForm->UpdateField(pWidget->GetFormField());
+        }
 
-		m_bNotifying = FALSE;
-	}
+        m_bNotifying = FALSE;
+    }
 }
 
 void CFFL_IFormFiller::OnClick(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bReset, FX_BOOL& bExit, FX_UINT nFlag)
 {
-	ASSERT(pWidget != NULL);
+    ASSERT(pWidget != NULL);
 
-	if (!m_bNotifying)
-	{
-		if (pWidget->HasXFAAAction(PDFSDK_XFA_Click))
-		{
-			m_bNotifying = TRUE;
-			int nAge = pWidget->GetAppearanceAge();
-			int nValueAge = pWidget->GetValueAge();
+    if (!m_bNotifying)
+    {
+        if (pWidget->HasXFAAAction(PDFSDK_XFA_Click))
+        {
+            m_bNotifying = TRUE;
+            int nAge = pWidget->GetAppearanceAge();
+            int nValueAge = pWidget->GetValueAge();
 
-			PDFSDK_FieldAction fa;
-			fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
-			fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
+            PDFSDK_FieldAction fa;
+            fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
+            fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
 
-			pWidget->OnXFAAAction(PDFSDK_XFA_Click, fa, pPageView);
-			m_bNotifying = FALSE;
+            pWidget->OnXFAAAction(PDFSDK_XFA_Click, fa, pPageView);
+            m_bNotifying = FALSE;
 
-			if (!IsValidAnnot(pPageView, pWidget))
-			{
-				bExit = TRUE;
-				return;
-			}
+            if (!IsValidAnnot(pPageView, pWidget))
+            {
+                bExit = TRUE;
+                return;
+            }
 
-			if (nAge != pWidget->GetAppearanceAge())
-			{
-				if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE))
-				{
-					pFormFiller->ResetPDFWindow(pPageView, nValueAge == pWidget->GetValueAge());
-				}
+            if (nAge != pWidget->GetAppearanceAge())
+            {
+                if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE))
+                {
+                    pFormFiller->ResetPDFWindow(pPageView, nValueAge == pWidget->GetValueAge());
+                }
 
-				bReset = TRUE;
-			}
-		}
-	}
+                bReset = TRUE;
+            }
+        }
+    }
 }
 
 void CFFL_IFormFiller::OnFull(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bReset, FX_BOOL& bExit, FX_UINT nFlag)
 {
-	ASSERT(pWidget != NULL);
+    ASSERT(pWidget != NULL);
 
-	if (!m_bNotifying)
-	{
-		if (pWidget->HasXFAAAction(PDFSDK_XFA_Full))
-		{
-			m_bNotifying = TRUE;
-			int nAge = pWidget->GetAppearanceAge();
-			int nValueAge = pWidget->GetValueAge();
+    if (!m_bNotifying)
+    {
+        if (pWidget->HasXFAAAction(PDFSDK_XFA_Full))
+        {
+            m_bNotifying = TRUE;
+            int nAge = pWidget->GetAppearanceAge();
+            int nValueAge = pWidget->GetValueAge();
 
-			PDFSDK_FieldAction fa;
-			fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
-			fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
+            PDFSDK_FieldAction fa;
+            fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
+            fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
 
-			pWidget->OnXFAAAction(PDFSDK_XFA_Full, fa, pPageView);
-			m_bNotifying = FALSE;
+            pWidget->OnXFAAAction(PDFSDK_XFA_Full, fa, pPageView);
+            m_bNotifying = FALSE;
 
-			if (!IsValidAnnot(pPageView, pWidget))
-			{
-				bExit = TRUE;
-				return;
-			}
+            if (!IsValidAnnot(pPageView, pWidget))
+            {
+                bExit = TRUE;
+                return;
+            }
 
-			if (nAge != pWidget->GetAppearanceAge())
-			{
-				if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE))
-				{
-					pFormFiller->ResetPDFWindow(pPageView, nValueAge == pWidget->GetValueAge());
-				}
+            if (nAge != pWidget->GetAppearanceAge())
+            {
+                if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE))
+                {
+                    pFormFiller->ResetPDFWindow(pPageView, nValueAge == pWidget->GetValueAge());
+                }
 
-				bReset = TRUE;
-			}
-		}
-	}
+                bReset = TRUE;
+            }
+        }
+    }
 }
 
 void CFFL_IFormFiller::OnPopupPreOpen(void* pPrivateData, FX_BOOL& bExit, FX_DWORD nFlag)
@@ -1135,14 +1099,10 @@
 
 FX_BOOL	CFFL_IFormFiller::IsValidAnnot(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot)
 {
+    if(pPageView)
+        return pPageView->IsValidAnnot(pAnnot->GetPDFAnnot());
 
-	ASSERT(pPageView != NULL);
-	ASSERT(pAnnot != NULL);
-
-	if(pPageView)
-		return pPageView->IsValidAnnot(pAnnot->GetPDFAnnot());
-	else
-		return FALSE;
+    return FALSE;
 }
 
 void CFFL_IFormFiller::BeforeUndo(CPDFSDK_Document* pDocument)
diff --git a/fpdfsdk/src/formfiller/FFL_TextField.cpp b/fpdfsdk/src/formfiller/FFL_TextField.cpp
index db69101..dbcf4e5 100644
--- a/fpdfsdk/src/formfiller/FFL_TextField.cpp
+++ b/fpdfsdk/src/formfiller/FFL_TextField.cpp
@@ -10,11 +10,11 @@
 /* ------------------------------- CFFL_TextField ------------------------------- */
 
 CFFL_TextField::CFFL_TextField(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot) :
-	CFFL_FormFiller(pApp, pAnnot),
-	m_pFontMap(NULL)//,
-	//m_pSpellCheck(NULL)
+    CFFL_FormFiller(pApp, pAnnot),
+    m_pFontMap(NULL)//,
+    //m_pSpellCheck(NULL)
 {
-	m_State.nStart = m_State.nEnd = 0;
+    m_State.nStart = m_State.nEnd = 0;
 }
 
 CFFL_TextField::~CFFL_TextField()
@@ -24,112 +24,112 @@
 
 PWL_CREATEPARAM CFFL_TextField::GetCreateParam()
 {
-	PWL_CREATEPARAM cp = CFFL_FormFiller::GetCreateParam();
+    PWL_CREATEPARAM cp = CFFL_FormFiller::GetCreateParam();
 
-	ASSERT(m_pWidget != NULL);
-	int nFlags = m_pWidget->GetFieldFlags();
+    ASSERT(m_pWidget != NULL);
+    int nFlags = m_pWidget->GetFieldFlags();
 
 
-	if (nFlags & FIELDFLAG_PASSWORD)
-	{
-		cp.dwFlags |= PES_PASSWORD;
-	}
+    if (nFlags & FIELDFLAG_PASSWORD)
+    {
+        cp.dwFlags |= PES_PASSWORD;
+    }
 
-	if (!(nFlags & FIELDFLAG_DONOTSPELLCHECK))
-	{
-	}
+    if (!(nFlags & FIELDFLAG_DONOTSPELLCHECK))
+    {
+    }
 
-	if (nFlags & FIELDFLAG_MULTILINE)
-	{
-		cp.dwFlags |= PES_MULTILINE | PES_AUTORETURN | PES_TOP;
+    if (nFlags & FIELDFLAG_MULTILINE)
+    {
+        cp.dwFlags |= PES_MULTILINE | PES_AUTORETURN | PES_TOP;
 
-		if (!(nFlags & FIELDFLAG_DONOTSCROLL))
-		{
-			cp.dwFlags |= PWS_VSCROLL | PES_AUTOSCROLL;
-		}
-	}
-	else
-	{
-		cp.dwFlags |= PES_CENTER;
+        if (!(nFlags & FIELDFLAG_DONOTSCROLL))
+        {
+            cp.dwFlags |= PWS_VSCROLL | PES_AUTOSCROLL;
+        }
+    }
+    else
+    {
+        cp.dwFlags |= PES_CENTER;
 
-		if (!(nFlags & FIELDFLAG_DONOTSCROLL))
-		{
-			cp.dwFlags |= PES_AUTOSCROLL;
-		}
-	}
+        if (!(nFlags & FIELDFLAG_DONOTSCROLL))
+        {
+            cp.dwFlags |= PES_AUTOSCROLL;
+        }
+    }
 
-	if (nFlags & FIELDFLAG_COMB)
-	{
-		cp.dwFlags |= PES_CHARARRAY;
-	}
+    if (nFlags & FIELDFLAG_COMB)
+    {
+        cp.dwFlags |= PES_CHARARRAY;
+    }
 
-	if (nFlags & FIELDFLAG_RICHTEXT)
-	{
-		cp.dwFlags |= PES_RICH;
-	}
+    if (nFlags & FIELDFLAG_RICHTEXT)
+    {
+        cp.dwFlags |= PES_RICH;
+    }
 
-	cp.dwFlags |= PES_UNDO;
+    cp.dwFlags |= PES_UNDO;
 
- 	switch (m_pWidget->GetAlignment())
- 	{
- 	default:
- 	case BF_ALIGN_LEFT:
- 		cp.dwFlags |= PES_LEFT;
- 		break;
- 	case BF_ALIGN_MIDDLE:
- 		cp.dwFlags |= PES_MIDDLE;
- 		break;
- 	case BF_ALIGN_RIGHT:
- 		cp.dwFlags |= PES_RIGHT;
- 		break;
- 	}
+    switch (m_pWidget->GetAlignment())
+    {
+    default:
+    case BF_ALIGN_LEFT:
+        cp.dwFlags |= PES_LEFT;
+        break;
+    case BF_ALIGN_MIDDLE:
+        cp.dwFlags |= PES_MIDDLE;
+        break;
+    case BF_ALIGN_RIGHT:
+        cp.dwFlags |= PES_RIGHT;
+        break;
+    }
 
-	if (!m_pFontMap)
-	{
-		m_pFontMap = new CBA_FontMap(m_pWidget, m_pApp->GetSysHandler());
-		m_pFontMap->Initial();
-	}
-	cp.pFontMap = m_pFontMap;
-	cp.pFocusHandler = this;
+    if (!m_pFontMap)
+    {
+        m_pFontMap = new CBA_FontMap(m_pWidget, m_pApp->GetSysHandler());
+        m_pFontMap->Initial();
+    }
+    cp.pFontMap = m_pFontMap;
+    cp.pFocusHandler = this;
 
-	return cp;
+    return cp;
 }
 
 CPWL_Wnd* CFFL_TextField::NewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView)
 {
-	CPWL_Edit * pWnd = new CPWL_Edit();
-		pWnd->AttachFFLData(this);
-	pWnd->Create(cp);
+    CPWL_Edit * pWnd = new CPWL_Edit();
+        pWnd->AttachFFLData(this);
+    pWnd->Create(cp);
 
 
 
-	ASSERT(m_pApp != NULL);
-	CFFL_IFormFiller* pIFormFiller = m_pApp->GetIFormFiller();
-	pWnd->SetFillerNotify(pIFormFiller);
+    ASSERT(m_pApp != NULL);
+    CFFL_IFormFiller* pIFormFiller = m_pApp->GetIFormFiller();
+    pWnd->SetFillerNotify(pIFormFiller);
 
-	ASSERT(m_pWidget != NULL);
-	int32_t nMaxLen = m_pWidget->GetMaxLen();
-	CFX_WideString swValue = m_pWidget->GetValue();
+    ASSERT(m_pWidget != NULL);
+    int32_t nMaxLen = m_pWidget->GetMaxLen();
+    CFX_WideString swValue = m_pWidget->GetValue();
 
-	if (nMaxLen > 0)
-	{
-		if (pWnd->HasFlag(PES_CHARARRAY))
-		{
-			pWnd->SetCharArray(nMaxLen);
-			pWnd->SetAlignFormatV(PEAV_CENTER);
-		}
-		else
-		{
-			pWnd->SetLimitChar(nMaxLen);
-		}
-	}
+    if (nMaxLen > 0)
+    {
+        if (pWnd->HasFlag(PES_CHARARRAY))
+        {
+            pWnd->SetCharArray(nMaxLen);
+            pWnd->SetAlignFormatV(PEAV_CENTER);
+        }
+        else
+        {
+            pWnd->SetLimitChar(nMaxLen);
+        }
+    }
 
-	pWnd->SetText(swValue.c_str());
-	return pWnd;
+    pWnd->SetText(swValue.c_str());
+    return pWnd;
 }
 
 
-FX_BOOL	CFFL_TextField::OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags)
+FX_BOOL CFFL_TextField::OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags)
 {
 	switch (nChar)
 	{
@@ -173,143 +173,143 @@
 	return CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags);
 }
 
-FX_BOOL	CFFL_TextField::IsDataChanged(CPDFSDK_PageView* pPageView)
+FX_BOOL CFFL_TextField::IsDataChanged(CPDFSDK_PageView* pPageView)
 {
-	ASSERT(m_pWidget != NULL);
+    ASSERT(m_pWidget != NULL);
 
- 	if (CPWL_Edit * pEdit = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE))
- 		return pEdit->GetText() != m_pWidget->GetValue();
+    if (CPWL_Edit * pEdit = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE))
+        return pEdit->GetText() != m_pWidget->GetValue();
 
-	return FALSE;
+    return FALSE;
 }
 
 void CFFL_TextField::SaveData(CPDFSDK_PageView* pPageView)
 {
-	ASSERT(m_pWidget != NULL);
+    ASSERT(m_pWidget != NULL);
 
-	if (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE))
-	{
-		CFX_WideString sOldValue = m_pWidget->GetValue();
-		CFX_WideString sNewValue = pWnd->GetText();
+    if (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE))
+    {
+        CFX_WideString sOldValue = m_pWidget->GetValue();
+        CFX_WideString sNewValue = pWnd->GetText();
 
-		m_pWidget->SetValue(sNewValue, FALSE);
-		m_pWidget->ResetFieldAppearance(TRUE);
-		m_pWidget->UpdateField();
-		SetChangeMark();
-	}
+        m_pWidget->SetValue(sNewValue, FALSE);
+        m_pWidget->ResetFieldAppearance(TRUE);
+        m_pWidget->UpdateField();
+        SetChangeMark();
+    }
 }
 
 void CFFL_TextField::GetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
-									PDFSDK_FieldAction& fa)
+                                    PDFSDK_FieldAction& fa)
 {
-	switch (type)
-	{
-	case CPDF_AAction::KeyStroke:
-		if (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE))
-		{
-			fa.bFieldFull = pWnd->IsTextFull();
+    switch (type)
+    {
+    case CPDF_AAction::KeyStroke:
+        if (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE))
+        {
+            fa.bFieldFull = pWnd->IsTextFull();
 
-			fa.sValue = pWnd->GetText();
+            fa.sValue = pWnd->GetText();
 
-			if (fa.bFieldFull)
-			{
-				fa.sChange = L"";
-				fa.sChangeEx = L"";
-			}
-		}
-		break;
-	case CPDF_AAction::Validate:
-		if (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE))
-		{
-			fa.sValue = pWnd->GetText();
-		}
-		break;
-	case CPDF_AAction::LoseFocus:
-	case CPDF_AAction::GetFocus:
-		ASSERT(m_pWidget != NULL);
-		fa.sValue = m_pWidget->GetValue();
-		break;
-	default:
-		break;
-	}
+            if (fa.bFieldFull)
+            {
+                fa.sChange = L"";
+                fa.sChangeEx = L"";
+            }
+        }
+        break;
+    case CPDF_AAction::Validate:
+        if (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE))
+        {
+            fa.sValue = pWnd->GetText();
+        }
+        break;
+    case CPDF_AAction::LoseFocus:
+    case CPDF_AAction::GetFocus:
+        ASSERT(m_pWidget != NULL);
+        fa.sValue = m_pWidget->GetValue();
+        break;
+    default:
+        break;
+    }
 }
 
 void CFFL_TextField::SetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
- 									const PDFSDK_FieldAction& fa)
+                                    const PDFSDK_FieldAction& fa)
 {
-	switch (type)
-	{
-	case CPDF_AAction::KeyStroke:
-		if (CPWL_Edit * pEdit = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE))
-		{
-			pEdit->SetFocus();
-			pEdit->SetSel(fa.nSelStart, fa.nSelEnd);
-			pEdit->ReplaceSel(fa.sChange.c_str());
-		}
-		break;
-	default:
-		break;
-	}
+    switch (type)
+    {
+    case CPDF_AAction::KeyStroke:
+        if (CPWL_Edit * pEdit = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE))
+        {
+            pEdit->SetFocus();
+            pEdit->SetSel(fa.nSelStart, fa.nSelEnd);
+            pEdit->ReplaceSel(fa.sChange.c_str());
+        }
+        break;
+    default:
+        break;
+    }
 }
 
 
-FX_BOOL	CFFL_TextField::IsActionDataChanged(CPDF_AAction::AActionType type, const PDFSDK_FieldAction& faOld,
-									const PDFSDK_FieldAction& faNew)
+FX_BOOL CFFL_TextField::IsActionDataChanged(CPDF_AAction::AActionType type, const PDFSDK_FieldAction& faOld,
+                                    const PDFSDK_FieldAction& faNew)
 {
-	switch (type)
-	{
-	case CPDF_AAction::KeyStroke:
-		return (!faOld.bFieldFull && faOld.nSelEnd != faNew.nSelEnd) || faOld.nSelStart != faNew.nSelStart ||
-			faOld.sChange != faNew.sChange;
-	default:
-		break;
-	}
+    switch (type)
+    {
+    case CPDF_AAction::KeyStroke:
+        return (!faOld.bFieldFull && faOld.nSelEnd != faNew.nSelEnd) || faOld.nSelStart != faNew.nSelStart ||
+            faOld.sChange != faNew.sChange;
+    default:
+        break;
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
 void CFFL_TextField::SaveState(CPDFSDK_PageView* pPageView)
 {
-	ASSERT(pPageView != NULL);
+    ASSERT(pPageView != NULL);
 
-	if (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE))
-	{
-		pWnd->GetSel(m_State.nStart, m_State.nEnd);
-		m_State.sValue = pWnd->GetText();
-	}
+    if (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE))
+    {
+        pWnd->GetSel(m_State.nStart, m_State.nEnd);
+        m_State.sValue = pWnd->GetText();
+    }
 }
 
 void CFFL_TextField::RestoreState(CPDFSDK_PageView* pPageView)
 {
-	ASSERT(pPageView != NULL);
+    ASSERT(pPageView != NULL);
 
-	if (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, TRUE))
-	{
-		pWnd->SetText(m_State.sValue.c_str());
-		pWnd->SetSel(m_State.nStart, m_State.nEnd);
-	}
+    if (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, TRUE))
+    {
+        pWnd->SetText(m_State.sValue.c_str());
+        pWnd->SetSel(m_State.nStart, m_State.nEnd);
+    }
 }
 
 CPWL_Wnd* CFFL_TextField::ResetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bRestoreValue)
 {
-	if (bRestoreValue)
-		SaveState(pPageView);
+    if (bRestoreValue)
+        SaveState(pPageView);
 
-	DestroyPDFWindow(pPageView);
+    DestroyPDFWindow(pPageView);
 
-	CPWL_Wnd* pRet = NULL;
+    CPWL_Wnd* pRet = NULL;
 
-	if (bRestoreValue)
-	{
-		RestoreState(pPageView);
-		pRet = GetPDFWindow(pPageView, FALSE);
-	}
-	else
-		pRet = GetPDFWindow(pPageView, TRUE);
+    if (bRestoreValue)
+    {
+        RestoreState(pPageView);
+        pRet = GetPDFWindow(pPageView, FALSE);
+    }
+    else
+        pRet = GetPDFWindow(pPageView, TRUE);
 
-	m_pWidget->UpdateField();
+    m_pWidget->UpdateField();
 
-	return pRet;
+    return pRet;
 }
 
 FX_BOOL	CFFL_TextField::IsFieldFull(CPDFSDK_PageView* pPageView)
@@ -324,26 +324,26 @@
 
 void CFFL_TextField::OnSetFocus(CPWL_Wnd* pWnd)
 {
-	ASSERT(m_pApp != NULL);
+    ASSERT(m_pApp != NULL);
 
- 	ASSERT(pWnd != NULL);
+    ASSERT(pWnd != NULL);
 
- 	if (pWnd->GetClassName() == PWL_CLASSNAME_EDIT)
- 	{
- 		CPWL_Edit* pEdit = (CPWL_Edit*)pWnd;
-		pEdit->SetCharSet(134);
-		pEdit->SetCodePage(936);
+    if (pWnd->GetClassName() == PWL_CLASSNAME_EDIT)
+    {
+        CPWL_Edit* pEdit = (CPWL_Edit*)pWnd;
+        pEdit->SetCharSet(134);
+        pEdit->SetCodePage(936);
 
-		pEdit->SetReadyToInput();
-		CFX_WideString wsText = pEdit->GetText();
-		int nCharacters = wsText.GetLength();
-		CFX_ByteString bsUTFText = wsText.UTF16LE_Encode();
-		unsigned short* pBuffer = (unsigned short*)bsUTFText.c_str();
-		m_pApp->FFI_OnSetFieldInputFocus(m_pWidget->GetFormField(), pBuffer, nCharacters, TRUE);
+        pEdit->SetReadyToInput();
+        CFX_WideString wsText = pEdit->GetText();
+        int nCharacters = wsText.GetLength();
+        CFX_ByteString bsUTFText = wsText.UTF16LE_Encode();
+        unsigned short* pBuffer = (unsigned short*)bsUTFText.c_str();
+        m_pApp->FFI_OnSetFieldInputFocus(m_pWidget->GetFormField(), pBuffer, nCharacters, TRUE);
 
- 		pEdit->SetEditNotify(this);
- 		//pUndo->BeginEdit(pDocument);
- 	}
+        pEdit->SetEditNotify(this);
+        //pUndo->BeginEdit(pDocument);
+    }
 }
 
 void CFFL_TextField::OnKillFocus(CPWL_Wnd* pWnd)
@@ -351,19 +351,19 @@
 
 }
 
-FX_BOOL	CFFL_TextField::CanCopy(CPDFSDK_Document* pDocument)
+FX_BOOL CFFL_TextField::CanCopy(CPDFSDK_Document* pDocument)
 {
-	return FALSE;
+    return FALSE;
 }
 
 FX_BOOL CFFL_TextField::CanCut(CPDFSDK_Document* pDocument)
 {
-	return FALSE;
+    return FALSE;
 }
 
-FX_BOOL	CFFL_TextField::CanPaste(CPDFSDK_Document* pDocument)
+FX_BOOL CFFL_TextField::CanPaste(CPDFSDK_Document* pDocument)
 {
-	return FALSE;
+    return FALSE;
 }
 
 void CFFL_TextField::DoCopy(CPDFSDK_Document* pDocument)
diff --git a/fpdfsdk/src/fpdf_ext.cpp b/fpdfsdk/src/fpdf_ext.cpp
index d0036e6..cc359e9 100644
--- a/fpdfsdk/src/fpdf_ext.cpp
+++ b/fpdfsdk/src/fpdf_ext.cpp
@@ -14,140 +14,140 @@
 class CFSDK_UnsupportInfo_Adapter
 {
 public:
-	CFSDK_UnsupportInfo_Adapter(UNSUPPORT_INFO* unsp_info){ m_unsp_info = unsp_info;}
-//	FX_BOOL NeedToPauseNow();
-	void ReportError(int nErrorType);
+    CFSDK_UnsupportInfo_Adapter(UNSUPPORT_INFO* unsp_info){ m_unsp_info = unsp_info;}
+//  FX_BOOL NeedToPauseNow();
+    void ReportError(int nErrorType);
 
 private:
-	UNSUPPORT_INFO* m_unsp_info;
+    UNSUPPORT_INFO* m_unsp_info;
 };
 
 void CFSDK_UnsupportInfo_Adapter::ReportError(int nErrorType)
 {
-	if(m_unsp_info && m_unsp_info->FSDK_UnSupport_Handler)
-	{
-		m_unsp_info->FSDK_UnSupport_Handler(m_unsp_info,nErrorType);
-	}
+    if(m_unsp_info && m_unsp_info->FSDK_UnSupport_Handler)
+    {
+        m_unsp_info->FSDK_UnSupport_Handler(m_unsp_info,nErrorType);
+    }
 }
 
 void FreeUnsupportInfo(void* pData)
 {
-	CFSDK_UnsupportInfo_Adapter * pAdapter = (CFSDK_UnsupportInfo_Adapter *)pData;
-	delete pAdapter;
+    CFSDK_UnsupportInfo_Adapter * pAdapter = (CFSDK_UnsupportInfo_Adapter *)pData;
+    delete pAdapter;
 }
 
 FX_BOOL FPDF_UnSupportError(int nError)
 {
-	CFSDK_UnsupportInfo_Adapter * pAdapter = (CFSDK_UnsupportInfo_Adapter *)CPDF_ModuleMgr::Get()->GetPrivateData((void *)FPDFSDK_UNSUPPORT_CALL);
+    CFSDK_UnsupportInfo_Adapter * pAdapter = (CFSDK_UnsupportInfo_Adapter *)CPDF_ModuleMgr::Get()->GetPrivateData((void *)FPDFSDK_UNSUPPORT_CALL);
 
-	if(!pAdapter)
-		return FALSE;
-	pAdapter->ReportError(nError);
-	return TRUE;
+    if(!pAdapter)
+        return FALSE;
+    pAdapter->ReportError(nError);
+    return TRUE;
 }
 
 DLLEXPORT FPDF_BOOL STDCALL FSDK_SetUnSpObjProcessHandler(UNSUPPORT_INFO* unsp_info)
 {
-	if (!unsp_info || unsp_info->version!=1)
-		return FALSE;
-	CFSDK_UnsupportInfo_Adapter * pAdapter = new CFSDK_UnsupportInfo_Adapter(unsp_info);
+    if (!unsp_info || unsp_info->version!=1)
+        return FALSE;
+    CFSDK_UnsupportInfo_Adapter * pAdapter = new CFSDK_UnsupportInfo_Adapter(unsp_info);
 
-	CPDF_ModuleMgr::Get()->SetPrivateData((void *)FPDFSDK_UNSUPPORT_CALL,pAdapter, &FreeUnsupportInfo);
+    CPDF_ModuleMgr::Get()->SetPrivateData((void *)FPDFSDK_UNSUPPORT_CALL,pAdapter, &FreeUnsupportInfo);
 
-	return TRUE;
+    return TRUE;
 }
 
 void CheckUnSupportAnnot(CPDF_Document * pDoc, CPDF_Annot* pPDFAnnot)
 {
-	CFX_ByteString cbSubType = pPDFAnnot->GetSubType();
-	if(cbSubType.Compare("3D") == 0)
-	{
-		FPDF_UnSupportError(FPDF_UNSP_ANNOT_3DANNOT);
-	}
-	else if(cbSubType.Compare("Screen") ==0)
-	{
-		CPDF_Dictionary* pAnnotDict = pPDFAnnot->GetAnnotDict();
-		CFX_ByteString cbString;
-		if(pAnnotDict->KeyExist("IT"))
-			cbString = pAnnotDict->GetString("IT");
-		if(cbString.Compare("Img") != 0)
-			FPDF_UnSupportError(FPDF_UNSP_ANNOT_SCREEN_MEDIA);
-	}
-	else if(cbSubType.Compare("Movie") ==0)
-	{
-		FPDF_UnSupportError(FPDF_UNSP_ANNOT_MOVIE);
-	}
-	else if(cbSubType.Compare("Sound") ==0)
-	{
-		FPDF_UnSupportError(FPDF_UNSP_ANNOT_SOUND);
-	}
-	else if(cbSubType.Compare("RichMedia") ==0)
-	{
-		FPDF_UnSupportError(FPDF_UNSP_ANNOT_SCREEN_RICHMEDIA);
-	}
-	else if(cbSubType.Compare("FileAttachment") ==0)
-	{
-		FPDF_UnSupportError(FPDF_UNSP_ANNOT_ATTACHMENT);
-	}
-	else if(cbSubType.Compare("Widget") ==0)
-	{
-		CPDF_Dictionary* pAnnotDict = pPDFAnnot->GetAnnotDict();
-		CFX_ByteString cbString;
-		if(pAnnotDict->KeyExist("FT"))
-		{
-			cbString = pAnnotDict->GetString("FT");
-		}
-		if(cbString.Compare("Sig") == 0)
-		{
-			FPDF_UnSupportError(FPDF_UNSP_ANNOT_SIG);
-		}
-	}
+    CFX_ByteString cbSubType = pPDFAnnot->GetSubType();
+    if(cbSubType.Compare("3D") == 0)
+    {
+        FPDF_UnSupportError(FPDF_UNSP_ANNOT_3DANNOT);
+    }
+    else if(cbSubType.Compare("Screen") ==0)
+    {
+        CPDF_Dictionary* pAnnotDict = pPDFAnnot->GetAnnotDict();
+        CFX_ByteString cbString;
+        if(pAnnotDict->KeyExist("IT"))
+            cbString = pAnnotDict->GetString("IT");
+        if(cbString.Compare("Img") != 0)
+            FPDF_UnSupportError(FPDF_UNSP_ANNOT_SCREEN_MEDIA);
+    }
+    else if(cbSubType.Compare("Movie") ==0)
+    {
+        FPDF_UnSupportError(FPDF_UNSP_ANNOT_MOVIE);
+    }
+    else if(cbSubType.Compare("Sound") ==0)
+    {
+        FPDF_UnSupportError(FPDF_UNSP_ANNOT_SOUND);
+    }
+    else if(cbSubType.Compare("RichMedia") ==0)
+    {
+        FPDF_UnSupportError(FPDF_UNSP_ANNOT_SCREEN_RICHMEDIA);
+    }
+    else if(cbSubType.Compare("FileAttachment") ==0)
+    {
+        FPDF_UnSupportError(FPDF_UNSP_ANNOT_ATTACHMENT);
+    }
+    else if(cbSubType.Compare("Widget") ==0)
+    {
+        CPDF_Dictionary* pAnnotDict = pPDFAnnot->GetAnnotDict();
+        CFX_ByteString cbString;
+        if(pAnnotDict->KeyExist("FT"))
+        {
+            cbString = pAnnotDict->GetString("FT");
+        }
+        if(cbString.Compare("Sig") == 0)
+        {
+            FPDF_UnSupportError(FPDF_UNSP_ANNOT_SIG);
+        }
+    }
 
 }
 
 FX_BOOL CheckSharedForm(CXML_Element * pElement, CFX_ByteString cbName)
 {
-	int count = pElement->CountAttrs();
-	int i=0;
-	for (i = 0; i < count; i++)
-	{
-		CFX_ByteString space, name;
-		CFX_WideString value;
-		pElement->GetAttrByIndex(i, space, name, value);
-		if (space == FX_BSTRC("xmlns") && name == FX_BSTRC("adhocwf") && value ==  L"http://ns.adobe.com/AcrobatAdhocWorkflow/1.0/")
-		{
-			CXML_Element *pVersion = pElement->GetElement("adhocwf",cbName);
-			if (!pVersion)
-				continue;
-			CFX_WideString wsContent = pVersion->GetContent(0); // == 1.1
-			int nType = wsContent.GetInteger();
-			switch(nType)
-			{
-			case 1:
-				FPDF_UnSupportError(FPDF_UNSP_DOC_SHAREDFORM_ACROBAT);
-				break;
-			case 2:
-				FPDF_UnSupportError(FPDF_UNSP_DOC_SHAREDFORM_FILESYSTEM);
-				break;
-			case 0:
-				FPDF_UnSupportError(FPDF_UNSP_DOC_SHAREDFORM_EMAIL);
-				break;
-			}
-		}
-	}
+    int count = pElement->CountAttrs();
+    int i=0;
+    for (i = 0; i < count; i++)
+    {
+        CFX_ByteString space, name;
+        CFX_WideString value;
+        pElement->GetAttrByIndex(i, space, name, value);
+        if (space == FX_BSTRC("xmlns") && name == FX_BSTRC("adhocwf") && value ==  L"http://ns.adobe.com/AcrobatAdhocWorkflow/1.0/")
+        {
+            CXML_Element *pVersion = pElement->GetElement("adhocwf",cbName);
+            if (!pVersion)
+                continue;
+            CFX_WideString wsContent = pVersion->GetContent(0); // == 1.1
+            int nType = wsContent.GetInteger();
+            switch(nType)
+            {
+            case 1:
+                FPDF_UnSupportError(FPDF_UNSP_DOC_SHAREDFORM_ACROBAT);
+                break;
+            case 2:
+                FPDF_UnSupportError(FPDF_UNSP_DOC_SHAREDFORM_FILESYSTEM);
+                break;
+            case 0:
+                FPDF_UnSupportError(FPDF_UNSP_DOC_SHAREDFORM_EMAIL);
+                break;
+            }
+        }
+    }
 
-	FX_DWORD nCount = pElement->CountChildren();
-	for(i=0; i<(int)nCount; i++)
-	{
-		CXML_Element::ChildType childType = pElement->GetChildType(i);
-		if(childType == CXML_Element::Element)
-		{
-			CXML_Element * pChild = pElement->GetElement(i);
-			if(CheckSharedForm(pChild, cbName))
-				return TRUE;
-		}
-	}
-	return FALSE;
+    FX_DWORD nCount = pElement->CountChildren();
+    for(i=0; i<(int)nCount; i++)
+    {
+        CXML_Element::ChildType childType = pElement->GetChildType(i);
+        if(childType == CXML_Element::Element)
+        {
+            CXML_Element * pChild = pElement->GetElement(i);
+            if(CheckSharedForm(pChild, cbName))
+                return TRUE;
+        }
+    }
+    return FALSE;
 }
 
 void CheckUnSupportError(CPDF_Document * pDoc, FX_DWORD err_code)
diff --git a/fpdfsdk/src/fpdfdoc.cpp b/fpdfsdk/src/fpdfdoc.cpp
index 2c3d1af..5128847 100644
--- a/fpdfsdk/src/fpdfdoc.cpp
+++ b/fpdfsdk/src/fpdfdoc.cpp
@@ -13,27 +13,27 @@
 
 static CPDF_Bookmark FindBookmark(const CPDF_BookmarkTree& tree, CPDF_Bookmark bookmark, const CFX_WideString& title)
 {
-	if (bookmark && bookmark.GetTitle().CompareNoCase(title.c_str()) == 0) {
-		// First check this item
-		return bookmark;
-	}
-	// go into children items
-	CPDF_Bookmark child = tree.GetFirstChild(bookmark);
-	while (child) {
-		// check if this item
-		CPDF_Bookmark found = FindBookmark(tree, child, title);
-		if (found)
-			return found;
-		child = tree.GetNextSibling(child);
-	}
-	return CPDF_Bookmark();
+    if (bookmark && bookmark.GetTitle().CompareNoCase(title.c_str()) == 0) {
+        // First check this item
+        return bookmark;
+    }
+    // go into children items
+    CPDF_Bookmark child = tree.GetFirstChild(bookmark);
+    while (child) {
+        // check if this item
+        CPDF_Bookmark found = FindBookmark(tree, child, title);
+        if (found)
+            return found;
+        child = tree.GetNextSibling(child);
+    }
+    return CPDF_Bookmark();
 }
 
 DLLEXPORT FPDF_BOOKMARK STDCALL FPDFBookmark_GetFirstChild(FPDF_DOCUMENT document, FPDF_BOOKMARK pDict)
 {
     if (!document || !pDict)
         return NULL;
-	CPDF_Document* pDoc = ((CPDFXFA_Document*)document)->GetPDFDoc();
+    CPDF_Document* pDoc = ((CPDFXFA_Document*)document)->GetPDFDoc();
     CPDF_BookmarkTree tree(pDoc);
     CPDF_Bookmark bookmark = CPDF_Bookmark((CPDF_Dictionary*)pDict);
     return tree.GetFirstChild(bookmark).GetDict();
@@ -43,7 +43,7 @@
 {
     if (!document || !pDict)
         return NULL;
-	CPDF_Document* pDoc = ((CPDFXFA_Document*)document)->GetPDFDoc();
+    CPDF_Document* pDoc = ((CPDFXFA_Document*)document)->GetPDFDoc();
     CPDF_BookmarkTree tree(pDoc);
     CPDF_Bookmark bookmark = CPDF_Bookmark((CPDF_Dictionary*)pDict);
     return tree.GetNextSibling(bookmark).GetDict();
@@ -65,236 +65,235 @@
 
 DLLEXPORT FPDF_BOOKMARK STDCALL FPDFBookmark_Find(FPDF_DOCUMENT document, FPDF_WIDESTRING title)
 {
-	if (!document)
-		return NULL;
-	if (!title || title[0] == 0)
-		return NULL;
-	CPDF_Document* pDoc = ((CPDFXFA_Document*)document)->GetPDFDoc();
-	CPDF_BookmarkTree tree(pDoc);
-	FX_STRSIZE len = CFX_WideString::WStringLength(title);
-	CFX_WideString encodedTitle = CFX_WideString::FromUTF16LE(title, len);
-	return FindBookmark(tree, CPDF_Bookmark(), encodedTitle).GetDict();
+    if (!document)
+        return NULL;
+    if (!title || title[0] == 0)
+        return NULL;
+    CPDF_Document* pDoc = ((CPDFXFA_Document*)document)->GetPDFDoc();
+    CPDF_BookmarkTree tree(pDoc);
+    FX_STRSIZE len = CFX_WideString::WStringLength(title);
+    CFX_WideString encodedTitle = CFX_WideString::FromUTF16LE(title, len);
+    return FindBookmark(tree, CPDF_Bookmark(), encodedTitle).GetDict();
 }
 
 DLLEXPORT FPDF_DEST STDCALL FPDFBookmark_GetDest(FPDF_DOCUMENT document, FPDF_BOOKMARK pDict)
 {
-	if (!document)
-		return NULL;
-	if (!pDict)
-		return NULL;
-	CPDF_Bookmark bookmark((CPDF_Dictionary*)pDict);
-	CPDF_Document* pDoc = ((CPDFXFA_Document*)document)->GetPDFDoc();
-	CPDF_Dest dest = bookmark.GetDest(pDoc);
-	if (dest)
-		return dest.GetObject();
-	// If this bookmark is not directly associated with a dest, we try to get action
-	CPDF_Action action = bookmark.GetAction();
-	if (!action)
-		return NULL;
-	return action.GetDest(pDoc).GetObject();
+    if (!document)
+        return NULL;
+    if (!pDict)
+        return NULL;
+    CPDF_Bookmark bookmark((CPDF_Dictionary*)pDict);
+    CPDF_Document* pDoc = (CPDF_Document*)document;
+    CPDF_Dest dest = bookmark.GetDest(pDoc);
+    if (dest)
+        return dest.GetObject();
+    // If this bookmark is not directly associated with a dest, we try to get action
+    CPDF_Action action = bookmark.GetAction();
+    if (!action)
+        return NULL;
+    return action.GetDest(pDoc).GetObject();
 }
 
 DLLEXPORT FPDF_ACTION STDCALL FPDFBookmark_GetAction(FPDF_BOOKMARK pDict)
 {
-	if (!pDict)
-		return NULL;
-	CPDF_Bookmark bookmark((CPDF_Dictionary*)pDict);
-	return bookmark.GetAction().GetDict();
+    if (!pDict)
+        return NULL;
+    CPDF_Bookmark bookmark((CPDF_Dictionary*)pDict);
+    return bookmark.GetAction().GetDict();
 }
 
 DLLEXPORT unsigned long STDCALL FPDFAction_GetType(FPDF_ACTION pDict)
 {
-	if (!pDict)
-		return 0;
-	CPDF_Action action((CPDF_Dictionary*)pDict);
-	CPDF_Action::ActionType type = action.GetType();
-	switch (type) {
-		case CPDF_Action::GoTo:
-			return PDFACTION_GOTO;
-		case CPDF_Action::GoToR:
-			return PDFACTION_REMOTEGOTO;
-		case CPDF_Action::URI:
-			return PDFACTION_URI;
-		case CPDF_Action::Launch:
-			return PDFACTION_LAUNCH;
-		default:
-			return PDFACTION_UNSUPPORTED;
-	}
-	return PDFACTION_UNSUPPORTED;
+    if (!pDict)
+        return 0;
+    CPDF_Action action((CPDF_Dictionary*)pDict);
+    CPDF_Action::ActionType type = action.GetType();
+    switch (type) {
+        case CPDF_Action::GoTo:
+            return PDFACTION_GOTO;
+        case CPDF_Action::GoToR:
+            return PDFACTION_REMOTEGOTO;
+        case CPDF_Action::URI:
+            return PDFACTION_URI;
+        case CPDF_Action::Launch:
+            return PDFACTION_LAUNCH;
+        default:
+            return PDFACTION_UNSUPPORTED;
+    }
+    return PDFACTION_UNSUPPORTED;
 }
 
 DLLEXPORT FPDF_DEST STDCALL FPDFAction_GetDest(FPDF_DOCUMENT document, FPDF_ACTION pDict)
 {
-	if (!document)
-		return NULL;
-	if (!pDict)
-		return NULL;
-	CPDF_Document* pDoc = ((CPDFXFA_Document*)document)->GetPDFDoc();
-	CPDF_Action action((CPDF_Dictionary*)pDict);
-	return action.GetDest(pDoc).GetObject();
+    if (!document)
+        return NULL;
+    if (!pDict)
+        return NULL;
+    CPDF_Document* pDoc = ((CPDFXFA_Document*)document)->GetPDFDoc();
+    CPDF_Action action((CPDF_Dictionary*)pDict);
+    return action.GetDest(pDoc).GetObject();
 }
 
 DLLEXPORT unsigned long STDCALL FPDFAction_GetURIPath(FPDF_DOCUMENT document, FPDF_ACTION pDict,
-											  void* buffer, unsigned long buflen)
+                                              void* buffer, unsigned long buflen)
 {
-	if (!document)
-		return 0;
-	if (!pDict)
-		return 0;
-	CPDF_Document* pDoc = ((CPDFXFA_Document*)document)->GetPDFDoc();
-	CPDF_Action action((CPDF_Dictionary*)pDict);
-	CFX_ByteString path = action.GetURI(pDoc);
-	unsigned long len = path.GetLength() + 1;
-	if (buffer != NULL && buflen >= len)
-		FXSYS_memcpy(buffer, path.c_str(), len);
-	return len;
+    if (!document)
+        return 0;
+    if (!pDict)
+        return 0;
+    CPDF_Document* pDoc = ((CPDFXFA_Document*)document)->GetPDFDoc();
+    CPDF_Action action((CPDF_Dictionary*)pDict);
+    CFX_ByteString path = action.GetURI(pDoc);
+    unsigned long len = path.GetLength() + 1;
+    if (buffer != NULL && buflen >= len)
+        FXSYS_memcpy(buffer, path.c_str(), len);
+    return len;
 }
 
 DLLEXPORT unsigned long STDCALL FPDFDest_GetPageIndex(FPDF_DOCUMENT document, FPDF_DEST pDict)
 {
-	if (!document)
-		return 0;
-	if (!pDict)
-		return 0;
-	CPDF_Document* pDoc = ((CPDFXFA_Document*)document)->GetPDFDoc();
-	CPDF_Dest dest((CPDF_Array*)pDict);
-	return dest.GetPageIndex(pDoc);
+    if (!document)
+        return 0;
+    if (!pDict)
+        return 0;
+    CPDF_Document* pDoc = ((CPDFXFA_Document*)document)->GetPDFDoc();
+    CPDF_Dest dest((CPDF_Array*)pDict);
+    return dest.GetPageIndex(pDoc);
 }
 
 static void ReleaseLinkList(void* data)
 {
-	delete (CPDF_LinkList*)data;
+    delete (CPDF_LinkList*)data;
 }
 
 DLLEXPORT FPDF_LINK STDCALL FPDFLink_GetLinkAtPoint(FPDF_PAGE page, double x, double y)
 {
-	if (!page)
-		return NULL;
+    if (!page)
+        return NULL;
     CPDF_Page* pPage = ((CPDFXFA_Page*)page)->GetPDFPage();
-	if (!pPage)
-		return NULL;
-	// Link list is stored with the document
-	CPDF_Document* pDoc = pPage->m_pDocument;
-	CPDF_LinkList* pLinkList = (CPDF_LinkList*)pDoc->GetPrivateData(&THISMODULE);
-	if (!pLinkList) {
-		pLinkList = FX_NEW CPDF_LinkList(pDoc);
-		pDoc->SetPrivateData(&THISMODULE, pLinkList, ReleaseLinkList);
-	}
-	return pLinkList->GetLinkAtPoint(pPage, (FX_FLOAT)x, (FX_FLOAT)y).GetDict();
+    if (!pPage)
+        return NULL;
+    // Link list is stored with the document
+    CPDF_Document* pDoc = pPage->m_pDocument;
+    CPDF_LinkList* pLinkList = (CPDF_LinkList*)pDoc->GetPrivateData(&THISMODULE);
+    if (!pLinkList) {
+        pLinkList = FX_NEW CPDF_LinkList(pDoc);
+        pDoc->SetPrivateData(&THISMODULE, pLinkList, ReleaseLinkList);
+    }
+    return pLinkList->GetLinkAtPoint(pPage, (FX_FLOAT)x, (FX_FLOAT)y).GetDict();
 }
 
 DLLEXPORT FPDF_DEST STDCALL FPDFLink_GetDest(FPDF_DOCUMENT document, FPDF_LINK pDict)
 {
-	if (!document)
-		return NULL;
-	if (!pDict)
-		return NULL;
-	CPDF_Document* pDoc = ((CPDFXFA_Document*)document)->GetPDFDoc();
-	CPDF_Link link((CPDF_Dictionary*)pDict);
-	FPDF_DEST dest = link.GetDest(pDoc).GetObject();
-	if (dest)
-		return dest;
-	// If this link is not directly associated with a dest, we try to get action
-	CPDF_Action action = link.GetAction();
-	if (!action)
-		return NULL;
-	return action.GetDest(pDoc).GetObject();
+    if (!document)
+        return NULL;
+    if (!pDict)
+        return NULL;
+    CPDF_Document* pDoc = ((CPDFXFA_Document*)document)->GetPDFDoc();
+    CPDF_Link link((CPDF_Dictionary*)pDict);
+    FPDF_DEST dest = link.GetDest(pDoc).GetObject();
+    if (dest)
+        return dest;
+    // If this link is not directly associated with a dest, we try to get action
+    CPDF_Action action = link.GetAction();
+    if (!action)
+        return NULL;
+    return action.GetDest(pDoc).GetObject();
 }
 
 DLLEXPORT FPDF_ACTION STDCALL FPDFLink_GetAction(FPDF_LINK pDict)
 {
-	if (!pDict)
-		return NULL;
-	CPDF_Link link((CPDF_Dictionary*)pDict);
-	return link.GetAction().GetDict();
+    if (!pDict)
+        return NULL;
+    CPDF_Link link((CPDF_Dictionary*)pDict);
+    return link.GetAction().GetDict();
 }
 
 DLLEXPORT FPDF_BOOL STDCALL FPDFLink_Enumerate(FPDF_PAGE page, int* startPos, FPDF_LINK* linkAnnot)
 {
-	if(!page || !startPos || !linkAnnot)
-		return FALSE;
+    if(!page || !startPos || !linkAnnot)
+        return FALSE;
     CPDF_Page* pPage = ((CPDFXFA_Page*)page)->GetPDFPage();
-	if(!pPage->m_pFormDict)
-		return FALSE;
-	CPDF_Array* pAnnots = pPage->m_pFormDict->GetArray("Annots");
-	if(!pAnnots)
-		return FALSE;
-	for (int i = *startPos; i < (int)pAnnots->GetCount(); i++) {
-		CPDF_Dictionary* pDict = (CPDF_Dictionary*)pAnnots->GetElementValue(i);
-		if (!pDict || pDict->GetType() != PDFOBJ_DICTIONARY)
-			continue;
-		if(pDict->GetString(FX_BSTRC("Subtype")).Equal(FX_BSTRC("Link"))) {
-			*startPos = i + 1;
-			*linkAnnot = (FPDF_LINK)pDict;
-			return TRUE;
-		}
-	}
-	return FALSE;
+    if(!pPage->m_pFormDict)
+        return FALSE;
+    CPDF_Array* pAnnots = pPage->m_pFormDict->GetArray("Annots");
+    if(!pAnnots)
+        return FALSE;
+    for (int i = *startPos; i < (int)pAnnots->GetCount(); i++) {
+        CPDF_Dictionary* pDict = (CPDF_Dictionary*)pAnnots->GetElementValue(i);
+        if (!pDict || pDict->GetType() != PDFOBJ_DICTIONARY)
+            continue;
+        if(pDict->GetString(FX_BSTRC("Subtype")).Equal(FX_BSTRC("Link"))) {
+            *startPos = i + 1;
+            *linkAnnot = (FPDF_LINK)pDict;
+            return TRUE;
+        }
+    }
+    return FALSE;
 }
 
 DLLEXPORT FPDF_BOOL STDCALL FPDFLink_GetAnnotRect(FPDF_LINK linkAnnot, FS_RECTF* rect)
 {
-	if(!linkAnnot || !rect)
-		return FALSE;
-	CPDF_Dictionary* pAnnotDict = (CPDF_Dictionary*)linkAnnot;
-	CPDF_Rect rt = pAnnotDict->GetRect(FX_BSTRC("Rect"));
-	rect->left = rt.left;
-	rect->bottom = rt.bottom;
-	rect->right = rt.right;
-	rect->top = rt.top;
-	return TRUE;
+    if(!linkAnnot || !rect)
+        return FALSE;
+    CPDF_Dictionary* pAnnotDict = (CPDF_Dictionary*)linkAnnot;
+    CPDF_Rect rt = pAnnotDict->GetRect(FX_BSTRC("Rect"));
+    rect->left = rt.left;
+    rect->bottom = rt.bottom;
+    rect->right = rt.right;
+    rect->top = rt.top;
+    return TRUE;
 }
 
 DLLEXPORT int STDCALL FPDFLink_CountQuadPoints(FPDF_LINK linkAnnot)
 {
-	if(!linkAnnot)
-		return 0;
-	CPDF_Dictionary* pAnnotDict = (CPDF_Dictionary*)linkAnnot;
-	CPDF_Array* pArray = pAnnotDict->GetArray(FX_BSTRC("QuadPoints"));
-	if (!pArray)
-		return 0;
-	else
-		return pArray->GetCount() / 8;
+    if(!linkAnnot)
+        return 0;
+    CPDF_Dictionary* pAnnotDict = (CPDF_Dictionary*)linkAnnot;
+    CPDF_Array* pArray = pAnnotDict->GetArray(FX_BSTRC("QuadPoints"));
+    if (!pArray)
+        return 0;
+    return pArray->GetCount() / 8;
 }
 
 DLLEXPORT FPDF_BOOL STDCALL FPDFLink_GetQuadPoints(FPDF_LINK linkAnnot, int quadIndex, FS_QUADPOINTSF* quadPoints)
 {
-	if(!linkAnnot || !quadPoints)
-		return FALSE;
-	CPDF_Dictionary* pAnnotDict = (CPDF_Dictionary*)linkAnnot;
-	CPDF_Array* pArray = pAnnotDict->GetArray(FX_BSTRC("QuadPoints"));
-	if (pArray) {
-		if (quadIndex < 0 || quadIndex >= (int)pArray->GetCount()/8 || ((quadIndex*8+7) >= (int)pArray->GetCount()))
-			return FALSE;
-		quadPoints->x1 = pArray->GetNumber(quadIndex*8);
-		quadPoints->y1 = pArray->GetNumber(quadIndex*8+1);
-		quadPoints->x2 = pArray->GetNumber(quadIndex*8+2);
-		quadPoints->y2 = pArray->GetNumber(quadIndex*8+3);
-		quadPoints->x3 = pArray->GetNumber(quadIndex*8+4);
-		quadPoints->y3 = pArray->GetNumber(quadIndex*8+5);
-		quadPoints->x4 = pArray->GetNumber(quadIndex*8+6);
-		quadPoints->y4 = pArray->GetNumber(quadIndex*8+7);
-		return TRUE;
-	}
-	return FALSE;
+    if(!linkAnnot || !quadPoints)
+        return FALSE;
+    CPDF_Dictionary* pAnnotDict = (CPDF_Dictionary*)linkAnnot;
+    CPDF_Array* pArray = pAnnotDict->GetArray(FX_BSTRC("QuadPoints"));
+    if (pArray) {
+        if (quadIndex < 0 || quadIndex >= (int)pArray->GetCount()/8 || ((quadIndex*8+7) >= (int)pArray->GetCount()))
+            return FALSE;
+        quadPoints->x1 = pArray->GetNumber(quadIndex*8);
+        quadPoints->y1 = pArray->GetNumber(quadIndex*8+1);
+        quadPoints->x2 = pArray->GetNumber(quadIndex*8+2);
+        quadPoints->y2 = pArray->GetNumber(quadIndex*8+3);
+        quadPoints->x3 = pArray->GetNumber(quadIndex*8+4);
+        quadPoints->y3 = pArray->GetNumber(quadIndex*8+5);
+        quadPoints->x4 = pArray->GetNumber(quadIndex*8+6);
+        quadPoints->y4 = pArray->GetNumber(quadIndex*8+7);
+        return TRUE;
+    }
+    return FALSE;
 }
 
 DLLEXPORT unsigned long STDCALL FPDF_GetMetaText(FPDF_DOCUMENT doc, FPDF_BYTESTRING tag,
-												 void* buffer, unsigned long buflen)
+                                                 void* buffer, unsigned long buflen)
 {
-	if (!doc || !tag)
-		return 0;
+    if (!doc || !tag)
+        return 0;
     CPDF_Document* pDoc = ((CPDFXFA_Document*)doc)->GetPDFDoc();
-	// Get info dictionary
-	CPDF_Dictionary* pInfo = pDoc->GetInfo();
-	if (!pInfo)
-		return 0;
-	CFX_WideString text = pInfo->GetUnicodeText(tag);
-	// Use UTF-16LE encoding
-	CFX_ByteString encodedText = text.UTF16LE_Encode();
-	unsigned long len = encodedText.GetLength();
-	if (buffer && buflen >= len) {
-		FXSYS_memcpy(buffer, encodedText.c_str(), len);
-	}
-	return len;
+    // Get info dictionary
+    CPDF_Dictionary* pInfo = pDoc->GetInfo();
+    if (!pInfo)
+        return 0;
+    CFX_WideString text = pInfo->GetUnicodeText(tag);
+    // Use UTF-16LE encoding
+    CFX_ByteString encodedText = text.UTF16LE_Encode();
+    unsigned long len = encodedText.GetLength();
+    if (buffer && buflen >= len) {
+        FXSYS_memcpy(buffer, encodedText.c_str(), len);
+    }
+    return len;
 }
diff --git a/fpdfsdk/src/fpdfppo.cpp b/fpdfsdk/src/fpdfppo.cpp
index 688b793..93766ee 100644
--- a/fpdfsdk/src/fpdfppo.cpp
+++ b/fpdfsdk/src/fpdfppo.cpp
@@ -11,15 +11,15 @@
 class CPDF_PageOrganizer
 {
 public:
-	CPDF_PageOrganizer();
-	~CPDF_PageOrganizer();
+    CPDF_PageOrganizer();
+    ~CPDF_PageOrganizer();
 
 public:
-	FX_BOOL				PDFDocInit(CPDF_Document *pDestPDFDoc, CPDF_Document *pSrcPDFDoc);
-	FX_BOOL				ExportPage(CPDF_Document *pSrcPDFDoc, CFX_WordArray* nPageNum, CPDF_Document *pDestPDFDoc, int nIndex);
-	CPDF_Object*		PageDictGetInheritableTag(CPDF_Dictionary *pDict, CFX_ByteString nSrctag);
-	FX_BOOL				UpdateReference(CPDF_Object *pObj, CPDF_Document *pDoc, CFX_MapPtrToPtr* pMapPtrToPtr);
-	int					GetNewObjId(CPDF_Document *pDoc, CFX_MapPtrToPtr* pMapPtrToPtr, CPDF_Reference *pRef);
+    FX_BOOL             PDFDocInit(CPDF_Document *pDestPDFDoc, CPDF_Document *pSrcPDFDoc);
+    FX_BOOL             ExportPage(CPDF_Document *pSrcPDFDoc, CFX_WordArray* nPageNum, CPDF_Document *pDestPDFDoc, int nIndex);
+    CPDF_Object*        PageDictGetInheritableTag(CPDF_Dictionary *pDict, CFX_ByteString nSrctag);
+    FX_BOOL             UpdateReference(CPDF_Object *pObj, CPDF_Document *pDoc, CFX_MapPtrToPtr* pMapPtrToPtr);
+    int                 GetNewObjId(CPDF_Document *pDoc, CFX_MapPtrToPtr* pMapPtrToPtr, CPDF_Reference *pRef);
 
 };
 
@@ -36,437 +36,427 @@
 
 FX_BOOL CPDF_PageOrganizer::PDFDocInit(CPDF_Document *pDestPDFDoc, CPDF_Document *pSrcPDFDoc)
 {
-	if(!pDestPDFDoc || !pSrcPDFDoc)
-		return false;
+    if(!pDestPDFDoc || !pSrcPDFDoc)
+        return false;
 
-	CPDF_Dictionary* pNewRoot = pDestPDFDoc->GetRoot();
-	if(!pNewRoot)	return FALSE;
+    CPDF_Dictionary* pNewRoot = pDestPDFDoc->GetRoot();
+    if(!pNewRoot)   return FALSE;
 
-	//Set the document information////////////////////////////////////////////
+    //Set the document information////////////////////////////////////////////
 
-	CPDF_Dictionary* DInfoDict = pDestPDFDoc->GetInfo();
+    CPDF_Dictionary* DInfoDict = pDestPDFDoc->GetInfo();
 
-	if(!DInfoDict)
-		return FALSE;
+    if(!DInfoDict)
+        return FALSE;
 
-	CFX_ByteString producerstr;
-	producerstr.Format("PDFium");
-	DInfoDict->SetAt("Producer", new CPDF_String(producerstr));
+    CFX_ByteString producerstr;
+    producerstr.Format("PDFium");
+    DInfoDict->SetAt("Producer", new CPDF_String(producerstr));
 
-	//Set type////////////////////////////////////////////////////////////////
-	CFX_ByteString cbRootType = pNewRoot->GetString("Type","");
-	if( cbRootType.Equal("") )
-	{
-		pNewRoot->SetAt("Type", new CPDF_Name("Catalog"));
-	}
+    //Set type////////////////////////////////////////////////////////////////
+    CFX_ByteString cbRootType = pNewRoot->GetString("Type","");
+    if( cbRootType.Equal("") )
+    {
+        pNewRoot->SetAt("Type", new CPDF_Name("Catalog"));
+    }
 
-	CPDF_Dictionary* pNewPages = (CPDF_Dictionary*)(pNewRoot->GetElement("Pages")? pNewRoot->GetElement("Pages")->GetDirect() : NULL);
-	if(!pNewPages)
-	{
-		pNewPages = new CPDF_Dictionary;
-		FX_DWORD NewPagesON = pDestPDFDoc->AddIndirectObject(pNewPages);
-		pNewRoot->SetAt("Pages", new CPDF_Reference(pDestPDFDoc, NewPagesON));
-	}
+    CPDF_Dictionary* pNewPages = (CPDF_Dictionary*)(pNewRoot->GetElement("Pages")? pNewRoot->GetElement("Pages")->GetDirect() : NULL);
+    if(!pNewPages)
+    {
+        pNewPages = new CPDF_Dictionary;
+        FX_DWORD NewPagesON = pDestPDFDoc->AddIndirectObject(pNewPages);
+        pNewRoot->SetAt("Pages", new CPDF_Reference(pDestPDFDoc, NewPagesON));
+    }
 
-	CFX_ByteString cbPageType = pNewPages->GetString("Type","");
-	if(cbPageType.Equal(""))
-	{
-		pNewPages->SetAt("Type", new CPDF_Name("Pages"));
-	}
+    CFX_ByteString cbPageType = pNewPages->GetString("Type","");
+    if(cbPageType.Equal(""))
+    {
+        pNewPages->SetAt("Type", new CPDF_Name("Pages"));
+    }
 
-	CPDF_Array* pKeysArray = pNewPages->GetArray("Kids");
-	if(pKeysArray == NULL)
-	{
-		CPDF_Array* pNewKids = new CPDF_Array;
-		FX_DWORD Kidsobjnum = -1;
-		Kidsobjnum = pDestPDFDoc->AddIndirectObject(pNewKids);//, Kidsobjnum, Kidsgennum);
+    CPDF_Array* pKeysArray = pNewPages->GetArray("Kids");
+    if(pKeysArray == NULL)
+    {
+        CPDF_Array* pNewKids = new CPDF_Array;
+        FX_DWORD Kidsobjnum = -1;
+        Kidsobjnum = pDestPDFDoc->AddIndirectObject(pNewKids);//, Kidsobjnum, Kidsgennum);
 
-		pNewPages->SetAt("Kids", new CPDF_Reference(pDestPDFDoc, Kidsobjnum));//, Kidsgennum));
-		pNewPages->SetAt("Count", new CPDF_Number(0));
-	}
+        pNewPages->SetAt("Kids", new CPDF_Reference(pDestPDFDoc, Kidsobjnum));//, Kidsgennum));
+        pNewPages->SetAt("Count", new CPDF_Number(0));
+    }
 
-	return true;
+    return true;
 }
 
 FX_BOOL CPDF_PageOrganizer::ExportPage(CPDF_Document *pSrcPDFDoc, CFX_WordArray* nPageNum,
-												CPDF_Document *pDestPDFDoc,int nIndex)
+                                                CPDF_Document *pDestPDFDoc,int nIndex)
 {
-	int curpage =nIndex;
+    int curpage =nIndex;
 
-	CFX_MapPtrToPtr* pMapPtrToPtr = new CFX_MapPtrToPtr;
-	pMapPtrToPtr->InitHashTable(1001);
+    CFX_MapPtrToPtr* pMapPtrToPtr = new CFX_MapPtrToPtr;
+    pMapPtrToPtr->InitHashTable(1001);
 
-	for(int i=0; i<nPageNum->GetSize(); i++)
-	{
+    for(int i=0; i<nPageNum->GetSize(); i++)
+    {
 
-		CPDF_Dictionary* pCurPageDict = pDestPDFDoc->CreateNewPage(curpage);
-		CPDF_Dictionary* pSrcPageDict = pSrcPDFDoc->GetPage(nPageNum->GetAt(i)-1);
-		if(!pSrcPageDict || !pCurPageDict)
-		{
-			delete pMapPtrToPtr;
-			return FALSE;
-		}
+        CPDF_Dictionary* pCurPageDict = pDestPDFDoc->CreateNewPage(curpage);
+        CPDF_Dictionary* pSrcPageDict = pSrcPDFDoc->GetPage(nPageNum->GetAt(i)-1);
+        if(!pSrcPageDict || !pCurPageDict)
+        {
+            delete pMapPtrToPtr;
+            return FALSE;
+        }
 
-		// Clone the page dictionary///////////
-		FX_POSITION	SrcPos = pSrcPageDict->GetStartPos();
-		while (SrcPos)
-		{
-			CFX_ByteString cbSrcKeyStr;
-			CPDF_Object* pObj = pSrcPageDict->GetNextElement(SrcPos, cbSrcKeyStr);
-			if(cbSrcKeyStr.Compare(("Type")) && cbSrcKeyStr.Compare(("Parent")))
-			{
-				if(pCurPageDict->KeyExist(cbSrcKeyStr))
-					pCurPageDict->RemoveAt(cbSrcKeyStr);
-				pCurPageDict->SetAt(cbSrcKeyStr, pObj->Clone());
-			}
-		}
+        // Clone the page dictionary///////////
+        FX_POSITION SrcPos = pSrcPageDict->GetStartPos();
+        while (SrcPos)
+        {
+            CFX_ByteString cbSrcKeyStr;
+            CPDF_Object* pObj = pSrcPageDict->GetNextElement(SrcPos, cbSrcKeyStr);
+            if(cbSrcKeyStr.Compare(("Type")) && cbSrcKeyStr.Compare(("Parent")))
+            {
+                if(pCurPageDict->KeyExist(cbSrcKeyStr))
+                    pCurPageDict->RemoveAt(cbSrcKeyStr);
+                pCurPageDict->SetAt(cbSrcKeyStr, pObj->Clone());
+            }
+        }
 
-		//inheritable item///////////////////////
-		CPDF_Object* pInheritable = NULL;
-		//1	MediaBox  //required
-		if(!pCurPageDict->KeyExist("MediaBox"))
-		{
+        //inheritable item///////////////////////
+        CPDF_Object* pInheritable = NULL;
+        //1 MediaBox  //required
+        if(!pCurPageDict->KeyExist("MediaBox"))
+        {
 
-			pInheritable = PageDictGetInheritableTag(pSrcPageDict, "MediaBox");
-			if(!pInheritable)
-			{
-				//Search the "CropBox" from source page dictionary, if not exists,we take the letter size.
-				pInheritable = PageDictGetInheritableTag(pSrcPageDict, "CropBox");
-				if(pInheritable)
-					pCurPageDict->SetAt("MediaBox", pInheritable->Clone());
-				else
-				{
-					//Make the default size to be letter size (8.5'x11')
-					CPDF_Array* pArray = new CPDF_Array;
-					pArray->AddNumber(0);
-					pArray->AddNumber(0);
-					pArray->AddNumber(612);
-					pArray->AddNumber(792);
-					pCurPageDict->SetAt("MediaBox", pArray);
-				}
-			}
-			else
-				pCurPageDict->SetAt("MediaBox", pInheritable->Clone());
-		}
-		//2 Resources //required
-		if(!pCurPageDict->KeyExist("Resources"))
-		{
-			pInheritable = PageDictGetInheritableTag(pSrcPageDict, "Resources");
-			if(!pInheritable)
-			{
-				delete pMapPtrToPtr;
-				return FALSE;
-			}
-			pCurPageDict->SetAt("Resources", pInheritable->Clone());
-		}
-		//3 CropBox  //Optional
-		if(!pCurPageDict->KeyExist("CropBox"))
-		{
-			pInheritable = PageDictGetInheritableTag(pSrcPageDict, "CropBox");
-			if(pInheritable)
-				pCurPageDict->SetAt("CropBox", pInheritable->Clone());
-		}
-		//4 Rotate  //Optional
-		if(!pCurPageDict->KeyExist("Rotate"))
-		{
-			pInheritable = PageDictGetInheritableTag(pSrcPageDict, "Rotate");
-			if(pInheritable)
-				pCurPageDict->SetAt("Rotate", pInheritable->Clone());
-		}
+            pInheritable = PageDictGetInheritableTag(pSrcPageDict, "MediaBox");
+            if(!pInheritable)
+            {
+                //Search the "CropBox" from source page dictionary, if not exists,we take the letter size.
+                pInheritable = PageDictGetInheritableTag(pSrcPageDict, "CropBox");
+                if(pInheritable)
+                    pCurPageDict->SetAt("MediaBox", pInheritable->Clone());
+                else
+                {
+                    //Make the default size to be letter size (8.5'x11')
+                    CPDF_Array* pArray = new CPDF_Array;
+                    pArray->AddNumber(0);
+                    pArray->AddNumber(0);
+                    pArray->AddNumber(612);
+                    pArray->AddNumber(792);
+                    pCurPageDict->SetAt("MediaBox", pArray);
+                }
+            }
+            else
+                pCurPageDict->SetAt("MediaBox", pInheritable->Clone());
+        }
+        //2 Resources //required
+        if(!pCurPageDict->KeyExist("Resources"))
+        {
+            pInheritable = PageDictGetInheritableTag(pSrcPageDict, "Resources");
+            if(!pInheritable)
+            {
+                delete pMapPtrToPtr;
+                return FALSE;
+            }
+            pCurPageDict->SetAt("Resources", pInheritable->Clone());
+        }
+        //3 CropBox  //Optional
+        if(!pCurPageDict->KeyExist("CropBox"))
+        {
+            pInheritable = PageDictGetInheritableTag(pSrcPageDict, "CropBox");
+            if(pInheritable)
+                pCurPageDict->SetAt("CropBox", pInheritable->Clone());
+        }
+        //4 Rotate  //Optional
+        if(!pCurPageDict->KeyExist("Rotate"))
+        {
+            pInheritable = PageDictGetInheritableTag(pSrcPageDict, "Rotate");
+            if(pInheritable)
+                pCurPageDict->SetAt("Rotate", pInheritable->Clone());
+        }
 
-		/////////////////////////////////////////////
-		//Update the reference
-		FX_DWORD dwOldPageObj = pSrcPageDict->GetObjNum();
-		FX_DWORD dwNewPageObj = pCurPageDict->GetObjNum();
+        /////////////////////////////////////////////
+        //Update the reference
+        FX_DWORD dwOldPageObj = pSrcPageDict->GetObjNum();
+        FX_DWORD dwNewPageObj = pCurPageDict->GetObjNum();
 
-		pMapPtrToPtr->SetAt((void*)(uintptr_t)dwOldPageObj, (void*)(uintptr_t)dwNewPageObj);
+        pMapPtrToPtr->SetAt((void*)(uintptr_t)dwOldPageObj, (void*)(uintptr_t)dwNewPageObj);
 
-		UpdateReference(pCurPageDict, pDestPDFDoc, pMapPtrToPtr);
-		curpage++;
-	}
+        UpdateReference(pCurPageDict, pDestPDFDoc, pMapPtrToPtr);
+        curpage++;
+    }
 
-	delete pMapPtrToPtr;
-	return TRUE;
+    delete pMapPtrToPtr;
+    return TRUE;
 }
 
 CPDF_Object* CPDF_PageOrganizer::PageDictGetInheritableTag(CPDF_Dictionary *pDict, CFX_ByteString nSrctag)
 {
-	if(!pDict || !pDict->KeyExist("Type") || nSrctag.IsEmpty())
-		return NULL;
+    if(!pDict || !pDict->KeyExist("Type") || nSrctag.IsEmpty())
+        return NULL;
 
-	CPDF_Object* pType = pDict->GetElement("Type")->GetDirect();
-	if(!pType || pType->GetType() != PDFOBJ_NAME)	return NULL;
+    CPDF_Object* pType = pDict->GetElement("Type")->GetDirect();
+    if(!pType || pType->GetType() != PDFOBJ_NAME)   return NULL;
 
-	if(pType->GetString().Compare("Page"))	return NULL;
+    if(pType->GetString().Compare("Page"))  return NULL;
 
-	if(!pDict->KeyExist("Parent"))	return NULL;
-	CPDF_Object* pParent = pDict->GetElement("Parent")->GetDirect();
-	if(!pParent || pParent->GetType() != PDFOBJ_DICTIONARY)	return NULL;
+    if(!pDict->KeyExist("Parent"))  return NULL;
+    CPDF_Object* pParent = pDict->GetElement("Parent")->GetDirect();
+    if(!pParent || pParent->GetType() != PDFOBJ_DICTIONARY) return NULL;
 
-	CPDF_Dictionary* pp = (CPDF_Dictionary*)pParent;
+    CPDF_Dictionary* pp = (CPDF_Dictionary*)pParent;
 
-	if(pDict->KeyExist((const char*)nSrctag))
-		return pDict->GetElement((const char*)nSrctag);
-	while (pp)
-	{
-		if(pp->KeyExist((const char*)nSrctag))
-			return pp->GetElement((const char*)nSrctag);
-		else if (pp->KeyExist("Parent"))
-		{
-			pp = (CPDF_Dictionary*)pp->GetElement("Parent")->GetDirect();
-			if (pp->GetType() == PDFOBJ_NULL) break;
-		}
-		else break;
-	}
+    if(pDict->KeyExist((const char*)nSrctag))
+        return pDict->GetElement((const char*)nSrctag);
+    while (pp)
+    {
+        if (pp->KeyExist((const char*)nSrctag))
+            return pp->GetElement((const char*)nSrctag);
+        if (pp->KeyExist("Parent"))
+        {
+            pp = (CPDF_Dictionary*)pp->GetElement("Parent")->GetDirect();
+            if (pp->GetType() == PDFOBJ_NULL)
+                break;
+        }
+        else
+            break;
+    }
 
-	return NULL;
+    return NULL;
 }
 
 FX_BOOL CPDF_PageOrganizer::UpdateReference(CPDF_Object *pObj, CPDF_Document *pDoc,
-										 CFX_MapPtrToPtr* pMapPtrToPtr)
+                                         CFX_MapPtrToPtr* pMapPtrToPtr)
 {
-	switch (pObj->GetType())
-	{
-	case PDFOBJ_REFERENCE:
-		{
-			CPDF_Reference* pReference = (CPDF_Reference*)pObj;
-			int newobjnum = GetNewObjId(pDoc, pMapPtrToPtr, pReference);
-			if (newobjnum == 0) return FALSE;
-			pReference->SetRef(pDoc, newobjnum);//, 0);
-			break;
-		}
-	case PDFOBJ_DICTIONARY:
-		{
-			CPDF_Dictionary* pDict = (CPDF_Dictionary*)pObj;
+    switch (pObj->GetType())
+    {
+    case PDFOBJ_REFERENCE:
+        {
+            CPDF_Reference* pReference = (CPDF_Reference*)pObj;
+            int newobjnum = GetNewObjId(pDoc, pMapPtrToPtr, pReference);
+            if (newobjnum == 0) return FALSE;
+            pReference->SetRef(pDoc, newobjnum);//, 0);
+            break;
+        }
+    case PDFOBJ_DICTIONARY:
+        {
+            CPDF_Dictionary* pDict = (CPDF_Dictionary*)pObj;
 
-			FX_POSITION pos = pDict->GetStartPos();
-			while(pos)
-			{
-				CFX_ByteString key("");
-				CPDF_Object* pNextObj = pDict->GetNextElement(pos, key);
-				if (!FXSYS_strcmp(key, "Parent") || !FXSYS_strcmp(key, "Prev") || !FXSYS_strcmp(key, "First"))
-					continue;
-				if(pNextObj)
-				{
-					if(!UpdateReference(pNextObj, pDoc, pMapPtrToPtr))
-						pDict->RemoveAt(key);
-				}
-				else
-					return FALSE;
-			}
-			break;
-		}
-	case	PDFOBJ_ARRAY:
-		{
-			CPDF_Array* pArray = (CPDF_Array*)pObj;
-			FX_DWORD count = pArray->GetCount();
-			for(FX_DWORD i = 0; i < count; i ++)
-			{
-				CPDF_Object* pNextObj = pArray->GetElement(i);
-				if(pNextObj)
-				{
-					if(!UpdateReference(pNextObj, pDoc, pMapPtrToPtr))
-						return FALSE;
-				}
-				else
-					return FALSE;
-			}
-			break;
-		}
-	case	PDFOBJ_STREAM:
-		{
-			CPDF_Stream* pStream = (CPDF_Stream*)pObj;
-			CPDF_Dictionary* pDict = pStream->GetDict();
-			if(pDict)
-			{
-				if(!UpdateReference(pDict, pDoc, pMapPtrToPtr))
-					return FALSE;
-			}
-			else
-				return FALSE;
-			break;
-		}
-	default:	break;
-	}
+            FX_POSITION pos = pDict->GetStartPos();
+            while(pos)
+            {
+                CFX_ByteString key("");
+                CPDF_Object* pNextObj = pDict->GetNextElement(pos, key);
+                if (!FXSYS_strcmp(key, "Parent") || !FXSYS_strcmp(key, "Prev") || !FXSYS_strcmp(key, "First"))
+                    continue;
+                if(pNextObj)
+                {
+                    if(!UpdateReference(pNextObj, pDoc, pMapPtrToPtr))
+                        pDict->RemoveAt(key);
+                }
+                else
+                    return FALSE;
+            }
+            break;
+        }
+    case    PDFOBJ_ARRAY:
+        {
+            CPDF_Array* pArray = (CPDF_Array*)pObj;
+            FX_DWORD count = pArray->GetCount();
+            for(FX_DWORD i = 0; i < count; i ++)
+            {
+                CPDF_Object* pNextObj = pArray->GetElement(i);
+                if(pNextObj)
+                {
+                    if(!UpdateReference(pNextObj, pDoc, pMapPtrToPtr))
+                        return FALSE;
+                }
+                else
+                    return FALSE;
+            }
+            break;
+        }
+    case    PDFOBJ_STREAM:
+        {
+            CPDF_Stream* pStream = (CPDF_Stream*)pObj;
+            CPDF_Dictionary* pDict = pStream->GetDict();
+            if(pDict)
+            {
+                if(!UpdateReference(pDict, pDoc, pMapPtrToPtr))
+                    return FALSE;
+            }
+            else
+                return FALSE;
+            break;
+        }
+    default:    break;
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
-int	CPDF_PageOrganizer::GetNewObjId(CPDF_Document *pDoc, CFX_MapPtrToPtr* pMapPtrToPtr,
-									CPDF_Reference *pRef)
+int CPDF_PageOrganizer::GetNewObjId(CPDF_Document *pDoc, CFX_MapPtrToPtr* pMapPtrToPtr,
+                                    CPDF_Reference *pRef)
 {
-	size_t dwObjnum = 0;
-	if(!pRef)
-		return 0;
-	dwObjnum = pRef->GetRefObjNum();
+    if(!pRef)
+        return 0;
 
-	size_t dwNewObjNum = 0;
+    size_t dwObjnum = pRef->GetRefObjNum();
+    size_t dwNewObjNum = 0;
 
-	pMapPtrToPtr->Lookup((void*)dwObjnum, (void*&)dwNewObjNum);
-	if(dwNewObjNum)
-	{
-		return (int)dwNewObjNum;
-	}
-	else
-	{
-		CPDF_Object* pDirect = pRef->GetDirect();
-		if(!pDirect)
-		{
-			return 0;
-		}
+    pMapPtrToPtr->Lookup((void*)dwObjnum, (void*&)dwNewObjNum);
+    if(dwNewObjNum)
+    {
+        return (int)dwNewObjNum;
+    }
 
-		CPDF_Object* pClone = pDirect->Clone();
-		if(!pClone)
-		{
-			return 0;
-		}
+    CPDF_Object* pDirect = pRef->GetDirect();
+    if(!pDirect)
+    {
+        return 0;
+    }
 
-		if(pClone->GetType() == PDFOBJ_DICTIONARY)
-		{
-			CPDF_Dictionary* pDictClone = (CPDF_Dictionary*)pClone;
-			if(pDictClone->KeyExist("Type"))
-			{
-				CFX_ByteString strType = pDictClone->GetString("Type");
-				if(!FXSYS_stricmp(strType, "Pages"))
-				{
-					pDictClone->Release();
-					return 4;
-				}
-				else if(!FXSYS_stricmp(strType, "Page"))
-				{
-					pDictClone->Release();
-					return  0;
-				}
-			}
-		}
-		dwNewObjNum = pDoc->AddIndirectObject(pClone);//, onum, gnum);
-		pMapPtrToPtr->SetAt((void*)dwObjnum, (void*)dwNewObjNum);
+    CPDF_Object* pClone = pDirect->Clone();
+    if(!pClone)
+    {
+        return 0;
+    }
 
-		if(!UpdateReference(pClone, pDoc, pMapPtrToPtr))
-		{
-			pClone->Release();
-			return 0;
-		}
-		return (int)dwNewObjNum;
-	}
-	return 0;
+    if(pClone->GetType() == PDFOBJ_DICTIONARY)
+    {
+        CPDF_Dictionary* pDictClone = (CPDF_Dictionary*)pClone;
+        if(pDictClone->KeyExist("Type"))
+        {
+            CFX_ByteString strType = pDictClone->GetString("Type");
+            if(!FXSYS_stricmp(strType, "Pages"))
+            {
+                pDictClone->Release();
+                return 4;
+            }
+            else if(!FXSYS_stricmp(strType, "Page"))
+            {
+                pDictClone->Release();
+                return  0;
+            }
+        }
+    }
+
+    dwNewObjNum = pDoc->AddIndirectObject(pClone);
+    pMapPtrToPtr->SetAt((void*)dwObjnum, (void*)dwNewObjNum);
+    if(!UpdateReference(pClone, pDoc, pMapPtrToPtr))
+    {
+        pClone->Release();
+        return 0;
+    }
+
+    return (int)dwNewObjNum;
 }
 
 FPDF_BOOL ParserPageRangeString(CFX_ByteString rangstring, CFX_WordArray* pageArray,int nCount)
 {
+    if(rangstring.GetLength() != 0)
+    {
+        rangstring.Remove(' ');
+        int nLength = rangstring.GetLength();
+        CFX_ByteString cbCompareString("0123456789-,");
+        for(int i=0; i<nLength; i++)
+        {
+            if(cbCompareString.Find(rangstring[i]) == -1)
+                return FALSE;
+        }
+        CFX_ByteString cbMidRange;
+        int nStringFrom = 0;
+        int nStringTo=0;
+        while(nStringTo < nLength)
+        {
+            nStringTo = rangstring.Find(',',nStringFrom);
+            if(nStringTo == -1)
+            {
+                nStringTo = nLength;
+            }
+            cbMidRange = rangstring.Mid(nStringFrom,nStringTo-nStringFrom);
 
-	if(rangstring.GetLength() != 0)
-	{
-		rangstring.Remove(' ');
-		int nLength = rangstring.GetLength();
-		CFX_ByteString cbCompareString("0123456789-,");
-		for(int i=0; i<nLength; i++)
-		{
-			if(cbCompareString.Find(rangstring[i]) == -1)
-				return FALSE;
-		}
-		CFX_ByteString cbMidRange;
-		int nStringFrom = 0;
-		int nStringTo=0;
-		while(nStringTo < nLength)
-		{
-			nStringTo = rangstring.Find(',',nStringFrom);
-			if(nStringTo == -1)
-			{
-				nStringTo = nLength;
-			}
-			cbMidRange = rangstring.Mid(nStringFrom,nStringTo-nStringFrom);
+            int nMid = cbMidRange.Find('-');
+            if(nMid == -1)
+            {
+                long lPageNum = atol(cbMidRange);
+                if(lPageNum <= 0 || lPageNum > nCount)
+                    return FALSE;
 
-			int nMid = cbMidRange.Find('-');
-			if(nMid == -1)
-			{
-				long lPageNum = atol(cbMidRange);
-				if(lPageNum <= 0 || lPageNum > nCount)
-					return FALSE;
-				pageArray->Add((FX_WORD)lPageNum);
-			}
-			else
-			{
-				int nStartPageNum = atol(cbMidRange.Mid(0,nMid));
-				if (nStartPageNum ==0)
-				{
-					return FALSE;
-				}
+                pageArray->Add((FX_WORD)lPageNum);
+            }
+            else
+            {
+                int nStartPageNum = atol(cbMidRange.Mid(0,nMid));
+                if (nStartPageNum ==0)
+                    return FALSE;
 
+                nMid = nMid+1;
+                int nEnd = cbMidRange.GetLength()-nMid;
+                if (nEnd ==0)
+                    return FALSE;
 
-				nMid = nMid+1;
-				int nEnd = cbMidRange.GetLength()-nMid;
+                int nEndPageNum = atol(cbMidRange.Mid(nMid,nEnd));
+                if (nStartPageNum < 0 ||nStartPageNum >nEndPageNum|| nEndPageNum > nCount)
+                    return FALSE;
 
-				if(nEnd ==0)return FALSE;
-
-				//				int nEndPageNum = (nEnd == 0)?nCount:atol(cbMidRange.Mid(nMid,nEnd));
-				int nEndPageNum = atol(cbMidRange.Mid(nMid,nEnd));
-
-				if(nStartPageNum < 0 ||nStartPageNum >nEndPageNum|| nEndPageNum > nCount)
-				{
-					return FALSE;
-				}
-				else
-				{
-					for(int nIndex=nStartPageNum; nIndex <= nEndPageNum; nIndex ++)
-						pageArray->Add(nIndex);
-				}
-			}
-			nStringFrom = nStringTo +1;
-		}
-	}
-	return TRUE;
+                for (int nIndex = nStartPageNum; nIndex <= nEndPageNum; ++nIndex)
+                    pageArray->Add(nIndex);
+            }
+            nStringFrom = nStringTo + 1;
+        }
+    }
+    return TRUE;
 }
 
 DLLEXPORT FPDF_BOOL STDCALL FPDF_ImportPages(FPDF_DOCUMENT dest_doc,FPDF_DOCUMENT src_doc,
-											 FPDF_BYTESTRING pagerange, int index)
+                                             FPDF_BYTESTRING pagerange, int index)
 {
-	if(dest_doc == NULL || src_doc == NULL )
-		return FALSE;
-	CFX_WordArray pageArray;
-	CPDFXFA_Document* pSrcDoc = (CPDFXFA_Document*)src_doc;
-	CPDF_Document* pSrcPDFDoc = pSrcDoc->GetPDFDoc();
-	int nCount = pSrcPDFDoc->GetPageCount();
-	if(pagerange)
-	{
-		if(ParserPageRangeString(pagerange,&pageArray,nCount) == FALSE)
-			return FALSE;
-	}
-	else
-	{
-		for(int i=1; i<=nCount; i++)
-		{
-			pageArray.Add(i);
-		}
-	}
+    if(dest_doc == NULL || src_doc == NULL )
+        return FALSE;
+    CFX_WordArray pageArray;
+    CPDFXFA_Document* pSrcDoc = (CPDFXFA_Document*)src_doc;
+    CPDF_Document* pSrcPDFDoc = pSrcDoc->GetPDFDoc();
+    int nCount = pSrcPDFDoc->GetPageCount();
+    if(pagerange)
+    {
+        if(ParserPageRangeString(pagerange,&pageArray,nCount) == FALSE)
+            return FALSE;
+    }
+    else
+    {
+        for(int i=1; i<=nCount; i++)
+        {
+            pageArray.Add(i);
+        }
+    }
 
-	CPDFXFA_Document* pDestDoc = (CPDFXFA_Document*)dest_doc;
-	CPDF_Document* pDestPDFDoc = pDestDoc->GetPDFDoc();
-	CPDF_PageOrganizer pageOrg;
+    CPDFXFA_Document* pDestDoc = (CPDFXFA_Document*)dest_doc;
+    CPDF_Document* pDestPDFDoc = pDestDoc->GetPDFDoc();
+    CPDF_PageOrganizer pageOrg;
 
-	pageOrg.PDFDocInit(pDestPDFDoc,pSrcPDFDoc);
+    pageOrg.PDFDocInit(pDestPDFDoc,pSrcPDFDoc);
 
-	if(pageOrg.ExportPage(pSrcPDFDoc,&pageArray,pDestPDFDoc,index))
-		return TRUE;
-	return FALSE;
+    if(pageOrg.ExportPage(pSrcPDFDoc,&pageArray,pDestPDFDoc,index))
+        return TRUE;
+    return FALSE;
 }
 
 DLLEXPORT FPDF_BOOL STDCALL FPDF_CopyViewerPreferences(FPDF_DOCUMENT dest_doc, FPDF_DOCUMENT src_doc)
 {
-	if(src_doc == NULL || dest_doc == NULL)
-		return false;
-	CPDFXFA_Document* pSrcDoc = (CPDFXFA_Document*)src_doc;
-	CPDF_Document* pSrcPDFDoc = pSrcDoc->GetPDFDoc();
-	CPDF_Dictionary* pSrcDict = pSrcPDFDoc->GetRoot();
-	pSrcDict = pSrcDict->GetDict(FX_BSTRC("ViewerPreferences"));
-	if(!pSrcDict)
-		return FALSE;
-	CPDFXFA_Document* pDstDoc = (CPDFXFA_Document*)dest_doc;
-	CPDF_Document* pDstPDFDoc = pDstDoc->GetPDFDoc();
-	CPDF_Dictionary* pDstDict = pDstPDFDoc->GetRoot();
-	if(!pDstDict)
-		return FALSE;
-	pDstDict->SetAt(FX_BSTRC("ViewerPreferences"), pSrcDict->Clone(TRUE));
-	return TRUE;
+    if(src_doc == NULL || dest_doc == NULL)
+        return false;
+    CPDFXFA_Document* pSrcDoc = (CPDFXFA_Document*)src_doc;
+    CPDF_Document* pSrcPDFDoc = pSrcDoc->GetPDFDoc();
+    CPDF_Dictionary* pSrcDict = pSrcPDFDoc->GetRoot();
+    pSrcDict = pSrcDict->GetDict(FX_BSTRC("ViewerPreferences"));
+    if(!pSrcDict)
+        return FALSE;
+    CPDFXFA_Document* pDstDoc = (CPDFXFA_Document*)dest_doc;
+    CPDF_Document* pDstPDFDoc = pDstDoc->GetPDFDoc();
+    CPDF_Dictionary* pDstDict = pDstPDFDoc->GetRoot();
+    if(!pDstDict)
+        return FALSE;
+    pDstDict->SetAt(FX_BSTRC("ViewerPreferences"), pSrcDict->Clone(TRUE));
+    return TRUE;
 }
 
diff --git a/fpdfsdk/src/fpdfsave.cpp b/fpdfsdk/src/fpdfsave.cpp
index ddf4a47..bea5392 100644
--- a/fpdfsdk/src/fpdfsave.cpp
+++ b/fpdfsdk/src/fpdfsave.cpp
@@ -22,40 +22,36 @@
 {
 
 public:
-	CFX_IFileWrite();
-	FX_BOOL				Init( FPDF_FILEWRITE * pFileWriteStruct );
-	virtual	FX_BOOL		WriteBlock(const void* pData, size_t size) override;
-	virtual void		Release() override {}
+    CFX_IFileWrite();
+    FX_BOOL             Init( FPDF_FILEWRITE * pFileWriteStruct );
+    virtual FX_BOOL     WriteBlock(const void* pData, size_t size) override;
+    virtual void        Release() override {}
 
 protected:
-	FPDF_FILEWRITE*		m_pFileWriteStruct;
+    FPDF_FILEWRITE*     m_pFileWriteStruct;
 };
 
 CFX_IFileWrite::CFX_IFileWrite()
 {
-	m_pFileWriteStruct = NULL;
+    m_pFileWriteStruct = NULL;
 }
 
 FX_BOOL CFX_IFileWrite::Init( FPDF_FILEWRITE * pFileWriteStruct )
 {
-	if (!pFileWriteStruct)
-		return FALSE;
-	else
-	{
-		m_pFileWriteStruct = pFileWriteStruct;
-	}
-	return TRUE;
+    if (!pFileWriteStruct)
+        return FALSE;
+
+    m_pFileWriteStruct = pFileWriteStruct;
+    return TRUE;
 }
 
 FX_BOOL CFX_IFileWrite::WriteBlock(const void* pData, size_t size)
 {
-	if (m_pFileWriteStruct)
-	{
-		m_pFileWriteStruct->WriteBlock( m_pFileWriteStruct, pData, size );
-		return TRUE;
-	}
-	else
-		return FALSE;
+    if (!m_pFileWriteStruct)
+        return FALSE;
+
+    m_pFileWriteStruct->WriteBlock( m_pFileWriteStruct, pData, size );
+    return TRUE;
 }
 
 #define  XFA_DATASETS 0
@@ -63,298 +59,298 @@
 
 FX_BOOL _SaveXFADocumentData(CPDFXFA_Document* pDocument, CFX_PtrArray& fileList)
 {
-	if (!pDocument)
-		return FALSE;
-	if (pDocument->GetDocType() != DOCTYPE_DYNIMIC_XFA && pDocument->GetDocType() != DOCTYPE_STATIC_XFA)
-		return TRUE;
-	if (!CPDFXFA_App::GetInstance()->GetXFAApp())
-		return TRUE;
+    if (!pDocument)
+        return FALSE;
+    if (pDocument->GetDocType() != DOCTYPE_DYNIMIC_XFA && pDocument->GetDocType() != DOCTYPE_STATIC_XFA)
+        return TRUE;
+    if (!CPDFXFA_App::GetInstance()->GetXFAApp())
+        return TRUE;
 
-	IXFA_DocView* pXFADocView = pDocument->GetXFADocView();
-	if (NULL == pXFADocView)
-		return TRUE;
+    IXFA_DocView* pXFADocView = pDocument->GetXFADocView();
+    if (NULL == pXFADocView)
+        return TRUE;
 
-	IXFA_DocHandler *pXFADocHandler = CPDFXFA_App::GetInstance()->GetXFAApp()->GetDocHandler();
-	CPDF_Document * pPDFDocument = pDocument->GetPDFDoc();
-	if (pDocument == NULL)
-		return FALSE;
+    IXFA_DocHandler *pXFADocHandler = CPDFXFA_App::GetInstance()->GetXFAApp()->GetDocHandler();
+    CPDF_Document * pPDFDocument = pDocument->GetPDFDoc();
+    if (pDocument == NULL)
+        return FALSE;
 
-	CPDF_Dictionary* pRoot = pPDFDocument->GetRoot();
-	if (pRoot == NULL)
-		return FALSE;
-	CPDF_Dictionary* pAcroForm = pRoot->GetDict("AcroForm");
-	if (NULL == pAcroForm)
-		return FALSE;
-	CPDF_Object* pXFA = pAcroForm->GetElement("XFA");
-	if (pXFA == NULL)
-		return TRUE;
-	if(pXFA->GetType() != PDFOBJ_ARRAY)
-		return FALSE;
-	CPDF_Array* pArray = pXFA->GetArray();
-	if (NULL == pArray)
-		return FALSE;
-	int size = pArray->GetCount();
-	int iFormIndex = -1;
-	int iDataSetsIndex = -1;
-	int iTemplate = -1;
-	int iLast = size - 2;
-	for (int i = 0; i < size - 1; i++)
-	{
-		CPDF_Object* pPDFObj = pArray->GetElement(i);
-		if (pPDFObj->GetType() != PDFOBJ_STRING)
-			continue;
-		if (pPDFObj->GetString() == "form")
-			iFormIndex = i+1;
-		else if (pPDFObj->GetString() == "datasets")
-			iDataSetsIndex = i+1;
-		else if (pPDFObj->GetString() == FX_BSTRC("template"))
-			iTemplate = i + 1;
-	}
-	IXFA_ChecksumContext* pContext = NULL;
+    CPDF_Dictionary* pRoot = pPDFDocument->GetRoot();
+    if (pRoot == NULL)
+        return FALSE;
+    CPDF_Dictionary* pAcroForm = pRoot->GetDict("AcroForm");
+    if (NULL == pAcroForm)
+        return FALSE;
+    CPDF_Object* pXFA = pAcroForm->GetElement("XFA");
+    if (pXFA == NULL)
+        return TRUE;
+    if(pXFA->GetType() != PDFOBJ_ARRAY)
+        return FALSE;
+    CPDF_Array* pArray = pXFA->GetArray();
+    if (NULL == pArray)
+        return FALSE;
+    int size = pArray->GetCount();
+    int iFormIndex = -1;
+    int iDataSetsIndex = -1;
+    int iTemplate = -1;
+    int iLast = size - 2;
+    for (int i = 0; i < size - 1; i++)
+    {
+        CPDF_Object* pPDFObj = pArray->GetElement(i);
+        if (pPDFObj->GetType() != PDFOBJ_STRING)
+            continue;
+        if (pPDFObj->GetString() == "form")
+            iFormIndex = i+1;
+        else if (pPDFObj->GetString() == "datasets")
+            iDataSetsIndex = i+1;
+        else if (pPDFObj->GetString() == FX_BSTRC("template"))
+            iTemplate = i + 1;
+    }
+    IXFA_ChecksumContext* pContext = NULL;
 #define XFA_USECKSUM
 #ifdef XFA_USECKSUM
-	//Checksum
-	pContext = XFA_Checksum_Create();
-	FXSYS_assert(pContext);
-	pContext->StartChecksum();
+    //Checksum
+    pContext = XFA_Checksum_Create();
+    FXSYS_assert(pContext);
+    pContext->StartChecksum();
 
-	//template
-	if (iTemplate > -1)
-	{
-		CPDF_Stream *pTemplateStream = pArray->GetStream(iTemplate);
-		CPDF_StreamAcc streamAcc;
-		streamAcc.LoadAllData(pTemplateStream);
-		uint8_t* pData = (uint8_t*)streamAcc.GetData();
-		FX_DWORD dwSize2 = streamAcc.GetSize();
-		IFX_FileStream *pTemplate = FX_CreateMemoryStream(pData, dwSize2);
-		pContext->UpdateChecksum((IFX_FileRead*)pTemplate);
-		pTemplate->Release();
-	}
+    //template
+    if (iTemplate > -1)
+    {
+        CPDF_Stream *pTemplateStream = pArray->GetStream(iTemplate);
+        CPDF_StreamAcc streamAcc;
+        streamAcc.LoadAllData(pTemplateStream);
+        uint8_t* pData = (uint8_t*)streamAcc.GetData();
+        FX_DWORD dwSize2 = streamAcc.GetSize();
+        IFX_FileStream *pTemplate = FX_CreateMemoryStream(pData, dwSize2);
+        pContext->UpdateChecksum((IFX_FileRead*)pTemplate);
+        pTemplate->Release();
+    }
 #endif
-	CPDF_Stream* pFormStream = NULL;
-	CPDF_Stream* pDataSetsStream = NULL;
-	if (iFormIndex != -1)
-	{
-		//Get form CPDF_Stream
-		CPDF_Object* pFormPDFObj = pArray->GetElement(iFormIndex);
-		if (pFormPDFObj->GetType() == PDFOBJ_REFERENCE)
-		{
-			CPDF_Reference* pFormRefObj = (CPDF_Reference*)pFormPDFObj;
-			CPDF_Object* pFormDircetObj = pFormPDFObj->GetDirect();
-			if (NULL != pFormDircetObj && pFormDircetObj->GetType() == PDFOBJ_STREAM)
-			{
-				pFormStream = (CPDF_Stream*)pFormDircetObj;
-			}
-		}
-		else if (pFormPDFObj->GetType() == PDFOBJ_STREAM)
-		{
-			pFormStream = (CPDF_Stream*)pFormPDFObj;
-		}
-	}
+    CPDF_Stream* pFormStream = NULL;
+    CPDF_Stream* pDataSetsStream = NULL;
+    if (iFormIndex != -1)
+    {
+        //Get form CPDF_Stream
+        CPDF_Object* pFormPDFObj = pArray->GetElement(iFormIndex);
+        if (pFormPDFObj->GetType() == PDFOBJ_REFERENCE)
+        {
+            CPDF_Reference* pFormRefObj = (CPDF_Reference*)pFormPDFObj;
+            CPDF_Object* pFormDircetObj = pFormPDFObj->GetDirect();
+            if (NULL != pFormDircetObj && pFormDircetObj->GetType() == PDFOBJ_STREAM)
+            {
+                pFormStream = (CPDF_Stream*)pFormDircetObj;
+            }
+        }
+        else if (pFormPDFObj->GetType() == PDFOBJ_STREAM)
+        {
+            pFormStream = (CPDF_Stream*)pFormPDFObj;
+        }
+    }
 
-	if (iDataSetsIndex != -1)
-	{
-		//Get datasets CPDF_Stream
-		CPDF_Object* pDataSetsPDFObj = pArray->GetElement(iDataSetsIndex);
-		if (pDataSetsPDFObj->GetType() == PDFOBJ_REFERENCE)
-		{
-			CPDF_Reference* pDataSetsRefObj = (CPDF_Reference*)pDataSetsPDFObj;
-			CPDF_Object* pDataSetsDircetObj = pDataSetsRefObj->GetDirect();
-			if (NULL != pDataSetsDircetObj && pDataSetsDircetObj->GetType() == PDFOBJ_STREAM)
-			{
-				pDataSetsStream = (CPDF_Stream*)pDataSetsDircetObj;
-			}
-		}
-		else if (pDataSetsPDFObj->GetType() == PDFOBJ_STREAM)
-		{
-			pDataSetsStream = (CPDF_Stream*)pDataSetsPDFObj;
-		}
-	}
-	//end
-	//L"datasets"
-	{
-		IFX_FileStream* pDsfileWrite = FX_CreateMemoryStream();
-		if ( NULL == pDsfileWrite )
-		{
-			pContext->Release();
-			pDsfileWrite->Release();
-			return FALSE;
-		}
-		if (pXFADocHandler->SavePackage(pXFADocView->GetDoc(), CFX_WideStringC(L"datasets"), pDsfileWrite) && pDsfileWrite->GetSize()>0)
-		{
+    if (iDataSetsIndex != -1)
+    {
+        //Get datasets CPDF_Stream
+        CPDF_Object* pDataSetsPDFObj = pArray->GetElement(iDataSetsIndex);
+        if (pDataSetsPDFObj->GetType() == PDFOBJ_REFERENCE)
+        {
+            CPDF_Reference* pDataSetsRefObj = (CPDF_Reference*)pDataSetsPDFObj;
+            CPDF_Object* pDataSetsDircetObj = pDataSetsRefObj->GetDirect();
+            if (NULL != pDataSetsDircetObj && pDataSetsDircetObj->GetType() == PDFOBJ_STREAM)
+            {
+                pDataSetsStream = (CPDF_Stream*)pDataSetsDircetObj;
+            }
+        }
+        else if (pDataSetsPDFObj->GetType() == PDFOBJ_STREAM)
+        {
+            pDataSetsStream = (CPDF_Stream*)pDataSetsPDFObj;
+        }
+    }
+    //end
+    //L"datasets"
+    {
+        IFX_FileStream* pDsfileWrite = FX_CreateMemoryStream();
+        if ( NULL == pDsfileWrite )
+        {
+            pContext->Release();
+            pDsfileWrite->Release();
+            return FALSE;
+        }
+        if (pXFADocHandler->SavePackage(pXFADocView->GetDoc(), CFX_WideStringC(L"datasets"), pDsfileWrite) && pDsfileWrite->GetSize()>0)
+        {
 #ifdef XFA_USECKSUM
-		//Datasets
-		pContext->UpdateChecksum((IFX_FileRead*)pDsfileWrite);
-		pContext->FinishChecksum();
+        //Datasets
+        pContext->UpdateChecksum((IFX_FileRead*)pDsfileWrite);
+        pContext->FinishChecksum();
 #endif
-			CPDF_Dictionary* pDataDict = FX_NEW CPDF_Dictionary;
-			if (iDataSetsIndex != -1)
-			{
-				if (pDataSetsStream)
-					pDataSetsStream->InitStream(pDsfileWrite, pDataDict);
-			}
-			else
-			{
-				CPDF_Stream* pData = FX_NEW CPDF_Stream(NULL, 0, NULL);
-				pData->InitStream(pDsfileWrite, pDataDict);
-				FX_DWORD AppStreamobjnum = pPDFDocument->AddIndirectObject(pData);
-				CPDF_Reference* pRef = (CPDF_Reference*)pPDFDocument->GetIndirectObject(AppStreamobjnum);
-				{
-					iLast = pArray->GetCount() -2;
-					pArray->InsertAt(iLast,CPDF_String::Create("datasets"));
-					pArray->InsertAt(iLast+1, pData, pPDFDocument);
-				}
-			}
-			fileList.Add(pDsfileWrite);
-		}
-	}
+            CPDF_Dictionary* pDataDict = FX_NEW CPDF_Dictionary;
+            if (iDataSetsIndex != -1)
+            {
+                if (pDataSetsStream)
+                    pDataSetsStream->InitStream(pDsfileWrite, pDataDict);
+            }
+            else
+            {
+                CPDF_Stream* pData = FX_NEW CPDF_Stream(NULL, 0, NULL);
+                pData->InitStream(pDsfileWrite, pDataDict);
+                FX_DWORD AppStreamobjnum = pPDFDocument->AddIndirectObject(pData);
+                CPDF_Reference* pRef = (CPDF_Reference*)pPDFDocument->GetIndirectObject(AppStreamobjnum);
+                {
+                    iLast = pArray->GetCount() -2;
+                    pArray->InsertAt(iLast,CPDF_String::Create("datasets"));
+                    pArray->InsertAt(iLast+1, pData, pPDFDocument);
+                }
+            }
+            fileList.Add(pDsfileWrite);
+        }
+    }
 
 
-	//L"form"
-	{
+    //L"form"
+    {
 
-		IFX_FileStream* pfileWrite = FX_CreateMemoryStream();
-		if (NULL == pfileWrite)
-		{
-			pContext->Release();
-			return FALSE;
-		}
-		if(pXFADocHandler->SavePackage(pXFADocView->GetDoc(), CFX_WideStringC(L"form"), pfileWrite, pContext) && pfileWrite > 0)
-		{
-			CPDF_Dictionary* pDataDict = FX_NEW CPDF_Dictionary;
-			if (iFormIndex != -1)
-			{
-				if (pFormStream)
-					pFormStream->InitStream(pfileWrite, pDataDict);
-			}
-			else
-			{
-				CPDF_Stream* pData = FX_NEW CPDF_Stream(NULL, 0, NULL);
-				pData->InitStream(pfileWrite, pDataDict);
-				FX_DWORD AppStreamobjnum = pPDFDocument->AddIndirectObject(pData);
-				CPDF_Reference* pRef = (CPDF_Reference*)pPDFDocument->GetIndirectObject(AppStreamobjnum);
-				{
-					iLast = pArray->GetCount() -2;
-					pArray->InsertAt(iLast, CPDF_String::Create("form"));
-					pArray->InsertAt(iLast+1, pData, pPDFDocument);
-				}
-			}
-			fileList.Add(pfileWrite);
-		}
-	}
-	pContext->Release();
-	return TRUE;
+        IFX_FileStream* pfileWrite = FX_CreateMemoryStream();
+        if (NULL == pfileWrite)
+        {
+            pContext->Release();
+            return FALSE;
+        }
+        if(pXFADocHandler->SavePackage(pXFADocView->GetDoc(), CFX_WideStringC(L"form"), pfileWrite, pContext) && pfileWrite > 0)
+        {
+            CPDF_Dictionary* pDataDict = FX_NEW CPDF_Dictionary;
+            if (iFormIndex != -1)
+            {
+                if (pFormStream)
+                    pFormStream->InitStream(pfileWrite, pDataDict);
+            }
+            else
+            {
+                CPDF_Stream* pData = FX_NEW CPDF_Stream(NULL, 0, NULL);
+                pData->InitStream(pfileWrite, pDataDict);
+                FX_DWORD AppStreamobjnum = pPDFDocument->AddIndirectObject(pData);
+                CPDF_Reference* pRef = (CPDF_Reference*)pPDFDocument->GetIndirectObject(AppStreamobjnum);
+                {
+                    iLast = pArray->GetCount() -2;
+                    pArray->InsertAt(iLast, CPDF_String::Create("form"));
+                    pArray->InsertAt(iLast+1, pData, pPDFDocument);
+                }
+            }
+            fileList.Add(pfileWrite);
+        }
+    }
+    pContext->Release();
+    return TRUE;
 }
 
 
 FX_BOOL _SendPostSaveToXFADoc(CPDFXFA_Document* pDocument)
 {
-	if (!pDocument)
-		return FALSE;
+    if (!pDocument)
+        return FALSE;
 
-	if (pDocument->GetDocType() != DOCTYPE_DYNIMIC_XFA && pDocument->GetDocType() != DOCTYPE_STATIC_XFA)
-		return TRUE;
+    if (pDocument->GetDocType() != DOCTYPE_DYNIMIC_XFA && pDocument->GetDocType() != DOCTYPE_STATIC_XFA)
+        return TRUE;
 
-	IXFA_DocView* pXFADocView = pDocument->GetXFADocView();
-	if (NULL == pXFADocView)
-		return FALSE;
-	IXFA_WidgetHandler* pWidgetHander =  pXFADocView->GetWidgetHandler();
+    IXFA_DocView* pXFADocView = pDocument->GetXFADocView();
+    if (NULL == pXFADocView)
+        return FALSE;
+    IXFA_WidgetHandler* pWidgetHander =  pXFADocView->GetWidgetHandler();
 
-	CXFA_WidgetAcc* pWidgetAcc = NULL;
-	IXFA_WidgetAccIterator* pWidgetAccIterator = pXFADocView->CreateWidgetAccIterator();
-	pWidgetAcc = pWidgetAccIterator->MoveToNext();
-	while(pWidgetAcc)
-	{
-		CXFA_EventParam preParam;
-		preParam.m_eType =  XFA_EVENT_PostSave;
-		pWidgetHander->ProcessEvent(pWidgetAcc,&preParam);
-		pWidgetAcc = pWidgetAccIterator->MoveToNext();
-	}
-	pWidgetAccIterator->Release();
-	pXFADocView->UpdateDocView();
-	pDocument->_ClearChangeMark();
-	return TRUE;
+    CXFA_WidgetAcc* pWidgetAcc = NULL;
+    IXFA_WidgetAccIterator* pWidgetAccIterator = pXFADocView->CreateWidgetAccIterator();
+    pWidgetAcc = pWidgetAccIterator->MoveToNext();
+    while(pWidgetAcc)
+    {
+        CXFA_EventParam preParam;
+        preParam.m_eType =  XFA_EVENT_PostSave;
+        pWidgetHander->ProcessEvent(pWidgetAcc,&preParam);
+        pWidgetAcc = pWidgetAccIterator->MoveToNext();
+    }
+    pWidgetAccIterator->Release();
+    pXFADocView->UpdateDocView();
+    pDocument->_ClearChangeMark();
+    return TRUE;
 }
 
 
 FX_BOOL _SendPreSaveToXFADoc(CPDFXFA_Document* pDocument, CFX_PtrArray& fileList)
 {
-	if (pDocument->GetDocType() != DOCTYPE_DYNIMIC_XFA && pDocument->GetDocType() != DOCTYPE_STATIC_XFA)
-		return TRUE;
-	IXFA_DocView* pXFADocView = pDocument->GetXFADocView();
-	if (NULL == pXFADocView)
-		return TRUE;
-	IXFA_WidgetHandler* pWidgetHander =  pXFADocView->GetWidgetHandler();
-	CXFA_WidgetAcc* pWidgetAcc = NULL;
-	IXFA_WidgetAccIterator* pWidgetAccIterator = pXFADocView->CreateWidgetAccIterator();
-	pWidgetAcc = pWidgetAccIterator->MoveToNext();
-	while(pWidgetAcc)
-	{
-		CXFA_EventParam preParam;
-		preParam.m_eType =  XFA_EVENT_PreSave;
-		pWidgetHander->ProcessEvent(pWidgetAcc, &preParam);
-		pWidgetAcc = pWidgetAccIterator->MoveToNext();
-	}
-	pWidgetAccIterator->Release();
-	pXFADocView->UpdateDocView();
-	return _SaveXFADocumentData(pDocument, fileList);
+    if (pDocument->GetDocType() != DOCTYPE_DYNIMIC_XFA && pDocument->GetDocType() != DOCTYPE_STATIC_XFA)
+        return TRUE;
+    IXFA_DocView* pXFADocView = pDocument->GetXFADocView();
+    if (NULL == pXFADocView)
+        return TRUE;
+    IXFA_WidgetHandler* pWidgetHander =  pXFADocView->GetWidgetHandler();
+    CXFA_WidgetAcc* pWidgetAcc = NULL;
+    IXFA_WidgetAccIterator* pWidgetAccIterator = pXFADocView->CreateWidgetAccIterator();
+    pWidgetAcc = pWidgetAccIterator->MoveToNext();
+    while(pWidgetAcc)
+    {
+        CXFA_EventParam preParam;
+        preParam.m_eType =  XFA_EVENT_PreSave;
+        pWidgetHander->ProcessEvent(pWidgetAcc, &preParam);
+        pWidgetAcc = pWidgetAccIterator->MoveToNext();
+    }
+    pWidgetAccIterator->Release();
+    pXFADocView->UpdateDocView();
+    return _SaveXFADocumentData(pDocument, fileList);
 }
 
 FPDF_BOOL _FPDF_Doc_Save(FPDF_DOCUMENT document, FPDF_FILEWRITE * pFileWrite,FPDF_DWORD flags, FPDF_BOOL bSetVersion,
-						 int fileVerion)
+                         int fileVerion)
 {
-	CPDFXFA_Document* pDoc = (CPDFXFA_Document*)document;
+    CPDFXFA_Document* pDoc = (CPDFXFA_Document*)document;
 
-	CFX_PtrArray fileList;
+    CFX_PtrArray fileList;
 
-	_SendPreSaveToXFADoc(pDoc, fileList);
+    _SendPreSaveToXFADoc(pDoc, fileList);
 
-	CPDF_Document* pPDFDoc = pDoc->GetPDFDoc();
-	if (!pPDFDoc)
-		return 0;
+    CPDF_Document* pPDFDoc = pDoc->GetPDFDoc();
+    if (!pPDFDoc)
+        return 0;
 
-	if ( flags < FPDF_INCREMENTAL || flags > FPDF_REMOVE_SECURITY )
-	{
-		flags = 0;
-	}
+    if ( flags < FPDF_INCREMENTAL || flags > FPDF_REMOVE_SECURITY )
+    {
+        flags = 0;
+    }
 
-	CPDF_Creator FileMaker(pPDFDoc);
-	if (bSetVersion)
-		FileMaker.SetFileVersion(fileVerion);
-	if (flags == FPDF_REMOVE_SECURITY)
-	{
-		flags =  0;
-		FileMaker.RemoveSecurity();
-	}
-	CFX_IFileWrite* pStreamWrite = NULL;
-	FX_BOOL bRet;
-	pStreamWrite = new CFX_IFileWrite;
-	pStreamWrite->Init( pFileWrite );
-	bRet = FileMaker.Create(pStreamWrite, flags);
+    CPDF_Creator FileMaker(pPDFDoc);
+    if (bSetVersion)
+        FileMaker.SetFileVersion(fileVerion);
+    if (flags == FPDF_REMOVE_SECURITY)
+    {
+        flags =  0;
+        FileMaker.RemoveSecurity();
+    }
+    CFX_IFileWrite* pStreamWrite = NULL;
+    FX_BOOL bRet;
+    pStreamWrite = new CFX_IFileWrite;
+    pStreamWrite->Init( pFileWrite );
+    bRet = FileMaker.Create(pStreamWrite, flags);
 
-	_SendPostSaveToXFADoc(pDoc);
-	//pDoc->_ClearChangeMark();
+    _SendPostSaveToXFADoc(pDoc);
+    //pDoc->_ClearChangeMark();
 
-	for (int i = 0; i < fileList.GetSize(); i++)
-	{
-		IFX_FileStream* pFile = (IFX_FileStream*)fileList.GetAt(i);
-		pFile->Release();
-	}
-	fileList.RemoveAll();
+    for (int i = 0; i < fileList.GetSize(); i++)
+    {
+        IFX_FileStream* pFile = (IFX_FileStream*)fileList.GetAt(i);
+        pFile->Release();
+    }
+    fileList.RemoveAll();
 
-	delete pStreamWrite;
-	return bRet;
+    delete pStreamWrite;
+    return bRet;
 }
 
-DLLEXPORT FPDF_BOOL STDCALL FPDF_SaveAsCopy(	FPDF_DOCUMENT document,FPDF_FILEWRITE * pFileWrite,
-												FPDF_DWORD flags )
+DLLEXPORT FPDF_BOOL STDCALL FPDF_SaveAsCopy(    FPDF_DOCUMENT document,FPDF_FILEWRITE * pFileWrite,
+                                                FPDF_DWORD flags )
 {
-	return _FPDF_Doc_Save(document, pFileWrite, flags, FALSE , 0);
+    return _FPDF_Doc_Save(document, pFileWrite, flags, FALSE , 0);
 }
 
-DLLEXPORT FPDF_BOOL STDCALL FPDF_SaveWithVersion(	FPDF_DOCUMENT document,FPDF_FILEWRITE * pFileWrite,
-	FPDF_DWORD flags, int fileVersion)
+DLLEXPORT FPDF_BOOL STDCALL FPDF_SaveWithVersion(   FPDF_DOCUMENT document,FPDF_FILEWRITE * pFileWrite,
+    FPDF_DWORD flags, int fileVersion)
 {
-	return _FPDF_Doc_Save(document, pFileWrite, flags, TRUE , fileVersion);
+    return _FPDF_Doc_Save(document, pFileWrite, flags, TRUE , fileVersion);
 }
 
diff --git a/fpdfsdk/src/fsdk_annothandler.cpp b/fpdfsdk/src/fsdk_annothandler.cpp
index 50ef9cf..ebdd67e 100644
--- a/fpdfsdk/src/fsdk_annothandler.cpp
+++ b/fpdfsdk/src/fsdk_annothandler.cpp
@@ -309,35 +309,18 @@
         if (pAnnotHandler->OnSetFocus(pAnnot, nFlag))
         {
             CPDFSDK_PageView* pPage = pAnnot->GetPageView();
-            ASSERT(pPage != NULL);
-
             pPage->GetSDKDocument();
-    //      pDocument->SetTopmostAnnot(pAnnot);
-
             return TRUE;
         }
-        else
-        {
-            return FALSE;
-        }
     }
-
     return FALSE;
 }
 
 FX_BOOL         CPDFSDK_AnnotHandlerMgr::Annot_OnKillFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag)
 {
-    ASSERT(pAnnot != NULL);
-
+    ASSERT(pAnnot);
     if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
-    {
-        if (pAnnotHandler->OnKillFocus(pAnnot, nFlag))
-        {
-            return TRUE;
-        }
-        else
-            return FALSE;
-    }
+        return pAnnotHandler->OnKillFocus(pAnnot, nFlag);
 
     return FALSE;
 }
@@ -360,9 +343,8 @@
 {
     ASSERT(pAnnot);
     if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
-    {
         return pAnnotHandler->GetViewBBox(pPageView, pAnnot);
-    }
+
     return pAnnot->GetRect();
 }
 
@@ -371,7 +353,7 @@
     ASSERT(pAnnot);
     if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
     {
-        if(pAnnotHandler->CanAnswer(pAnnot))
+        if (pAnnotHandler->CanAnswer(pAnnot))
             return pAnnotHandler->HitTest(pPageView, pAnnot, point);
     }
     return FALSE;
@@ -407,38 +389,26 @@
 
 FX_BOOL CPDFSDK_BFAnnotHandler::CanAnswer(CPDFSDK_Annot* pAnnot)
 {
-    ASSERT(pAnnot);
     ASSERT(pAnnot->GetType() == "Widget");
-    CFX_ByteString sSubType = pAnnot->GetSubType();
+    if (pAnnot->GetSubType() == BFFT_SIGNATURE)
+        return FALSE;
 
-    if (sSubType == BFFT_SIGNATURE)
-    {
-    }
-    else
-    {
-        CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
-        if (!pWidget->IsVisible()) return FALSE;
+    CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
+    if (!pWidget->IsVisible())
+            return FALSE;
 
-        int nFieldFlags = pWidget->GetFieldFlags();
-        if ((nFieldFlags & FIELDFLAG_READONLY) == FIELDFLAG_READONLY) return FALSE;
-        if (pWidget->GetFieldType() == FIELDTYPE_PUSHBUTTON)
-            return TRUE;
-        else
-        {
-            CPDF_Page* pPage = pWidget->GetPDFPage();
-            ASSERT(pPage != NULL);
+    int nFieldFlags = pWidget->GetFieldFlags();
+    if ((nFieldFlags & FIELDFLAG_READONLY) == FIELDFLAG_READONLY)
+        return FALSE;
 
-            CPDF_Document* pDocument = pPage->m_pDocument;
-            ASSERT(pDocument != NULL);
+    if (pWidget->GetFieldType() == FIELDTYPE_PUSHBUTTON)
+        return TRUE;
 
-            FX_DWORD dwPermissions = pDocument->GetUserPermissions();
-            return (dwPermissions&FPDFPERM_FILL_FORM) ||
-                (dwPermissions&FPDFPERM_ANNOT_FORM) ||
-            (dwPermissions&FPDFPERM_ANNOT_FORM);
-        }
-    }
-
-    return FALSE;
+    CPDF_Page* pPage = pWidget->GetPDFPage();
+    CPDF_Document* pDocument = pPage->m_pDocument;
+    FX_DWORD dwPermissions = pDocument->GetUserPermissions();
+    return (dwPermissions & FPDFPERM_FILL_FORM) ||
+            (dwPermissions & FPDFPERM_ANNOT_FORM);
 }
 
 CPDFSDK_Annot* CPDFSDK_BFAnnotHandler::NewAnnot(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPage)
@@ -1338,12 +1308,11 @@
 
 int LyOrderCompare(CPDFSDK_Annot* p1, CPDFSDK_Annot* p2)
 {
-    if(p1->GetLayoutOrder() < p2->GetLayoutOrder())
+    if (p1->GetLayoutOrder() < p2->GetLayoutOrder())
         return -1;
-    else if (p1->GetLayoutOrder() == p2->GetLayoutOrder())
-        return 0;
-    else
+    if (p1->GetLayoutOrder() > p2->GetLayoutOrder())
         return 1;
+    return 0;
 }
 
 FX_BOOL CPDFSDK_AnnotIterator::InitIteratorAnnotList(CPDFSDK_PageView* pPageView,CFX_PtrArray * pAnnotList)
diff --git a/fpdfsdk/src/fsdk_baseannot.cpp b/fpdfsdk/src/fsdk_baseannot.cpp
index e9a1cc3..a862ea7 100644
--- a/fpdfsdk/src/fsdk_baseannot.cpp
+++ b/fpdfsdk/src/fsdk_baseannot.cpp
@@ -11,498 +11,498 @@
 
 
 //---------------------------------------------------------------------------
-//								CPDFSDK_DateTime
+//                              CPDFSDK_DateTime
 //---------------------------------------------------------------------------
 int _gAfxGetTimeZoneInSeconds(FX_CHAR tzhour, uint8_t tzminute)
 {
-	return (int)tzhour * 3600 + (int)tzminute * (tzhour >= 0 ? 60 : -60);
+    return (int)tzhour * 3600 + (int)tzminute * (tzhour >= 0 ? 60 : -60);
 }
 
 FX_BOOL _gAfxIsLeapYear(int16_t year)
 {
-	return ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0)));
+    return ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0)));
 }
 
 FX_WORD _gAfxGetYearDays(int16_t year)
 {
-	return (_gAfxIsLeapYear(year) == TRUE ? 366 : 365);
+    return (_gAfxIsLeapYear(year) == TRUE ? 366 : 365);
 }
 
 uint8_t _gAfxGetMonthDays(int16_t year, uint8_t month)
 {
-	uint8_t	mDays;
-	switch (month)
-	{
-	case 1:
-	case 3:
-	case 5:
-	case 7:
-	case 8:
-	case 10:
-	case 12:
-		mDays = 31;
-		break;
+    uint8_t mDays;
+    switch (month)
+    {
+    case 1:
+    case 3:
+    case 5:
+    case 7:
+    case 8:
+    case 10:
+    case 12:
+        mDays = 31;
+        break;
 
-	case 4:
-	case 6:
-	case 9:
-	case 11:
-		mDays = 30;
-		break;
+    case 4:
+    case 6:
+    case 9:
+    case 11:
+        mDays = 30;
+        break;
 
-	case 2:
-		if (_gAfxIsLeapYear(year) == TRUE)
-			mDays = 29;
-		else
-			mDays = 28;
-		break;
+    case 2:
+        if (_gAfxIsLeapYear(year) == TRUE)
+            mDays = 29;
+        else
+            mDays = 28;
+        break;
 
-	default:
-		mDays = 0;
-		break;
-	}
+    default:
+        mDays = 0;
+        break;
+    }
 
-	return mDays;
+    return mDays;
 }
 
 CPDFSDK_DateTime::CPDFSDK_DateTime()
 {
-	ResetDateTime();
+    ResetDateTime();
 }
 
 CPDFSDK_DateTime::CPDFSDK_DateTime(const CFX_ByteString& dtStr)
 {
-	ResetDateTime();
+    ResetDateTime();
 
-	FromPDFDateTimeString(dtStr);
+    FromPDFDateTimeString(dtStr);
 }
 
 CPDFSDK_DateTime::CPDFSDK_DateTime(const CPDFSDK_DateTime& datetime)
 {
-	operator = (datetime);
+    operator = (datetime);
 }
 
 CPDFSDK_DateTime::CPDFSDK_DateTime(const FX_SYSTEMTIME& st)
 {
-	operator = (st) ;
+    operator = (st) ;
 }
 
 
 void CPDFSDK_DateTime::ResetDateTime()
 {
-	tzset();
+    tzset();
 
-	time_t	curTime;
-	time(&curTime);
-	struct tm* newtime;
-	//newtime = gmtime(&curTime);
-	newtime = localtime(&curTime);
+    time_t  curTime;
+    time(&curTime);
+    struct tm* newtime;
+    //newtime = gmtime(&curTime);
+    newtime = localtime(&curTime);
 
-	dt.year = newtime->tm_year + 1900;
-	dt.month = newtime->tm_mon + 1;
-	dt.day = newtime->tm_mday;
-	dt.hour = newtime->tm_hour;
-	dt.minute = newtime->tm_min;
-	dt.second = newtime->tm_sec;
-// 	dt.tzHour = _timezone / 3600 * -1;
-// 	dt.tzMinute = (abs(_timezone) % 3600) / 60;
+    dt.year = newtime->tm_year + 1900;
+    dt.month = newtime->tm_mon + 1;
+    dt.day = newtime->tm_mday;
+    dt.hour = newtime->tm_hour;
+    dt.minute = newtime->tm_min;
+    dt.second = newtime->tm_sec;
+//  dt.tzHour = _timezone / 3600 * -1;
+//  dt.tzMinute = (abs(_timezone) % 3600) / 60;
 }
 
 CPDFSDK_DateTime& CPDFSDK_DateTime::operator = (const CPDFSDK_DateTime& datetime)
 {
-	FXSYS_memcpy(&dt, &datetime.dt, sizeof(FX_DATETIME));
-	return *this;
+    FXSYS_memcpy(&dt, &datetime.dt, sizeof(FX_DATETIME));
+    return *this;
 }
 
 CPDFSDK_DateTime& CPDFSDK_DateTime::operator = (const FX_SYSTEMTIME& st)
 {
-	tzset();
+    tzset();
 
-	dt.year = (int16_t)st.wYear;
-	dt.month = (uint8_t)st.wMonth;
-	dt.day = (uint8_t)st.wDay;
-	dt.hour = (uint8_t)st.wHour;
-	dt.minute = (uint8_t)st.wMinute;
-	dt.second = (uint8_t)st.wSecond;
-// 	dt.tzHour = _timezone / 3600 * -1;
-// 	dt.tzMinute = (abs(_timezone) % 3600) / 60;
-	return *this;
+    dt.year = (int16_t)st.wYear;
+    dt.month = (uint8_t)st.wMonth;
+    dt.day = (uint8_t)st.wDay;
+    dt.hour = (uint8_t)st.wHour;
+    dt.minute = (uint8_t)st.wMinute;
+    dt.second = (uint8_t)st.wSecond;
+//  dt.tzHour = _timezone / 3600 * -1;
+//  dt.tzMinute = (abs(_timezone) % 3600) / 60;
+    return *this;
 }
 
 FX_BOOL CPDFSDK_DateTime::operator == (CPDFSDK_DateTime& datetime)
 {
-	return (FXSYS_memcmp(&dt, &datetime.dt, sizeof(FX_DATETIME)) == 0);
+    return (FXSYS_memcmp(&dt, &datetime.dt, sizeof(FX_DATETIME)) == 0);
 }
 
 FX_BOOL CPDFSDK_DateTime::operator != (CPDFSDK_DateTime& datetime)
 {
-	return (FXSYS_memcmp(&dt, &datetime.dt, sizeof(FX_DATETIME)) != 0);
+    return (FXSYS_memcmp(&dt, &datetime.dt, sizeof(FX_DATETIME)) != 0);
 }
 
 FX_BOOL CPDFSDK_DateTime::operator > (CPDFSDK_DateTime& datetime)
 {
-	CPDFSDK_DateTime dt1 = ToGMT();
-	CPDFSDK_DateTime dt2 = datetime.ToGMT();
-	int d1 = (((int)dt1.dt.year) << 16) | (((int)dt1.dt.month) << 8) | (int)dt1.dt.day;
-	int d2 = (((int)dt1.dt.hour) << 16) | (((int)dt1.dt.minute) << 8) | (int)dt1.dt.second;
-	int d3 = (((int)dt2.dt.year) << 16) | (((int)dt2.dt.month) << 8) | (int)dt2.dt.day;
-	int d4 = (((int)dt2.dt.hour) << 16) | (((int)dt2.dt.minute) << 8) | (int)dt2.dt.second;
+    CPDFSDK_DateTime dt1 = ToGMT();
+    CPDFSDK_DateTime dt2 = datetime.ToGMT();
+    int d1 = (((int)dt1.dt.year) << 16) | (((int)dt1.dt.month) << 8) | (int)dt1.dt.day;
+    int d2 = (((int)dt1.dt.hour) << 16) | (((int)dt1.dt.minute) << 8) | (int)dt1.dt.second;
+    int d3 = (((int)dt2.dt.year) << 16) | (((int)dt2.dt.month) << 8) | (int)dt2.dt.day;
+    int d4 = (((int)dt2.dt.hour) << 16) | (((int)dt2.dt.minute) << 8) | (int)dt2.dt.second;
 
-	if (d1 > d3) return TRUE;
-	if (d2 > d4) return TRUE;
-	return FALSE;
+    if (d1 > d3) return TRUE;
+    if (d2 > d4) return TRUE;
+    return FALSE;
 }
 
 FX_BOOL CPDFSDK_DateTime::operator >= (CPDFSDK_DateTime& datetime)
 {
-	CPDFSDK_DateTime dt1 = ToGMT();
-	CPDFSDK_DateTime dt2 = datetime.ToGMT();
-	int d1 = (((int)dt1.dt.year) << 16) | (((int)dt1.dt.month) << 8) | (int)dt1.dt.day;
-	int d2 = (((int)dt1.dt.hour) << 16) | (((int)dt1.dt.minute) << 8) | (int)dt1.dt.second;
-	int d3 = (((int)dt2.dt.year) << 16) | (((int)dt2.dt.month) << 8) | (int)dt2.dt.day;
-	int d4 = (((int)dt2.dt.hour) << 16) | (((int)dt2.dt.minute) << 8) | (int)dt2.dt.second;
+    CPDFSDK_DateTime dt1 = ToGMT();
+    CPDFSDK_DateTime dt2 = datetime.ToGMT();
+    int d1 = (((int)dt1.dt.year) << 16) | (((int)dt1.dt.month) << 8) | (int)dt1.dt.day;
+    int d2 = (((int)dt1.dt.hour) << 16) | (((int)dt1.dt.minute) << 8) | (int)dt1.dt.second;
+    int d3 = (((int)dt2.dt.year) << 16) | (((int)dt2.dt.month) << 8) | (int)dt2.dt.day;
+    int d4 = (((int)dt2.dt.hour) << 16) | (((int)dt2.dt.minute) << 8) | (int)dt2.dt.second;
 
-	if (d1 >= d3) return TRUE;
-	if (d2 >= d4) return TRUE;
-	return FALSE;
+    if (d1 >= d3) return TRUE;
+    if (d2 >= d4) return TRUE;
+    return FALSE;
 }
 
 FX_BOOL CPDFSDK_DateTime::operator < (CPDFSDK_DateTime& datetime)
 {
-	CPDFSDK_DateTime dt1 = ToGMT();
-	CPDFSDK_DateTime dt2 = datetime.ToGMT();
-	int d1 = (((int)dt1.dt.year) << 16) | (((int)dt1.dt.month) << 8) | (int)dt1.dt.day;
-	int d2 = (((int)dt1.dt.hour) << 16) | (((int)dt1.dt.minute) << 8) | (int)dt1.dt.second;
-	int d3 = (((int)dt2.dt.year) << 16) | (((int)dt2.dt.month) << 8) | (int)dt2.dt.day;
-	int d4 = (((int)dt2.dt.hour) << 16) | (((int)dt2.dt.minute) << 8) | (int)dt2.dt.second;
+    CPDFSDK_DateTime dt1 = ToGMT();
+    CPDFSDK_DateTime dt2 = datetime.ToGMT();
+    int d1 = (((int)dt1.dt.year) << 16) | (((int)dt1.dt.month) << 8) | (int)dt1.dt.day;
+    int d2 = (((int)dt1.dt.hour) << 16) | (((int)dt1.dt.minute) << 8) | (int)dt1.dt.second;
+    int d3 = (((int)dt2.dt.year) << 16) | (((int)dt2.dt.month) << 8) | (int)dt2.dt.day;
+    int d4 = (((int)dt2.dt.hour) << 16) | (((int)dt2.dt.minute) << 8) | (int)dt2.dt.second;
 
-	if (d1 < d3) return TRUE;
-	if (d2 < d4) return TRUE;
-	return FALSE;
+    if (d1 < d3) return TRUE;
+    if (d2 < d4) return TRUE;
+    return FALSE;
 }
 
 FX_BOOL CPDFSDK_DateTime::operator <= (CPDFSDK_DateTime& datetime)
 {
-	CPDFSDK_DateTime dt1 = ToGMT();
-	CPDFSDK_DateTime dt2 = datetime.ToGMT();
-	int d1 = (((int)dt1.dt.year) << 16) | (((int)dt1.dt.month) << 8) | (int)dt1.dt.day;
-	int d2 = (((int)dt1.dt.hour) << 16) | (((int)dt1.dt.minute) << 8) | (int)dt1.dt.second;
-	int d3 = (((int)dt2.dt.year) << 16) | (((int)dt2.dt.month) << 8) | (int)dt2.dt.day;
-	int d4 = (((int)dt2.dt.hour) << 16) | (((int)dt2.dt.minute) << 8) | (int)dt2.dt.second;
+    CPDFSDK_DateTime dt1 = ToGMT();
+    CPDFSDK_DateTime dt2 = datetime.ToGMT();
+    int d1 = (((int)dt1.dt.year) << 16) | (((int)dt1.dt.month) << 8) | (int)dt1.dt.day;
+    int d2 = (((int)dt1.dt.hour) << 16) | (((int)dt1.dt.minute) << 8) | (int)dt1.dt.second;
+    int d3 = (((int)dt2.dt.year) << 16) | (((int)dt2.dt.month) << 8) | (int)dt2.dt.day;
+    int d4 = (((int)dt2.dt.hour) << 16) | (((int)dt2.dt.minute) << 8) | (int)dt2.dt.second;
 
-	if (d1 <= d3) return TRUE;
-	if (d2 <= d4) return TRUE;
-	return FALSE;
+    if (d1 <= d3) return TRUE;
+    if (d2 <= d4) return TRUE;
+    return FALSE;
 }
 
 CPDFSDK_DateTime::operator time_t()
 {
-	struct tm newtime;
+    struct tm newtime;
 
-	newtime.tm_year = dt.year - 1900;
-	newtime.tm_mon = dt.month - 1;
-	newtime.tm_mday = dt.day;
-	newtime.tm_hour = dt.hour;
-	newtime.tm_min = dt.minute;
-	newtime.tm_sec = dt.second;
+    newtime.tm_year = dt.year - 1900;
+    newtime.tm_mon = dt.month - 1;
+    newtime.tm_mday = dt.day;
+    newtime.tm_hour = dt.hour;
+    newtime.tm_min = dt.minute;
+    newtime.tm_sec = dt.second;
 
-	return mktime(&newtime);
+    return mktime(&newtime);
 }
 
 CPDFSDK_DateTime& CPDFSDK_DateTime::FromPDFDateTimeString(const CFX_ByteString& dtStr)
 {
-	int strLength = dtStr.GetLength();
-	if (strLength > 0)
-	{
-		int i = 0;
-		int j, k;
-		FX_CHAR ch;
-		while (i < strLength)
-		{
-			ch = dtStr[i];
-			if (ch >= '0' && ch <= '9') break;
-			i ++;
-		}
-		if (i >= strLength) return *this;
+    int strLength = dtStr.GetLength();
+    if (strLength > 0)
+    {
+        int i = 0;
+        int j, k;
+        FX_CHAR ch;
+        while (i < strLength)
+        {
+            ch = dtStr[i];
+            if (ch >= '0' && ch <= '9') break;
+            i ++;
+        }
+        if (i >= strLength) return *this;
 
-		j = 0;
-		k = 0;
-		while (i < strLength && j < 4)
-		{
-			ch = dtStr[i];
-			k = k * 10 + ch - '0';
-			j ++;
-			if (ch < '0' || ch > '9') break;
-			i ++;
-		}
-		dt.year = (int16_t)k;
-		if (i >= strLength || j < 4) return *this;
+        j = 0;
+        k = 0;
+        while (i < strLength && j < 4)
+        {
+            ch = dtStr[i];
+            k = k * 10 + ch - '0';
+            j ++;
+            if (ch < '0' || ch > '9') break;
+            i ++;
+        }
+        dt.year = (int16_t)k;
+        if (i >= strLength || j < 4) return *this;
 
-		j = 0;
-		k = 0;
-		while (i < strLength && j < 2)
-		{
-			ch = dtStr[i];
-			k = k * 10 + ch - '0';
-			j ++;
-			if (ch < '0' || ch > '9') break;
-			i ++;
-		}
-		dt.month = (uint8_t)k;
-		if (i >= strLength || j < 2) return *this;
+        j = 0;
+        k = 0;
+        while (i < strLength && j < 2)
+        {
+            ch = dtStr[i];
+            k = k * 10 + ch - '0';
+            j ++;
+            if (ch < '0' || ch > '9') break;
+            i ++;
+        }
+        dt.month = (uint8_t)k;
+        if (i >= strLength || j < 2) return *this;
 
-		j = 0;
-		k = 0;
-		while (i < strLength && j < 2)
-		{
-			ch = dtStr[i];
-			k = k * 10 + ch - '0';
-			j ++;
-			if (ch < '0' || ch > '9') break;
-			i ++;
-		}
-		dt.day = (uint8_t)k;
-		if (i >= strLength || j < 2) return *this;
+        j = 0;
+        k = 0;
+        while (i < strLength && j < 2)
+        {
+            ch = dtStr[i];
+            k = k * 10 + ch - '0';
+            j ++;
+            if (ch < '0' || ch > '9') break;
+            i ++;
+        }
+        dt.day = (uint8_t)k;
+        if (i >= strLength || j < 2) return *this;
 
-		j = 0;
-		k = 0;
-		while (i < strLength && j < 2)
-		{
-			ch = dtStr[i];
-			k = k * 10 + ch - '0';
-			j ++;
-			if (ch < '0' || ch > '9') break;
-			i ++;
-		}
-		dt.hour = (uint8_t)k;
-		if (i >= strLength || j < 2) return *this;
+        j = 0;
+        k = 0;
+        while (i < strLength && j < 2)
+        {
+            ch = dtStr[i];
+            k = k * 10 + ch - '0';
+            j ++;
+            if (ch < '0' || ch > '9') break;
+            i ++;
+        }
+        dt.hour = (uint8_t)k;
+        if (i >= strLength || j < 2) return *this;
 
-		j = 0;
-		k = 0;
-		while (i < strLength && j < 2)
-		{
-			ch = dtStr[i];
-			k = k * 10 + ch - '0';
-			j ++;
-			if (ch < '0' || ch > '9') break;
-			i ++;
-		}
-		dt.minute = (uint8_t)k;
-		if (i >= strLength || j < 2) return *this;
+        j = 0;
+        k = 0;
+        while (i < strLength && j < 2)
+        {
+            ch = dtStr[i];
+            k = k * 10 + ch - '0';
+            j ++;
+            if (ch < '0' || ch > '9') break;
+            i ++;
+        }
+        dt.minute = (uint8_t)k;
+        if (i >= strLength || j < 2) return *this;
 
-		j = 0;
-		k = 0;
-		while (i < strLength && j < 2)
-		{
-			ch = dtStr[i];
-			k = k * 10 + ch - '0';
-			j ++;
-			if (ch < '0' || ch > '9') break;
-			i ++;
-		}
-		dt.second = (uint8_t)k;
-		if (i >= strLength || j < 2) return *this;
+        j = 0;
+        k = 0;
+        while (i < strLength && j < 2)
+        {
+            ch = dtStr[i];
+            k = k * 10 + ch - '0';
+            j ++;
+            if (ch < '0' || ch > '9') break;
+            i ++;
+        }
+        dt.second = (uint8_t)k;
+        if (i >= strLength || j < 2) return *this;
 
-		ch = dtStr[i ++];
-		if (ch != '-' && ch != '+') return *this;
-		if (ch == '-')
-			dt.tzHour = -1;
-		else
-			dt.tzHour = 1;
-		j = 0;
-		k = 0;
-		while (i < strLength && j < 2)
-		{
-			ch = dtStr[i];
-			k = k * 10 + ch - '0';
-			j ++;
-			if (ch < '0' || ch > '9') break;
-			i ++;
-		}
-		dt.tzHour *= (FX_CHAR)k;
-		if (i >= strLength || j < 2) return *this;
+        ch = dtStr[i ++];
+        if (ch != '-' && ch != '+') return *this;
+        if (ch == '-')
+            dt.tzHour = -1;
+        else
+            dt.tzHour = 1;
+        j = 0;
+        k = 0;
+        while (i < strLength && j < 2)
+        {
+            ch = dtStr[i];
+            k = k * 10 + ch - '0';
+            j ++;
+            if (ch < '0' || ch > '9') break;
+            i ++;
+        }
+        dt.tzHour *= (FX_CHAR)k;
+        if (i >= strLength || j < 2) return *this;
 
-		ch = dtStr[i ++];
-		if (ch != '\'') return *this;
-		j = 0;
-		k = 0;
-		while (i < strLength && j < 2)
-		{
-			ch = dtStr[i];
-			k = k * 10 + ch - '0';
-			j ++;
-			if (ch < '0' || ch > '9') break;
-			i ++;
-		}
-		dt.tzMinute = (uint8_t)k;
-		if (i >= strLength || j < 2) return *this;
-	}
+        ch = dtStr[i ++];
+        if (ch != '\'') return *this;
+        j = 0;
+        k = 0;
+        while (i < strLength && j < 2)
+        {
+            ch = dtStr[i];
+            k = k * 10 + ch - '0';
+            j ++;
+            if (ch < '0' || ch > '9') break;
+            i ++;
+        }
+        dt.tzMinute = (uint8_t)k;
+        if (i >= strLength || j < 2) return *this;
+    }
 
-	return  *this;
+    return  *this;
 }
 
 CFX_ByteString CPDFSDK_DateTime::ToCommonDateTimeString()
 {
-	CFX_ByteString str1;
-	str1.Format("%04d-%02d-%02d %02d:%02d:%02d ", dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second);
-	if (dt.tzHour < 0)
-		str1 += "-";
-	else
-		str1 += "+";
-	CFX_ByteString str2;
-	str2.Format("%02d:%02d", abs(dt.tzHour), dt.tzMinute);
-	return str1 + str2;
+    CFX_ByteString str1;
+    str1.Format("%04d-%02d-%02d %02d:%02d:%02d ", dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second);
+    if (dt.tzHour < 0)
+        str1 += "-";
+    else
+        str1 += "+";
+    CFX_ByteString str2;
+    str2.Format("%02d:%02d", abs(dt.tzHour), dt.tzMinute);
+    return str1 + str2;
 }
 
 CFX_ByteString CPDFSDK_DateTime::ToPDFDateTimeString()
 {
-	CFX_ByteString dtStr;
-	char tempStr[32];
-	memset(tempStr, 0, sizeof(tempStr));
-	FXSYS_snprintf(tempStr, sizeof(tempStr) - 1, "D:%04d%02d%02d%02d%02d%02d",
+    CFX_ByteString dtStr;
+    char tempStr[32];
+    memset(tempStr, 0, sizeof(tempStr));
+    FXSYS_snprintf(tempStr, sizeof(tempStr) - 1, "D:%04d%02d%02d%02d%02d%02d",
                    dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second);
-	dtStr = CFX_ByteString(tempStr);
-	if (dt.tzHour < 0)
-		dtStr += CFX_ByteString("-");
-	else
-		dtStr += CFX_ByteString("+");
-	memset(tempStr, 0, sizeof(tempStr));
-	FXSYS_snprintf(tempStr, sizeof(tempStr) - 1, "%02d'%02d'", abs(dt.tzHour), dt.tzMinute);
-	dtStr += CFX_ByteString(tempStr);
-	return dtStr;
+    dtStr = CFX_ByteString(tempStr);
+    if (dt.tzHour < 0)
+        dtStr += CFX_ByteString("-");
+    else
+        dtStr += CFX_ByteString("+");
+    memset(tempStr, 0, sizeof(tempStr));
+    FXSYS_snprintf(tempStr, sizeof(tempStr) - 1, "%02d'%02d'", abs(dt.tzHour), dt.tzMinute);
+    dtStr += CFX_ByteString(tempStr);
+    return dtStr;
 }
 
 void CPDFSDK_DateTime::ToSystemTime(FX_SYSTEMTIME& st)
 {
-	CPDFSDK_DateTime dt = *this;
-	time_t t = (time_t)dt;
-	struct tm* pTime = localtime(&t);
-	if(pTime){
-		st.wYear = (FX_WORD)pTime->tm_year + 1900;
-		st.wMonth = (FX_WORD)pTime->tm_mon + 1;
-		st.wDay = (FX_WORD)pTime->tm_mday;
-		st.wDayOfWeek = (FX_WORD)pTime->tm_wday;
-		st.wHour = (FX_WORD)pTime->tm_hour;
-		st.wMinute = (FX_WORD)pTime->tm_min;
-		st.wSecond = (FX_WORD)pTime->tm_sec;
-		st.wMilliseconds = 0;
-	}
+    CPDFSDK_DateTime dt = *this;
+    time_t t = (time_t)dt;
+    struct tm* pTime = localtime(&t);
+    if(pTime){
+        st.wYear = (FX_WORD)pTime->tm_year + 1900;
+        st.wMonth = (FX_WORD)pTime->tm_mon + 1;
+        st.wDay = (FX_WORD)pTime->tm_mday;
+        st.wDayOfWeek = (FX_WORD)pTime->tm_wday;
+        st.wHour = (FX_WORD)pTime->tm_hour;
+        st.wMinute = (FX_WORD)pTime->tm_min;
+        st.wSecond = (FX_WORD)pTime->tm_sec;
+        st.wMilliseconds = 0;
+    }
 }
 
 CPDFSDK_DateTime CPDFSDK_DateTime::ToGMT()
 {
-	CPDFSDK_DateTime dt = *this;
-	dt.AddSeconds(-_gAfxGetTimeZoneInSeconds(dt.dt.tzHour, dt.dt.tzMinute));
-	dt.dt.tzHour = 0;
-	dt.dt.tzMinute = 0;
-	return dt;
+    CPDFSDK_DateTime dt = *this;
+    dt.AddSeconds(-_gAfxGetTimeZoneInSeconds(dt.dt.tzHour, dt.dt.tzMinute));
+    dt.dt.tzHour = 0;
+    dt.dt.tzMinute = 0;
+    return dt;
 }
 
 CPDFSDK_DateTime& CPDFSDK_DateTime::AddDays(short days)
 {
-	if (days == 0) return *this;
+    if (days == 0) return *this;
 
-	int16_t	y = dt.year, yy;
-	uint8_t		m = dt.month;
-	uint8_t		d = dt.day;
-	int			mdays, ydays, ldays;
+    int16_t y = dt.year, yy;
+    uint8_t     m = dt.month;
+    uint8_t     d = dt.day;
+    int         mdays, ydays, ldays;
 
-	ldays = days;
-	if (ldays > 0)
-	{
-		yy = y;
-		if (((FX_WORD)m * 100 + d) > 300) yy ++;
-		ydays = _gAfxGetYearDays(yy);
-		while (ldays >= ydays)
-		{
-			y ++;
-			ldays -= ydays;
-			yy ++;
-			mdays = _gAfxGetMonthDays(y, m);
-			if (d > mdays)
-			{
-				m ++;
-				d -= mdays;
-			}
-			ydays = _gAfxGetYearDays(yy);
-		}
-		mdays = _gAfxGetMonthDays(y, m) - d + 1;
-		while (ldays >= mdays)
-		{
-			ldays -= mdays;
-			m ++;
-			d = 1;
-			mdays = _gAfxGetMonthDays(y, m);
-		}
-		d += ldays;
-	}
-	else
-	{
-		ldays *= -1;
-		yy = y;
-		if (((FX_WORD)m * 100 + d) < 300) yy --;
-		ydays = _gAfxGetYearDays(yy);
-		while (ldays >= ydays)
-		{
-			y --;
-			ldays -= ydays;
-			yy --;
-			mdays = _gAfxGetMonthDays(y, m);
-			if (d > mdays)
-			{
-				m ++;
-				d -= mdays;
-			}
-			ydays = _gAfxGetYearDays(yy);
-		}
-		while (ldays >= d)
-		{
-			ldays -= d;
-			m --;
-			mdays = _gAfxGetMonthDays(y, m);
-			d = mdays;
-		}
-		d -= ldays;
-	}
+    ldays = days;
+    if (ldays > 0)
+    {
+        yy = y;
+        if (((FX_WORD)m * 100 + d) > 300) yy ++;
+        ydays = _gAfxGetYearDays(yy);
+        while (ldays >= ydays)
+        {
+            y ++;
+            ldays -= ydays;
+            yy ++;
+            mdays = _gAfxGetMonthDays(y, m);
+            if (d > mdays)
+            {
+                m ++;
+                d -= mdays;
+            }
+            ydays = _gAfxGetYearDays(yy);
+        }
+        mdays = _gAfxGetMonthDays(y, m) - d + 1;
+        while (ldays >= mdays)
+        {
+            ldays -= mdays;
+            m ++;
+            d = 1;
+            mdays = _gAfxGetMonthDays(y, m);
+        }
+        d += ldays;
+    }
+    else
+    {
+        ldays *= -1;
+        yy = y;
+        if (((FX_WORD)m * 100 + d) < 300) yy --;
+        ydays = _gAfxGetYearDays(yy);
+        while (ldays >= ydays)
+        {
+            y --;
+            ldays -= ydays;
+            yy --;
+            mdays = _gAfxGetMonthDays(y, m);
+            if (d > mdays)
+            {
+                m ++;
+                d -= mdays;
+            }
+            ydays = _gAfxGetYearDays(yy);
+        }
+        while (ldays >= d)
+        {
+            ldays -= d;
+            m --;
+            mdays = _gAfxGetMonthDays(y, m);
+            d = mdays;
+        }
+        d -= ldays;
+    }
 
-	dt.year = y;
-	dt.month = m;
-	dt.day = d;
+    dt.year = y;
+    dt.month = m;
+    dt.day = d;
 
-	return *this;
+    return *this;
 }
 
 CPDFSDK_DateTime& CPDFSDK_DateTime::AddSeconds(int seconds)
 {
-	if (seconds == 0) return *this;
+    if (seconds == 0) return *this;
 
-	int	n;
-	int	days;
+    int n;
+    int days;
 
-	n = dt.hour * 3600 + dt.minute * 60 + dt.second + seconds;
-	if (n < 0)
-	{
-		days = (n - 86399) / 86400;
-		n -= days * 86400;
-	}
-	else
-	{
-		days = n / 86400;
-		n %= 86400;
-	}
-	dt.hour = (uint8_t)(n / 3600);
-	dt.hour %= 24;
-	n %= 3600;
-	dt.minute = (uint8_t)(n / 60);
-	dt.second = (uint8_t)(n % 60);
-	if (days != 0) AddDays(days);
+    n = dt.hour * 3600 + dt.minute * 60 + dt.second + seconds;
+    if (n < 0)
+    {
+        days = (n - 86399) / 86400;
+        n -= days * 86400;
+    }
+    else
+    {
+        days = n / 86400;
+        n %= 86400;
+    }
+    dt.hour = (uint8_t)(n / 3600);
+    dt.hour %= 24;
+    n %= 3600;
+    dt.minute = (uint8_t)(n / 60);
+    dt.second = (uint8_t)(n % 60);
+    if (days != 0) AddDays(days);
 
-	return *this;
+    return *this;
 }
 
 
 //---------------------------------------------------------------------------
-//								CPDFSDK_Annot
+//                              CPDFSDK_Annot
 //---------------------------------------------------------------------------
 CPDFSDK_Annot::CPDFSDK_Annot(CPDFSDK_PageView* pPageView) :
 m_pPageView(pPageView),
@@ -514,585 +514,575 @@
 
 //CPDFSDK_BAAnnot
 CPDFSDK_BAAnnot::CPDFSDK_BAAnnot(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPageView) :
-	CPDFSDK_Annot(pPageView),
-		m_pAnnot(pAnnot)
+    CPDFSDK_Annot(pPageView),
+        m_pAnnot(pAnnot)
 {
-
 }
 
 CPDFSDK_BAAnnot::~CPDFSDK_BAAnnot()
 {
-	m_pAnnot = NULL;
+    m_pAnnot = NULL;
 }
 
-CPDF_Annot*	CPDFSDK_BAAnnot::GetPDFAnnot()
+CPDF_Annot* CPDFSDK_BAAnnot::GetPDFAnnot()
 {
-	return m_pAnnot;
+    return m_pAnnot;
 }
 
 FX_BOOL CPDFSDK_Annot::IsSelected()
 {
-	return m_bSelected;
+    return m_bSelected;
 }
 
 void CPDFSDK_Annot::SetSelected(FX_BOOL bSelected)
 {
-	m_bSelected = bSelected;
+    m_bSelected = bSelected;
 }
 
 // Tab Order
 int CPDFSDK_Annot::GetTabOrder()
 {
-	return m_nTabOrder;
+    return m_nTabOrder;
 }
 
 void CPDFSDK_Annot::SetTabOrder(int iTabOrder)
 {
-	m_nTabOrder = iTabOrder;
+    m_nTabOrder = iTabOrder;
 }
 
 CPDF_Dictionary* CPDFSDK_BAAnnot::GetAnnotDict() const
 {
-	ASSERT(m_pAnnot != NULL);
+    ASSERT(m_pAnnot != NULL);
 
-	return m_pAnnot->GetAnnotDict();
+    return m_pAnnot->GetAnnotDict();
 }
 
 void CPDFSDK_BAAnnot::SetRect(const CPDF_Rect& rect)
 {
-	ASSERT(rect.right - rect.left >= GetMinWidth());
-	ASSERT(rect.top - rect.bottom >= GetMinHeight());
+    ASSERT(rect.right - rect.left >= GetMinWidth());
+    ASSERT(rect.top - rect.bottom >= GetMinHeight());
 
-	m_pAnnot->GetAnnotDict()->SetAtRect("Rect", rect);
+    m_pAnnot->GetAnnotDict()->SetAtRect("Rect", rect);
 }
 
 CPDF_Rect CPDFSDK_BAAnnot::GetRect() const
 {
-	ASSERT(m_pAnnot != NULL);
+    ASSERT(m_pAnnot != NULL);
 
-	CPDF_Rect rect;
-	m_pAnnot->GetRect(rect);
+    CPDF_Rect rect;
+    m_pAnnot->GetRect(rect);
 
-	return rect;
+    return rect;
 }
 
 CFX_ByteString CPDFSDK_BAAnnot::GetType() const
 {
-	ASSERT(m_pAnnot != NULL);
+    ASSERT(m_pAnnot != NULL);
 
-	return m_pAnnot->GetSubType();
+    return m_pAnnot->GetSubType();
 }
 
 CFX_ByteString CPDFSDK_BAAnnot::GetSubType() const
 {
-	return "";
+    return "";
 }
 
 void CPDFSDK_BAAnnot::ResetAppearance()
 {
-	ASSERT(FALSE);
+    ASSERT(FALSE);
 }
 
 void CPDFSDK_BAAnnot::DrawAppearance(CFX_RenderDevice* pDevice, const CPDF_Matrix* pUser2Device,
-								   CPDF_Annot::AppearanceMode mode, const CPDF_RenderOptions* pOptions)
+                                   CPDF_Annot::AppearanceMode mode, const CPDF_RenderOptions* pOptions)
 {
-	ASSERT(m_pPageView != NULL);
-	ASSERT(m_pAnnot != NULL);
+    ASSERT(m_pPageView != NULL);
+    ASSERT(m_pAnnot != NULL);
 
-	m_pAnnot->DrawAppearance(m_pPageView->GetPDFPage(), pDevice, pUser2Device, mode, pOptions);
+    m_pAnnot->DrawAppearance(m_pPageView->GetPDFPage(), pDevice, pUser2Device, mode, pOptions);
 }
 
-FX_BOOL	CPDFSDK_BAAnnot::IsAppearanceValid()
+FX_BOOL CPDFSDK_BAAnnot::IsAppearanceValid()
 {
-	return m_pAnnot->GetAnnotDict()->GetDict("AP") != NULL;
+    return m_pAnnot->GetAnnotDict()->GetDict("AP") != NULL;
 }
 
-FX_BOOL	CPDFSDK_BAAnnot::IsAppearanceValid(CPDF_Annot::AppearanceMode mode)
+FX_BOOL CPDFSDK_BAAnnot::IsAppearanceValid(CPDF_Annot::AppearanceMode mode)
 {
-	CPDF_Dictionary* pAP = m_pAnnot->GetAnnotDict()->GetDict("AP");
-	if (pAP == NULL) return FALSE;
+    CPDF_Dictionary* pAP = m_pAnnot->GetAnnotDict()->GetDict("AP");
+    if (pAP == NULL) return FALSE;
 
-	// Choose the right sub-ap
-	const FX_CHAR* ap_entry = "N";
-	if (mode == CPDF_Annot::Down)
-		ap_entry = "D";
-	else if (mode == CPDF_Annot::Rollover)
-		ap_entry = "R";
-	if (!pAP->KeyExist(ap_entry))
-		ap_entry = "N";
+    // Choose the right sub-ap
+    const FX_CHAR* ap_entry = "N";
+    if (mode == CPDF_Annot::Down)
+        ap_entry = "D";
+    else if (mode == CPDF_Annot::Rollover)
+        ap_entry = "R";
+    if (!pAP->KeyExist(ap_entry))
+        ap_entry = "N";
 
-	// Get the AP stream or subdirectory
-	CPDF_Object* psub = pAP->GetElementValue(ap_entry);
-	if (psub == NULL) return FALSE;
+    // Get the AP stream or subdirectory
+    CPDF_Object* psub = pAP->GetElementValue(ap_entry);
+    if (psub == NULL) return FALSE;
 
-	return TRUE;
+    return TRUE;
 }
 
 void CPDFSDK_BAAnnot::DrawBorder(CFX_RenderDevice* pDevice, const CPDF_Matrix* pUser2Device,
-						   const CPDF_RenderOptions* pOptions)
+                           const CPDF_RenderOptions* pOptions)
 {
-	ASSERT(m_pAnnot != NULL);
-	m_pAnnot->DrawBorder(pDevice, pUser2Device, pOptions);
+    ASSERT(m_pAnnot != NULL);
+    m_pAnnot->DrawBorder(pDevice, pUser2Device, pOptions);
 }
 
 void CPDFSDK_BAAnnot::ClearCachedAP()
 {
-	ASSERT(m_pAnnot != NULL);
-	m_pAnnot->ClearCachedAP();
+    ASSERT(m_pAnnot != NULL);
+    m_pAnnot->ClearCachedAP();
 }
 
 void CPDFSDK_BAAnnot::SetContents(const CFX_WideString& sContents)
 {
-	if (sContents.IsEmpty())
-		m_pAnnot->GetAnnotDict()->RemoveAt("Contents");
-	else
-		m_pAnnot->GetAnnotDict()->SetAtString("Contents", PDF_EncodeText(sContents));
+    if (sContents.IsEmpty())
+        m_pAnnot->GetAnnotDict()->RemoveAt("Contents");
+    else
+        m_pAnnot->GetAnnotDict()->SetAtString("Contents", PDF_EncodeText(sContents));
 }
 
 CFX_WideString CPDFSDK_BAAnnot::GetContents() const
 {
-	return m_pAnnot->GetAnnotDict()->GetUnicodeText("Contents");
+    return m_pAnnot->GetAnnotDict()->GetUnicodeText("Contents");
 }
 
 void CPDFSDK_BAAnnot::SetAnnotName(const CFX_WideString& sName)
 {
-	if (sName.IsEmpty())
-		m_pAnnot->GetAnnotDict()->RemoveAt("NM");
-	else
-		m_pAnnot->GetAnnotDict()->SetAtString("NM", PDF_EncodeText(sName));
+    if (sName.IsEmpty())
+        m_pAnnot->GetAnnotDict()->RemoveAt("NM");
+    else
+        m_pAnnot->GetAnnotDict()->SetAtString("NM", PDF_EncodeText(sName));
 }
 
 CFX_WideString CPDFSDK_BAAnnot::GetAnnotName() const
 {
-	return m_pAnnot->GetAnnotDict()->GetUnicodeText("NM");
+    return m_pAnnot->GetAnnotDict()->GetUnicodeText("NM");
 }
 
 void CPDFSDK_BAAnnot::SetModifiedDate(const FX_SYSTEMTIME& st)
 {
-	CPDFSDK_DateTime dt(st);
-	CFX_ByteString str = dt.ToPDFDateTimeString();
+    CPDFSDK_DateTime dt(st);
+    CFX_ByteString str = dt.ToPDFDateTimeString();
 
-	if (str.IsEmpty())
-		m_pAnnot->GetAnnotDict()->RemoveAt("M");
-	else
-		m_pAnnot->GetAnnotDict()->SetAtString("M", str);
+    if (str.IsEmpty())
+        m_pAnnot->GetAnnotDict()->RemoveAt("M");
+    else
+        m_pAnnot->GetAnnotDict()->SetAtString("M", str);
 }
 
 FX_SYSTEMTIME CPDFSDK_BAAnnot::GetModifiedDate() const
 {
-	FX_SYSTEMTIME systime;
-	CFX_ByteString str = m_pAnnot->GetAnnotDict()->GetString("M");
+    FX_SYSTEMTIME systime;
+    CFX_ByteString str = m_pAnnot->GetAnnotDict()->GetString("M");
 
- 	CPDFSDK_DateTime dt(str);
- 	dt.ToSystemTime(systime);
+    CPDFSDK_DateTime dt(str);
+    dt.ToSystemTime(systime);
 
-	return systime;
+    return systime;
 }
 
 void CPDFSDK_BAAnnot::SetFlags(int nFlags)
 {
-	m_pAnnot->GetAnnotDict()->SetAtInteger("F", nFlags);
+    m_pAnnot->GetAnnotDict()->SetAtInteger("F", nFlags);
 }
 
 int CPDFSDK_BAAnnot::GetFlags() const
 {
-	return m_pAnnot->GetAnnotDict()->GetInteger("F");
+    return m_pAnnot->GetAnnotDict()->GetInteger("F");
 }
 
 void CPDFSDK_BAAnnot::SetAppState(const CFX_ByteString& str)
 {
-	if (str.IsEmpty())
-		m_pAnnot->GetAnnotDict()->RemoveAt("AS");
-	else
-		m_pAnnot->GetAnnotDict()->SetAtString("AS", str);
+    if (str.IsEmpty())
+        m_pAnnot->GetAnnotDict()->RemoveAt("AS");
+    else
+        m_pAnnot->GetAnnotDict()->SetAtString("AS", str);
 }
 
 CFX_ByteString CPDFSDK_BAAnnot::GetAppState() const
 {
-	return m_pAnnot->GetAnnotDict()->GetString("AS");
+    return m_pAnnot->GetAnnotDict()->GetString("AS");
 }
 
 void CPDFSDK_BAAnnot::SetStructParent(int key)
 {
-	m_pAnnot->GetAnnotDict()->SetAtInteger("StructParent", key);
+    m_pAnnot->GetAnnotDict()->SetAtInteger("StructParent", key);
 }
 
-int	CPDFSDK_BAAnnot::GetStructParent() const
+int CPDFSDK_BAAnnot::GetStructParent() const
 {
-	return m_pAnnot->GetAnnotDict()->GetInteger("StructParent");
+    return m_pAnnot->GetAnnotDict()->GetInteger("StructParent");
 }
 
 //border
 void CPDFSDK_BAAnnot::SetBorderWidth(int nWidth)
 {
-	CPDF_Array* pBorder = m_pAnnot->GetAnnotDict()->GetArray("Border");
+    CPDF_Array* pBorder = m_pAnnot->GetAnnotDict()->GetArray("Border");
 
-	if (pBorder)
-	{
-		pBorder->SetAt(2, FX_NEW CPDF_Number(nWidth));
-	}
-	else
-	{
-		CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDict("BS");
+    if (pBorder)
+    {
+        pBorder->SetAt(2, FX_NEW CPDF_Number(nWidth));
+    }
+    else
+    {
+        CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDict("BS");
 
-		if (!pBSDict)
-		{
-			pBSDict = FX_NEW CPDF_Dictionary;
-			m_pAnnot->GetAnnotDict()->SetAt("BS", pBSDict);
-		}
+        if (!pBSDict)
+        {
+            pBSDict = FX_NEW CPDF_Dictionary;
+            m_pAnnot->GetAnnotDict()->SetAt("BS", pBSDict);
+        }
 
-		pBSDict->SetAtInteger("W", nWidth);
-	}
+        pBSDict->SetAtInteger("W", nWidth);
+    }
 }
 
-int	CPDFSDK_BAAnnot::GetBorderWidth() const
+int CPDFSDK_BAAnnot::GetBorderWidth() const
 {
-	CPDF_Array* pBorder = m_pAnnot->GetAnnotDict()->GetArray("Border");
-
-	if (pBorder)
-	{
-		return pBorder->GetInteger(2);
-	}
-	else
-	{
-		CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDict("BS");
-
-		if (pBSDict)
-		{
-			return pBSDict->GetInteger("W", 1);
-		}
-	}
-	return 1;
+    if (CPDF_Array* pBorder = m_pAnnot->GetAnnotDict()->GetArray("Border")) {
+        return pBorder->GetInteger(2);
+    }
+    if (CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDict("BS")) {
+        return pBSDict->GetInteger("W", 1);
+    }
+    return 1;
 }
 
 void CPDFSDK_BAAnnot::SetBorderStyle(int nStyle)
 {
-	CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDict("BS");
-	if (!pBSDict)
-	{
-		pBSDict = new CPDF_Dictionary;
-		m_pAnnot->GetAnnotDict()->SetAt("BS", pBSDict);
-	}
+    CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDict("BS");
+    if (!pBSDict)
+    {
+        pBSDict = new CPDF_Dictionary;
+        m_pAnnot->GetAnnotDict()->SetAt("BS", pBSDict);
+    }
 
-	switch (nStyle)
-	{
-	case BBS_SOLID:
-		pBSDict->SetAtName("S", "S");
-		break;
-	case BBS_DASH:
-		pBSDict->SetAtName("S", "D");
-		break;
-	case BBS_BEVELED:
-		pBSDict->SetAtName("S", "B");
-		break;
-	case BBS_INSET:
-		pBSDict->SetAtName("S", "I");
-		break;
-	case BBS_UNDERLINE:
-		pBSDict->SetAtName("S", "U");
-		break;
-	}
+    switch (nStyle)
+    {
+    case BBS_SOLID:
+        pBSDict->SetAtName("S", "S");
+        break;
+    case BBS_DASH:
+        pBSDict->SetAtName("S", "D");
+        break;
+    case BBS_BEVELED:
+        pBSDict->SetAtName("S", "B");
+        break;
+    case BBS_INSET:
+        pBSDict->SetAtName("S", "I");
+        break;
+    case BBS_UNDERLINE:
+        pBSDict->SetAtName("S", "U");
+        break;
+    }
 }
 
-int	CPDFSDK_BAAnnot::GetBorderStyle() const
+int CPDFSDK_BAAnnot::GetBorderStyle() const
 {
-	CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDict("BS");
-	if (pBSDict)
-	{
-		CFX_ByteString sBorderStyle = pBSDict->GetString("S", "S");
-		if (sBorderStyle == "S") return BBS_SOLID;
-		if (sBorderStyle == "D") return BBS_DASH;
-		if (sBorderStyle == "B") return BBS_BEVELED;
-		if (sBorderStyle == "I") return BBS_INSET;
-		if (sBorderStyle == "U") return BBS_UNDERLINE;
-	}
+    CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDict("BS");
+    if (pBSDict)
+    {
+        CFX_ByteString sBorderStyle = pBSDict->GetString("S", "S");
+        if (sBorderStyle == "S") return BBS_SOLID;
+        if (sBorderStyle == "D") return BBS_DASH;
+        if (sBorderStyle == "B") return BBS_BEVELED;
+        if (sBorderStyle == "I") return BBS_INSET;
+        if (sBorderStyle == "U") return BBS_UNDERLINE;
+    }
 
-	CPDF_Array* pBorder = m_pAnnot->GetAnnotDict()->GetArray("Border");
-	if (pBorder)
-	{
-		if (pBorder->GetCount() >= 4)
-		{
-			CPDF_Array *pDP = pBorder->GetArray(3);
-			if (pDP && pDP->GetCount() > 0)
-				return BBS_DASH;
-		}
-	}
+    CPDF_Array* pBorder = m_pAnnot->GetAnnotDict()->GetArray("Border");
+    if (pBorder)
+    {
+        if (pBorder->GetCount() >= 4)
+        {
+            CPDF_Array *pDP = pBorder->GetArray(3);
+            if (pDP && pDP->GetCount() > 0)
+                return BBS_DASH;
+        }
+    }
 
-	return BBS_SOLID;
+    return BBS_SOLID;
 }
 
 void CPDFSDK_BAAnnot::SetBorderDash(const CFX_IntArray& array)
 {
-	CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDict("BS");
-	if (!pBSDict)
-	{
-		pBSDict = new CPDF_Dictionary;
-		m_pAnnot->GetAnnotDict()->SetAt("BS", pBSDict);
-	}
+    CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDict("BS");
+    if (!pBSDict)
+    {
+        pBSDict = new CPDF_Dictionary;
+        m_pAnnot->GetAnnotDict()->SetAt("BS", pBSDict);
+    }
 
-	CPDF_Array* pArray = FX_NEW CPDF_Array;
-	for (int i=0,sz=array.GetSize(); i<sz; i++)
-	{
-		pArray->AddInteger(array[i]);
-	}
+    CPDF_Array* pArray = FX_NEW CPDF_Array;
+    for (int i=0,sz=array.GetSize(); i<sz; i++)
+    {
+        pArray->AddInteger(array[i]);
+    }
 
-	pBSDict->SetAt("D", pArray);
+    pBSDict->SetAt("D", pArray);
 }
 
 void CPDFSDK_BAAnnot::GetBorderDash(CFX_IntArray& array) const
 {
-	CPDF_Array* pDash = NULL;
+    CPDF_Array* pDash = NULL;
 
-	CPDF_Array* pBorder = m_pAnnot->GetAnnotDict()->GetArray("Border");
-	if (pBorder)
-	{
-		pDash = pBorder->GetArray(3);
-	}
-	else
-	{
-		CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDict("BS");
-		if (pBSDict)
-		{
-			pDash = pBSDict->GetArray("D");
-		}
-	}
+    CPDF_Array* pBorder = m_pAnnot->GetAnnotDict()->GetArray("Border");
+    if (pBorder)
+    {
+        pDash = pBorder->GetArray(3);
+    }
+    else
+    {
+        CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDict("BS");
+        if (pBSDict)
+        {
+            pDash = pBSDict->GetArray("D");
+        }
+    }
 
-	if (pDash)
-	{
-		for (int i=0,sz=pDash->GetCount(); i<sz; i++)
-		{
-			array.Add(pDash->GetInteger(i));
-		}
-	}
+    if (pDash)
+    {
+        for (int i=0,sz=pDash->GetCount(); i<sz; i++)
+        {
+            array.Add(pDash->GetInteger(i));
+        }
+    }
 }
 
 void CPDFSDK_BAAnnot::SetColor(FX_COLORREF color)
 {
-	CPDF_Array* pArray = new CPDF_Array;
-	pArray->AddNumber((FX_FLOAT)FXSYS_GetRValue(color) / 255.0f);
-	pArray->AddNumber((FX_FLOAT)FXSYS_GetGValue(color) / 255.0f);
-	pArray->AddNumber((FX_FLOAT)FXSYS_GetBValue(color) / 255.0f);
-	m_pAnnot->GetAnnotDict()->SetAt("C", pArray);
+    CPDF_Array* pArray = new CPDF_Array;
+    pArray->AddNumber((FX_FLOAT)FXSYS_GetRValue(color) / 255.0f);
+    pArray->AddNumber((FX_FLOAT)FXSYS_GetGValue(color) / 255.0f);
+    pArray->AddNumber((FX_FLOAT)FXSYS_GetBValue(color) / 255.0f);
+    m_pAnnot->GetAnnotDict()->SetAt("C", pArray);
 }
 
 void CPDFSDK_BAAnnot::RemoveColor()
 {
-	m_pAnnot->GetAnnotDict()->RemoveAt("C");
+    m_pAnnot->GetAnnotDict()->RemoveAt("C");
 }
 
 FX_BOOL CPDFSDK_BAAnnot::GetColor(FX_COLORREF& color) const
 {
-	if (CPDF_Array* pEntry = m_pAnnot->GetAnnotDict()->GetArray("C"))
-	{
-		int nCount = pEntry->GetCount();
-		if (nCount == 1)
-		{
-			FX_FLOAT g = pEntry->GetNumber(0) * 255;
+    if (CPDF_Array* pEntry = m_pAnnot->GetAnnotDict()->GetArray("C"))
+    {
+        int nCount = pEntry->GetCount();
+        if (nCount == 1)
+        {
+            FX_FLOAT g = pEntry->GetNumber(0) * 255;
 
-			color = FXSYS_RGB((int)g, (int)g, (int)g);
+            color = FXSYS_RGB((int)g, (int)g, (int)g);
 
-			return TRUE;
-		}
-		else if (nCount == 3)
-		{
-			FX_FLOAT r = pEntry->GetNumber(0) * 255;
-			FX_FLOAT g = pEntry->GetNumber(1) * 255;
-			FX_FLOAT b = pEntry->GetNumber(2) * 255;
+            return TRUE;
+        }
+        else if (nCount == 3)
+        {
+            FX_FLOAT r = pEntry->GetNumber(0) * 255;
+            FX_FLOAT g = pEntry->GetNumber(1) * 255;
+            FX_FLOAT b = pEntry->GetNumber(2) * 255;
 
-			color = FXSYS_RGB((int)r, (int)g, (int)b);
+            color = FXSYS_RGB((int)r, (int)g, (int)b);
 
-			return TRUE;
-		}
-		else if (nCount == 4)
-		{
-			FX_FLOAT c = pEntry->GetNumber(0);
-			FX_FLOAT m = pEntry->GetNumber(1);
-			FX_FLOAT y = pEntry->GetNumber(2);
-			FX_FLOAT k = pEntry->GetNumber(3);
+            return TRUE;
+        }
+        else if (nCount == 4)
+        {
+            FX_FLOAT c = pEntry->GetNumber(0);
+            FX_FLOAT m = pEntry->GetNumber(1);
+            FX_FLOAT y = pEntry->GetNumber(2);
+            FX_FLOAT k = pEntry->GetNumber(3);
 
-			FX_FLOAT r = 1.0f - FX_MIN(1.0f, c + k);
-			FX_FLOAT g = 1.0f - FX_MIN(1.0f, m + k);
-			FX_FLOAT b = 1.0f - FX_MIN(1.0f, y + k);
+            FX_FLOAT r = 1.0f - FX_MIN(1.0f, c + k);
+            FX_FLOAT g = 1.0f - FX_MIN(1.0f, m + k);
+            FX_FLOAT b = 1.0f - FX_MIN(1.0f, y + k);
 
-			color = FXSYS_RGB((int)(r * 255), (int)(g * 255), (int)(b * 255));
+            color = FXSYS_RGB((int)(r * 255), (int)(g * 255), (int)(b * 255));
 
-			return TRUE;
-		}
-	}
+            return TRUE;
+        }
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
 
 void CPDFSDK_BAAnnot::WriteAppearance(const CFX_ByteString& sAPType, const CPDF_Rect& rcBBox,
-								const CPDF_Matrix& matrix, const CFX_ByteString& sContents,
-								const CFX_ByteString& sAPState)
+                                const CPDF_Matrix& matrix, const CFX_ByteString& sContents,
+                                const CFX_ByteString& sAPState)
 {
-	CPDF_Dictionary* pAPDict = m_pAnnot->GetAnnotDict()->GetDict("AP");
+    CPDF_Dictionary* pAPDict = m_pAnnot->GetAnnotDict()->GetDict("AP");
 
-	if (!pAPDict)
-	{
-		pAPDict = new CPDF_Dictionary;
-		m_pAnnot->GetAnnotDict()->SetAt("AP", pAPDict);
-	}
+    if (!pAPDict)
+    {
+        pAPDict = new CPDF_Dictionary;
+        m_pAnnot->GetAnnotDict()->SetAt("AP", pAPDict);
+    }
 
-	CPDF_Stream* pStream = NULL;
-	CPDF_Dictionary* pParentDict = NULL;
+    CPDF_Stream* pStream = NULL;
+    CPDF_Dictionary* pParentDict = NULL;
 
-	if (sAPState.IsEmpty())
-	{
-		pParentDict = pAPDict;
-		pStream = pAPDict->GetStream(sAPType);
-	}
-	else
-	{
-		CPDF_Dictionary* pAPTypeDict = pAPDict->GetDict(sAPType);
-		if (!pAPTypeDict)
-		{
-			pAPTypeDict = FX_NEW CPDF_Dictionary;
-			pAPDict->SetAt(sAPType, pAPTypeDict);
-		}
+    if (sAPState.IsEmpty())
+    {
+        pParentDict = pAPDict;
+        pStream = pAPDict->GetStream(sAPType);
+    }
+    else
+    {
+        CPDF_Dictionary* pAPTypeDict = pAPDict->GetDict(sAPType);
+        if (!pAPTypeDict)
+        {
+            pAPTypeDict = FX_NEW CPDF_Dictionary;
+            pAPDict->SetAt(sAPType, pAPTypeDict);
+        }
 
-		pParentDict = pAPTypeDict;
-		pStream = pAPTypeDict->GetStream(sAPState);
-	}
+        pParentDict = pAPTypeDict;
+        pStream = pAPTypeDict->GetStream(sAPState);
+    }
 
-	if (!pStream)
-	{
-		ASSERT(m_pPageView != NULL);
-		CPDF_Document* pDoc = m_pPageView->GetPDFDocument();
-		ASSERT(pDoc != NULL);
+    if (!pStream)
+    {
+        ASSERT(m_pPageView != NULL);
+        CPDF_Document* pDoc = m_pPageView->GetPDFDocument();
+        ASSERT(pDoc != NULL);
 
-		pStream = FX_NEW CPDF_Stream(NULL, 0, NULL);
-		int32_t objnum = pDoc->AddIndirectObject(pStream);
-		//pAPDict->SetAtReference(sAPType, pDoc, objnum);
-		ASSERT(pParentDict != NULL);
-		pParentDict->SetAtReference(sAPType, pDoc, objnum);
-	}
+        pStream = FX_NEW CPDF_Stream(NULL, 0, NULL);
+        int32_t objnum = pDoc->AddIndirectObject(pStream);
+        //pAPDict->SetAtReference(sAPType, pDoc, objnum);
+        ASSERT(pParentDict != NULL);
+        pParentDict->SetAtReference(sAPType, pDoc, objnum);
+    }
 
-	CPDF_Dictionary * pStreamDict = pStream->GetDict();
+    CPDF_Dictionary * pStreamDict = pStream->GetDict();
 
-	if (!pStreamDict)
-	{
-		pStreamDict = FX_NEW CPDF_Dictionary;
-		pStreamDict->SetAtName("Type", "XObject");
-		pStreamDict->SetAtName("Subtype", "Form");
-		pStreamDict->SetAtInteger("FormType", 1);
-		pStream->InitStream(NULL,0,pStreamDict);
-	}
+    if (!pStreamDict)
+    {
+        pStreamDict = FX_NEW CPDF_Dictionary;
+        pStreamDict->SetAtName("Type", "XObject");
+        pStreamDict->SetAtName("Subtype", "Form");
+        pStreamDict->SetAtInteger("FormType", 1);
+        pStream->InitStream(NULL,0,pStreamDict);
+    }
 
-	if (pStreamDict)
-	{
-		pStreamDict->SetAtMatrix("Matrix",matrix);
-		pStreamDict->SetAtRect("BBox", rcBBox);
-	}
+    if (pStreamDict)
+    {
+        pStreamDict->SetAtMatrix("Matrix",matrix);
+        pStreamDict->SetAtRect("BBox", rcBBox);
+    }
 
-	pStream->SetData((uint8_t*)sContents.c_str(), sContents.GetLength(), FALSE, FALSE);
+    pStream->SetData((uint8_t*)sContents.c_str(), sContents.GetLength(), FALSE, FALSE);
 }
 
-#define BA_ANNOT_MINWIDTH			1
-#define BA_ANNOT_MINHEIGHT			1
+#define BA_ANNOT_MINWIDTH           1
+#define BA_ANNOT_MINHEIGHT          1
 
 FX_FLOAT CPDFSDK_Annot::GetMinWidth() const
 {
-	return BA_ANNOT_MINWIDTH;
+    return BA_ANNOT_MINWIDTH;
 }
 
 FX_FLOAT CPDFSDK_Annot::GetMinHeight() const
 {
-	return BA_ANNOT_MINHEIGHT;
+    return BA_ANNOT_MINHEIGHT;
 }
 
 FX_BOOL CPDFSDK_BAAnnot::CreateFormFiller()
 {
-	return TRUE;
+    return TRUE;
 }
-FX_BOOL	CPDFSDK_BAAnnot::IsVisible() const
+FX_BOOL CPDFSDK_BAAnnot::IsVisible() const
 {
-	int nFlags = GetFlags();
-	return !((nFlags & ANNOTFLAG_INVISIBLE) || (nFlags & ANNOTFLAG_HIDDEN) || (nFlags & ANNOTFLAG_NOVIEW));
+    int nFlags = GetFlags();
+    return !((nFlags & ANNOTFLAG_INVISIBLE) || (nFlags & ANNOTFLAG_HIDDEN) || (nFlags & ANNOTFLAG_NOVIEW));
 }
 
 CPDF_Action CPDFSDK_BAAnnot::GetAction() const
 {
-	return CPDF_Action(m_pAnnot->GetAnnotDict()->GetDict("A"));
+    return CPDF_Action(m_pAnnot->GetAnnotDict()->GetDict("A"));
 }
 
 void CPDFSDK_BAAnnot::SetAction(const CPDF_Action& action)
 {
-	ASSERT(action);
-	if ((CPDF_Action&)action != CPDF_Action(m_pAnnot->GetAnnotDict()->GetDict("A")))
-	{
-		CPDF_Document* pDoc = m_pPageView->GetPDFDocument();
-		CPDF_Dictionary* pDict = action.GetDict();
-		if (pDict && pDict->GetObjNum() == 0) {
-			pDoc->AddIndirectObject(pDict);
-		}
-		m_pAnnot->GetAnnotDict()->SetAtReference("A", pDoc, pDict->GetObjNum());
-	}
+    ASSERT(action);
+    if ((CPDF_Action&)action != CPDF_Action(m_pAnnot->GetAnnotDict()->GetDict("A")))
+    {
+        CPDF_Document* pDoc = m_pPageView->GetPDFDocument();
+        CPDF_Dictionary* pDict = action.GetDict();
+        if (pDict && pDict->GetObjNum() == 0) {
+            pDoc->AddIndirectObject(pDict);
+        }
+        m_pAnnot->GetAnnotDict()->SetAtReference("A", pDoc, pDict->GetObjNum());
+    }
 }
 
 void CPDFSDK_BAAnnot::RemoveAction()
 {
-	m_pAnnot->GetAnnotDict()->RemoveAt("A");
+    m_pAnnot->GetAnnotDict()->RemoveAt("A");
 }
 
 CPDF_AAction CPDFSDK_BAAnnot::GetAAction() const
 {
-	return m_pAnnot->GetAnnotDict()->GetDict("AA");
+    return m_pAnnot->GetAnnotDict()->GetDict("AA");
 }
 
 void CPDFSDK_BAAnnot::SetAAction(const CPDF_AAction& aa)
 {
-	ASSERT(aa != NULL);
+    ASSERT(aa != NULL);
 
-	if ((CPDF_AAction&)aa != m_pAnnot->GetAnnotDict()->GetDict("AA"))
-		m_pAnnot->GetAnnotDict()->SetAt("AA", (CPDF_AAction&)aa);
+    if ((CPDF_AAction&)aa != m_pAnnot->GetAnnotDict()->GetDict("AA"))
+        m_pAnnot->GetAnnotDict()->SetAt("AA", (CPDF_AAction&)aa);
 }
 
 void CPDFSDK_BAAnnot::RemoveAAction()
 {
-	m_pAnnot->GetAnnotDict()->RemoveAt("AA");
+    m_pAnnot->GetAnnotDict()->RemoveAt("AA");
 }
 
-CPDF_Action	CPDFSDK_BAAnnot::GetAAction(CPDF_AAction::AActionType eAAT)
+CPDF_Action CPDFSDK_BAAnnot::GetAAction(CPDF_AAction::AActionType eAAT)
 {
-	CPDF_AAction AAction = GetAAction();
+    CPDF_AAction AAction = GetAAction();
 
-	if (AAction.ActionExist(eAAT))
-		return AAction.GetAction(eAAT);
+    if (AAction.ActionExist(eAAT))
+        return AAction.GetAction(eAAT);
 
-	if (eAAT == CPDF_AAction::ButtonUp)
-		return GetAction();
+    if (eAAT == CPDF_AAction::ButtonUp)
+        return GetAction();
 
-	return CPDF_Action();
+    return CPDF_Action();
 }
 
 FX_BOOL CPDFSDK_BAAnnot::IsXFAField()
 {
-	return FALSE;
+    return FALSE;
 }
 
 void  CPDFSDK_BAAnnot::Annot_OnDraw(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, CPDF_RenderOptions* pOptions)
 {
 
-	m_pAnnot->GetAPForm(m_pPageView->GetPDFPage(), CPDF_Annot::Normal);
-	m_pAnnot->DrawAppearance(m_pPageView->GetPDFPage(), pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
+    m_pAnnot->GetAPForm(m_pPageView->GetPDFPage(), CPDF_Annot::Normal);
+    m_pAnnot->DrawAppearance(m_pPageView->GetPDFPage(), pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
 
-	return ;
+    return ;
 }
 
 CPDF_Page* CPDFSDK_Annot::GetPDFPage()
 {
-	if(m_pPageView)
-		return m_pPageView->GetPDFPage();
-	return NULL;
+    if(m_pPageView)
+        return m_pPageView->GetPDFPage();
+    return NULL;
 }
 
 CPDFXFA_Page* CPDFSDK_Annot::GetPDFXFAPage()
 {
-	if (m_pPageView)
-		return m_pPageView->GetPDFXFAPage();
-	return NULL;
+    if (m_pPageView)
+        return m_pPageView->GetPDFXFAPage();
+    return NULL;
 }
 
diff --git a/fpdfsdk/src/fsdk_baseform.cpp b/fpdfsdk/src/fsdk_baseform.cpp
index cff6a38..b26a7f4 100644
--- a/fpdfsdk/src/fsdk_baseform.cpp
+++ b/fpdfsdk/src/fsdk_baseform.cpp
@@ -17,13 +17,13 @@
 #include "../include/javascript/IJavaScript.h"
 
 //------------------------------------------------------------------------------------
-//*										CPDFSDK_Widget
+//*                                     CPDFSDK_Widget
 //------------------------------------------------------------------------------------
 
-#define IsFloatZero(f)						((f) < 0.01 && (f) > -0.01)
-#define IsFloatBigger(fa,fb)				((fa) > (fb) && !IsFloatZero((fa) - (fb)))
-#define IsFloatSmaller(fa,fb)				((fa) < (fb) && !IsFloatZero((fa) - (fb)))
-#define IsFloatEqual(fa,fb)					IsFloatZero((fa)-(fb))
+#define IsFloatZero(f)                      ((f) < 0.01 && (f) > -0.01)
+#define IsFloatBigger(fa,fb)                ((fa) > (fb) && !IsFloatZero((fa) - (fb)))
+#define IsFloatSmaller(fa,fb)               ((fa) < (fb) && !IsFloatZero((fa) - (fb)))
+#define IsFloatEqual(fa,fb)                 IsFloatZero((fa)-(fb))
 
 CPDFSDK_Widget::CPDFSDK_Widget(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPageView, CPDFSDK_InterForm* pInterForm) :
 					CPDFSDK_BAAnnot(pAnnot, pPageView),
@@ -33,7 +33,7 @@
 					m_hMixXFAWidget(NULL),
 					m_pWidgetHandler(NULL)
 {
-	ASSERT(m_pInterForm != NULL);
+    ASSERT(m_pInterForm != NULL);
 }
 
 CPDFSDK_Widget::~CPDFSDK_Widget()
@@ -565,7 +565,8 @@
 FX_BOOL		CPDFSDK_Widget::IsWidgetAppearanceValid(CPDF_Annot::AppearanceMode mode)
 {
 	CPDF_Dictionary* pAP = m_pAnnot->GetAnnotDict()->GetDict("AP");
-	if (pAP == NULL) return FALSE;
+	if (!pAP)
+        return FALSE;
 
 	// Choose the right sub-ap
 	const FX_CHAR* ap_entry = "N";
@@ -578,7 +579,8 @@
 
 	// Get the AP stream or subdirectory
 	CPDF_Object* psub = pAP->GetElementValue(ap_entry);
-	if (psub == NULL) return FALSE;
+	if (!psub)
+        return FALSE;
 
 	int nFieldType = GetFieldType();
 	switch (nFieldType)
@@ -594,23 +596,19 @@
 		if (psub->GetType() == PDFOBJ_DICTIONARY)
 		{
 			CPDF_Dictionary* pSubDict = (CPDF_Dictionary*)psub;
-
 			return pSubDict->GetStream(GetAppState()) != NULL;
 		}
-		else
-			return FALSE;
-		break;
+        return FALSE;
 	}
-
-	return TRUE;
+    return TRUE;
 }
 
-int	CPDFSDK_Widget::GetFieldType() const
+int CPDFSDK_Widget::GetFieldType() const
 {
-	CPDF_FormField* pField = GetFormField();
-	ASSERT(pField != NULL);
+    CPDF_FormField* pField = GetFormField();
+    ASSERT(pField != NULL);
 
-	return pField->GetFieldType();
+    return pField->GetFieldType();
 }
 
 FX_BOOL	CPDFSDK_Widget::IsAppearanceValid()
@@ -632,59 +630,59 @@
 
 int CPDFSDK_Widget::GetFieldFlags() const
 {
-	CPDF_InterForm* pPDFInterForm = m_pInterForm->GetInterForm();
-	ASSERT(pPDFInterForm != NULL);
+    CPDF_InterForm* pPDFInterForm = m_pInterForm->GetInterForm();
+    ASSERT(pPDFInterForm != NULL);
 
-	CPDF_FormControl* pFormControl = pPDFInterForm->GetControlByDict(m_pAnnot->GetAnnotDict());
-	CPDF_FormField* pFormField = pFormControl->GetField();
-	return pFormField->GetFieldFlags();
+    CPDF_FormControl* pFormControl = pPDFInterForm->GetControlByDict(m_pAnnot->GetAnnotDict());
+    CPDF_FormField* pFormField = pFormControl->GetField();
+    return pFormField->GetFieldFlags();
 }
 
 CFX_ByteString CPDFSDK_Widget::GetSubType() const
 {
-	int nType = GetFieldType();
+    int nType = GetFieldType();
 
-	if (nType == FIELDTYPE_SIGNATURE)
-		return BFFT_SIGNATURE;
-	return CPDFSDK_Annot::GetSubType();
+    if (nType == FIELDTYPE_SIGNATURE)
+        return BFFT_SIGNATURE;
+    return CPDFSDK_Annot::GetSubType();
 }
 
-CPDF_FormField*	CPDFSDK_Widget::GetFormField() const
+CPDF_FormField* CPDFSDK_Widget::GetFormField() const
 {
-	ASSERT(m_pInterForm != NULL);
+    ASSERT(m_pInterForm != NULL);
 
-	CPDF_FormControl* pCtrl = GetFormControl();
-	ASSERT(pCtrl != NULL);
+    CPDF_FormControl* pCtrl = GetFormControl();
+    ASSERT(pCtrl != NULL);
 
-	return pCtrl->GetField();
+    return pCtrl->GetField();
 }
 
 CPDF_FormControl* CPDFSDK_Widget::GetFormControl() const
 {
-	ASSERT(m_pInterForm != NULL);
+    ASSERT(m_pInterForm != NULL);
 
-	CPDF_InterForm* pPDFInterForm = m_pInterForm->GetInterForm();
-	ASSERT(pPDFInterForm != NULL);
+    CPDF_InterForm* pPDFInterForm = m_pInterForm->GetInterForm();
+    ASSERT(pPDFInterForm != NULL);
 
-	return pPDFInterForm->GetControlByDict(GetAnnotDict());
+    return pPDFInterForm->GetControlByDict(GetAnnotDict());
 }
 
 CPDF_FormControl* CPDFSDK_Widget::GetFormControl(CPDF_InterForm* pInterForm, CPDF_Dictionary* pAnnotDict)
 {
-	ASSERT(pInterForm != NULL);
-	ASSERT(pAnnotDict != NULL);
+    ASSERT(pInterForm != NULL);
+    ASSERT(pAnnotDict != NULL);
 
-	CPDF_FormControl* pControl = pInterForm->GetControlByDict(pAnnotDict);
+    CPDF_FormControl* pControl = pInterForm->GetControlByDict(pAnnotDict);
 
-	return pControl;
+    return pControl;
 }
 
 int CPDFSDK_Widget::GetRotate() const
 {
-	CPDF_FormControl* pCtrl = GetFormControl();
-	ASSERT(pCtrl != NULL);
+    CPDF_FormControl* pCtrl = GetFormControl();
+    ASSERT(pCtrl != NULL);
 
-	return pCtrl->GetRotation() % 360;
+    return pCtrl->GetRotation() % 360;
 }
 
 CFX_WideString	CPDFSDK_Widget::GetName()
@@ -699,56 +697,56 @@
 
 FX_BOOL	CPDFSDK_Widget::GetFillColor(FX_COLORREF& color) const
 {
-	CPDF_FormControl* pFormCtrl = GetFormControl();
-	ASSERT(pFormCtrl != NULL);
+    CPDF_FormControl* pFormCtrl = GetFormControl();
+    ASSERT(pFormCtrl != NULL);
 
-	int iColorType = 0;
-	color = FX_ARGBTOCOLORREF(pFormCtrl->GetBackgroundColor(iColorType));
+    int iColorType = 0;
+    color = FX_ARGBTOCOLORREF(pFormCtrl->GetBackgroundColor(iColorType));
 
-	return iColorType != COLORTYPE_TRANSPARENT;
+    return iColorType != COLORTYPE_TRANSPARENT;
 }
 
-FX_BOOL	CPDFSDK_Widget::GetBorderColor(FX_COLORREF& color) const
+FX_BOOL CPDFSDK_Widget::GetBorderColor(FX_COLORREF& color) const
 {
-	CPDF_FormControl* pFormCtrl = GetFormControl();
-	ASSERT(pFormCtrl != NULL);
+    CPDF_FormControl* pFormCtrl = GetFormControl();
+    ASSERT(pFormCtrl != NULL);
 
-	int iColorType = 0;
-	color = FX_ARGBTOCOLORREF(pFormCtrl->GetBorderColor(iColorType));
+    int iColorType = 0;
+    color = FX_ARGBTOCOLORREF(pFormCtrl->GetBorderColor(iColorType));
 
-	return iColorType != COLORTYPE_TRANSPARENT;
+    return iColorType != COLORTYPE_TRANSPARENT;
 }
 
-FX_BOOL	CPDFSDK_Widget::GetTextColor(FX_COLORREF& color) const
+FX_BOOL CPDFSDK_Widget::GetTextColor(FX_COLORREF& color) const
 {
-	CPDF_FormControl* pFormCtrl = GetFormControl();
-	ASSERT(pFormCtrl != NULL);
+    CPDF_FormControl* pFormCtrl = GetFormControl();
+    ASSERT(pFormCtrl != NULL);
 
-	CPDF_DefaultAppearance da = pFormCtrl->GetDefaultAppearance();
-	if (da.HasColor())
-	{
-		FX_ARGB argb;
-		int iColorType = COLORTYPE_TRANSPARENT;
-		da.GetColor(argb, iColorType);
-		color = FX_ARGBTOCOLORREF(argb);
+    CPDF_DefaultAppearance da = pFormCtrl->GetDefaultAppearance();
+    if (da.HasColor())
+    {
+        FX_ARGB argb;
+        int iColorType = COLORTYPE_TRANSPARENT;
+        da.GetColor(argb, iColorType);
+        color = FX_ARGBTOCOLORREF(argb);
 
-		return iColorType != COLORTYPE_TRANSPARENT;
-	}
+        return iColorType != COLORTYPE_TRANSPARENT;
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
 FX_FLOAT CPDFSDK_Widget::GetFontSize() const
 {
-	CPDF_FormControl* pFormCtrl = GetFormControl();
-	ASSERT(pFormCtrl != NULL);
+    CPDF_FormControl* pFormCtrl = GetFormControl();
+    ASSERT(pFormCtrl != NULL);
 
-	CPDF_DefaultAppearance pDa = pFormCtrl->GetDefaultAppearance();
-	CFX_ByteString csFont = "";
-	FX_FLOAT fFontSize = 0.0f;
-	pDa.GetFont(csFont, fFontSize);
+    CPDF_DefaultAppearance pDa = pFormCtrl->GetDefaultAppearance();
+    CFX_ByteString csFont = "";
+    FX_FLOAT fFontSize = 0.0f;
+    pDa.GetFont(csFont, fFontSize);
 
-	return fFontSize;
+    return fFontSize;
 }
 
 int	CPDFSDK_Widget::GetSelectedIndex(int nIndex)
@@ -768,7 +766,7 @@
 	CPDF_FormField*	pFormField = GetFormField();
 	ASSERT(pFormField != NULL);
 
-	return pFormField->GetSelectedIndex(nIndex);
+    return pFormField->GetSelectedIndex(nIndex);
 }
 
 CFX_WideString CPDFSDK_Widget::GetValue(FX_BOOL bDisplay)
@@ -789,31 +787,31 @@
 	CPDF_FormField*	pFormField = GetFormField();
 	ASSERT(pFormField != NULL);
 
-	return pFormField->GetValue();
+    return pFormField->GetValue();
 }
 
 CFX_WideString CPDFSDK_Widget::GetDefaultValue() const
 {
-	CPDF_FormField*	pFormField = GetFormField();
-	ASSERT(pFormField != NULL);
+    CPDF_FormField* pFormField = GetFormField();
+    ASSERT(pFormField != NULL);
 
-	return pFormField->GetDefaultValue();
+    return pFormField->GetDefaultValue();
 }
 
 CFX_WideString CPDFSDK_Widget::GetOptionLabel(int nIndex) const
 {
-	CPDF_FormField*	pFormField = GetFormField();
-	ASSERT(pFormField != NULL);
+    CPDF_FormField* pFormField = GetFormField();
+    ASSERT(pFormField != NULL);
 
-	return pFormField->GetOptionLabel(nIndex);
+    return pFormField->GetOptionLabel(nIndex);
 }
 
-int	CPDFSDK_Widget::CountOptions() const
+int CPDFSDK_Widget::CountOptions() const
 {
-	CPDF_FormField*	pFormField = GetFormField();
-	ASSERT(pFormField != NULL);
+    CPDF_FormField* pFormField = GetFormField();
+    ASSERT(pFormField != NULL);
 
-	return pFormField->CountOptions();
+    return pFormField->CountOptions();
 }
 
 FX_BOOL	CPDFSDK_Widget::IsOptionSelected(int nIndex)
@@ -826,24 +824,20 @@
 			{
 				if (nIndex > -1 && nIndex < pWidgetAcc->CountChoiceListItems())
 					return pWidgetAcc->GetItemState(nIndex);
-				else
-					return FALSE;
+
+                return FALSE;
 			}
 		}
 	}
 
 	CPDF_FormField*	pFormField = GetFormField();
-	ASSERT(pFormField != NULL);
-
-	return pFormField->IsItemSelected(nIndex);
+    return pFormField->IsItemSelected(nIndex);
 }
 
-int	CPDFSDK_Widget::GetTopVisibleIndex() const
+int CPDFSDK_Widget::GetTopVisibleIndex() const
 {
-	CPDF_FormField*	pFormField = GetFormField();
-	ASSERT(pFormField != NULL);
-
-	return pFormField->GetTopVisibleIndex();
+    CPDF_FormField* pFormField = GetFormField();
+    return pFormField->GetTopVisibleIndex();
 }
 
 FX_BOOL	CPDFSDK_Widget::IsChecked()
@@ -863,32 +857,32 @@
 	CPDF_FormControl* pFormCtrl = GetFormControl();
 	ASSERT(pFormCtrl != NULL);
 
-	return pFormCtrl->IsChecked();
+    return pFormCtrl->IsChecked();
 }
 
-int	CPDFSDK_Widget::GetAlignment() const
+int CPDFSDK_Widget::GetAlignment() const
 {
-	CPDF_FormControl* pFormCtrl = GetFormControl();
-	ASSERT(pFormCtrl != NULL);
+    CPDF_FormControl* pFormCtrl = GetFormControl();
+    ASSERT(pFormCtrl != NULL);
 
-	return pFormCtrl->GetControlAlignment();
+    return pFormCtrl->GetControlAlignment();
 }
 
-int	CPDFSDK_Widget::GetMaxLen() const
+int CPDFSDK_Widget::GetMaxLen() const
 {
-	CPDF_FormField*	pFormField = GetFormField();
-	ASSERT(pFormField != NULL);
+    CPDF_FormField* pFormField = GetFormField();
+    ASSERT(pFormField != NULL);
 
-	return pFormField->GetMaxLen();
+    return pFormField->GetMaxLen();
 }
 
 void CPDFSDK_Widget::SetCheck(FX_BOOL bChecked, FX_BOOL bNotify)
 {
-	CPDF_FormControl* pFormCtrl = GetFormControl();
-	ASSERT(pFormCtrl != NULL);
+    CPDF_FormControl* pFormCtrl = GetFormControl();
+    ASSERT(pFormCtrl != NULL);
 
-	CPDF_FormField*	pFormField = pFormCtrl->GetField();
-	ASSERT(pFormField != NULL);
+    CPDF_FormField* pFormField = pFormCtrl->GetField();
+    ASSERT(pFormField != NULL);
 
 	pFormField->CheckControl(pFormField->GetControlIndex(pFormCtrl), bChecked, bNotify);
 	if (!IsWidgetAppearanceValid(CPDF_Annot::Normal))
@@ -899,8 +893,8 @@
 
 void CPDFSDK_Widget::SetValue(const CFX_WideString& sValue, FX_BOOL bNotify)
 {
-	CPDF_FormField*	pFormField = GetFormField();
-	ASSERT(pFormField != NULL);
+    CPDF_FormField* pFormField = GetFormField();
+    ASSERT(pFormField != NULL);
 
 	pFormField->SetValue(sValue, bNotify);
 
@@ -913,8 +907,8 @@
 }
 void CPDFSDK_Widget::SetOptionSelection(int index, FX_BOOL bSelected, FX_BOOL bNotify)
 {
-	CPDF_FormField* pFormField = GetFormField();
-	ASSERT(pFormField != NULL);
+    CPDF_FormField* pFormField = GetFormField();
+    ASSERT(pFormField != NULL);
 
 	pFormField->SetItemSelection(index, bSelected, bNotify);
 
@@ -924,8 +918,8 @@
 
 void CPDFSDK_Widget::ClearSelection(FX_BOOL bNotify)
 {
-	CPDF_FormField* pFormField = GetFormField();
-	ASSERT(pFormField != NULL);
+    CPDF_FormField* pFormField = GetFormField();
+    ASSERT(pFormField != NULL);
 
 	pFormField->ClearSelection(bNotify);
 
@@ -939,17 +933,17 @@
 
 void CPDFSDK_Widget::SetAppModified()
 {
-	m_bAppModified = TRUE;
+    m_bAppModified = TRUE;
 }
 
 void CPDFSDK_Widget::ClearAppModified()
 {
-	m_bAppModified = FALSE;
+    m_bAppModified = FALSE;
 }
 
 FX_BOOL CPDFSDK_Widget::IsAppModified() const
 {
-	return m_bAppModified;
+    return m_bAppModified;
 }
 
 void CPDFSDK_Widget::ResetAppearance(FX_BOOL bValueChanged)
@@ -975,40 +969,40 @@
 
 void CPDFSDK_Widget::ResetAppearance(const FX_WCHAR* sValue, FX_BOOL bValueChanged)
 {
-	SetAppModified();
+    SetAppModified();
 
-	m_nAppAge++;
-	if (m_nAppAge > 999999)
-		m_nAppAge = 0;
-	if (bValueChanged)
-		m_nValueAge++;
+    m_nAppAge++;
+    if (m_nAppAge > 999999)
+        m_nAppAge = 0;
+    if (bValueChanged)
+        m_nValueAge++;
 
-	int nFieldType = GetFieldType();
+    int nFieldType = GetFieldType();
 
-	switch (nFieldType)
-	{
-	case FIELDTYPE_PUSHBUTTON:
-		ResetAppearance_PushButton();
-		break;
-	case FIELDTYPE_CHECKBOX:
-		ResetAppearance_CheckBox();
-		break;
-	case FIELDTYPE_RADIOBUTTON:
-		ResetAppearance_RadioButton();
-		break;
-	case FIELDTYPE_COMBOBOX:
-		ResetAppearance_ComboBox(sValue);
-		break;
-	case FIELDTYPE_LISTBOX:
-		ResetAppearance_ListBox();
-		break;
-	case FIELDTYPE_TEXTFIELD:
-		ResetAppearance_TextField(sValue);
-		break;
-	}
+    switch (nFieldType)
+    {
+    case FIELDTYPE_PUSHBUTTON:
+        ResetAppearance_PushButton();
+        break;
+    case FIELDTYPE_CHECKBOX:
+        ResetAppearance_CheckBox();
+        break;
+    case FIELDTYPE_RADIOBUTTON:
+        ResetAppearance_RadioButton();
+        break;
+    case FIELDTYPE_COMBOBOX:
+        ResetAppearance_ComboBox(sValue);
+        break;
+    case FIELDTYPE_LISTBOX:
+        ResetAppearance_ListBox();
+        break;
+    case FIELDTYPE_TEXTFIELD:
+        ResetAppearance_TextField(sValue);
+        break;
+    }
 
-	ASSERT(m_pAnnot != NULL);
-	m_pAnnot->ClearCachedAP();
+    ASSERT(m_pAnnot != NULL);
+    m_pAnnot->ClearCachedAP();
 }
 
 CFX_WideString CPDFSDK_Widget::OnFormat(FX_BOOL& bFormated)
@@ -1020,32 +1014,32 @@
 
 void CPDFSDK_Widget::ResetFieldAppearance(FX_BOOL bValueChanged)
 {
-	CPDF_FormField* pFormField = GetFormField();
-	ASSERT(pFormField != NULL);
+    CPDF_FormField* pFormField = GetFormField();
+    ASSERT(pFormField != NULL);
 
-	ASSERT(m_pInterForm != NULL);
+    ASSERT(m_pInterForm != NULL);
 
-	m_pInterForm->ResetFieldAppearance(pFormField, NULL, bValueChanged);
+    m_pInterForm->ResetFieldAppearance(pFormField, NULL, bValueChanged);
 }
 
-void	CPDFSDK_Widget::DrawAppearance(CFX_RenderDevice* pDevice, const CPDF_Matrix* pUser2Device,
-		CPDF_Annot::AppearanceMode mode, const CPDF_RenderOptions* pOptions)
+void    CPDFSDK_Widget::DrawAppearance(CFX_RenderDevice* pDevice, const CPDF_Matrix* pUser2Device,
+        CPDF_Annot::AppearanceMode mode, const CPDF_RenderOptions* pOptions)
 {
-	int nFieldType = GetFieldType();
+    int nFieldType = GetFieldType();
 
-	if ((nFieldType == FIELDTYPE_CHECKBOX || nFieldType == FIELDTYPE_RADIOBUTTON) &&
-		mode == CPDF_Annot::Normal &&
-		!IsWidgetAppearanceValid(CPDF_Annot::Normal))
-	{
-		CFX_PathData pathData;
+    if ((nFieldType == FIELDTYPE_CHECKBOX || nFieldType == FIELDTYPE_RADIOBUTTON) &&
+        mode == CPDF_Annot::Normal &&
+        !IsWidgetAppearanceValid(CPDF_Annot::Normal))
+    {
+        CFX_PathData pathData;
 
-		CPDF_Rect rcAnnot = GetRect();
+        CPDF_Rect rcAnnot = GetRect();
 
-		pathData.AppendRect(rcAnnot.left, rcAnnot.bottom,
-			rcAnnot.right, rcAnnot.top);
+        pathData.AppendRect(rcAnnot.left, rcAnnot.bottom,
+            rcAnnot.right, rcAnnot.top);
 
-		CFX_GraphStateData gsd;
-		gsd.m_LineWidth = 0.0f;
+        CFX_GraphStateData gsd;
+        gsd.m_LineWidth = 0.0f;
 
 		pDevice->DrawPath(&pathData, pUser2Device, &gsd, 0, 0xFFAAAAAA, FXFILL_ALTERNATE);
 	}
@@ -1057,760 +1051,760 @@
 
 void CPDFSDK_Widget::UpdateField()
 {
-	CPDF_FormField* pFormField = GetFormField();
-	ASSERT(pFormField != NULL);
+    CPDF_FormField* pFormField = GetFormField();
+    ASSERT(pFormField != NULL);
 
-	ASSERT(m_pInterForm != NULL);
-	m_pInterForm->UpdateField(pFormField);
+    ASSERT(m_pInterForm != NULL);
+    m_pInterForm->UpdateField(pFormField);
 }
 
 void CPDFSDK_Widget::DrawShadow(CFX_RenderDevice* pDevice, CPDFSDK_PageView* pPageView)
 {
- 	ASSERT(m_pInterForm != NULL);
+    ASSERT(m_pInterForm != NULL);
 
-	int nFieldType = GetFieldType();
- 	if (m_pInterForm->IsNeedHighLight(nFieldType))
- 	{
+    int nFieldType = GetFieldType();
+    if (m_pInterForm->IsNeedHighLight(nFieldType))
+    {
 
-//  		if (nFieldType != FIELDTYPE_PUSHBUTTON)
-//  		{
-			CPDF_Rect rc  = GetRect();
-			FX_COLORREF color = m_pInterForm->GetHighlightColor(nFieldType);
-			uint8_t alpha = m_pInterForm->GetHighlightAlpha();
+//          if (nFieldType != FIELDTYPE_PUSHBUTTON)
+//          {
+            CPDF_Rect rc  = GetRect();
+            FX_COLORREF color = m_pInterForm->GetHighlightColor(nFieldType);
+            uint8_t alpha = m_pInterForm->GetHighlightAlpha();
 
-			CFX_FloatRect rcDevice;
-			ASSERT(m_pInterForm->GetDocument());
-			CPDFDoc_Environment* pEnv = m_pInterForm->GetDocument()->GetEnv();
-			if(!pEnv)
-				return;
-			CFX_AffineMatrix page2device;
-			pPageView->GetCurrentMatrix(page2device);
-			page2device.Transform(((FX_FLOAT)rc.left), ((FX_FLOAT)rc.bottom), rcDevice.left, rcDevice.bottom);
-// 			pEnv->FFI_PageToDevice(m_pPageView->GetPDFPage(), rc.left, rc.bottom, &rcDevice.left, &rcDevice.bottom);
-// 			pEnv->FFI_PageToDevice(m_pPageView->GetPDFPage(), rc.right, rc.top, &rcDevice.right, &rcDevice.top);
-			page2device.Transform(((FX_FLOAT)rc.right), ((FX_FLOAT)rc.top), rcDevice.right, rcDevice.top);
+            CFX_FloatRect rcDevice;
+            ASSERT(m_pInterForm->GetDocument());
+            CPDFDoc_Environment* pEnv = m_pInterForm->GetDocument()->GetEnv();
+            if(!pEnv)
+                return;
+            CFX_AffineMatrix page2device;
+            pPageView->GetCurrentMatrix(page2device);
+            page2device.Transform(((FX_FLOAT)rc.left), ((FX_FLOAT)rc.bottom), rcDevice.left, rcDevice.bottom);
+//          pEnv->FFI_PageToDevice(m_pPageView->GetPDFPage(), rc.left, rc.bottom, &rcDevice.left, &rcDevice.bottom);
+//          pEnv->FFI_PageToDevice(m_pPageView->GetPDFPage(), rc.right, rc.top, &rcDevice.right, &rcDevice.top);
+            page2device.Transform(((FX_FLOAT)rc.right), ((FX_FLOAT)rc.top), rcDevice.right, rcDevice.top);
 
-			rcDevice.Normalize();
+            rcDevice.Normalize();
 
-			FX_ARGB argb = ArgbEncode((int)alpha, color);
-			FX_RECT rcDev((int)rcDevice.left,(int)rcDevice.top,(int)rcDevice.right,(int)rcDevice.bottom);
-			pDevice->FillRect(&rcDev, argb);
-			/* 		}*/
-	}
+            FX_ARGB argb = ArgbEncode((int)alpha, color);
+            FX_RECT rcDev((int)rcDevice.left,(int)rcDevice.top,(int)rcDevice.right,(int)rcDevice.bottom);
+            pDevice->FillRect(&rcDev, argb);
+            /*      }*/
+    }
 }
 
 void CPDFSDK_Widget::ResetAppearance_PushButton()
 {
-	CPDF_FormControl* pControl = GetFormControl();
-	ASSERT(pControl != NULL);
+    CPDF_FormControl* pControl = GetFormControl();
+    ASSERT(pControl != NULL);
 
 
 
-	CPDF_Rect rcWindow = GetRotatedRect();
+    CPDF_Rect rcWindow = GetRotatedRect();
 
-	int32_t nLayout = 0;
+    int32_t nLayout = 0;
 
-	switch (pControl->GetTextPosition())
-	{
-	case TEXTPOS_ICON:
-		nLayout = PPBL_ICON;
-		break;
-	case TEXTPOS_BELOW:
-		nLayout = PPBL_ICONTOPLABELBOTTOM;
-		break;
-	case TEXTPOS_ABOVE:
-		nLayout = PPBL_LABELTOPICONBOTTOM;
-		break;
-	case TEXTPOS_RIGHT:
-		nLayout = PPBL_ICONLEFTLABELRIGHT;
-		break;
-	case TEXTPOS_LEFT:
-		nLayout = PPBL_LABELLEFTICONRIGHT;
-		break;
-	case TEXTPOS_OVERLAID:
-		nLayout = PPBL_LABELOVERICON;
-		break;
-	default:
-		nLayout = PPBL_LABEL;
-		break;
-	}
+    switch (pControl->GetTextPosition())
+    {
+    case TEXTPOS_ICON:
+        nLayout = PPBL_ICON;
+        break;
+    case TEXTPOS_BELOW:
+        nLayout = PPBL_ICONTOPLABELBOTTOM;
+        break;
+    case TEXTPOS_ABOVE:
+        nLayout = PPBL_LABELTOPICONBOTTOM;
+        break;
+    case TEXTPOS_RIGHT:
+        nLayout = PPBL_ICONLEFTLABELRIGHT;
+        break;
+    case TEXTPOS_LEFT:
+        nLayout = PPBL_LABELLEFTICONRIGHT;
+        break;
+    case TEXTPOS_OVERLAID:
+        nLayout = PPBL_LABELOVERICON;
+        break;
+    default:
+        nLayout = PPBL_LABEL;
+        break;
+    }
 
-	CPWL_Color crBackground, crBorder;
+    CPWL_Color crBackground, crBorder;
 
-	int iColorType;
-	FX_FLOAT fc[4];
+    int iColorType;
+    FX_FLOAT fc[4];
 
-	pControl->GetOriginalBackgroundColor(iColorType, fc);
-	if (iColorType > 0)
-		crBackground = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
+    pControl->GetOriginalBackgroundColor(iColorType, fc);
+    if (iColorType > 0)
+        crBackground = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
 
-	pControl->GetOriginalBorderColor(iColorType, fc);
-	if (iColorType > 0)
-		crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
+    pControl->GetOriginalBorderColor(iColorType, fc);
+    if (iColorType > 0)
+        crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
 
-	FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth();
-	int32_t nBorderStyle = 0;
-	CPWL_Dash dsBorder(3,0,0);
-	CPWL_Color crLeftTop,crRightBottom;
+    FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth();
+    int32_t nBorderStyle = 0;
+    CPWL_Dash dsBorder(3,0,0);
+    CPWL_Color crLeftTop,crRightBottom;
 
-	switch (GetBorderStyle())
-	{
-	case BBS_DASH:
-		nBorderStyle = PBS_DASH;
-		dsBorder = CPWL_Dash(3, 3, 0);
-		break;
-	case BBS_BEVELED:
-		nBorderStyle = PBS_BEVELED;
-		fBorderWidth *= 2;
-		crLeftTop = CPWL_Color(COLORTYPE_GRAY,1);
-		crRightBottom = CPWL_Utils::DevideColor(crBackground,2);
-		break;
-	case BBS_INSET:
-		nBorderStyle = PBS_INSET;
-		fBorderWidth *= 2;
-		crLeftTop = CPWL_Color(COLORTYPE_GRAY,0.5);
-		crRightBottom = CPWL_Color(COLORTYPE_GRAY,0.75);
-		break;
-	case BBS_UNDERLINE:
-		nBorderStyle = PBS_UNDERLINED;
-		break;
-	default:
-		nBorderStyle = PBS_SOLID;
-		break;
-	}
+    switch (GetBorderStyle())
+    {
+    case BBS_DASH:
+        nBorderStyle = PBS_DASH;
+        dsBorder = CPWL_Dash(3, 3, 0);
+        break;
+    case BBS_BEVELED:
+        nBorderStyle = PBS_BEVELED;
+        fBorderWidth *= 2;
+        crLeftTop = CPWL_Color(COLORTYPE_GRAY,1);
+        crRightBottom = CPWL_Utils::DevideColor(crBackground,2);
+        break;
+    case BBS_INSET:
+        nBorderStyle = PBS_INSET;
+        fBorderWidth *= 2;
+        crLeftTop = CPWL_Color(COLORTYPE_GRAY,0.5);
+        crRightBottom = CPWL_Color(COLORTYPE_GRAY,0.75);
+        break;
+    case BBS_UNDERLINE:
+        nBorderStyle = PBS_UNDERLINED;
+        break;
+    default:
+        nBorderStyle = PBS_SOLID;
+        break;
+    }
 
-	CPDF_Rect rcClient = CPWL_Utils::DeflateRect(rcWindow,fBorderWidth);
+    CPDF_Rect rcClient = CPWL_Utils::DeflateRect(rcWindow,fBorderWidth);
 
-	CPWL_Color crText(COLORTYPE_GRAY,0);
+    CPWL_Color crText(COLORTYPE_GRAY,0);
 
-	FX_FLOAT fFontSize = 12.0f;
-	CFX_ByteString csNameTag;
+    FX_FLOAT fFontSize = 12.0f;
+    CFX_ByteString csNameTag;
 
-	CPDF_DefaultAppearance da = pControl->GetDefaultAppearance();
-	if (da.HasColor())
-	{
-		da.GetColor(iColorType, fc);
-		crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
-	}
+    CPDF_DefaultAppearance da = pControl->GetDefaultAppearance();
+    if (da.HasColor())
+    {
+        da.GetColor(iColorType, fc);
+        crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
+    }
 
-	if (da.HasFont())
-		da.GetFont(csNameTag, fFontSize);
+    if (da.HasFont())
+        da.GetFont(csNameTag, fFontSize);
 
-	CFX_WideString csWCaption;
-	CFX_WideString csNormalCaption, csRolloverCaption, csDownCaption;
+    CFX_WideString csWCaption;
+    CFX_WideString csNormalCaption, csRolloverCaption, csDownCaption;
 
-	if (pControl->HasMKEntry("CA"))
-	{
-		csNormalCaption = pControl->GetNormalCaption();
-	}
-	if (pControl->HasMKEntry("RC"))
-	{
-		csRolloverCaption = pControl->GetRolloverCaption();
-	}
-	if (pControl->HasMKEntry("AC"))
-	{
-		csDownCaption = pControl->GetDownCaption();
-	}
+    if (pControl->HasMKEntry("CA"))
+    {
+        csNormalCaption = pControl->GetNormalCaption();
+    }
+    if (pControl->HasMKEntry("RC"))
+    {
+        csRolloverCaption = pControl->GetRolloverCaption();
+    }
+    if (pControl->HasMKEntry("AC"))
+    {
+        csDownCaption = pControl->GetDownCaption();
+    }
 
-	CPDF_Stream* pNormalIcon = NULL;
-	CPDF_Stream* pRolloverIcon = NULL;
-	CPDF_Stream* pDownIcon = NULL;
+    CPDF_Stream* pNormalIcon = NULL;
+    CPDF_Stream* pRolloverIcon = NULL;
+    CPDF_Stream* pDownIcon = NULL;
 
-	if (pControl->HasMKEntry("I"))
-	{
-		pNormalIcon = pControl->GetNormalIcon();
-	}
-	if (pControl->HasMKEntry("RI"))
-	{
-		pRolloverIcon = pControl->GetRolloverIcon();
-	}
-	if (pControl->HasMKEntry("IX"))
-	{
-		pDownIcon = pControl->GetDownIcon();
-	}
+    if (pControl->HasMKEntry("I"))
+    {
+        pNormalIcon = pControl->GetNormalIcon();
+    }
+    if (pControl->HasMKEntry("RI"))
+    {
+        pRolloverIcon = pControl->GetRolloverIcon();
+    }
+    if (pControl->HasMKEntry("IX"))
+    {
+        pDownIcon = pControl->GetDownIcon();
+    }
 
-	if (pNormalIcon)
-	{
-		if (CPDF_Dictionary* pImageDict = pNormalIcon->GetDict())
-		{
-			if (pImageDict->GetString("Name").IsEmpty())
-				pImageDict->SetAtString("Name", "ImgA");
-		}
-	}
+    if (pNormalIcon)
+    {
+        if (CPDF_Dictionary* pImageDict = pNormalIcon->GetDict())
+        {
+            if (pImageDict->GetString("Name").IsEmpty())
+                pImageDict->SetAtString("Name", "ImgA");
+        }
+    }
 
-	if (pRolloverIcon)
-	{
-		if (CPDF_Dictionary* pImageDict = pRolloverIcon->GetDict())
-		{
-			if (pImageDict->GetString("Name").IsEmpty())
-				pImageDict->SetAtString("Name", "ImgB");
-		}
-	}
+    if (pRolloverIcon)
+    {
+        if (CPDF_Dictionary* pImageDict = pRolloverIcon->GetDict())
+        {
+            if (pImageDict->GetString("Name").IsEmpty())
+                pImageDict->SetAtString("Name", "ImgB");
+        }
+    }
 
-	if (pDownIcon)
-	{
-		if (CPDF_Dictionary* pImageDict = pDownIcon->GetDict())
-		{
-			if (pImageDict->GetString("Name").IsEmpty())
-				pImageDict->SetAtString("Name", "ImgC");
-		}
-	}
+    if (pDownIcon)
+    {
+        if (CPDF_Dictionary* pImageDict = pDownIcon->GetDict())
+        {
+            if (pImageDict->GetString("Name").IsEmpty())
+                pImageDict->SetAtString("Name", "ImgC");
+        }
+    }
 
-	CPDF_IconFit iconFit = pControl->GetIconFit();
+    CPDF_IconFit iconFit = pControl->GetIconFit();
 
-	CPDFSDK_Document* pDoc = m_pInterForm->GetDocument();
-	ASSERT(pDoc != NULL);
-	CPDFDoc_Environment* pEnv = pDoc->GetEnv();
+    CPDFSDK_Document* pDoc = m_pInterForm->GetDocument();
+    ASSERT(pDoc != NULL);
+    CPDFDoc_Environment* pEnv = pDoc->GetEnv();
 
- 	CBA_FontMap FontMap(this,pEnv->GetSysHandler());//, ISystemHandle::GetSystemHandler(m_pBaseForm->GetEnv()));
-	FontMap.Initial();
+    CBA_FontMap FontMap(this,pEnv->GetSysHandler());//, ISystemHandle::GetSystemHandler(m_pBaseForm->GetEnv()));
+    FontMap.Initial();
 
-	FontMap.SetAPType("N");
+    FontMap.SetAPType("N");
 
-	CFX_ByteString csAP = CPWL_Utils::GetRectFillAppStream(rcWindow, crBackground) +
-		CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, crLeftTop, crRightBottom, nBorderStyle, dsBorder) +
-		CPWL_Utils::GetPushButtonAppStream(iconFit.GetFittingBounds() ? rcWindow : rcClient, &FontMap, pNormalIcon, iconFit, csNormalCaption, crText, fFontSize, nLayout);
+    CFX_ByteString csAP = CPWL_Utils::GetRectFillAppStream(rcWindow, crBackground) +
+        CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, crLeftTop, crRightBottom, nBorderStyle, dsBorder) +
+        CPWL_Utils::GetPushButtonAppStream(iconFit.GetFittingBounds() ? rcWindow : rcClient, &FontMap, pNormalIcon, iconFit, csNormalCaption, crText, fFontSize, nLayout);
 
-	WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP);
-	if (pNormalIcon)
-		AddImageToAppearance("N", pNormalIcon);
+    WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP);
+    if (pNormalIcon)
+        AddImageToAppearance("N", pNormalIcon);
 
-	CPDF_FormControl::HighlightingMode eHLM = pControl->GetHighlightingMode();
-	if (eHLM == CPDF_FormControl::Push || eHLM == CPDF_FormControl::Toggle)
-	{
-		if (csRolloverCaption.IsEmpty() && !pRolloverIcon)
-		{
-			csRolloverCaption = csNormalCaption;
-			pRolloverIcon = pNormalIcon;
-		}
+    CPDF_FormControl::HighlightingMode eHLM = pControl->GetHighlightingMode();
+    if (eHLM == CPDF_FormControl::Push || eHLM == CPDF_FormControl::Toggle)
+    {
+        if (csRolloverCaption.IsEmpty() && !pRolloverIcon)
+        {
+            csRolloverCaption = csNormalCaption;
+            pRolloverIcon = pNormalIcon;
+        }
 
-		FontMap.SetAPType("R");
+        FontMap.SetAPType("R");
 
-		csAP = CPWL_Utils::GetRectFillAppStream(rcWindow, crBackground) +
-				CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, crLeftTop, crRightBottom, nBorderStyle, dsBorder) +
-				CPWL_Utils::GetPushButtonAppStream(iconFit.GetFittingBounds() ? rcWindow : rcClient, &FontMap, pRolloverIcon, iconFit, csRolloverCaption, crText, fFontSize, nLayout);
+        csAP = CPWL_Utils::GetRectFillAppStream(rcWindow, crBackground) +
+                CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, crLeftTop, crRightBottom, nBorderStyle, dsBorder) +
+                CPWL_Utils::GetPushButtonAppStream(iconFit.GetFittingBounds() ? rcWindow : rcClient, &FontMap, pRolloverIcon, iconFit, csRolloverCaption, crText, fFontSize, nLayout);
 
-		WriteAppearance("R", GetRotatedRect(), GetMatrix(), csAP);
-		if (pRolloverIcon)
-			AddImageToAppearance("R", pRolloverIcon);
+        WriteAppearance("R", GetRotatedRect(), GetMatrix(), csAP);
+        if (pRolloverIcon)
+            AddImageToAppearance("R", pRolloverIcon);
 
-		if (csDownCaption.IsEmpty() && !pDownIcon)
-		{
-			csDownCaption = csNormalCaption;
-			pDownIcon = pNormalIcon;
-		}
+        if (csDownCaption.IsEmpty() && !pDownIcon)
+        {
+            csDownCaption = csNormalCaption;
+            pDownIcon = pNormalIcon;
+        }
 
-		switch (nBorderStyle)
-		{
-		case PBS_BEVELED:
-			{
-				CPWL_Color crTemp = crLeftTop;
-				crLeftTop = crRightBottom;
-				crRightBottom = crTemp;
-			}
-			break;
-		case PBS_INSET:
-			crLeftTop = CPWL_Color(COLORTYPE_GRAY,0);
-			crRightBottom = CPWL_Color(COLORTYPE_GRAY,1);
-			break;
-		}
+        switch (nBorderStyle)
+        {
+        case PBS_BEVELED:
+            {
+                CPWL_Color crTemp = crLeftTop;
+                crLeftTop = crRightBottom;
+                crRightBottom = crTemp;
+            }
+            break;
+        case PBS_INSET:
+            crLeftTop = CPWL_Color(COLORTYPE_GRAY,0);
+            crRightBottom = CPWL_Color(COLORTYPE_GRAY,1);
+            break;
+        }
 
-		FontMap.SetAPType("D");
+        FontMap.SetAPType("D");
 
-		csAP = CPWL_Utils::GetRectFillAppStream(rcWindow, CPWL_Utils::SubstractColor(crBackground,0.25f)) +
-			CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, crLeftTop, crRightBottom, nBorderStyle, dsBorder) +
-			CPWL_Utils::GetPushButtonAppStream(iconFit.GetFittingBounds() ? rcWindow : rcClient, &FontMap, pDownIcon, iconFit, csDownCaption, crText, fFontSize, nLayout);
+        csAP = CPWL_Utils::GetRectFillAppStream(rcWindow, CPWL_Utils::SubstractColor(crBackground,0.25f)) +
+            CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, crLeftTop, crRightBottom, nBorderStyle, dsBorder) +
+            CPWL_Utils::GetPushButtonAppStream(iconFit.GetFittingBounds() ? rcWindow : rcClient, &FontMap, pDownIcon, iconFit, csDownCaption, crText, fFontSize, nLayout);
 
-		WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP);
-		if (pDownIcon)
-			AddImageToAppearance("D", pDownIcon);
-	}
-	else
-	{
-		RemoveAppearance("D");
-		RemoveAppearance("R");
-	}
+        WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP);
+        if (pDownIcon)
+            AddImageToAppearance("D", pDownIcon);
+    }
+    else
+    {
+        RemoveAppearance("D");
+        RemoveAppearance("R");
+    }
 }
 
 void CPDFSDK_Widget::ResetAppearance_CheckBox()
 {
-	CPDF_FormControl* pControl = GetFormControl();
-	ASSERT(pControl != NULL);
+    CPDF_FormControl* pControl = GetFormControl();
+    ASSERT(pControl != NULL);
 
 
 
-	CPWL_Color crBackground, crBorder, crText;
+    CPWL_Color crBackground, crBorder, crText;
 
-	int iColorType;
-	FX_FLOAT fc[4];
+    int iColorType;
+    FX_FLOAT fc[4];
 
-	pControl->GetOriginalBackgroundColor(iColorType, fc);
-	if (iColorType > 0)
-		crBackground = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
+    pControl->GetOriginalBackgroundColor(iColorType, fc);
+    if (iColorType > 0)
+        crBackground = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
 
-	pControl->GetOriginalBorderColor(iColorType, fc);
-	if (iColorType > 0)
-		crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
+    pControl->GetOriginalBorderColor(iColorType, fc);
+    if (iColorType > 0)
+        crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
 
-	FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth();
-	int32_t nBorderStyle = 0;
-	CPWL_Dash dsBorder(3,0,0);
-	CPWL_Color crLeftTop,crRightBottom;
+    FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth();
+    int32_t nBorderStyle = 0;
+    CPWL_Dash dsBorder(3,0,0);
+    CPWL_Color crLeftTop,crRightBottom;
 
-	switch (GetBorderStyle())
-	{
-	case BBS_DASH:
-		nBorderStyle = PBS_DASH;
-		dsBorder = CPWL_Dash(3, 3, 0);
-		break;
-	case BBS_BEVELED:
-		nBorderStyle = PBS_BEVELED;
-		fBorderWidth *= 2;
-		crLeftTop = CPWL_Color(COLORTYPE_GRAY,1);
-		crRightBottom = CPWL_Utils::DevideColor(crBackground,2);
-		break;
-	case BBS_INSET:
-		nBorderStyle = PBS_INSET;
-		fBorderWidth *= 2;
-		crLeftTop = CPWL_Color(COLORTYPE_GRAY,0.5);
-		crRightBottom = CPWL_Color(COLORTYPE_GRAY,0.75);
-		break;
-	case BBS_UNDERLINE:
-		nBorderStyle = PBS_UNDERLINED;
-		break;
-	default:
-		nBorderStyle = PBS_SOLID;
-		break;
-	}
+    switch (GetBorderStyle())
+    {
+    case BBS_DASH:
+        nBorderStyle = PBS_DASH;
+        dsBorder = CPWL_Dash(3, 3, 0);
+        break;
+    case BBS_BEVELED:
+        nBorderStyle = PBS_BEVELED;
+        fBorderWidth *= 2;
+        crLeftTop = CPWL_Color(COLORTYPE_GRAY,1);
+        crRightBottom = CPWL_Utils::DevideColor(crBackground,2);
+        break;
+    case BBS_INSET:
+        nBorderStyle = PBS_INSET;
+        fBorderWidth *= 2;
+        crLeftTop = CPWL_Color(COLORTYPE_GRAY,0.5);
+        crRightBottom = CPWL_Color(COLORTYPE_GRAY,0.75);
+        break;
+    case BBS_UNDERLINE:
+        nBorderStyle = PBS_UNDERLINED;
+        break;
+    default:
+        nBorderStyle = PBS_SOLID;
+        break;
+    }
 
-	CPDF_Rect rcWindow = GetRotatedRect();
-	CPDF_Rect rcClient = CPWL_Utils::DeflateRect(rcWindow,fBorderWidth);
+    CPDF_Rect rcWindow = GetRotatedRect();
+    CPDF_Rect rcClient = CPWL_Utils::DeflateRect(rcWindow,fBorderWidth);
 
-	CPDF_DefaultAppearance da = pControl->GetDefaultAppearance();
-	if (da.HasColor())
-	{
-		da.GetColor(iColorType, fc);
-		crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
-	}
+    CPDF_DefaultAppearance da = pControl->GetDefaultAppearance();
+    if (da.HasColor())
+    {
+        da.GetColor(iColorType, fc);
+        crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
+    }
 
-	int32_t nStyle = 0;
+    int32_t nStyle = 0;
 
-	CFX_WideString csWCaption = pControl->GetNormalCaption();
-	if (csWCaption.GetLength() > 0)
-	{
-		switch (csWCaption[0])
-		{
-		case L'l':
-			nStyle = PCS_CIRCLE;
-			break;
-		case L'8':
-			nStyle = PCS_CROSS;
-			break;
-		case L'u':
-			nStyle = PCS_DIAMOND;
-			break;
-		case L'n':
-			nStyle = PCS_SQUARE;
-			break;
-		case L'H':
-			nStyle = PCS_STAR;
-			break;
-		default: //L'4'
-			nStyle = PCS_CHECK;
-			break;
-		}
-	}
-	else
-	{
-		nStyle = PCS_CHECK;
-	}
+    CFX_WideString csWCaption = pControl->GetNormalCaption();
+    if (csWCaption.GetLength() > 0)
+    {
+        switch (csWCaption[0])
+        {
+        case L'l':
+            nStyle = PCS_CIRCLE;
+            break;
+        case L'8':
+            nStyle = PCS_CROSS;
+            break;
+        case L'u':
+            nStyle = PCS_DIAMOND;
+            break;
+        case L'n':
+            nStyle = PCS_SQUARE;
+            break;
+        case L'H':
+            nStyle = PCS_STAR;
+            break;
+        default: //L'4'
+            nStyle = PCS_CHECK;
+            break;
+        }
+    }
+    else
+    {
+        nStyle = PCS_CHECK;
+    }
 
-	CFX_ByteString csAP_N_ON = CPWL_Utils::GetRectFillAppStream(rcWindow,crBackground) +
-		CPWL_Utils::GetBorderAppStream(rcWindow,fBorderWidth,crBorder,crLeftTop,crRightBottom,nBorderStyle,dsBorder);
+    CFX_ByteString csAP_N_ON = CPWL_Utils::GetRectFillAppStream(rcWindow,crBackground) +
+        CPWL_Utils::GetBorderAppStream(rcWindow,fBorderWidth,crBorder,crLeftTop,crRightBottom,nBorderStyle,dsBorder);
 
-	CFX_ByteString csAP_N_OFF = csAP_N_ON;
+    CFX_ByteString csAP_N_OFF = csAP_N_ON;
 
-	switch (nBorderStyle)
-	{
-	case PBS_BEVELED:
-		{
-			CPWL_Color crTemp = crLeftTop;
-			crLeftTop = crRightBottom;
-			crRightBottom = crTemp;
-		}
-		break;
-	case PBS_INSET:
-		crLeftTop = CPWL_Color(COLORTYPE_GRAY,0);
-		crRightBottom = CPWL_Color(COLORTYPE_GRAY,1);
-		break;
-	}
+    switch (nBorderStyle)
+    {
+    case PBS_BEVELED:
+        {
+            CPWL_Color crTemp = crLeftTop;
+            crLeftTop = crRightBottom;
+            crRightBottom = crTemp;
+        }
+        break;
+    case PBS_INSET:
+        crLeftTop = CPWL_Color(COLORTYPE_GRAY,0);
+        crRightBottom = CPWL_Color(COLORTYPE_GRAY,1);
+        break;
+    }
 
-	CFX_ByteString csAP_D_ON = CPWL_Utils::GetRectFillAppStream(rcWindow,CPWL_Utils::SubstractColor(crBackground,0.25f)) +
-		CPWL_Utils::GetBorderAppStream(rcWindow,fBorderWidth,crBorder,crLeftTop,crRightBottom,nBorderStyle,dsBorder);
+    CFX_ByteString csAP_D_ON = CPWL_Utils::GetRectFillAppStream(rcWindow,CPWL_Utils::SubstractColor(crBackground,0.25f)) +
+        CPWL_Utils::GetBorderAppStream(rcWindow,fBorderWidth,crBorder,crLeftTop,crRightBottom,nBorderStyle,dsBorder);
 
-	CFX_ByteString csAP_D_OFF = csAP_D_ON;
+    CFX_ByteString csAP_D_OFF = csAP_D_ON;
 
-	csAP_N_ON += CPWL_Utils::GetCheckBoxAppStream(rcClient,nStyle,crText);
-	csAP_D_ON += CPWL_Utils::GetCheckBoxAppStream(rcClient,nStyle,crText);
+    csAP_N_ON += CPWL_Utils::GetCheckBoxAppStream(rcClient,nStyle,crText);
+    csAP_D_ON += CPWL_Utils::GetCheckBoxAppStream(rcClient,nStyle,crText);
 
-	WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_ON, pControl->GetCheckedAPState());
-	WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_OFF, "Off");
+    WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_ON, pControl->GetCheckedAPState());
+    WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_OFF, "Off");
 
-	WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_ON, pControl->GetCheckedAPState());
-	WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_OFF, "Off");
+    WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_ON, pControl->GetCheckedAPState());
+    WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_OFF, "Off");
 
-	CFX_ByteString csAS = GetAppState();
-	if (csAS.IsEmpty())
-		SetAppState("Off");
+    CFX_ByteString csAS = GetAppState();
+    if (csAS.IsEmpty())
+        SetAppState("Off");
 }
 
 void CPDFSDK_Widget::ResetAppearance_RadioButton()
 {
-	CPDF_FormControl* pControl = GetFormControl();
-	ASSERT(pControl != NULL);
+    CPDF_FormControl* pControl = GetFormControl();
+    ASSERT(pControl != NULL);
 
 
 
-	CPWL_Color crBackground, crBorder, crText;
+    CPWL_Color crBackground, crBorder, crText;
 
-	int iColorType;
-	FX_FLOAT fc[4];
+    int iColorType;
+    FX_FLOAT fc[4];
 
-	pControl->GetOriginalBackgroundColor(iColorType, fc);
-	if (iColorType > 0)
-		crBackground = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
+    pControl->GetOriginalBackgroundColor(iColorType, fc);
+    if (iColorType > 0)
+        crBackground = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
 
-	pControl->GetOriginalBorderColor(iColorType, fc);
-	if (iColorType > 0)
-		crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
+    pControl->GetOriginalBorderColor(iColorType, fc);
+    if (iColorType > 0)
+        crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
 
-	FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth();
-	int32_t nBorderStyle = 0;
-	CPWL_Dash dsBorder(3,0,0);
-	CPWL_Color crLeftTop,crRightBottom;
+    FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth();
+    int32_t nBorderStyle = 0;
+    CPWL_Dash dsBorder(3,0,0);
+    CPWL_Color crLeftTop,crRightBottom;
 
-	switch (GetBorderStyle())
-	{
-	case BBS_DASH:
-		nBorderStyle = PBS_DASH;
-		dsBorder = CPWL_Dash(3, 3, 0);
-		break;
-	case BBS_BEVELED:
-		nBorderStyle = PBS_BEVELED;
-		fBorderWidth *= 2;
-		crLeftTop = CPWL_Color(COLORTYPE_GRAY,1);
-		crRightBottom = CPWL_Utils::DevideColor(crBackground,2);
-		break;
-	case BBS_INSET:
-		nBorderStyle = PBS_INSET;
-		fBorderWidth *= 2;
-		crLeftTop = CPWL_Color(COLORTYPE_GRAY,0.5);
-		crRightBottom = CPWL_Color(COLORTYPE_GRAY,0.75);
-		break;
-	case BBS_UNDERLINE:
-		nBorderStyle = PBS_UNDERLINED;
-		break;
-	default:
-		nBorderStyle = PBS_SOLID;
-		break;
-	}
+    switch (GetBorderStyle())
+    {
+    case BBS_DASH:
+        nBorderStyle = PBS_DASH;
+        dsBorder = CPWL_Dash(3, 3, 0);
+        break;
+    case BBS_BEVELED:
+        nBorderStyle = PBS_BEVELED;
+        fBorderWidth *= 2;
+        crLeftTop = CPWL_Color(COLORTYPE_GRAY,1);
+        crRightBottom = CPWL_Utils::DevideColor(crBackground,2);
+        break;
+    case BBS_INSET:
+        nBorderStyle = PBS_INSET;
+        fBorderWidth *= 2;
+        crLeftTop = CPWL_Color(COLORTYPE_GRAY,0.5);
+        crRightBottom = CPWL_Color(COLORTYPE_GRAY,0.75);
+        break;
+    case BBS_UNDERLINE:
+        nBorderStyle = PBS_UNDERLINED;
+        break;
+    default:
+        nBorderStyle = PBS_SOLID;
+        break;
+    }
 
-	CPDF_Rect rcWindow = GetRotatedRect();
-	CPDF_Rect rcClient = CPWL_Utils::DeflateRect(rcWindow, fBorderWidth);
+    CPDF_Rect rcWindow = GetRotatedRect();
+    CPDF_Rect rcClient = CPWL_Utils::DeflateRect(rcWindow, fBorderWidth);
 
-	CPDF_DefaultAppearance da = pControl->GetDefaultAppearance();
-	if (da.HasColor())
-	{
-		da.GetColor(iColorType, fc);
-		crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
-	}
+    CPDF_DefaultAppearance da = pControl->GetDefaultAppearance();
+    if (da.HasColor())
+    {
+        da.GetColor(iColorType, fc);
+        crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
+    }
 
-	int32_t nStyle = 0;
+    int32_t nStyle = 0;
 
-	CFX_WideString csWCaption = pControl->GetNormalCaption();
-	if (csWCaption.GetLength() > 0)
-	{
-		switch (csWCaption[0])
-		{
-		default: //L'l':
-			nStyle = PCS_CIRCLE;
-			break;
-		case L'8':
-			nStyle = PCS_CROSS;
-			break;
-		case L'u':
-			nStyle = PCS_DIAMOND;
-			break;
-		case L'n':
-			nStyle = PCS_SQUARE;
-			break;
-		case L'H':
-			nStyle = PCS_STAR;
-			break;
-		case L'4':
-			nStyle = PCS_CHECK;
-			break;
-		}
-	}
-	else
-	{
-		nStyle = PCS_CIRCLE;
-	}
+    CFX_WideString csWCaption = pControl->GetNormalCaption();
+    if (csWCaption.GetLength() > 0)
+    {
+        switch (csWCaption[0])
+        {
+        default: //L'l':
+            nStyle = PCS_CIRCLE;
+            break;
+        case L'8':
+            nStyle = PCS_CROSS;
+            break;
+        case L'u':
+            nStyle = PCS_DIAMOND;
+            break;
+        case L'n':
+            nStyle = PCS_SQUARE;
+            break;
+        case L'H':
+            nStyle = PCS_STAR;
+            break;
+        case L'4':
+            nStyle = PCS_CHECK;
+            break;
+        }
+    }
+    else
+    {
+        nStyle = PCS_CIRCLE;
+    }
 
-	CFX_ByteString csAP_N_ON;
+    CFX_ByteString csAP_N_ON;
 
-	CPDF_Rect rcCenter = CPWL_Utils::DeflateRect(CPWL_Utils::GetCenterSquare(rcWindow), 1.0f);
+    CPDF_Rect rcCenter = CPWL_Utils::DeflateRect(CPWL_Utils::GetCenterSquare(rcWindow), 1.0f);
 
-	if (nStyle == PCS_CIRCLE)
-	{
-		if (nBorderStyle == PBS_BEVELED)
-		{
-			crLeftTop = CPWL_Color(COLORTYPE_GRAY, 1);
-			crRightBottom = CPWL_Utils::SubstractColor(crBackground,0.25f);
-		}
-		else if (nBorderStyle == PBS_INSET)
-		{
-			crLeftTop = CPWL_Color(COLORTYPE_GRAY,0.5f);
-			crRightBottom = CPWL_Color(COLORTYPE_GRAY,0.75f);
-		}
+    if (nStyle == PCS_CIRCLE)
+    {
+        if (nBorderStyle == PBS_BEVELED)
+        {
+            crLeftTop = CPWL_Color(COLORTYPE_GRAY, 1);
+            crRightBottom = CPWL_Utils::SubstractColor(crBackground,0.25f);
+        }
+        else if (nBorderStyle == PBS_INSET)
+        {
+            crLeftTop = CPWL_Color(COLORTYPE_GRAY,0.5f);
+            crRightBottom = CPWL_Color(COLORTYPE_GRAY,0.75f);
+        }
 
-		csAP_N_ON = CPWL_Utils::GetCircleFillAppStream(rcCenter,crBackground) +
-			CPWL_Utils::GetCircleBorderAppStream(rcCenter,fBorderWidth,crBorder,crLeftTop,crRightBottom,nBorderStyle,dsBorder);
-	}
-	else
-	{
-		csAP_N_ON = CPWL_Utils::GetRectFillAppStream(rcWindow,crBackground) +
-			CPWL_Utils::GetBorderAppStream(rcWindow,fBorderWidth,crBorder,crLeftTop,crRightBottom,nBorderStyle,dsBorder);
-	}
+        csAP_N_ON = CPWL_Utils::GetCircleFillAppStream(rcCenter,crBackground) +
+            CPWL_Utils::GetCircleBorderAppStream(rcCenter,fBorderWidth,crBorder,crLeftTop,crRightBottom,nBorderStyle,dsBorder);
+    }
+    else
+    {
+        csAP_N_ON = CPWL_Utils::GetRectFillAppStream(rcWindow,crBackground) +
+            CPWL_Utils::GetBorderAppStream(rcWindow,fBorderWidth,crBorder,crLeftTop,crRightBottom,nBorderStyle,dsBorder);
+    }
 
-	CFX_ByteString csAP_N_OFF = csAP_N_ON;
+    CFX_ByteString csAP_N_OFF = csAP_N_ON;
 
-	switch (nBorderStyle)
-	{
-	case PBS_BEVELED:
-		{
-			CPWL_Color crTemp = crLeftTop;
-			crLeftTop = crRightBottom;
-			crRightBottom = crTemp;
-		}
-		break;
-	case PBS_INSET:
-		crLeftTop = CPWL_Color(COLORTYPE_GRAY,0);
-		crRightBottom = CPWL_Color(COLORTYPE_GRAY,1);
-		break;
-	}
+    switch (nBorderStyle)
+    {
+    case PBS_BEVELED:
+        {
+            CPWL_Color crTemp = crLeftTop;
+            crLeftTop = crRightBottom;
+            crRightBottom = crTemp;
+        }
+        break;
+    case PBS_INSET:
+        crLeftTop = CPWL_Color(COLORTYPE_GRAY,0);
+        crRightBottom = CPWL_Color(COLORTYPE_GRAY,1);
+        break;
+    }
 
-	CFX_ByteString csAP_D_ON;
+    CFX_ByteString csAP_D_ON;
 
-	if (nStyle == PCS_CIRCLE)
-	{
-		CPWL_Color crBK = CPWL_Utils::SubstractColor(crBackground,0.25f);
-		if (nBorderStyle == PBS_BEVELED)
-		{
-			crLeftTop = CPWL_Utils::SubstractColor(crBackground,0.25f);
-			crRightBottom = CPWL_Color(COLORTYPE_GRAY, 1);
-			crBK = crBackground;
-		}
-		else if (nBorderStyle == PBS_INSET)
-		{
-			crLeftTop = CPWL_Color(COLORTYPE_GRAY,0);
-			crRightBottom = CPWL_Color(COLORTYPE_GRAY,1);
-		}
+    if (nStyle == PCS_CIRCLE)
+    {
+        CPWL_Color crBK = CPWL_Utils::SubstractColor(crBackground,0.25f);
+        if (nBorderStyle == PBS_BEVELED)
+        {
+            crLeftTop = CPWL_Utils::SubstractColor(crBackground,0.25f);
+            crRightBottom = CPWL_Color(COLORTYPE_GRAY, 1);
+            crBK = crBackground;
+        }
+        else if (nBorderStyle == PBS_INSET)
+        {
+            crLeftTop = CPWL_Color(COLORTYPE_GRAY,0);
+            crRightBottom = CPWL_Color(COLORTYPE_GRAY,1);
+        }
 
-		csAP_D_ON = CPWL_Utils::GetCircleFillAppStream(rcCenter,crBK)
-			+ CPWL_Utils::GetCircleBorderAppStream(rcCenter,fBorderWidth,crBorder,crLeftTop,crRightBottom,nBorderStyle,dsBorder);
-	}
-	else
-	{
-		csAP_D_ON = CPWL_Utils::GetRectFillAppStream(rcWindow,CPWL_Utils::SubstractColor(crBackground,0.25f)) +
-			CPWL_Utils::GetBorderAppStream(rcWindow,fBorderWidth,crBorder,crLeftTop,crRightBottom,nBorderStyle,dsBorder);
-	}
+        csAP_D_ON = CPWL_Utils::GetCircleFillAppStream(rcCenter,crBK)
+            + CPWL_Utils::GetCircleBorderAppStream(rcCenter,fBorderWidth,crBorder,crLeftTop,crRightBottom,nBorderStyle,dsBorder);
+    }
+    else
+    {
+        csAP_D_ON = CPWL_Utils::GetRectFillAppStream(rcWindow,CPWL_Utils::SubstractColor(crBackground,0.25f)) +
+            CPWL_Utils::GetBorderAppStream(rcWindow,fBorderWidth,crBorder,crLeftTop,crRightBottom,nBorderStyle,dsBorder);
+    }
 
-	CFX_ByteString csAP_D_OFF = csAP_D_ON;
+    CFX_ByteString csAP_D_OFF = csAP_D_ON;
 
-	csAP_N_ON += CPWL_Utils::GetRadioButtonAppStream(rcClient,nStyle,crText);
-	csAP_D_ON += CPWL_Utils::GetRadioButtonAppStream(rcClient,nStyle,crText);
+    csAP_N_ON += CPWL_Utils::GetRadioButtonAppStream(rcClient,nStyle,crText);
+    csAP_D_ON += CPWL_Utils::GetRadioButtonAppStream(rcClient,nStyle,crText);
 
-	WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_ON, pControl->GetCheckedAPState());
-	WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_OFF, "Off");
+    WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_ON, pControl->GetCheckedAPState());
+    WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_OFF, "Off");
 
-	WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_ON, pControl->GetCheckedAPState());
-	WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_OFF, "Off");
+    WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_ON, pControl->GetCheckedAPState());
+    WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_OFF, "Off");
 
-	CFX_ByteString csAS = GetAppState();
-	if (csAS.IsEmpty())
-		SetAppState("Off");
+    CFX_ByteString csAS = GetAppState();
+    if (csAS.IsEmpty())
+        SetAppState("Off");
 }
 
 void CPDFSDK_Widget::ResetAppearance_ComboBox(const FX_WCHAR* sValue)
 {
-	CPDF_FormControl* pControl = GetFormControl();
-	ASSERT(pControl != NULL);
-	CPDF_FormField* pField = pControl->GetField();
-	ASSERT(pField != NULL);
+    CPDF_FormControl* pControl = GetFormControl();
+    ASSERT(pControl != NULL);
+    CPDF_FormField* pField = pControl->GetField();
+    ASSERT(pField != NULL);
 
-	CFX_ByteTextBuf sBody, sLines;
+    CFX_ByteTextBuf sBody, sLines;
 
-	CPDF_Rect rcClient = GetClientRect();
-	CPDF_Rect rcButton = rcClient;
-	rcButton.left = rcButton.right - 13;
-	rcButton.Normalize();
+    CPDF_Rect rcClient = GetClientRect();
+    CPDF_Rect rcButton = rcClient;
+    rcButton.left = rcButton.right - 13;
+    rcButton.Normalize();
 
-	if (IFX_Edit * pEdit = IFX_Edit::NewEdit())
-	{
-		pEdit->EnableRefresh(FALSE);
+    if (IFX_Edit * pEdit = IFX_Edit::NewEdit())
+    {
+        pEdit->EnableRefresh(FALSE);
 
-		CPDFSDK_Document* pDoc = m_pInterForm->GetDocument();
-		ASSERT(pDoc != NULL);
-		CPDFDoc_Environment* pEnv = pDoc->GetEnv();
-		CBA_FontMap FontMap(this,pEnv->GetSysHandler());
-		FontMap.Initial();
-		pEdit->SetFontMap(&FontMap);
+        CPDFSDK_Document* pDoc = m_pInterForm->GetDocument();
+        ASSERT(pDoc != NULL);
+        CPDFDoc_Environment* pEnv = pDoc->GetEnv();
+        CBA_FontMap FontMap(this,pEnv->GetSysHandler());
+        FontMap.Initial();
+        pEdit->SetFontMap(&FontMap);
 
-		CPDF_Rect rcEdit = rcClient;
-		rcEdit.right = rcButton.left;
-		rcEdit.Normalize();
+        CPDF_Rect rcEdit = rcClient;
+        rcEdit.right = rcButton.left;
+        rcEdit.Normalize();
 
-		pEdit->SetPlateRect(rcEdit);
-		pEdit->SetAlignmentV(1);
+        pEdit->SetPlateRect(rcEdit);
+        pEdit->SetAlignmentV(1);
 
-		FX_FLOAT fFontSize = GetFontSize();
-		if (IsFloatZero(fFontSize))
-			pEdit->SetAutoFontSize(TRUE);
-		else
-			pEdit->SetFontSize(fFontSize);
+        FX_FLOAT fFontSize = GetFontSize();
+        if (IsFloatZero(fFontSize))
+            pEdit->SetAutoFontSize(TRUE);
+        else
+            pEdit->SetFontSize(fFontSize);
 
-		pEdit->Initialize();
+        pEdit->Initialize();
 
-		if (sValue)
-			pEdit->SetText(sValue);
-		else
-		{
-			int32_t nCurSel = pField->GetSelectedIndex(0);
+        if (sValue)
+            pEdit->SetText(sValue);
+        else
+        {
+            int32_t nCurSel = pField->GetSelectedIndex(0);
 
-			if (nCurSel < 0)
-				pEdit->SetText(pField->GetValue().c_str());
-			else
-				pEdit->SetText(pField->GetOptionLabel(nCurSel).c_str());
-		}
+            if (nCurSel < 0)
+                pEdit->SetText(pField->GetValue().c_str());
+            else
+                pEdit->SetText(pField->GetOptionLabel(nCurSel).c_str());
+        }
 
-		CPDF_Rect rcContent = pEdit->GetContentRect();
+        CPDF_Rect rcContent = pEdit->GetContentRect();
 
-		CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(pEdit,CPDF_Point(0.0f,0.0f));
-		if (sEdit.GetLength() > 0)
-		{
-			sBody << "/Tx BMC\n" << "q\n";
-			if (rcContent.Width() > rcEdit.Width() ||
-				rcContent.Height() > rcEdit.Height())
-			{
-				sBody << rcEdit.left << " " << rcEdit.bottom << " "
-					<< rcEdit.Width() << " " << rcEdit.Height() << " re\nW\nn\n";
-			}
+        CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(pEdit,CPDF_Point(0.0f,0.0f));
+        if (sEdit.GetLength() > 0)
+        {
+            sBody << "/Tx BMC\n" << "q\n";
+            if (rcContent.Width() > rcEdit.Width() ||
+                rcContent.Height() > rcEdit.Height())
+            {
+                sBody << rcEdit.left << " " << rcEdit.bottom << " "
+                    << rcEdit.Width() << " " << rcEdit.Height() << " re\nW\nn\n";
+            }
 
-			CPWL_Color crText = GetTextPWLColor();
-			sBody << "BT\n" << CPWL_Utils::GetColorAppStream(crText) << sEdit << "ET\n" << "Q\nEMC\n";
-		}
+            CPWL_Color crText = GetTextPWLColor();
+            sBody << "BT\n" << CPWL_Utils::GetColorAppStream(crText) << sEdit << "ET\n" << "Q\nEMC\n";
+        }
 
-		IFX_Edit::DelEdit(pEdit);
-	}
+        IFX_Edit::DelEdit(pEdit);
+    }
 
-	sBody << CPWL_Utils::GetDropButtonAppStream(rcButton);
+    sBody << CPWL_Utils::GetDropButtonAppStream(rcButton);
 
-	CFX_ByteString sAP = GetBackgroundAppStream() + GetBorderAppStream() + sLines.GetByteString() + sBody.GetByteString();
+    CFX_ByteString sAP = GetBackgroundAppStream() + GetBorderAppStream() + sLines.GetByteString() + sBody.GetByteString();
 
-	WriteAppearance("N", GetRotatedRect(), GetMatrix(), sAP);
+    WriteAppearance("N", GetRotatedRect(), GetMatrix(), sAP);
 }
 
 void CPDFSDK_Widget::ResetAppearance_ListBox()
 {
-	CPDF_FormControl* pControl = GetFormControl();
-	ASSERT(pControl != NULL);
-	CPDF_FormField* pField = pControl->GetField();
-	ASSERT(pField != NULL);
+    CPDF_FormControl* pControl = GetFormControl();
+    ASSERT(pControl != NULL);
+    CPDF_FormField* pField = pControl->GetField();
+    ASSERT(pField != NULL);
 
-	CPDF_Rect rcClient = GetClientRect();
+    CPDF_Rect rcClient = GetClientRect();
 
-	CFX_ByteTextBuf sBody, sLines;
+    CFX_ByteTextBuf sBody, sLines;
 
-	if (IFX_Edit * pEdit = IFX_Edit::NewEdit())
-	{
-		pEdit->EnableRefresh(FALSE);
+    if (IFX_Edit * pEdit = IFX_Edit::NewEdit())
+    {
+        pEdit->EnableRefresh(FALSE);
 
-		CPDFSDK_Document* pDoc = m_pInterForm->GetDocument();
-		ASSERT(pDoc != NULL);
-		CPDFDoc_Environment* pEnv = pDoc->GetEnv();
+        CPDFSDK_Document* pDoc = m_pInterForm->GetDocument();
+        ASSERT(pDoc != NULL);
+        CPDFDoc_Environment* pEnv = pDoc->GetEnv();
 
-		CBA_FontMap FontMap(this,pEnv->GetSysHandler());
-		FontMap.Initial();
-		pEdit->SetFontMap(&FontMap);
+        CBA_FontMap FontMap(this,pEnv->GetSysHandler());
+        FontMap.Initial();
+        pEdit->SetFontMap(&FontMap);
 
-		pEdit->SetPlateRect(CPDF_Rect(rcClient.left,0.0f,rcClient.right,0.0f));
+        pEdit->SetPlateRect(CPDF_Rect(rcClient.left,0.0f,rcClient.right,0.0f));
 
-		FX_FLOAT fFontSize = GetFontSize();
+        FX_FLOAT fFontSize = GetFontSize();
 
-		if (IsFloatZero(fFontSize))
-			pEdit->SetFontSize(12.0f);
-		else
-			pEdit->SetFontSize(fFontSize);
+        if (IsFloatZero(fFontSize))
+            pEdit->SetFontSize(12.0f);
+        else
+            pEdit->SetFontSize(fFontSize);
 
-		pEdit->Initialize();
+        pEdit->Initialize();
 
-		CFX_ByteTextBuf sList;
-		FX_FLOAT fy = rcClient.top;
+        CFX_ByteTextBuf sList;
+        FX_FLOAT fy = rcClient.top;
 
-		int32_t nTop = pField->GetTopVisibleIndex();
-		int32_t nCount = pField->CountOptions();
-		int32_t nSelCount = pField->CountSelectedItems();
+        int32_t nTop = pField->GetTopVisibleIndex();
+        int32_t nCount = pField->CountOptions();
+        int32_t nSelCount = pField->CountSelectedItems();
 
-		for (int32_t i=nTop; i<nCount; i++)
-		{
-			FX_BOOL bSelected = FALSE;
-			for (int32_t j=0; j<nSelCount; j++)
-			{
-				if (pField->GetSelectedIndex(j) == i)
-				{
-					bSelected = TRUE;
-					break;
-				}
-			}
+        for (int32_t i=nTop; i<nCount; i++)
+        {
+            FX_BOOL bSelected = FALSE;
+            for (int32_t j=0; j<nSelCount; j++)
+            {
+                if (pField->GetSelectedIndex(j) == i)
+                {
+                    bSelected = TRUE;
+                    break;
+                }
+            }
 
-			pEdit->SetText(pField->GetOptionLabel(i).c_str());
+            pEdit->SetText(pField->GetOptionLabel(i).c_str());
 
-			CPDF_Rect rcContent = pEdit->GetContentRect();
-			FX_FLOAT fItemHeight = rcContent.Height();
+            CPDF_Rect rcContent = pEdit->GetContentRect();
+            FX_FLOAT fItemHeight = rcContent.Height();
 
-			if (bSelected)
-			{
-				CPDF_Rect rcItem = CPDF_Rect(rcClient.left,fy-fItemHeight,rcClient.right,fy);
-				sList << "q\n" << CPWL_Utils::GetColorAppStream(CPWL_Color(COLORTYPE_RGB,0,51.0f/255.0f,113.0f/255.0f),TRUE)
-					<< rcItem.left << " " << rcItem.bottom << " " << rcItem.Width() << " " << rcItem.Height() << " re f\n" << "Q\n";
+            if (bSelected)
+            {
+                CPDF_Rect rcItem = CPDF_Rect(rcClient.left,fy-fItemHeight,rcClient.right,fy);
+                sList << "q\n" << CPWL_Utils::GetColorAppStream(CPWL_Color(COLORTYPE_RGB,0,51.0f/255.0f,113.0f/255.0f),TRUE)
+                    << rcItem.left << " " << rcItem.bottom << " " << rcItem.Width() << " " << rcItem.Height() << " re f\n" << "Q\n";
 
-				sList << "BT\n" << CPWL_Utils::GetColorAppStream(CPWL_Color(COLORTYPE_GRAY,1),TRUE) <<
-					CPWL_Utils::GetEditAppStream(pEdit,CPDF_Point(0.0f,fy)) << "ET\n";
-			}
-			else
-			{
-				CPWL_Color crText = GetTextPWLColor();
-				sList << "BT\n" << CPWL_Utils::GetColorAppStream(crText,TRUE) <<
-				CPWL_Utils::GetEditAppStream(pEdit,CPDF_Point(0.0f,fy)) << "ET\n";
-			}
+                sList << "BT\n" << CPWL_Utils::GetColorAppStream(CPWL_Color(COLORTYPE_GRAY,1),TRUE) <<
+                    CPWL_Utils::GetEditAppStream(pEdit,CPDF_Point(0.0f,fy)) << "ET\n";
+            }
+            else
+            {
+                CPWL_Color crText = GetTextPWLColor();
+                sList << "BT\n" << CPWL_Utils::GetColorAppStream(crText,TRUE) <<
+                CPWL_Utils::GetEditAppStream(pEdit,CPDF_Point(0.0f,fy)) << "ET\n";
+            }
 
-			fy -= fItemHeight;
-		}
+            fy -= fItemHeight;
+        }
 
-		if (sList.GetSize() > 0)
-		{
-			sBody << "/Tx BMC\n" << "q\n" << rcClient.left << " " << rcClient.bottom << " "
-					<< rcClient.Width() << " " << rcClient.Height() << " re\nW\nn\n";
-			sBody << sList << "Q\nEMC\n";
-		}
+        if (sList.GetSize() > 0)
+        {
+            sBody << "/Tx BMC\n" << "q\n" << rcClient.left << " " << rcClient.bottom << " "
+                    << rcClient.Width() << " " << rcClient.Height() << " re\nW\nn\n";
+            sBody << sList << "Q\nEMC\n";
+        }
 
-		IFX_Edit::DelEdit(pEdit);
-	}
+        IFX_Edit::DelEdit(pEdit);
+    }
 
-	CFX_ByteString sAP = GetBackgroundAppStream() + GetBorderAppStream() + sLines.GetByteString() + sBody.GetByteString();
+    CFX_ByteString sAP = GetBackgroundAppStream() + GetBorderAppStream() + sLines.GetByteString() + sBody.GetByteString();
 
-	WriteAppearance("N", GetRotatedRect(), GetMatrix(), sAP);
+    WriteAppearance("N", GetRotatedRect(), GetMatrix(), sAP);
 }
 
 void CPDFSDK_Widget::ResetAppearance_TextField(const FX_WCHAR* sValue)
@@ -1979,202 +1973,200 @@
 
 CPDF_Rect CPDFSDK_Widget::GetClientRect() const
 {
-	CPDF_Rect rcWindow = GetRotatedRect();
-	FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth();
-	switch (GetBorderStyle())
-	{
-	case BBS_BEVELED:
-	case BBS_INSET:
-		fBorderWidth *= 2.0f;
-		break;
-	}
+    CPDF_Rect rcWindow = GetRotatedRect();
+    FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth();
+    switch (GetBorderStyle())
+    {
+    case BBS_BEVELED:
+    case BBS_INSET:
+        fBorderWidth *= 2.0f;
+        break;
+    }
 
-	return CPWL_Utils::DeflateRect(rcWindow, fBorderWidth);
+    return CPWL_Utils::DeflateRect(rcWindow, fBorderWidth);
 }
 
 CPDF_Rect CPDFSDK_Widget::GetRotatedRect() const
 {
-	CPDF_Rect rectAnnot = GetRect();
-	FX_FLOAT fWidth = rectAnnot.right - rectAnnot.left;
-	FX_FLOAT fHeight = rectAnnot.top - rectAnnot.bottom;
+    CPDF_Rect rectAnnot = GetRect();
+    FX_FLOAT fWidth = rectAnnot.right - rectAnnot.left;
+    FX_FLOAT fHeight = rectAnnot.top - rectAnnot.bottom;
 
-	CPDF_FormControl* pControl = GetFormControl();
-	ASSERT(pControl != NULL);
+    CPDF_FormControl* pControl = GetFormControl();
+    CPDF_Rect rcPDFWindow;
+    switch(abs(pControl->GetRotation() % 360))
+    {
+        case 0:
+        case 180:
+        default:
+            rcPDFWindow = CPDF_Rect(0, 0, fWidth, fHeight);
+            break;
+        case 90:
+        case 270:
+            rcPDFWindow = CPDF_Rect(0, 0, fHeight, fWidth);
+            break;
+    }
 
-	CPDF_Rect rcPDFWindow;
-	switch(abs(pControl->GetRotation() % 360))
-	{
-		case 0:
-		case 180:
-		default:
-			rcPDFWindow = CPDF_Rect(0, 0, fWidth, fHeight);
-			break;
-		case 90:
-		case 270:
-			rcPDFWindow = CPDF_Rect(0, 0, fHeight, fWidth);
-			break;
-	}
-
-	return rcPDFWindow;
+    return rcPDFWindow;
 }
 
 CFX_ByteString CPDFSDK_Widget::GetBackgroundAppStream() const
 {
-	CPWL_Color crBackground = GetFillPWLColor();
-	if (crBackground.nColorType != COLORTYPE_TRANSPARENT)
-		return CPWL_Utils::GetRectFillAppStream(GetRotatedRect(), crBackground);
-	else
-		return "";
+    CPWL_Color crBackground = GetFillPWLColor();
+    if (crBackground.nColorType != COLORTYPE_TRANSPARENT) {
+        return CPWL_Utils::GetRectFillAppStream(GetRotatedRect(), crBackground);
+    }
+    return "";
 }
 
 CFX_ByteString CPDFSDK_Widget::GetBorderAppStream() const
 {
-	CPDF_Rect rcWindow = GetRotatedRect();
-	CPWL_Color crBorder = GetBorderPWLColor();
-	CPWL_Color crBackground = GetFillPWLColor();
-	CPWL_Color crLeftTop, crRightBottom;
+    CPDF_Rect rcWindow = GetRotatedRect();
+    CPWL_Color crBorder = GetBorderPWLColor();
+    CPWL_Color crBackground = GetFillPWLColor();
+    CPWL_Color crLeftTop, crRightBottom;
 
-	FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth();
-	int32_t nBorderStyle = 0;
-	CPWL_Dash dsBorder(3,0,0);
+    FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth();
+    int32_t nBorderStyle = 0;
+    CPWL_Dash dsBorder(3,0,0);
 
-	switch (GetBorderStyle())
-	{
-	case BBS_DASH:
-		nBorderStyle = PBS_DASH;
-		dsBorder = CPWL_Dash(3, 3, 0);
-		break;
-	case BBS_BEVELED:
-		nBorderStyle = PBS_BEVELED;
-		fBorderWidth *= 2;
-		crLeftTop = CPWL_Color(COLORTYPE_GRAY, 1);
-		crRightBottom = CPWL_Utils::DevideColor(crBackground, 2);
-		break;
-	case BBS_INSET:
-		nBorderStyle = PBS_INSET;
-		fBorderWidth *= 2;
-		crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0.5);
-		crRightBottom = CPWL_Color(COLORTYPE_GRAY, 0.75);
-		break;
-	case BBS_UNDERLINE:
-		nBorderStyle = PBS_UNDERLINED;
-		break;
-	default:
-		nBorderStyle = PBS_SOLID;
-		break;
-	}
+    switch (GetBorderStyle())
+    {
+    case BBS_DASH:
+        nBorderStyle = PBS_DASH;
+        dsBorder = CPWL_Dash(3, 3, 0);
+        break;
+    case BBS_BEVELED:
+        nBorderStyle = PBS_BEVELED;
+        fBorderWidth *= 2;
+        crLeftTop = CPWL_Color(COLORTYPE_GRAY, 1);
+        crRightBottom = CPWL_Utils::DevideColor(crBackground, 2);
+        break;
+    case BBS_INSET:
+        nBorderStyle = PBS_INSET;
+        fBorderWidth *= 2;
+        crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0.5);
+        crRightBottom = CPWL_Color(COLORTYPE_GRAY, 0.75);
+        break;
+    case BBS_UNDERLINE:
+        nBorderStyle = PBS_UNDERLINED;
+        break;
+    default:
+        nBorderStyle = PBS_SOLID;
+        break;
+    }
 
-	return CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, crLeftTop,
-		crRightBottom, nBorderStyle, dsBorder);
+    return CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, crLeftTop,
+        crRightBottom, nBorderStyle, dsBorder);
 }
 
 CPDF_Matrix CPDFSDK_Widget::GetMatrix() const
 {
-	CPDF_Matrix mt;
-	CPDF_FormControl* pControl = GetFormControl();
-	ASSERT(pControl != NULL);
+    CPDF_Matrix mt;
+    CPDF_FormControl* pControl = GetFormControl();
+    ASSERT(pControl != NULL);
 
-	CPDF_Rect rcAnnot = GetRect();
-	FX_FLOAT fWidth = rcAnnot.right - rcAnnot.left;
-	FX_FLOAT fHeight = rcAnnot.top - rcAnnot.bottom;
+    CPDF_Rect rcAnnot = GetRect();
+    FX_FLOAT fWidth = rcAnnot.right - rcAnnot.left;
+    FX_FLOAT fHeight = rcAnnot.top - rcAnnot.bottom;
 
 
 
-	switch (abs(pControl->GetRotation() % 360))
-	{
-		case 0:
-		default:
-			mt = CPDF_Matrix(1, 0, 0, 1, 0, 0);
-			break;
-		case 90:
-			mt = CPDF_Matrix(0, 1, -1, 0, fWidth, 0);
-			break;
-		case 180:
-			mt = CPDF_Matrix(-1, 0, 0, -1, fWidth, fHeight);
-			break;
-		case 270:
-			mt = CPDF_Matrix(0, -1, 1, 0, 0, fHeight);
-			break;
-	}
+    switch (abs(pControl->GetRotation() % 360))
+    {
+        case 0:
+        default:
+            mt = CPDF_Matrix(1, 0, 0, 1, 0, 0);
+            break;
+        case 90:
+            mt = CPDF_Matrix(0, 1, -1, 0, fWidth, 0);
+            break;
+        case 180:
+            mt = CPDF_Matrix(-1, 0, 0, -1, fWidth, fHeight);
+            break;
+        case 270:
+            mt = CPDF_Matrix(0, -1, 1, 0, 0, fHeight);
+            break;
+    }
 
-	return mt;
+    return mt;
 }
 
 CPWL_Color CPDFSDK_Widget::GetTextPWLColor() const
 {
-	CPWL_Color crText = CPWL_Color(COLORTYPE_GRAY, 0);
+    CPWL_Color crText = CPWL_Color(COLORTYPE_GRAY, 0);
 
-	CPDF_FormControl* pFormCtrl = GetFormControl();
-	ASSERT(pFormCtrl != NULL);
+    CPDF_FormControl* pFormCtrl = GetFormControl();
+    ASSERT(pFormCtrl != NULL);
 
-	CPDF_DefaultAppearance da = pFormCtrl->GetDefaultAppearance();
-	if (da.HasColor())
-	{
-		int32_t iColorType;
-		FX_FLOAT fc[4];
-		da.GetColor(iColorType, fc);
-		crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
-	}
+    CPDF_DefaultAppearance da = pFormCtrl->GetDefaultAppearance();
+    if (da.HasColor())
+    {
+        int32_t iColorType;
+        FX_FLOAT fc[4];
+        da.GetColor(iColorType, fc);
+        crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
+    }
 
-	return crText;
+    return crText;
 }
 
 CPWL_Color CPDFSDK_Widget::GetBorderPWLColor() const
 {
-	CPWL_Color crBorder;
+    CPWL_Color crBorder;
 
-	CPDF_FormControl* pFormCtrl = GetFormControl();
-	ASSERT(pFormCtrl != NULL);
+    CPDF_FormControl* pFormCtrl = GetFormControl();
+    ASSERT(pFormCtrl != NULL);
 
-	int32_t iColorType;
-	FX_FLOAT fc[4];
-	pFormCtrl->GetOriginalBorderColor(iColorType, fc);
-	if (iColorType > 0)
-		crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
+    int32_t iColorType;
+    FX_FLOAT fc[4];
+    pFormCtrl->GetOriginalBorderColor(iColorType, fc);
+    if (iColorType > 0)
+        crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
 
-	return crBorder;
+    return crBorder;
 }
 
 CPWL_Color CPDFSDK_Widget::GetFillPWLColor() const
 {
-	CPWL_Color crFill;
+    CPWL_Color crFill;
 
-	CPDF_FormControl* pFormCtrl = GetFormControl();
-	ASSERT(pFormCtrl != NULL);
+    CPDF_FormControl* pFormCtrl = GetFormControl();
+    ASSERT(pFormCtrl != NULL);
 
-	int32_t iColorType;
-	FX_FLOAT fc[4];
-	pFormCtrl->GetOriginalBackgroundColor(iColorType, fc);
-	if (iColorType > 0)
-		crFill = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
+    int32_t iColorType;
+    FX_FLOAT fc[4];
+    pFormCtrl->GetOriginalBackgroundColor(iColorType, fc);
+    if (iColorType > 0)
+        crFill = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
 
-	return crFill;
+    return crFill;
 }
 
 void CPDFSDK_Widget::AddImageToAppearance(const CFX_ByteString& sAPType, CPDF_Stream* pImage)
 {
-	ASSERT(pImage != NULL);
+    ASSERT(pImage != NULL);
 
-	CPDF_Document* pDoc = m_pPageView->GetPDFDocument();//pDocument->GetDocument();
-	ASSERT(pDoc != NULL);
+    CPDF_Document* pDoc = m_pPageView->GetPDFDocument();//pDocument->GetDocument();
+    ASSERT(pDoc != NULL);
 
-	CPDF_Dictionary* pAPDict = m_pAnnot->GetAnnotDict()->GetDict("AP");
-	ASSERT(pAPDict != NULL);
+    CPDF_Dictionary* pAPDict = m_pAnnot->GetAnnotDict()->GetDict("AP");
+    ASSERT(pAPDict != NULL);
 
-	CPDF_Stream* pStream = pAPDict->GetStream(sAPType);
-	ASSERT(pStream != NULL);
+    CPDF_Stream* pStream = pAPDict->GetStream(sAPType);
+    ASSERT(pStream != NULL);
 
-	CPDF_Dictionary* pStreamDict = pStream->GetDict();
-	ASSERT(pStreamDict != NULL);
+    CPDF_Dictionary* pStreamDict = pStream->GetDict();
+    ASSERT(pStreamDict != NULL);
 
-	CFX_ByteString sImageAlias = "IMG";
+    CFX_ByteString sImageAlias = "IMG";
 
-	if (CPDF_Dictionary* pImageDict = pImage->GetDict())
-	{
-		sImageAlias = pImageDict->GetString("Name");
-		if (sImageAlias.IsEmpty())
-			sImageAlias = "IMG";
-	}
+    if (CPDF_Dictionary* pImageDict = pImage->GetDict())
+    {
+        sImageAlias = pImageDict->GetString("Name");
+        if (sImageAlias.IsEmpty())
+            sImageAlias = "IMG";
+    }
 
 	CPDF_Dictionary* pStreamResList = pStreamDict->GetDict("Resources");
 	if (!pStreamResList)
@@ -2193,10 +2185,10 @@
 
 void CPDFSDK_Widget::RemoveAppearance(const CFX_ByteString& sAPType)
 {
-	if (CPDF_Dictionary* pAPDict = m_pAnnot->GetAnnotDict()->GetDict("AP"))
-	{
-		pAPDict->RemoveAt(sAPType);
-	}
+    if (CPDF_Dictionary* pAPDict = m_pAnnot->GetAnnotDict()->GetDict("AP"))
+    {
+        pAPDict->RemoveAt(sAPType);
+    }
 }
 
 FX_BOOL CPDFSDK_Widget::OnAAction(CPDF_AAction::AActionType type, PDFSDK_FieldAction& data, CPDFSDK_PageView* pPageView)
@@ -2254,12 +2246,9 @@
 
 	if (action && action.GetType() != CPDF_Action::Unknown)
 	{
-		CPDFSDK_ActionHandler* pActionHandler = pEnv->GetActionHander();/*(CPDFSDK_ActionHandler*)pApp->GetActionHandler();*/
- 		ASSERT(pActionHandler != NULL);
-
- 		return pActionHandler->DoAction_Field(action, type, pDocument, GetFormField(), data);
-	}
-
+        CPDFSDK_ActionHandler* pActionHandler = pEnv->GetActionHander();
+        return pActionHandler->DoAction_Field(action, type, pDocument, GetFormField(), data);
+    }
 	return FALSE;
 }
 
@@ -2293,45 +2282,45 @@
 		break;
 	}
 
-	return CPDF_Action();
+    return CPDF_Action();
 }
 
 
 CFX_WideString CPDFSDK_Widget::GetAlternateName() const
 {
-	CPDF_FormField*	pFormField = GetFormField();
-	ASSERT(pFormField != NULL);
+    CPDF_FormField* pFormField = GetFormField();
+    ASSERT(pFormField != NULL);
 
-	return pFormField->GetAlternateName();
+    return pFormField->GetAlternateName();
 }
 
-int32_t	CPDFSDK_Widget::GetAppearanceAge() const
+int32_t CPDFSDK_Widget::GetAppearanceAge() const
 {
-	return m_nAppAge;
+    return m_nAppAge;
 }
 
 int32_t CPDFSDK_Widget::GetValueAge() const
 {
-	return m_nValueAge;
+    return m_nValueAge;
 }
 
 
-FX_BOOL	CPDFSDK_Widget::HitTest(FX_FLOAT pageX, FX_FLOAT pageY)
+FX_BOOL CPDFSDK_Widget::HitTest(FX_FLOAT pageX, FX_FLOAT pageY)
 {
-	CPDF_Annot* pAnnot = GetPDFAnnot();
-	CFX_FloatRect annotRect;
-	pAnnot->GetRect(annotRect);
-	if(annotRect.Contains(pageX, pageY))
-	{
-		if (!IsVisible()) return FALSE;
+    CPDF_Annot* pAnnot = GetPDFAnnot();
+    CFX_FloatRect annotRect;
+    pAnnot->GetRect(annotRect);
+    if(annotRect.Contains(pageX, pageY))
+    {
+        if (!IsVisible()) return FALSE;
 
-		int nFieldFlags = GetFieldFlags();
-		if ((nFieldFlags & FIELDFLAG_READONLY) == FIELDFLAG_READONLY)
-			return FALSE;
+        int nFieldFlags = GetFieldFlags();
+        if ((nFieldFlags & FIELDFLAG_READONLY) == FIELDFLAG_READONLY)
+            return FALSE;
 
-		return TRUE;
-	}
-	return FALSE;
+        return TRUE;
+    }
+    return FALSE;
 }
 
 //CPDFSDK_XFAWidget
@@ -2390,9 +2379,9 @@
 	ASSERT(m_pInterForm != NULL);
 	m_pInterForm->SetFormNotify(this);
 
-	for(int i=0; i<6; i++)
-		m_bNeedHightlight[i] = FALSE;
-	m_iHighlightAlpha = 0;
+    for(int i=0; i<6; i++)
+        m_bNeedHightlight[i] = FALSE;
+    m_iHighlightAlpha = 0;
 }
 
 CPDFSDK_InterForm::~CPDFSDK_InterForm()
@@ -2406,7 +2395,7 @@
 
 FX_BOOL CPDFSDK_InterForm::HighlightWidgets()
 {
-	return FALSE;
+    return FALSE;
 }
 
 CPDFSDK_Widget* CPDFSDK_InterForm::GetSibling(CPDFSDK_Widget* pWidget, FX_BOOL bNext) const
@@ -2458,57 +2447,57 @@
 
 void CPDFSDK_InterForm::GetWidgets(const CFX_WideString& sFieldName, CFX_PtrArray& widgets)
 {
-	ASSERT(m_pInterForm != NULL);
+    ASSERT(m_pInterForm != NULL);
 
-	for (int i=0,sz=m_pInterForm->CountFields(sFieldName); i<sz; i++)
-	{
-		CPDF_FormField* pFormField = m_pInterForm->GetField(i, sFieldName);
-		ASSERT(pFormField != NULL);
+    for (int i=0,sz=m_pInterForm->CountFields(sFieldName); i<sz; i++)
+    {
+        CPDF_FormField* pFormField = m_pInterForm->GetField(i, sFieldName);
+        ASSERT(pFormField != NULL);
 
-		GetWidgets(pFormField, widgets);
-	}
+        GetWidgets(pFormField, widgets);
+    }
 }
 
 void CPDFSDK_InterForm::GetWidgets(CPDF_FormField* pField, CFX_PtrArray& widgets)
 {
-	ASSERT(pField != NULL);
+    ASSERT(pField != NULL);
 
-	for (int i=0,isz=pField->CountControls(); i<isz; i++)
-	{
-		CPDF_FormControl* pFormCtrl = pField->GetControl(i);
-		ASSERT(pFormCtrl != NULL);
+    for (int i=0,isz=pField->CountControls(); i<isz; i++)
+    {
+        CPDF_FormControl* pFormCtrl = pField->GetControl(i);
+        ASSERT(pFormCtrl != NULL);
 
-		CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl);
+        CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl);
 
-		if (pWidget)
-			widgets.Add(pWidget);
-	}
+        if (pWidget)
+            widgets.Add(pWidget);
+    }
 }
 
 int CPDFSDK_InterForm::GetPageIndexByAnnotDict(CPDF_Document* pDocument, CPDF_Dictionary* pAnnotDict) const
 {
-	ASSERT(pDocument != NULL);
-	ASSERT(pAnnotDict != NULL);
+    ASSERT(pDocument != NULL);
+    ASSERT(pAnnotDict != NULL);
 
-	for (int i=0,sz=pDocument->GetPageCount(); i<sz; i++)
-	{
-		if (CPDF_Dictionary* pPageDict = pDocument->GetPage(i))
-		{
-			if (CPDF_Array* pAnnots = pPageDict->GetArray("Annots"))
-			{
-				for (int j=0,jsz=pAnnots->GetCount(); j<jsz; j++)
-				{
-					CPDF_Object* pDict = pAnnots->GetElementValue(j);
-					if (pAnnotDict == pDict)
-					{
-						return i;
-					}
-				}
-			}
-		}
-	}
+    for (int i=0,sz=pDocument->GetPageCount(); i<sz; i++)
+    {
+        if (CPDF_Dictionary* pPageDict = pDocument->GetPage(i))
+        {
+            if (CPDF_Array* pAnnots = pPageDict->GetArray("Annots"))
+            {
+                for (int j=0,jsz=pAnnots->GetCount(); j<jsz; j++)
+                {
+                    CPDF_Object* pDict = pAnnots->GetElementValue(j);
+                    if (pAnnotDict == pDict)
+                    {
+                        return i;
+                    }
+                }
+            }
+        }
+    }
 
-	return -1;
+    return -1;
 }
 
 void CPDFSDK_InterForm::AddMap(CPDF_FormControl* pControl, CPDFSDK_Widget* pWidget)
@@ -2541,12 +2530,12 @@
 
 void CPDFSDK_InterForm::EnableCalculate(FX_BOOL bEnabled)
 {
-	m_bCalculate = bEnabled;
+    m_bCalculate = bEnabled;
 }
 
 FX_BOOL CPDFSDK_InterForm::IsCalculateEnabled() const
 {
-	return m_bCalculate;
+    return m_bCalculate;
 }
 
 void CPDFSDK_InterForm::XfaEnableCalculate(FX_BOOL bEnabled)
@@ -2634,457 +2623,440 @@
 
 void CPDFSDK_InterForm::OnCalculate(CPDF_FormField* pFormField)
 {
-	ASSERT(m_pDocument != NULL);
-	CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
-	ASSERT(pEnv);
-	if(!pEnv->IsJSInitiated())
-		return;
+    ASSERT(m_pDocument != NULL);
+    CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
+    ASSERT(pEnv);
+    if(!pEnv->IsJSInitiated())
+        return;
 
-	if (m_bBusy) return;
+    if (m_bBusy) return;
 
-	m_bBusy = TRUE;
+    m_bBusy = TRUE;
 
-	if (IsCalculateEnabled())
-	{
-		IFXJS_Runtime* pRuntime = m_pDocument->GetJsRuntime();
-		ASSERT(pRuntime != NULL);
+    if (IsCalculateEnabled())
+    {
+        IFXJS_Runtime* pRuntime = m_pDocument->GetJsRuntime();
+        ASSERT(pRuntime != NULL);
 
-		pRuntime->SetReaderDocument(m_pDocument);
+        pRuntime->SetReaderDocument(m_pDocument);
 
-		int nSize = m_pInterForm->CountFieldsInCalculationOrder();
-		for (int i=0; i<nSize; i++)
-		{
-			if(CPDF_FormField* pField = m_pInterForm->GetFieldInCalculationOrder(i))
-			{
-//			ASSERT(pField != NULL);
-				int nType = pField->GetFieldType();
-				if (nType == FIELDTYPE_COMBOBOX || nType == FIELDTYPE_TEXTFIELD)
-				{
-					CPDF_AAction aAction = pField->GetAdditionalAction();
-					if (aAction && aAction.ActionExist(CPDF_AAction::Calculate))
-					{
-						CPDF_Action action = aAction.GetAction(CPDF_AAction::Calculate);
-						if (action)
-						{
-							CFX_WideString csJS = action.GetJavaScript();
-							if (!csJS.IsEmpty())
-							{
-								IFXJS_Context* pContext = pRuntime->NewContext();
-								ASSERT(pContext != NULL);
+        int nSize = m_pInterForm->CountFieldsInCalculationOrder();
+        for (int i=0; i<nSize; i++)
+        {
+            if(CPDF_FormField* pField = m_pInterForm->GetFieldInCalculationOrder(i))
+            {
+//          ASSERT(pField != NULL);
+                int nType = pField->GetFieldType();
+                if (nType == FIELDTYPE_COMBOBOX || nType == FIELDTYPE_TEXTFIELD)
+                {
+                    CPDF_AAction aAction = pField->GetAdditionalAction();
+                    if (aAction && aAction.ActionExist(CPDF_AAction::Calculate))
+                    {
+                        CPDF_Action action = aAction.GetAction(CPDF_AAction::Calculate);
+                        if (action)
+                        {
+                            CFX_WideString csJS = action.GetJavaScript();
+                            if (!csJS.IsEmpty())
+                            {
+                                IFXJS_Context* pContext = pRuntime->NewContext();
+                                ASSERT(pContext != NULL);
 
-								CFX_WideString sOldValue = pField->GetValue();
-								CFX_WideString sValue = sOldValue;
-								FX_BOOL bRC = TRUE;
-								pContext->OnField_Calculate(pFormField, pField, sValue, bRC);
+                                CFX_WideString sOldValue = pField->GetValue();
+                                CFX_WideString sValue = sOldValue;
+                                FX_BOOL bRC = TRUE;
+                                pContext->OnField_Calculate(pFormField, pField, sValue, bRC);
 
-								CFX_WideString sInfo;
-								FX_BOOL bRet = pContext->RunScript(csJS, sInfo);
-								pRuntime->ReleaseContext(pContext);
+                                CFX_WideString sInfo;
+                                FX_BOOL bRet = pContext->RunScript(csJS, sInfo);
+                                pRuntime->ReleaseContext(pContext);
 
-								if (bRet)
-								{
-									if (bRC)
-									{
-										if (sValue.Compare(sOldValue) != 0)
-											pField->SetValue(sValue, TRUE);
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-		}
+                                if (bRet)
+                                {
+                                    if (bRC)
+                                    {
+                                        if (sValue.Compare(sOldValue) != 0)
+                                            pField->SetValue(sValue, TRUE);
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
 
 
-	}
+    }
 
-	m_bBusy = FALSE;
+    m_bBusy = FALSE;
 }
 
 CFX_WideString CPDFSDK_InterForm::OnFormat(CPDF_FormField* pFormField, FX_BOOL& bFormated)
 {
-	ASSERT(m_pDocument != NULL);
-	ASSERT(pFormField != NULL);
+    ASSERT(m_pDocument != NULL);
+    ASSERT(pFormField != NULL);
 
-	CFX_WideString sValue = pFormField->GetValue();
-	CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
-	ASSERT(pEnv);
-	if(!pEnv->IsJSInitiated())
-	{
-		bFormated = FALSE;
-		return sValue;
-	}
+    CFX_WideString sValue = pFormField->GetValue();
+    CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
+    ASSERT(pEnv);
+    if(!pEnv->IsJSInitiated())
+    {
+        bFormated = FALSE;
+        return sValue;
+    }
 
-	IFXJS_Runtime* pRuntime = m_pDocument->GetJsRuntime();
-	ASSERT(pRuntime != NULL);
+    IFXJS_Runtime* pRuntime = m_pDocument->GetJsRuntime();
+    ASSERT(pRuntime != NULL);
 
-	pRuntime->SetReaderDocument(m_pDocument);
+    pRuntime->SetReaderDocument(m_pDocument);
 
-	if (pFormField->GetFieldType() == FIELDTYPE_COMBOBOX)
-	{
-		if (pFormField->CountSelectedItems() > 0)
-		{
-			int index = pFormField->GetSelectedIndex(0);
-			if (index >= 0)
-				sValue = pFormField->GetOptionLabel(index);
-		}
-	}
+    if (pFormField->GetFieldType() == FIELDTYPE_COMBOBOX)
+    {
+        if (pFormField->CountSelectedItems() > 0)
+        {
+            int index = pFormField->GetSelectedIndex(0);
+            if (index >= 0)
+                sValue = pFormField->GetOptionLabel(index);
+        }
+    }
 
-	bFormated = FALSE;
+    bFormated = FALSE;
 
-	CPDF_AAction aAction = pFormField->GetAdditionalAction();
-	if (aAction != NULL && aAction.ActionExist(CPDF_AAction::Format))
-	{
-		CPDF_Action action = aAction.GetAction(CPDF_AAction::Format);
-		if (action)
-		{
-			CFX_WideString script = action.GetJavaScript();
-			if (!script.IsEmpty())
-			{
-				CFX_WideString Value = sValue;
+    CPDF_AAction aAction = pFormField->GetAdditionalAction();
+    if (aAction != NULL && aAction.ActionExist(CPDF_AAction::Format))
+    {
+        CPDF_Action action = aAction.GetAction(CPDF_AAction::Format);
+        if (action)
+        {
+            CFX_WideString script = action.GetJavaScript();
+            if (!script.IsEmpty())
+            {
+                CFX_WideString Value = sValue;
 
-				IFXJS_Context* pContext = pRuntime->NewContext();
-				ASSERT(pContext != NULL);
+                IFXJS_Context* pContext = pRuntime->NewContext();
+                ASSERT(pContext != NULL);
 
-				pContext->OnField_Format(pFormField, Value, TRUE);
+                pContext->OnField_Format(pFormField, Value, TRUE);
 
-				CFX_WideString sInfo;
- 				FX_BOOL bRet = pContext->RunScript(script, sInfo);
-				pRuntime->ReleaseContext(pContext);
+                CFX_WideString sInfo;
+                FX_BOOL bRet = pContext->RunScript(script, sInfo);
+                pRuntime->ReleaseContext(pContext);
 
-				if (bRet)
-				{
-					sValue = Value;
-					bFormated = TRUE;
-				}
-			}
-		}
-	}
+                if (bRet)
+                {
+                    sValue = Value;
+                    bFormated = TRUE;
+                }
+            }
+        }
+    }
 
-	return sValue;
+    return sValue;
 }
 
 void CPDFSDK_InterForm::ResetFieldAppearance(CPDF_FormField* pFormField, const FX_WCHAR* sValue, FX_BOOL bValueChanged)
 {
-	ASSERT(pFormField != NULL);
+    ASSERT(pFormField != NULL);
 
-	for (int i=0,sz=pFormField->CountControls(); i<sz; i++)
-	{
-		CPDF_FormControl* pFormCtrl = pFormField->GetControl(i);
-		ASSERT(pFormCtrl != NULL);
+    for (int i=0,sz=pFormField->CountControls(); i<sz; i++)
+    {
+        CPDF_FormControl* pFormCtrl = pFormField->GetControl(i);
+        ASSERT(pFormCtrl != NULL);
 
-		ASSERT(m_pInterForm != NULL);
-		if(CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl))
-			pWidget->ResetAppearance(sValue, bValueChanged);
-	}
+        ASSERT(m_pInterForm != NULL);
+        if(CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl))
+            pWidget->ResetAppearance(sValue, bValueChanged);
+    }
 }
 
 void CPDFSDK_InterForm::UpdateField(CPDF_FormField* pFormField)
 {
-	ASSERT(pFormField != NULL);
+    ASSERT(pFormField != NULL);
 
-	for (int i=0,sz=pFormField->CountControls(); i<sz; i++)
-	{
-		CPDF_FormControl* pFormCtrl = pFormField->GetControl(i);
-		ASSERT(pFormCtrl != NULL);
+    for (int i=0,sz=pFormField->CountControls(); i<sz; i++)
+    {
+        CPDF_FormControl* pFormCtrl = pFormField->GetControl(i);
+        ASSERT(pFormCtrl != NULL);
 
-		if(CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl))
-		{
-			CPDFDoc_Environment * pEnv = m_pDocument->GetEnv();
-			CFFL_IFormFiller* pIFormFiller = pEnv->GetIFormFiller();
+        if(CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl))
+        {
+            CPDFDoc_Environment * pEnv = m_pDocument->GetEnv();
+            CFFL_IFormFiller* pIFormFiller = pEnv->GetIFormFiller();
 
 			CPDFXFA_Page * pPage = pWidget->GetPDFXFAPage();
 			CPDFSDK_PageView * pPageView = m_pDocument->GetPageView(pPage,FALSE);
 
-			FX_RECT rcBBox = pIFormFiller->GetViewBBox(pPageView, pWidget);
+            FX_RECT rcBBox = pIFormFiller->GetViewBBox(pPageView, pWidget);
 
-			pEnv->FFI_Invalidate(pPage,rcBBox.left, rcBBox.top, rcBBox.right, rcBBox.bottom);
-		}
-	}
+            pEnv->FFI_Invalidate(pPage,rcBBox.left, rcBBox.top, rcBBox.right, rcBBox.bottom);
+        }
+    }
 }
 
 void CPDFSDK_InterForm::OnKeyStrokeCommit(CPDF_FormField* pFormField, CFX_WideString& csValue, FX_BOOL& bRC)
 {
-	ASSERT(pFormField != NULL);
+    ASSERT(pFormField != NULL);
 
- 	CPDF_AAction aAction = pFormField->GetAdditionalAction();
- 	if (aAction != NULL && aAction.ActionExist(CPDF_AAction::KeyStroke))
- 	{
- 		CPDF_Action action = aAction.GetAction(CPDF_AAction::KeyStroke);
- 		if (action)
- 		{
- 			ASSERT(m_pDocument != NULL);
- 			CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
- 			ASSERT(pEnv != NULL);
+    CPDF_AAction aAction = pFormField->GetAdditionalAction();
+    if (aAction != NULL && aAction.ActionExist(CPDF_AAction::KeyStroke))
+    {
+        CPDF_Action action = aAction.GetAction(CPDF_AAction::KeyStroke);
+        if (action)
+        {
+            ASSERT(m_pDocument != NULL);
+            CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
+            ASSERT(pEnv != NULL);
 
-			CPDFSDK_ActionHandler* pActionHandler = pEnv->GetActionHander();
-			ASSERT(pActionHandler != NULL);
+            CPDFSDK_ActionHandler* pActionHandler = pEnv->GetActionHander();
+            ASSERT(pActionHandler != NULL);
 
-			PDFSDK_FieldAction fa;
-			fa.bModifier = pEnv->FFI_IsCTRLKeyDown(0);
- 			fa.bShift = pEnv->FFI_IsSHIFTKeyDown(0);
-			fa.sValue = csValue;
+            PDFSDK_FieldAction fa;
+            fa.bModifier = pEnv->FFI_IsCTRLKeyDown(0);
+            fa.bShift = pEnv->FFI_IsSHIFTKeyDown(0);
+            fa.sValue = csValue;
 
-   			pActionHandler->DoAction_FieldJavaScript(action, CPDF_AAction::KeyStroke,
-   				m_pDocument, pFormField, fa);
-   			bRC = fa.bRC;
- 		}
- 	}
+            pActionHandler->DoAction_FieldJavaScript(action, CPDF_AAction::KeyStroke,
+                m_pDocument, pFormField, fa);
+            bRC = fa.bRC;
+        }
+    }
 }
 
 void CPDFSDK_InterForm::OnValidate(CPDF_FormField* pFormField, CFX_WideString& csValue, FX_BOOL& bRC)
 {
-	ASSERT(pFormField != NULL);
+    ASSERT(pFormField != NULL);
 
- 	CPDF_AAction aAction = pFormField->GetAdditionalAction();
- 	if (aAction != NULL && aAction.ActionExist(CPDF_AAction::Validate))
- 	{
- 		CPDF_Action action = aAction.GetAction(CPDF_AAction::Validate);
-		if (action)
- 		{
-			ASSERT(m_pDocument != NULL);
-			CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
-			ASSERT(pEnv != NULL);
+    CPDF_AAction aAction = pFormField->GetAdditionalAction();
+    if (aAction != NULL && aAction.ActionExist(CPDF_AAction::Validate))
+    {
+        CPDF_Action action = aAction.GetAction(CPDF_AAction::Validate);
+        if (action)
+        {
+            ASSERT(m_pDocument != NULL);
+            CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
+            ASSERT(pEnv != NULL);
 
-			CPDFSDK_ActionHandler* pActionHandler = pEnv->GetActionHander();
-			ASSERT(pActionHandler != NULL);
+            CPDFSDK_ActionHandler* pActionHandler = pEnv->GetActionHander();
+            ASSERT(pActionHandler != NULL);
 
-			PDFSDK_FieldAction fa;
-			fa.bModifier = pEnv->FFI_IsCTRLKeyDown(0);
-			fa.bShift = pEnv->FFI_IsSHIFTKeyDown(0);
-			fa.sValue = csValue;
+            PDFSDK_FieldAction fa;
+            fa.bModifier = pEnv->FFI_IsCTRLKeyDown(0);
+            fa.bShift = pEnv->FFI_IsSHIFTKeyDown(0);
+            fa.sValue = csValue;
 
-			pActionHandler->DoAction_FieldJavaScript(action, CPDF_AAction::Validate, m_pDocument, pFormField, fa);
-			bRC = fa.bRC;
+            pActionHandler->DoAction_FieldJavaScript(action, CPDF_AAction::Validate, m_pDocument, pFormField, fa);
+            bRC = fa.bRC;
 
-		}
- 	}
+        }
+    }
 }
 
 /* ----------------------------- action ----------------------------- */
 
 FX_BOOL CPDFSDK_InterForm::DoAction_Hide(const CPDF_Action& action)
 {
-	ASSERT(action);
+    ASSERT(action);
 
-	CPDF_ActionFields af = action.GetWidgets();
-	CFX_PtrArray fieldObjects;
-	af.GetAllFields(fieldObjects);
-	CFX_PtrArray widgetArray;
-	CFX_PtrArray fields;
-	GetFieldFromObjects(fieldObjects, fields);
+    CPDF_ActionFields af = action.GetWidgets();
+    CFX_PtrArray fieldObjects;
+    af.GetAllFields(fieldObjects);
+    CFX_PtrArray widgetArray;
+    CFX_PtrArray fields;
+    GetFieldFromObjects(fieldObjects, fields);
 
-	FX_BOOL bHide = action.GetHideStatus();
+    FX_BOOL bHide = action.GetHideStatus();
 
-	FX_BOOL bChanged = FALSE;
+    FX_BOOL bChanged = FALSE;
 
-	for (int i=0, sz=fields.GetSize(); i<sz; i++)
-	{
-		CPDF_FormField* pField = (CPDF_FormField*)fields[i];
-		ASSERT(pField != NULL);
+    for (int i=0, sz=fields.GetSize(); i<sz; i++)
+    {
+        CPDF_FormField* pField = (CPDF_FormField*)fields[i];
+        ASSERT(pField != NULL);
 
 
-		for (int j=0,jsz=pField->CountControls(); j<jsz; j++)
-		{
-			CPDF_FormControl* pControl = pField->GetControl(j);
-			ASSERT(pControl != NULL);
+        for (int j=0,jsz=pField->CountControls(); j<jsz; j++)
+        {
+            CPDF_FormControl* pControl = pField->GetControl(j);
+            ASSERT(pControl != NULL);
 
-			if (CPDFSDK_Widget* pWidget = GetWidget(pControl))
-			{
-				int nFlags = pWidget->GetFlags();
-				if (bHide)
-				{
-					nFlags &= (~ANNOTFLAG_INVISIBLE);
-					nFlags &= (~ANNOTFLAG_NOVIEW);
-					nFlags |= (ANNOTFLAG_HIDDEN);
-				}
-				else
-				{
-					nFlags &= (~ANNOTFLAG_INVISIBLE);
-					nFlags &= (~ANNOTFLAG_HIDDEN);
-					nFlags &= (~ANNOTFLAG_NOVIEW);
-				}
-				pWidget->SetFlags(nFlags);
+            if (CPDFSDK_Widget* pWidget = GetWidget(pControl))
+            {
+                int nFlags = pWidget->GetFlags();
+                if (bHide)
+                {
+                    nFlags &= (~ANNOTFLAG_INVISIBLE);
+                    nFlags &= (~ANNOTFLAG_NOVIEW);
+                    nFlags |= (ANNOTFLAG_HIDDEN);
+                }
+                else
+                {
+                    nFlags &= (~ANNOTFLAG_INVISIBLE);
+                    nFlags &= (~ANNOTFLAG_HIDDEN);
+                    nFlags &= (~ANNOTFLAG_NOVIEW);
+                }
+                pWidget->SetFlags(nFlags);
 
- 				CPDFSDK_PageView* pPageView = pWidget->GetPageView();
- 				ASSERT(pPageView != NULL);
+                CPDFSDK_PageView* pPageView = pWidget->GetPageView();
+                ASSERT(pPageView != NULL);
 
- 				pPageView->UpdateView(pWidget);
+                pPageView->UpdateView(pWidget);
 
-				bChanged = TRUE;
-			}
-		}
-	}
+                bChanged = TRUE;
+            }
+        }
+    }
 
-	return bChanged;
+    return bChanged;
 }
 
 FX_BOOL CPDFSDK_InterForm::DoAction_SubmitForm(const CPDF_Action& action)
 {
-	ASSERT(action);
-	ASSERT(m_pInterForm != NULL);
+    ASSERT(m_pInterForm != NULL);
+    CFX_WideString sDestination = action.GetFilePath();
+    if (sDestination.IsEmpty())
+        return FALSE;
 
-	CFX_WideString sDestination = action.GetFilePath();
-	if (sDestination.IsEmpty()) return FALSE;
+    CPDF_Dictionary* pActionDict = action.GetDict();
+    if (pActionDict->KeyExist("Fields"))
+    {
+        CPDF_ActionFields af = action.GetWidgets();
+        FX_DWORD dwFlags = action.GetFlags();
+        CFX_PtrArray fieldObjects;
+        af.GetAllFields(fieldObjects);
 
-	CPDF_Dictionary* pActionDict = action.GetDict();
-	if (pActionDict->KeyExist("Fields"))
-	{
-		CPDF_ActionFields af = action.GetWidgets();
-		FX_DWORD dwFlags = action.GetFlags();
+        CFX_PtrArray fields;
+        GetFieldFromObjects(fieldObjects, fields);
+        if (fields.GetSize() != 0)
+        {
+            FX_BOOL bIncludeOrExclude = !(dwFlags & 0x01);
+            if (m_pInterForm->CheckRequiredFields(&fields, bIncludeOrExclude))
+                return FALSE;
 
-		CFX_PtrArray fieldObjects;
-		af.GetAllFields(fieldObjects);
-		CFX_PtrArray fields;
-		GetFieldFromObjects(fieldObjects, fields);
+            return SubmitFields(sDestination, fields, bIncludeOrExclude, FALSE);
+        }
+    }
+    if (m_pInterForm->CheckRequiredFields())
+        return FALSE;
 
-		if (fields.GetSize() != 0)
-		{
-			FX_BOOL bIncludeOrExclude = !(dwFlags & 0x01);
-			if (m_pInterForm->CheckRequiredFields(&fields, bIncludeOrExclude))
-			{
-				return FALSE;
-			}
-			return SubmitFields(sDestination, fields, bIncludeOrExclude, FALSE);
-		}
-		else
-		{
-			if ( m_pInterForm->CheckRequiredFields())
-			{
-				return FALSE;
-			}
-
-			return SubmitForm(sDestination, FALSE);
-		}
-	}
-	else
-	{
-		if ( m_pInterForm->CheckRequiredFields())
-		{
-			return FALSE;
-		}
-
-		return SubmitForm(sDestination, FALSE);
-	}
+    return SubmitForm(sDestination, FALSE);
 }
 
 FX_BOOL CPDFSDK_InterForm::SubmitFields(const CFX_WideString& csDestination, const CFX_PtrArray& fields,
-									FX_BOOL bIncludeOrExclude, FX_BOOL bUrlEncoded)
+                                    FX_BOOL bIncludeOrExclude, FX_BOOL bUrlEncoded)
 {
-	CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
-	ASSERT(pEnv != NULL);
+    CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
+    ASSERT(pEnv != NULL);
 
-	CFX_ByteTextBuf textBuf;
-	ExportFieldsToFDFTextBuf(fields, bIncludeOrExclude, textBuf);
+    CFX_ByteTextBuf textBuf;
+    ExportFieldsToFDFTextBuf(fields, bIncludeOrExclude, textBuf);
 
-	uint8_t* pBuffer = textBuf.GetBuffer();
-	FX_STRSIZE nBufSize = textBuf.GetLength();
+    uint8_t* pBuffer = textBuf.GetBuffer();
+    FX_STRSIZE nBufSize = textBuf.GetLength();
 
-	if (bUrlEncoded)
-	{
-		if(!FDFToURLEncodedData(pBuffer, nBufSize))
-			return FALSE;
-	}
+    if (bUrlEncoded)
+    {
+        if(!FDFToURLEncodedData(pBuffer, nBufSize))
+            return FALSE;
+    }
 
-	pEnv->JS_docSubmitForm(pBuffer, nBufSize, csDestination.c_str());
+    pEnv->JS_docSubmitForm(pBuffer, nBufSize, csDestination.c_str());
 
-	return TRUE;
+    return TRUE;
 }
 
 void CPDFSDK_InterForm::DoFDFBuffer(CFX_ByteString sBuffer)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (CFDF_Document *pFDFDocument = CFDF_Document::ParseMemory((const unsigned char *)sBuffer.GetBuffer(sBuffer.GetLength()), sBuffer.GetLength()))
-	{
-		CPDF_Dictionary* pRootDic = pFDFDocument->GetRoot();
-		if(pRootDic)
-		{
-			CPDF_Dictionary * pFDFDict=pRootDic->GetDict("FDF");
-			if(pFDFDict)
-			{
-				CPDF_Dictionary * pJSDict = pFDFDict->GetDict("JavaScript");
-				if(pJSDict)
-				{
-					CFX_WideString csJS;
+    if (CFDF_Document *pFDFDocument = CFDF_Document::ParseMemory((const unsigned char *)sBuffer.GetBuffer(sBuffer.GetLength()), sBuffer.GetLength()))
+    {
+        CPDF_Dictionary* pRootDic = pFDFDocument->GetRoot();
+        if(pRootDic)
+        {
+            CPDF_Dictionary * pFDFDict=pRootDic->GetDict("FDF");
+            if(pFDFDict)
+            {
+                CPDF_Dictionary * pJSDict = pFDFDict->GetDict("JavaScript");
+                if(pJSDict)
+                {
+                    CFX_WideString csJS;
 
-					CPDF_Object* pJS = pJSDict->GetElementValue("Before");
-					if (pJS != NULL)
-					{
-						int iType = pJS->GetType();
-						if (iType == PDFOBJ_STRING)
-							csJS = pJSDict->GetUnicodeText("Before");
-						else if (iType == PDFOBJ_STREAM)
-							csJS = pJS->GetUnicodeText();
-					}
+                    CPDF_Object* pJS = pJSDict->GetElementValue("Before");
+                    if (pJS != NULL)
+                    {
+                        int iType = pJS->GetType();
+                        if (iType == PDFOBJ_STRING)
+                            csJS = pJSDict->GetUnicodeText("Before");
+                        else if (iType == PDFOBJ_STREAM)
+                            csJS = pJS->GetUnicodeText();
+                    }
 
-				}
-			}
-		}
-		delete pFDFDocument;
-	}
+                }
+            }
+        }
+        delete pFDFDocument;
+    }
 
-	sBuffer.ReleaseBuffer();
+    sBuffer.ReleaseBuffer();
 }
 
 FX_BOOL CPDFSDK_InterForm::FDFToURLEncodedData(CFX_WideString csFDFFile, CFX_WideString csTxtFile)
 {
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL CPDFSDK_InterForm::FDFToURLEncodedData(uint8_t*& pBuf, FX_STRSIZE& nBufSize)
 {
- 	CFDF_Document* pFDF = CFDF_Document::ParseMemory(pBuf, nBufSize);
- 	if (pFDF)
- 	{
- 		CPDF_Dictionary* pMainDict = pFDF->GetRoot()->GetDict("FDF");
- 		if (pMainDict == NULL) return FALSE;
+    CFDF_Document* pFDF = CFDF_Document::ParseMemory(pBuf, nBufSize);
+    if (pFDF)
+    {
+        CPDF_Dictionary* pMainDict = pFDF->GetRoot()->GetDict("FDF");
+        if (pMainDict == NULL) return FALSE;
 
- 		// Get fields
- 		CPDF_Array* pFields = pMainDict->GetArray("Fields");
- 		if (pFields == NULL) return FALSE;
+        // Get fields
+        CPDF_Array* pFields = pMainDict->GetArray("Fields");
+        if (pFields == NULL) return FALSE;
 
-		CFX_ByteTextBuf fdfEncodedData;
+        CFX_ByteTextBuf fdfEncodedData;
 
- 		for (FX_DWORD i = 0; i < pFields->GetCount(); i ++)
- 		{
- 			CPDF_Dictionary* pField = pFields->GetDict(i);
- 			if (pField == NULL) continue;
- 			CFX_WideString name;
- 			name = pField->GetUnicodeText("T");
- 			CFX_ByteString name_b = CFX_ByteString::FromUnicode(name);
- 			CFX_ByteString csBValue = pField->GetString("V");
- 			CFX_WideString csWValue = PDF_DecodeText(csBValue);
- 			CFX_ByteString csValue_b = CFX_ByteString::FromUnicode(csWValue);
+        for (FX_DWORD i = 0; i < pFields->GetCount(); i ++)
+        {
+            CPDF_Dictionary* pField = pFields->GetDict(i);
+            if (pField == NULL) continue;
+            CFX_WideString name;
+            name = pField->GetUnicodeText("T");
+            CFX_ByteString name_b = CFX_ByteString::FromUnicode(name);
+            CFX_ByteString csBValue = pField->GetString("V");
+            CFX_WideString csWValue = PDF_DecodeText(csBValue);
+            CFX_ByteString csValue_b = CFX_ByteString::FromUnicode(csWValue);
 
-			fdfEncodedData = fdfEncodedData<<name_b.GetBuffer(name_b.GetLength());
-  			name_b.ReleaseBuffer();
-			fdfEncodedData = fdfEncodedData<<"=";
-			fdfEncodedData = fdfEncodedData<<csValue_b.GetBuffer(csValue_b.GetLength());
-  			csValue_b.ReleaseBuffer();
-  			if(i != pFields->GetCount()-1)
-  				fdfEncodedData = fdfEncodedData<<"&";
- 		}
+            fdfEncodedData = fdfEncodedData<<name_b.GetBuffer(name_b.GetLength());
+            name_b.ReleaseBuffer();
+            fdfEncodedData = fdfEncodedData<<"=";
+            fdfEncodedData = fdfEncodedData<<csValue_b.GetBuffer(csValue_b.GetLength());
+            csValue_b.ReleaseBuffer();
+            if(i != pFields->GetCount()-1)
+                fdfEncodedData = fdfEncodedData<<"&";
+        }
 
-		nBufSize = fdfEncodedData.GetLength();
-		pBuf = FX_Alloc(uint8_t, nBufSize);
-		FXSYS_memcpy(pBuf, fdfEncodedData.GetBuffer(), nBufSize);
- 	}
-	return TRUE;
+        nBufSize = fdfEncodedData.GetLength();
+        pBuf = FX_Alloc(uint8_t, nBufSize);
+        FXSYS_memcpy(pBuf, fdfEncodedData.GetBuffer(), nBufSize);
+    }
+    return TRUE;
 }
 
 FX_BOOL CPDFSDK_InterForm::ExportFieldsToFDFTextBuf(const CFX_PtrArray& fields,FX_BOOL bIncludeOrExclude, CFX_ByteTextBuf& textBuf)
 {
-	ASSERT(m_pDocument != NULL);
-	ASSERT(m_pInterForm != NULL);
+    ASSERT(m_pDocument != NULL);
+    ASSERT(m_pInterForm != NULL);
 
-	CFDF_Document* pFDF = m_pInterForm->ExportToFDF(m_pDocument->GetPath(),(CFX_PtrArray&)fields, bIncludeOrExclude);
-	if (!pFDF) return FALSE;
-	FX_BOOL bRet = pFDF->WriteBuf(textBuf); // = FALSE;//
-	delete pFDF;
+    CFDF_Document* pFDF = m_pInterForm->ExportToFDF(m_pDocument->GetPath(),(CFX_PtrArray&)fields, bIncludeOrExclude);
+    if (!pFDF) return FALSE;
+    FX_BOOL bRet = pFDF->WriteBuf(textBuf); // = FALSE;//
+    delete pFDF;
 
-	return bRet;
+    return bRet;
 }
 
 void CPDFSDK_InterForm::SynchronizeField(CPDF_FormField* pFormField, FX_BOOL bSynchronizeElse)
@@ -3110,142 +3082,134 @@
 
 CFX_WideString CPDFSDK_InterForm::GetTemporaryFileName(const CFX_WideString& sFileExt)
 {
-	CFX_WideString sFileName;
-	return L"";
+    CFX_WideString sFileName;
+    return L"";
 }
 
 FX_BOOL CPDFSDK_InterForm::SubmitForm(const CFX_WideString& sDestination, FX_BOOL bUrlEncoded)
 {
- 	if (sDestination.IsEmpty()) return FALSE;
+    if (sDestination.IsEmpty()) return FALSE;
 
-	CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
-	ASSERT(pEnv != NULL);
+    CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
+    ASSERT(pEnv != NULL);
 
-	if(NULL == m_pDocument) return FALSE;
-	CFX_WideString wsPDFFilePath = m_pDocument->GetPath();
+    if(NULL == m_pDocument) return FALSE;
+    CFX_WideString wsPDFFilePath = m_pDocument->GetPath();
 
-	if(NULL == m_pInterForm) return FALSE;
-	CFDF_Document* pFDFDoc = m_pInterForm->ExportToFDF(wsPDFFilePath);
-	if (NULL == pFDFDoc) return FALSE;
+    if(NULL == m_pInterForm) return FALSE;
+    CFDF_Document* pFDFDoc = m_pInterForm->ExportToFDF(wsPDFFilePath);
+    if (NULL == pFDFDoc) return FALSE;
 
-	CFX_ByteTextBuf FdfBuffer;
-	FX_BOOL bRet = pFDFDoc->WriteBuf(FdfBuffer);
-	delete pFDFDoc;
-	if (!bRet) return FALSE;
+    CFX_ByteTextBuf FdfBuffer;
+    FX_BOOL bRet = pFDFDoc->WriteBuf(FdfBuffer);
+    delete pFDFDoc;
+    if (!bRet) return FALSE;
 
-	uint8_t* pBuffer = FdfBuffer.GetBuffer();
-	FX_STRSIZE nBufSize = FdfBuffer.GetLength();
+    uint8_t* pBuffer = FdfBuffer.GetBuffer();
+    FX_STRSIZE nBufSize = FdfBuffer.GetLength();
 
-	if (bUrlEncoded)
-	{
-		if(!FDFToURLEncodedData(pBuffer, nBufSize))
-			return FALSE;
-	}
+    if (bUrlEncoded)
+    {
+        if(!FDFToURLEncodedData(pBuffer, nBufSize))
+            return FALSE;
+    }
 
-	pEnv->JS_docSubmitForm(pBuffer, nBufSize, sDestination.c_str());
+    pEnv->JS_docSubmitForm(pBuffer, nBufSize, sDestination.c_str());
 
-	if (bUrlEncoded && pBuffer)
-	{
-		FX_Free(pBuffer);
-		pBuffer = NULL;
-	}
+    if (bUrlEncoded && pBuffer)
+    {
+        FX_Free(pBuffer);
+        pBuffer = NULL;
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL CPDFSDK_InterForm::ExportFormToFDFTextBuf(CFX_ByteTextBuf& textBuf)
 {
 
-	ASSERT(m_pInterForm != NULL);
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pInterForm != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	CFDF_Document* pFDF = m_pInterForm->ExportToFDF(m_pDocument->GetPath());
-	if (!pFDF) return FALSE;
+    CFDF_Document* pFDF = m_pInterForm->ExportToFDF(m_pDocument->GetPath());
+    if (!pFDF) return FALSE;
 
-	FX_BOOL bRet = pFDF->WriteBuf(textBuf);
-	delete pFDF;
+    FX_BOOL bRet = pFDF->WriteBuf(textBuf);
+    delete pFDF;
 
-	return bRet;
+    return bRet;
 }
 
 
 FX_BOOL CPDFSDK_InterForm::DoAction_ResetForm(const CPDF_Action& action)
 {
-	ASSERT(action);
+    ASSERT(action);
 
-	CPDF_Dictionary* pActionDict = action.GetDict();
-	if (pActionDict->KeyExist("Fields"))
-	{
-		CPDF_ActionFields af = action.GetWidgets();
-		FX_DWORD dwFlags = action.GetFlags();
+    CPDF_Dictionary* pActionDict = action.GetDict();
+    if (pActionDict->KeyExist("Fields"))
+    {
+        CPDF_ActionFields af = action.GetWidgets();
+        FX_DWORD dwFlags = action.GetFlags();
 
-		CFX_PtrArray fieldObjects;
-		af.GetAllFields(fieldObjects);
-		CFX_PtrArray fields;
-		GetFieldFromObjects(fieldObjects, fields);
-		return m_pInterForm->ResetForm(fields, !(dwFlags & 0x01), TRUE);
-	}
+        CFX_PtrArray fieldObjects;
+        af.GetAllFields(fieldObjects);
+        CFX_PtrArray fields;
+        GetFieldFromObjects(fieldObjects, fields);
+        return m_pInterForm->ResetForm(fields, !(dwFlags & 0x01), TRUE);
+    }
 
-	return m_pInterForm->ResetForm(TRUE);
+    return m_pInterForm->ResetForm(TRUE);
 }
 
 FX_BOOL CPDFSDK_InterForm::DoAction_ImportData(const CPDF_Action& action)
 {
-	return FALSE;
+    return FALSE;
 }
 
 void CPDFSDK_InterForm::GetFieldFromObjects(const CFX_PtrArray& objects, CFX_PtrArray& fields)
 {
-	ASSERT(m_pInterForm != NULL);
+    ASSERT(m_pInterForm != NULL);
 
-	int iCount = objects.GetSize();
-	for (int i = 0; i < iCount; i ++)
-	{
-		CPDF_Object* pObject = (CPDF_Object*)objects[i];
-		if (pObject == NULL) continue;
+    int iCount = objects.GetSize();
+    for (int i = 0; i < iCount; i ++)
+    {
+        CPDF_Object* pObject = (CPDF_Object*)objects[i];
+        if (pObject == NULL) continue;
 
-		int iType = pObject->GetType();
-		if (iType == PDFOBJ_STRING)
-		{
-			CFX_WideString csName = pObject->GetUnicodeText();
-			CPDF_FormField* pField = m_pInterForm->GetField(0, csName);
-			if (pField != NULL)
-				fields.Add(pField);
-		}
-		else if (iType == PDFOBJ_DICTIONARY)
-		{
-			if (m_pInterForm->IsValidFormField(pObject))
-				fields.Add(pObject);
-		}
-	}
+        int iType = pObject->GetType();
+        if (iType == PDFOBJ_STRING)
+        {
+            CFX_WideString csName = pObject->GetUnicodeText();
+            CPDF_FormField* pField = m_pInterForm->GetField(0, csName);
+            if (pField != NULL)
+                fields.Add(pField);
+        }
+        else if (iType == PDFOBJ_DICTIONARY)
+        {
+            if (m_pInterForm->IsValidFormField(pObject))
+                fields.Add(pObject);
+        }
+    }
 }
 
 /* ----------------------------- CPDF_FormNotify ----------------------------- */
 
-int	CPDFSDK_InterForm::BeforeValueChange(const CPDF_FormField* pField, CFX_WideString& csValue)
+int CPDFSDK_InterForm::BeforeValueChange(const CPDF_FormField* pField, CFX_WideString& csValue)
 {
-	ASSERT(pField != NULL);
-
-	CPDF_FormField* pFormField = (CPDF_FormField*)pField;
-
-	int nType = pFormField->GetFieldType();
-	if (nType == FIELDTYPE_COMBOBOX || nType == FIELDTYPE_TEXTFIELD)
-	{
-		FX_BOOL bRC = TRUE;
-		OnKeyStrokeCommit(pFormField, csValue, bRC);
-		if (bRC)
-		{
-			OnValidate(pFormField, csValue, bRC);
-			if (bRC)
-				return 1;
-			else
-				return -1;
-		}
-		else
-			return -1;
-	}
-	else
-		return 0;
+    CPDF_FormField* pFormField = (CPDF_FormField*)pField;
+    int nType = pFormField->GetFieldType();
+    if (nType == FIELDTYPE_COMBOBOX || nType == FIELDTYPE_TEXTFIELD)
+    {
+        FX_BOOL bRC = TRUE;
+        OnKeyStrokeCommit(pFormField, csValue, bRC);
+        if (bRC)
+        {
+            OnValidate(pFormField, csValue, bRC);
+            return bRC ? 1 : -1;
+        }
+        return -1;
+    }
+    return 0;
 }
 
 int	CPDFSDK_InterForm::AfterValueChange(const CPDF_FormField* pField)
@@ -3273,82 +3237,65 @@
 	return 0;
 }
 
-int	CPDFSDK_InterForm::BeforeSelectionChange(const CPDF_FormField* pField, CFX_WideString& csValue)
+int CPDFSDK_InterForm::BeforeSelectionChange(const CPDF_FormField* pField, CFX_WideString& csValue)
 {
-	ASSERT(pField != NULL);
+    CPDF_FormField* pFormField = (CPDF_FormField*)pField;
+    if (pFormField->GetFieldType() != FIELDTYPE_LISTBOX)
+        return 0;
 
-	CPDF_FormField* pFormField = (CPDF_FormField*)pField;
+    FX_BOOL bRC = TRUE;
+    OnKeyStrokeCommit(pFormField, csValue, bRC);
+    if (!bRC)
+        return -1;
 
-	int nType = pFormField->GetFieldType();
-	if (nType == FIELDTYPE_LISTBOX)
-	{
-		FX_BOOL bRC = TRUE;
-		OnKeyStrokeCommit(pFormField, csValue, bRC);
-		if (bRC)
-		{
-			OnValidate(pFormField, csValue, bRC);
-			if (bRC)
-				return 1;
-			else
-				return -1;
-		}
-		else
-			return -1;
-	}
-	else
-		return 0;
+    OnValidate(pFormField, csValue, bRC);
+    if (!bRC)
+        return -1;
+
+    return 1;
 }
 
-int	CPDFSDK_InterForm::AfterSelectionChange(const CPDF_FormField* pField)
+int CPDFSDK_InterForm::AfterSelectionChange(const CPDF_FormField* pField)
 {
-	ASSERT(pField != NULL);
-
-	CPDF_FormField* pFormField = (CPDF_FormField*)pField;
-	int nType = pFormField->GetFieldType();
-
-	if (nType == FIELDTYPE_LISTBOX)
-	{
-		OnCalculate(pFormField);
-		ResetFieldAppearance(pFormField, NULL, TRUE);
-		UpdateField(pFormField);
-	}
-
-	return 0;
+    CPDF_FormField* pFormField = (CPDF_FormField*)pField;
+    if (pFormField->GetFieldType() == FIELDTYPE_LISTBOX)
+    {
+        OnCalculate(pFormField);
+        ResetFieldAppearance(pFormField, NULL, TRUE);
+        UpdateField(pFormField);
+    }
+    return 0;
 }
 
-int	CPDFSDK_InterForm::AfterCheckedStatusChange(const CPDF_FormField* pField, const CFX_ByteArray& statusArray)
+int CPDFSDK_InterForm::AfterCheckedStatusChange(const CPDF_FormField* pField, const CFX_ByteArray& statusArray)
 {
-	ASSERT(pField != NULL);
-
-	CPDF_FormField* pFormField = (CPDF_FormField*)pField;
-	int nType = pFormField->GetFieldType();
-
-	if (nType == FIELDTYPE_CHECKBOX || nType == FIELDTYPE_RADIOBUTTON)
-	{
-		OnCalculate(pFormField);
-		UpdateField(pFormField);
-	}
-
-	return 0;
+    CPDF_FormField* pFormField = (CPDF_FormField*)pField;
+    int nType = pFormField->GetFieldType();
+    if (nType == FIELDTYPE_CHECKBOX || nType == FIELDTYPE_RADIOBUTTON)
+    {
+        OnCalculate(pFormField);
+        UpdateField(pFormField);
+    }
+    return 0;
 }
 
-int	CPDFSDK_InterForm::BeforeFormReset(const CPDF_InterForm* pForm)
+int CPDFSDK_InterForm::BeforeFormReset(const CPDF_InterForm* pForm)
 {
-	return 0;
+    return 0;
 }
 
-int	CPDFSDK_InterForm::AfterFormReset(const CPDF_InterForm* pForm)
+int CPDFSDK_InterForm::AfterFormReset(const CPDF_InterForm* pForm)
 {
     OnCalculate(nullptr);
     return 0;
 }
 
-int	CPDFSDK_InterForm::BeforeFormImportData(const CPDF_InterForm* pForm)
+int CPDFSDK_InterForm::BeforeFormImportData(const CPDF_InterForm* pForm)
 {
-	return 0;
+    return 0;
 }
 
-int	CPDFSDK_InterForm::AfterFormImportData(const CPDF_InterForm* pForm)
+int CPDFSDK_InterForm::AfterFormImportData(const CPDF_InterForm* pForm)
 {
     OnCalculate(nullptr);
     return 0;
@@ -3391,347 +3338,333 @@
 
 FX_COLORREF CPDFSDK_InterForm::GetHighlightColor(int nFieldType)
 {
-	if(nFieldType <0 || nFieldType >7) return FXSYS_RGB(255,255,255);
-	if(nFieldType == 0)
+	if (nFieldType < 0 || nFieldType > 7)
+        return FXSYS_RGB(255,255,255);
+	if (nFieldType == 0)
 		return m_aHighlightColor[0];
-	else
-		return m_aHighlightColor[nFieldType-1];
+    return m_aHighlightColor[nFieldType-1];
 }
 
 /* ------------------------- CBA_AnnotIterator ------------------------- */
 
 CBA_AnnotIterator::CBA_AnnotIterator(CPDFSDK_PageView* pPageView, const CFX_ByteString& sType, const CFX_ByteString& sSubType)
-	:m_pPageView(pPageView),
-	m_sType(sType),
-	m_sSubType(sSubType),
-	m_nTabs(BAI_STRUCTURE)
+    :m_pPageView(pPageView),
+    m_sType(sType),
+    m_sSubType(sSubType),
+    m_nTabs(BAI_STRUCTURE)
 {
-	ASSERT(m_pPageView != NULL);
+    ASSERT(m_pPageView != NULL);
 
-	CPDF_Page* pPDFPage = m_pPageView->GetPDFPage();
-	ASSERT(pPDFPage != NULL);
-	ASSERT(pPDFPage->m_pFormDict != NULL);
+    CPDF_Page* pPDFPage = m_pPageView->GetPDFPage();
+    ASSERT(pPDFPage != NULL);
+    ASSERT(pPDFPage->m_pFormDict != NULL);
 
-	CFX_ByteString sTabs = pPDFPage->m_pFormDict->GetString("Tabs");
+    CFX_ByteString sTabs = pPDFPage->m_pFormDict->GetString("Tabs");
 
-	if (sTabs == "R")
-	{
-		m_nTabs = BAI_ROW;
-	}
-	else if (sTabs == "C")
-	{
-		m_nTabs = BAI_COLUMN;
-	}
-	else
-	{
-		m_nTabs = BAI_STRUCTURE;
-	}
+    if (sTabs == "R")
+    {
+        m_nTabs = BAI_ROW;
+    }
+    else if (sTabs == "C")
+    {
+        m_nTabs = BAI_COLUMN;
+    }
+    else
+    {
+        m_nTabs = BAI_STRUCTURE;
+    }
 
-	GenerateResults();
+    GenerateResults();
 }
 
 CBA_AnnotIterator::~CBA_AnnotIterator()
 {
-	m_Annots.RemoveAll();
+    m_Annots.RemoveAll();
 }
 
 CPDFSDK_Annot* CBA_AnnotIterator::GetFirstAnnot()
 {
-	if (m_Annots.GetSize() > 0)
-		return m_Annots[0];
+    if (m_Annots.GetSize() > 0)
+        return m_Annots[0];
 
-	return NULL;
+    return NULL;
 }
 
 CPDFSDK_Annot* CBA_AnnotIterator::GetLastAnnot()
 {
-	if (m_Annots.GetSize() > 0)
-		return m_Annots[m_Annots.GetSize() - 1];
+    if (m_Annots.GetSize() > 0)
+        return m_Annots[m_Annots.GetSize() - 1];
 
-	return NULL;
+    return NULL;
 }
 
 CPDFSDK_Annot* CBA_AnnotIterator::GetNextAnnot(CPDFSDK_Annot* pAnnot)
 {
-	for (int i=0,sz=m_Annots.GetSize(); i<sz; i++)
-	{
-		if (m_Annots[i] == pAnnot)
-		{
-			if (i+1 < sz)
-				return m_Annots[i+1];
-			else
-				return m_Annots[0];
-		}
-	}
-
-	return NULL;
+    for (int i = 0, sz = m_Annots.GetSize(); i < sz; ++i) {
+        if (m_Annots[i] == pAnnot)
+            return (i + 1 < sz) ? m_Annots[i+1] : m_Annots[0];
+    }
+    return NULL;
 }
 
 CPDFSDK_Annot* CBA_AnnotIterator::GetPrevAnnot(CPDFSDK_Annot* pAnnot)
 {
-	for (int i=0,sz=m_Annots.GetSize(); i<sz; i++)
-	{
-		if (m_Annots[i] == pAnnot)
-		{
-			if (i-1 >= 0)
-				return m_Annots[i-1];
-			else
-				return m_Annots[sz-1];
-		}
-	}
-
-	return NULL;
+    for (int i = 0, sz = m_Annots.GetSize(); i < sz; ++i) {
+        if (m_Annots[i] == pAnnot)
+            return (i - 1 >= 0) ? m_Annots[i-1] : m_Annots[sz-1];
+    }
+    return NULL;
 }
 
 int CBA_AnnotIterator::CompareByLeft(CPDFSDK_Annot* p1, CPDFSDK_Annot* p2)
 {
-	ASSERT(p1 != NULL);
-	ASSERT(p2 != NULL);
+    ASSERT(p1);
+    ASSERT(p2);
 
-	CPDF_Rect rcAnnot1 = GetAnnotRect(p1);
-	CPDF_Rect rcAnnot2 = GetAnnotRect(p2);
+    CPDF_Rect rcAnnot1 = GetAnnotRect(p1);
+    CPDF_Rect rcAnnot2 = GetAnnotRect(p2);
 
-	if (rcAnnot1.left < rcAnnot2.left)
-		return -1;
-	if (rcAnnot1.left > rcAnnot2.left)
-		return 1;
-	return 0;
+    if (rcAnnot1.left < rcAnnot2.left)
+        return -1;
+    if (rcAnnot1.left > rcAnnot2.left)
+        return 1;
+    return 0;
 }
 
 
 int CBA_AnnotIterator::CompareByTop(CPDFSDK_Annot* p1, CPDFSDK_Annot* p2)
 {
-	ASSERT(p1 != NULL);
-	ASSERT(p2 != NULL);
+    ASSERT(p1 != NULL);
+    ASSERT(p2 != NULL);
 
-	CPDF_Rect rcAnnot1 = GetAnnotRect(p1);
-	CPDF_Rect rcAnnot2 = GetAnnotRect(p2);
+    CPDF_Rect rcAnnot1 = GetAnnotRect(p1);
+    CPDF_Rect rcAnnot2 = GetAnnotRect(p2);
 
-	if (rcAnnot1.top < rcAnnot2.top)
-		return -1;
-	if (rcAnnot1.top > rcAnnot2.top)
-		return 1;
-	return 0;
+    if (rcAnnot1.top < rcAnnot2.top)
+        return -1;
+    if (rcAnnot1.top > rcAnnot2.top)
+        return 1;
+    return 0;
 }
 
 void CBA_AnnotIterator::GenerateResults()
 {
-	ASSERT(m_pPageView != NULL);
+    ASSERT(m_pPageView != NULL);
 
-	switch (m_nTabs)
-	{
-	case BAI_STRUCTURE:
-		{
-			for (int i=0,sz=m_pPageView->CountAnnots(); i<sz; i++)
-			{
-				CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i);
-				ASSERT(pAnnot != NULL);
+    switch (m_nTabs)
+    {
+    case BAI_STRUCTURE:
+        {
+            for (int i=0,sz=m_pPageView->CountAnnots(); i<sz; i++)
+            {
+                CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i);
+                ASSERT(pAnnot != NULL);
 
-				if (pAnnot->GetType() == m_sType
-					&& pAnnot->GetSubType() == m_sSubType)
-					m_Annots.Add(pAnnot);
-			}
-		}
-		break;
-	case BAI_ROW:
-		{
-			CPDFSDK_SortAnnots sa;
+                if (pAnnot->GetType() == m_sType
+                    && pAnnot->GetSubType() == m_sSubType)
+                    m_Annots.Add(pAnnot);
+            }
+        }
+        break;
+    case BAI_ROW:
+        {
+            CPDFSDK_SortAnnots sa;
 
-			{
+            {
 
-				for (int i=0,sz=m_pPageView->CountAnnots(); i<sz; i++)
-				{
-					CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i);
-					ASSERT(pAnnot != NULL);
+                for (int i=0,sz=m_pPageView->CountAnnots(); i<sz; i++)
+                {
+                    CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i);
+                    ASSERT(pAnnot != NULL);
 
-					if (pAnnot->GetType() == m_sType
-						&& pAnnot->GetSubType() == m_sSubType)
-						sa.Add(pAnnot);
-				}
-			}
+                    if (pAnnot->GetType() == m_sType
+                        && pAnnot->GetSubType() == m_sSubType)
+                        sa.Add(pAnnot);
+                }
+            }
 
-			if (sa.GetSize() > 0)
-			{
-				sa.Sort(CBA_AnnotIterator::CompareByLeft);
-			}
+            if (sa.GetSize() > 0)
+            {
+                sa.Sort(CBA_AnnotIterator::CompareByLeft);
+            }
 
-			while (sa.GetSize() > 0)
-			{
-				int nLeftTopIndex = -1;
+            while (sa.GetSize() > 0)
+            {
+                int nLeftTopIndex = -1;
 
-				{
-					FX_FLOAT fTop = 0.0f;
+                {
+                    FX_FLOAT fTop = 0.0f;
 
-					for (int i=sa.GetSize()-1; i>=0; i--)
-					{
-						CPDFSDK_Annot* pAnnot = sa.GetAt(i);
-						ASSERT(pAnnot != NULL);
+                    for (int i=sa.GetSize()-1; i>=0; i--)
+                    {
+                        CPDFSDK_Annot* pAnnot = sa.GetAt(i);
+                        ASSERT(pAnnot != NULL);
 
-						CPDF_Rect rcAnnot = GetAnnotRect(pAnnot);
+                        CPDF_Rect rcAnnot = GetAnnotRect(pAnnot);
 
-						if (rcAnnot.top > fTop)
-						{
-							nLeftTopIndex = i;
-							fTop = rcAnnot.top;
-						}
-					}
-				}
+                        if (rcAnnot.top > fTop)
+                        {
+                            nLeftTopIndex = i;
+                            fTop = rcAnnot.top;
+                        }
+                    }
+                }
 
-				if (nLeftTopIndex >= 0)
-				{
-					CPDFSDK_Annot* pLeftTopAnnot = sa.GetAt(nLeftTopIndex);
-					ASSERT(pLeftTopAnnot != NULL);
+                if (nLeftTopIndex >= 0)
+                {
+                    CPDFSDK_Annot* pLeftTopAnnot = sa.GetAt(nLeftTopIndex);
+                    ASSERT(pLeftTopAnnot != NULL);
 
-					CPDF_Rect rcLeftTop = GetAnnotRect(pLeftTopAnnot);
+                    CPDF_Rect rcLeftTop = GetAnnotRect(pLeftTopAnnot);
 
-					m_Annots.Add(pLeftTopAnnot);
-					sa.RemoveAt(nLeftTopIndex);
+                    m_Annots.Add(pLeftTopAnnot);
+                    sa.RemoveAt(nLeftTopIndex);
 
-					CFX_ArrayTemplate<int> aSelect;
+                    CFX_ArrayTemplate<int> aSelect;
 
-					{
-						for (int i=0,sz=sa.GetSize(); i<sz; i++)
-						{
-							CPDFSDK_Annot* pAnnot = sa.GetAt(i);
-							ASSERT(pAnnot != NULL);
+                    {
+                        for (int i=0,sz=sa.GetSize(); i<sz; i++)
+                        {
+                            CPDFSDK_Annot* pAnnot = sa.GetAt(i);
+                            ASSERT(pAnnot != NULL);
 
-							CPDF_Rect rcAnnot = GetAnnotRect(pAnnot);
+                            CPDF_Rect rcAnnot = GetAnnotRect(pAnnot);
 
-							FX_FLOAT fCenterY = (rcAnnot.top + rcAnnot.bottom) / 2.0f;
+                            FX_FLOAT fCenterY = (rcAnnot.top + rcAnnot.bottom) / 2.0f;
 
-							if (fCenterY > rcLeftTop.bottom && fCenterY < rcLeftTop.top)
-								aSelect.Add(i);
-						}
-					}
+                            if (fCenterY > rcLeftTop.bottom && fCenterY < rcLeftTop.top)
+                                aSelect.Add(i);
+                        }
+                    }
 
-					{
-						for (int i=0,sz=aSelect.GetSize(); i<sz; i++)
-						{
-							m_Annots.Add(sa[aSelect[i]]);
-						}
-					}
+                    {
+                        for (int i=0,sz=aSelect.GetSize(); i<sz; i++)
+                        {
+                            m_Annots.Add(sa[aSelect[i]]);
+                        }
+                    }
 
-					{
-						for (int i=aSelect.GetSize()-1; i>=0; i--)
-						{
-							sa.RemoveAt(aSelect[i]);
-						}
-					}
+                    {
+                        for (int i=aSelect.GetSize()-1; i>=0; i--)
+                        {
+                            sa.RemoveAt(aSelect[i]);
+                        }
+                    }
 
-					aSelect.RemoveAll();
-				}
-			}
-			sa.RemoveAll();
-		}
-		break;
-	case BAI_COLUMN:
-		{
-			CPDFSDK_SortAnnots sa;
+                    aSelect.RemoveAll();
+                }
+            }
+            sa.RemoveAll();
+        }
+        break;
+    case BAI_COLUMN:
+        {
+            CPDFSDK_SortAnnots sa;
 
-			{
-				for (int i=0,sz=m_pPageView->CountAnnots(); i<sz; i++)
-				{
-					CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i);
-					ASSERT(pAnnot != NULL);
+            {
+                for (int i=0,sz=m_pPageView->CountAnnots(); i<sz; i++)
+                {
+                    CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i);
+                    ASSERT(pAnnot != NULL);
 
-					if (pAnnot->GetType() == m_sType
-						&& pAnnot->GetSubType() == m_sSubType)
-						sa.Add(pAnnot);
-				}
-			}
+                    if (pAnnot->GetType() == m_sType
+                        && pAnnot->GetSubType() == m_sSubType)
+                        sa.Add(pAnnot);
+                }
+            }
 
-			if (sa.GetSize() > 0)
-			{
-				sa.Sort(CBA_AnnotIterator::CompareByTop, FALSE);
-			}
+            if (sa.GetSize() > 0)
+            {
+                sa.Sort(CBA_AnnotIterator::CompareByTop, FALSE);
+            }
 
-			while (sa.GetSize() > 0)
-			{
-				int nLeftTopIndex = -1;
+            while (sa.GetSize() > 0)
+            {
+                int nLeftTopIndex = -1;
 
-				{
-					FX_FLOAT fLeft = -1.0f;
+                {
+                    FX_FLOAT fLeft = -1.0f;
 
-					for (int i=sa.GetSize()-1; i>=0; i--)
-					{
-						CPDFSDK_Annot* pAnnot = sa.GetAt(i);
-						ASSERT(pAnnot != NULL);
+                    for (int i=sa.GetSize()-1; i>=0; i--)
+                    {
+                        CPDFSDK_Annot* pAnnot = sa.GetAt(i);
+                        ASSERT(pAnnot != NULL);
 
-						CPDF_Rect rcAnnot = GetAnnotRect(pAnnot);
+                        CPDF_Rect rcAnnot = GetAnnotRect(pAnnot);
 
-						if (fLeft < 0)
-						{
-							nLeftTopIndex = 0;
-							fLeft = rcAnnot.left;
-						}
-						else if (rcAnnot.left < fLeft)
-						{
-							nLeftTopIndex = i;
-							fLeft = rcAnnot.left;
-						}
-					}
-				}
+                        if (fLeft < 0)
+                        {
+                            nLeftTopIndex = 0;
+                            fLeft = rcAnnot.left;
+                        }
+                        else if (rcAnnot.left < fLeft)
+                        {
+                            nLeftTopIndex = i;
+                            fLeft = rcAnnot.left;
+                        }
+                    }
+                }
 
-				if (nLeftTopIndex >= 0)
-				{
-					CPDFSDK_Annot* pLeftTopAnnot = sa.GetAt(nLeftTopIndex);
-					ASSERT(pLeftTopAnnot != NULL);
+                if (nLeftTopIndex >= 0)
+                {
+                    CPDFSDK_Annot* pLeftTopAnnot = sa.GetAt(nLeftTopIndex);
+                    ASSERT(pLeftTopAnnot != NULL);
 
-					CPDF_Rect rcLeftTop = GetAnnotRect(pLeftTopAnnot);
+                    CPDF_Rect rcLeftTop = GetAnnotRect(pLeftTopAnnot);
 
-					m_Annots.Add(pLeftTopAnnot);
-					sa.RemoveAt(nLeftTopIndex);
+                    m_Annots.Add(pLeftTopAnnot);
+                    sa.RemoveAt(nLeftTopIndex);
 
-					CFX_ArrayTemplate<int> aSelect;
+                    CFX_ArrayTemplate<int> aSelect;
 
-					{
-						for (int i=0,sz=sa.GetSize(); i<sz; i++)
-						{
-							CPDFSDK_Annot* pAnnot = sa.GetAt(i);
-							ASSERT(pAnnot != NULL);
+                    {
+                        for (int i=0,sz=sa.GetSize(); i<sz; i++)
+                        {
+                            CPDFSDK_Annot* pAnnot = sa.GetAt(i);
+                            ASSERT(pAnnot != NULL);
 
-							CPDF_Rect rcAnnot = GetAnnotRect(pAnnot);
+                            CPDF_Rect rcAnnot = GetAnnotRect(pAnnot);
 
-							FX_FLOAT fCenterX = (rcAnnot.left + rcAnnot.right) / 2.0f;
+                            FX_FLOAT fCenterX = (rcAnnot.left + rcAnnot.right) / 2.0f;
 
-							if (fCenterX > rcLeftTop.left && fCenterX < rcLeftTop.right)
-								aSelect.Add(i);
-						}
-					}
+                            if (fCenterX > rcLeftTop.left && fCenterX < rcLeftTop.right)
+                                aSelect.Add(i);
+                        }
+                    }
 
-					{
-						for (int i=0,sz=aSelect.GetSize(); i<sz; i++)
-						{
-							m_Annots.Add(sa[aSelect[i]]);
-						}
-					}
+                    {
+                        for (int i=0,sz=aSelect.GetSize(); i<sz; i++)
+                        {
+                            m_Annots.Add(sa[aSelect[i]]);
+                        }
+                    }
 
-					{
-						for (int i=aSelect.GetSize()-1; i>=0; i--)
-						{
-							sa.RemoveAt(aSelect[i]);
-						}
-					}
+                    {
+                        for (int i=aSelect.GetSize()-1; i>=0; i--)
+                        {
+                            sa.RemoveAt(aSelect[i]);
+                        }
+                    }
 
-					aSelect.RemoveAll();
-				}
-			}
-			sa.RemoveAll();
-		}
-		break;
-	}
+                    aSelect.RemoveAll();
+                }
+            }
+            sa.RemoveAll();
+        }
+        break;
+    }
 }
 
 CPDF_Rect CBA_AnnotIterator::GetAnnotRect(CPDFSDK_Annot* pAnnot)
 {
-	ASSERT(pAnnot != NULL);
+    ASSERT(pAnnot != NULL);
 
-	CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot();
-	ASSERT(pPDFAnnot != NULL);
+    CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot();
+    ASSERT(pPDFAnnot != NULL);
 
-	CPDF_Rect rcAnnot;
-	pPDFAnnot->GetRect(rcAnnot);
+    CPDF_Rect rcAnnot;
+    pPDFAnnot->GetRect(rcAnnot);
 
-	return rcAnnot;
+    return rcAnnot;
 }
 
diff --git a/fpdfsdk/src/fsdk_mgr.cpp b/fpdfsdk/src/fsdk_mgr.cpp
index 234f1fe..6190eff 100644
--- a/fpdfsdk/src/fsdk_mgr.cpp
+++ b/fpdfsdk/src/fsdk_mgr.cpp
@@ -141,9 +141,6 @@
 FX_BOOL CFX_SystemHandler::FindNativeTrueTypeFont(int32_t nCharset, CFX_ByteString sFontFaceName)
 {
     CFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr();
-//  FXFT_Face nFace = pFontMgr->FindSubstFont(sFontFaceName,TRUE,0,0,0,0,NULL);
-//  FXFT_Face nFace  = pFontMgr->m_pBuiltinMapper->FindSubstFont(sFontFaceName,TRUE,0,0,0,0,NULL);
-
     if(pFontMgr)
     {
         CFX_FontMapper* pFontMapper = pFontMgr->m_pBuiltinMapper;
@@ -166,19 +163,17 @@
     }
 
     return FALSE;
-//  pFontMgr->m_FaceMap.Lookup(sFontFaceName,pFont);
-//  return (pFont!=NULL);
 }
 
 static int CharSet2CP(int charset)
 {
-    if(charset == 128)
+    if (charset == 128)
         return 932;
-    else if(charset == 134)
+    if (charset == 134)
         return 936;
-    else if(charset == 129)
+    if (charset == 129)
         return 949;
-    else if(charset == 136)
+    if (charset == 136)
         return 950;
     return 0;
 }
@@ -1091,23 +1086,18 @@
         pAnnotHandlerMgr->Annot_OnMouseMove(this, pFXAnnot, nFlag, point);
         return TRUE;
     }
-    else
+    if(m_bOnWidget)
     {
-        if(m_bOnWidget)
+        m_bOnWidget = FALSE;
+        m_bExitWidget = TRUE;
+        m_bEnterWidget = FALSE;
+        if(m_CaptureWidget)
         {
-            m_bOnWidget = FALSE;
-            m_bExitWidget = TRUE;
-            m_bEnterWidget = FALSE;
-            if(m_CaptureWidget)
-            {
-                pAnnotHandlerMgr->Annot_OnMouseExit(this, m_CaptureWidget, nFlag);
-                m_CaptureWidget = NULL;
-            }
+            pAnnotHandlerMgr->Annot_OnMouseExit(this, m_CaptureWidget, nFlag);
+            m_CaptureWidget = NULL;
         }
-        return FALSE;
     }
-
-    return FALSE;;
+    return FALSE;
 }
 
 FX_BOOL CPDFSDK_PageView::OnMouseWheel(double deltaX, double deltaY,const CPDF_Point& point, int nFlag)
diff --git a/fpdfsdk/src/fsdk_rendercontext.cpp b/fpdfsdk/src/fsdk_rendercontext.cpp
index 4b7242d..f96db94 100644
--- a/fpdfsdk/src/fsdk_rendercontext.cpp
+++ b/fpdfsdk/src/fsdk_rendercontext.cpp
@@ -8,14 +8,14 @@
 
 void CRenderContext::Clear()
 {
-	m_pDevice = NULL;
-	m_pContext = NULL;
-	m_pRenderer = NULL;
-	m_pAnnots = NULL;
-	m_pOptions	= NULL;
+    m_pDevice = NULL;
+    m_pContext = NULL;
+    m_pRenderer = NULL;
+    m_pAnnots = NULL;
+    m_pOptions  = NULL;
 #ifdef _WIN32_WCE
-	m_pBitmap = NULL;
-	m_hBitmap = NULL;
+    m_pBitmap = NULL;
+    m_hBitmap = NULL;
 #endif
 }
 
@@ -35,15 +35,13 @@
 
 IFSDK_PAUSE_Adapter::IFSDK_PAUSE_Adapter(IFSDK_PAUSE* IPause )
 {
-	m_IPause = IPause;
+    m_IPause = IPause;
 }
 
 FX_BOOL IFSDK_PAUSE_Adapter::NeedToPauseNow()
 {
-	if (m_IPause->NeedToPauseNow)
-	{
-		return m_IPause->NeedToPauseNow(m_IPause);
-	}else{
-		return FALSE;
-	}
+    if (m_IPause->NeedToPauseNow) {
+        return m_IPause->NeedToPauseNow(m_IPause);
+    }
+    return FALSE;
 }
diff --git a/fpdfsdk/src/fxedit/fxet_edit.cpp b/fpdfsdk/src/fxedit/fxet_edit.cpp
index 8e109b5..63115c2 100644
--- a/fpdfsdk/src/fxedit/fxet_edit.cpp
+++ b/fpdfsdk/src/fxedit/fxet_edit.cpp
@@ -7,13 +7,13 @@
 #include "../../include/fxedit/fxet_stub.h"
 #include "../../include/fxedit/fxet_edit.h"
 
-#define FX_EDIT_UNDO_MAXITEM				10000
+#define FX_EDIT_UNDO_MAXITEM                10000
 
 /* ---------------------------- CFX_Edit_Iterator ---------------------------- */
 
 CFX_Edit_Iterator::CFX_Edit_Iterator(CFX_Edit * pEdit,IPDF_VariableText_Iterator * pVTIterator) :
-	m_pEdit(pEdit),
-	m_pVTIterator(pVTIterator)
+    m_pEdit(pEdit),
+    m_pVTIterator(pVTIterator)
 {
 }
 
@@ -21,121 +21,97 @@
 {
 }
 
-FX_BOOL	CFX_Edit_Iterator::NextWord()
+FX_BOOL CFX_Edit_Iterator::NextWord()
 {
-	ASSERT(m_pVTIterator != NULL);
-
-	return m_pVTIterator->NextWord();
+    return m_pVTIterator->NextWord();
 }
 
 FX_BOOL CFX_Edit_Iterator::NextLine()
 {
-	ASSERT(m_pVTIterator != NULL);
-
-	return m_pVTIterator->NextLine();
+    return m_pVTIterator->NextLine();
 }
 
 FX_BOOL CFX_Edit_Iterator::NextSection()
 {
-	ASSERT(m_pVTIterator != NULL);
-
-	return m_pVTIterator->NextSection();
+    return m_pVTIterator->NextSection();
 }
 
-FX_BOOL	CFX_Edit_Iterator::PrevWord()
+FX_BOOL CFX_Edit_Iterator::PrevWord()
 {
-	ASSERT(m_pVTIterator != NULL);
-
-	return m_pVTIterator->PrevWord();
+    return m_pVTIterator->PrevWord();
 }
 
-FX_BOOL	CFX_Edit_Iterator::PrevLine()
+FX_BOOL CFX_Edit_Iterator::PrevLine()
 {
-	ASSERT(m_pVTIterator != NULL);
-
-	return m_pVTIterator->PrevLine();
+    return m_pVTIterator->PrevLine();
 }
 
-FX_BOOL	CFX_Edit_Iterator::PrevSection()
+FX_BOOL CFX_Edit_Iterator::PrevSection()
 {
-	ASSERT(m_pVTIterator != NULL);
-
-	return m_pVTIterator->PrevSection();
+    return m_pVTIterator->PrevSection();
 }
 
 FX_BOOL CFX_Edit_Iterator::GetWord(CPVT_Word & word) const
 {
-	ASSERT(m_pEdit != NULL);
-	ASSERT(m_pVTIterator != NULL);
+    ASSERT(m_pEdit);
 
-	if (m_pVTIterator->GetWord(word))
-	{
-		word.ptWord = m_pEdit->VTToEdit(word.ptWord);
-		return TRUE;
-	}
-
-	return FALSE;
+    if (m_pVTIterator->GetWord(word))
+    {
+        word.ptWord = m_pEdit->VTToEdit(word.ptWord);
+        return TRUE;
+    }
+    return FALSE;
 }
 
 FX_BOOL CFX_Edit_Iterator::GetLine(CPVT_Line & line) const
 {
-	ASSERT(m_pEdit != NULL);
-	ASSERT(m_pVTIterator != NULL);
+    ASSERT(m_pEdit);
 
-	if (m_pVTIterator->GetLine(line))
-	{
-		line.ptLine = m_pEdit->VTToEdit(line.ptLine);
-		return TRUE;
-	}
-
-	return FALSE;
+    if (m_pVTIterator->GetLine(line))
+    {
+        line.ptLine = m_pEdit->VTToEdit(line.ptLine);
+        return TRUE;
+    }
+    return FALSE;
 }
 
 FX_BOOL CFX_Edit_Iterator::GetSection(CPVT_Section & section) const
 {
-	ASSERT(m_pEdit != NULL);
-	ASSERT(m_pVTIterator != NULL);
+    ASSERT(m_pEdit);
 
-	if (m_pVTIterator->GetSection(section))
-	{
-		section.rcSection = m_pEdit->VTToEdit(section.rcSection);
-		return TRUE;
-	}
-
-	return FALSE;
+    if (m_pVTIterator->GetSection(section))
+    {
+        section.rcSection = m_pEdit->VTToEdit(section.rcSection);
+        return TRUE;
+    }
+    return FALSE;
 }
 
 void CFX_Edit_Iterator::SetAt(int32_t nWordIndex)
 {
-	ASSERT(m_pVTIterator != NULL);
-
-	m_pVTIterator->SetAt(nWordIndex);
+    m_pVTIterator->SetAt(nWordIndex);
 }
 
 void CFX_Edit_Iterator::SetAt(const CPVT_WordPlace & place)
 {
-	ASSERT(m_pVTIterator != NULL);
-
-	m_pVTIterator->SetAt(place);
+    m_pVTIterator->SetAt(place);
 }
 
 const CPVT_WordPlace & CFX_Edit_Iterator::GetAt() const
 {
-	ASSERT(m_pVTIterator != NULL);
-
-	return m_pVTIterator->GetAt();
+    return m_pVTIterator->GetAt();
 }
 
 IFX_Edit* CFX_Edit_Iterator::GetEdit() const
 {
-	return m_pEdit;
+    return m_pEdit;
 }
 
 /* --------------------------- CFX_Edit_Provider ------------------------------- */
 
 CFX_Edit_Provider::CFX_Edit_Provider(IFX_Edit_FontMap * pFontMap) : m_pFontMap(pFontMap)
 {
-	ASSERT(m_pFontMap != NULL);
+    ASSERT(m_pFontMap != NULL);
 }
 
 CFX_Edit_Provider::~CFX_Edit_Provider()
@@ -144,56 +120,56 @@
 
 IFX_Edit_FontMap* CFX_Edit_Provider::GetFontMap()
 {
-	return m_pFontMap;
+    return m_pFontMap;
 }
 
 int32_t CFX_Edit_Provider::GetCharWidth(int32_t nFontIndex, FX_WORD word, int32_t nWordStyle)
 {
-	if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex))
-	{
-		FX_DWORD charcode = word;
+    if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex))
+    {
+        FX_DWORD charcode = word;
 
-		if (pPDFFont->IsUnicodeCompatible())
-			charcode = pPDFFont->CharCodeFromUnicode(word);
-		else
-			charcode = m_pFontMap->CharCodeFromUnicode(nFontIndex, word);
+        if (pPDFFont->IsUnicodeCompatible())
+            charcode = pPDFFont->CharCodeFromUnicode(word);
+        else
+            charcode = m_pFontMap->CharCodeFromUnicode(nFontIndex, word);
 
-		if (charcode != -1)
-			return pPDFFont->GetCharWidthF(charcode);
-	}
+        if (charcode != -1)
+            return pPDFFont->GetCharWidthF(charcode);
+    }
 
-	return 0;
+    return 0;
 }
 
 int32_t CFX_Edit_Provider::GetTypeAscent(int32_t nFontIndex)
 {
-	if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex))
-		return pPDFFont->GetTypeAscent();
+    if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex))
+        return pPDFFont->GetTypeAscent();
 
-	return 0;
+    return 0;
 }
 
 int32_t CFX_Edit_Provider::GetTypeDescent(int32_t nFontIndex)
 {
-	if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex))
-		return pPDFFont->GetTypeDescent();
+    if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex))
+        return pPDFFont->GetTypeDescent();
 
-	return 0;
+    return 0;
 }
 
 int32_t CFX_Edit_Provider::GetWordFontIndex(FX_WORD word, int32_t charset, int32_t nFontIndex)
 {
-	return m_pFontMap->GetWordFontIndex(word,charset,nFontIndex);
+    return m_pFontMap->GetWordFontIndex(word,charset,nFontIndex);
 }
 
 int32_t CFX_Edit_Provider::GetDefaultFontIndex()
 {
-	return 0;
+    return 0;
 }
 
-FX_BOOL	CFX_Edit_Provider::IsLatinWord(FX_WORD word)
+FX_BOOL CFX_Edit_Provider::IsLatinWord(FX_WORD word)
 {
-	return FX_EDIT_ISLATINWORD(word);
+    return FX_EDIT_ISLATINWORD(word);
 }
 
 /* --------------------------------- CFX_Edit_Refresh --------------------------------- */
@@ -208,272 +184,269 @@
 
 void CFX_Edit_Refresh::BeginRefresh()
 {
-	m_RefreshRects.Empty();
-	m_OldLineRects = m_NewLineRects;
+    m_RefreshRects.Empty();
+    m_OldLineRects = m_NewLineRects;
 }
 
 void CFX_Edit_Refresh::Push(const CPVT_WordRange & linerange,const CPDF_Rect & rect)
 {
-	m_NewLineRects.Add(linerange,rect);
+    m_NewLineRects.Add(linerange,rect);
 }
 
 void CFX_Edit_Refresh::NoAnalyse()
 {
-	{
-		for (int32_t i = 0, sz = m_OldLineRects.GetSize(); i < sz; i++)
-			if (CFX_Edit_LineRect * pOldRect = m_OldLineRects.GetAt(i))
-				m_RefreshRects.Add(pOldRect->m_rcLine);
-	}
+    {
+        for (int32_t i = 0, sz = m_OldLineRects.GetSize(); i < sz; i++)
+            if (CFX_Edit_LineRect * pOldRect = m_OldLineRects.GetAt(i))
+                m_RefreshRects.Add(pOldRect->m_rcLine);
+    }
 
-	{
-		for (int32_t i = 0, sz = m_NewLineRects.GetSize(); i < sz; i++)
-			if (CFX_Edit_LineRect * pNewRect = m_NewLineRects.GetAt(i))
-				m_RefreshRects.Add(pNewRect->m_rcLine);
-	}
+    {
+        for (int32_t i = 0, sz = m_NewLineRects.GetSize(); i < sz; i++)
+            if (CFX_Edit_LineRect * pNewRect = m_NewLineRects.GetAt(i))
+                m_RefreshRects.Add(pNewRect->m_rcLine);
+    }
 }
 
 void CFX_Edit_Refresh::Analyse(int32_t nAlignment)
 {
-	FX_BOOL bLineTopChanged = FALSE;
-	CPDF_Rect rcResult;
-	FX_FLOAT fWidthDiff;
+    FX_BOOL bLineTopChanged = FALSE;
+    CPDF_Rect rcResult;
+    FX_FLOAT fWidthDiff;
 
-	int32_t szMax = FX_EDIT_MAX(m_OldLineRects.GetSize(),m_NewLineRects.GetSize());
-	int32_t i = 0;
+    int32_t szMax = FX_EDIT_MAX(m_OldLineRects.GetSize(),m_NewLineRects.GetSize());
+    int32_t i = 0;
 
-	while (i < szMax)
-	{
-		CFX_Edit_LineRect * pOldRect = m_OldLineRects.GetAt(i);
-		CFX_Edit_LineRect * pNewRect = m_NewLineRects.GetAt(i);
+    while (i < szMax)
+    {
+        CFX_Edit_LineRect * pOldRect = m_OldLineRects.GetAt(i);
+        CFX_Edit_LineRect * pNewRect = m_NewLineRects.GetAt(i);
 
-		if (pOldRect)
-		{
-			if (pNewRect)
-			{
-				if (bLineTopChanged)
-				{
-					rcResult = pOldRect->m_rcLine;
-					rcResult.Union(pNewRect->m_rcLine);
-					m_RefreshRects.Add(rcResult);
-				}
-				else
-				{
-					if (*pNewRect != *pOldRect)
-					{
-						if (!pNewRect->IsSameTop(*pOldRect) || !pNewRect->IsSameHeight(*pOldRect))
-						{
-							bLineTopChanged = TRUE;
-							continue;
-						}
+        if (pOldRect)
+        {
+            if (pNewRect)
+            {
+                if (bLineTopChanged)
+                {
+                    rcResult = pOldRect->m_rcLine;
+                    rcResult.Union(pNewRect->m_rcLine);
+                    m_RefreshRects.Add(rcResult);
+                }
+                else
+                {
+                    if (*pNewRect != *pOldRect)
+                    {
+                        if (!pNewRect->IsSameTop(*pOldRect) || !pNewRect->IsSameHeight(*pOldRect))
+                        {
+                            bLineTopChanged = TRUE;
+                            continue;
+                        }
 
-						if (nAlignment == 0)
-						{
-							if (pNewRect->m_wrLine.BeginPos != pOldRect->m_wrLine.BeginPos)
-							{
-								rcResult = pOldRect->m_rcLine;
-								rcResult.Union(pNewRect->m_rcLine);
-								m_RefreshRects.Add(rcResult);
-							}
-							else
-							{
-								if (!pNewRect->IsSameLeft(*pOldRect))
-								{
-									rcResult = pOldRect->m_rcLine;
-									rcResult.Union(pNewRect->m_rcLine);
-								}
-								else
-								{
-									fWidthDiff = pNewRect->m_rcLine.Width() - pOldRect->m_rcLine.Width();
-									rcResult = pNewRect->m_rcLine;
-									if (fWidthDiff > 0.0f)
-										rcResult.left = rcResult.right - fWidthDiff;
-									else
-									{
-										rcResult.left = rcResult.right;
-										rcResult.right += (-fWidthDiff);
-									}
-								}
-								m_RefreshRects.Add(rcResult);
-							}
-						}
-						else
-						{
-							rcResult = pOldRect->m_rcLine;
-							rcResult.Union(pNewRect->m_rcLine);
-							m_RefreshRects.Add(rcResult);
-						}
-					}
-					else
-					{
-						//don't need to do anything
-					}
-				}
-			}
-			else
-			{
-				m_RefreshRects.Add(pOldRect->m_rcLine);
-			}
-		}
-		else
-		{
-			if (pNewRect)
-			{
-				m_RefreshRects.Add(pNewRect->m_rcLine);
-			}
-			else
-			{
-				//error
-			}
-		}
-		i++;
-	}
+                        if (nAlignment == 0)
+                        {
+                            if (pNewRect->m_wrLine.BeginPos != pOldRect->m_wrLine.BeginPos)
+                            {
+                                rcResult = pOldRect->m_rcLine;
+                                rcResult.Union(pNewRect->m_rcLine);
+                                m_RefreshRects.Add(rcResult);
+                            }
+                            else
+                            {
+                                if (!pNewRect->IsSameLeft(*pOldRect))
+                                {
+                                    rcResult = pOldRect->m_rcLine;
+                                    rcResult.Union(pNewRect->m_rcLine);
+                                }
+                                else
+                                {
+                                    fWidthDiff = pNewRect->m_rcLine.Width() - pOldRect->m_rcLine.Width();
+                                    rcResult = pNewRect->m_rcLine;
+                                    if (fWidthDiff > 0.0f)
+                                        rcResult.left = rcResult.right - fWidthDiff;
+                                    else
+                                    {
+                                        rcResult.left = rcResult.right;
+                                        rcResult.right += (-fWidthDiff);
+                                    }
+                                }
+                                m_RefreshRects.Add(rcResult);
+                            }
+                        }
+                        else
+                        {
+                            rcResult = pOldRect->m_rcLine;
+                            rcResult.Union(pNewRect->m_rcLine);
+                            m_RefreshRects.Add(rcResult);
+                        }
+                    }
+                    else
+                    {
+                        //don't need to do anything
+                    }
+                }
+            }
+            else
+            {
+                m_RefreshRects.Add(pOldRect->m_rcLine);
+            }
+        }
+        else
+        {
+            if (pNewRect)
+            {
+                m_RefreshRects.Add(pNewRect->m_rcLine);
+            }
+            else
+            {
+                //error
+            }
+        }
+        i++;
+    }
 }
 
 void CFX_Edit_Refresh::AddRefresh(const CPDF_Rect & rect)
 {
-	m_RefreshRects.Add(rect);
+    m_RefreshRects.Add(rect);
 }
 
 const CFX_Edit_RectArray * CFX_Edit_Refresh::GetRefreshRects() const
 {
-	return &m_RefreshRects;
+    return &m_RefreshRects;
 }
 
 void CFX_Edit_Refresh::EndRefresh()
 {
-	m_RefreshRects.Empty();
+    m_RefreshRects.Empty();
 }
 
 /* ------------------------------------- CFX_Edit_Undo ------------------------------------- */
 
 CFX_Edit_Undo::CFX_Edit_Undo(int32_t nBufsize) : m_nCurUndoPos(0),
-	m_nBufSize(nBufsize),
-	m_bModified(FALSE),
-	m_bVirgin(TRUE),
-	m_bWorking(FALSE)
+    m_nBufSize(nBufsize),
+    m_bModified(FALSE),
+    m_bVirgin(TRUE),
+    m_bWorking(FALSE)
 {
 }
 
 CFX_Edit_Undo::~CFX_Edit_Undo()
 {
-	Reset();
+    Reset();
 }
 
 FX_BOOL CFX_Edit_Undo::CanUndo() const
 {
-	return m_nCurUndoPos > 0;
+    return m_nCurUndoPos > 0;
 }
 
 void CFX_Edit_Undo::Undo()
 {
-	m_bWorking = TRUE;
+    m_bWorking = TRUE;
 
-	if (m_nCurUndoPos > 0)
-	{
-		IFX_Edit_UndoItem * pItem = m_UndoItemStack.GetAt(m_nCurUndoPos-1);
-		ASSERT(pItem != NULL);
+    if (m_nCurUndoPos > 0)
+    {
+        IFX_Edit_UndoItem * pItem = m_UndoItemStack.GetAt(m_nCurUndoPos-1);
+        ASSERT(pItem != NULL);
 
-		pItem->Undo();
+        pItem->Undo();
 
-		m_nCurUndoPos--;
-		m_bModified = (m_nCurUndoPos != 0);
-	}
+        m_nCurUndoPos--;
+        m_bModified = (m_nCurUndoPos != 0);
+    }
 
-	m_bWorking = FALSE;
+    m_bWorking = FALSE;
 }
 
-FX_BOOL	CFX_Edit_Undo::CanRedo() const
+FX_BOOL CFX_Edit_Undo::CanRedo() const
 {
-	return m_nCurUndoPos < m_UndoItemStack.GetSize();
+    return m_nCurUndoPos < m_UndoItemStack.GetSize();
 }
 
 void CFX_Edit_Undo::Redo()
 {
-	m_bWorking = TRUE;
+    m_bWorking = TRUE;
 
-	int32_t nStackSize = m_UndoItemStack.GetSize();
+    int32_t nStackSize = m_UndoItemStack.GetSize();
 
-	if (m_nCurUndoPos < nStackSize)
-	{
-		IFX_Edit_UndoItem * pItem = m_UndoItemStack.GetAt(m_nCurUndoPos);
-		ASSERT(pItem != NULL);
+    if (m_nCurUndoPos < nStackSize)
+    {
+        IFX_Edit_UndoItem * pItem = m_UndoItemStack.GetAt(m_nCurUndoPos);
+        ASSERT(pItem != NULL);
 
-		pItem->Redo();
+        pItem->Redo();
 
-		m_nCurUndoPos++;
-		m_bModified = (m_nCurUndoPos != 0);
-	}
+        m_nCurUndoPos++;
+        m_bModified = (m_nCurUndoPos != 0);
+    }
 
-	m_bWorking = FALSE;
+    m_bWorking = FALSE;
 }
 
-FX_BOOL	CFX_Edit_Undo::IsWorking() const
+FX_BOOL CFX_Edit_Undo::IsWorking() const
 {
-	return m_bWorking;
+    return m_bWorking;
 }
 
 void CFX_Edit_Undo::AddItem(IFX_Edit_UndoItem* pItem)
 {
-	ASSERT(!m_bWorking);
-	ASSERT(pItem != NULL);
-	ASSERT(m_nBufSize > 1);
+    ASSERT(!m_bWorking);
+    ASSERT(pItem != NULL);
+    ASSERT(m_nBufSize > 1);
 
-	if (m_nCurUndoPos < m_UndoItemStack.GetSize())
-		RemoveTails();
+    if (m_nCurUndoPos < m_UndoItemStack.GetSize())
+        RemoveTails();
 
-	if (m_UndoItemStack.GetSize() >= m_nBufSize)
-	{
-		RemoveHeads();
-		m_bVirgin = FALSE;
-	}
+    if (m_UndoItemStack.GetSize() >= m_nBufSize)
+    {
+        RemoveHeads();
+        m_bVirgin = FALSE;
+    }
 
-	m_UndoItemStack.Add(pItem);
-	m_nCurUndoPos = m_UndoItemStack.GetSize();
+    m_UndoItemStack.Add(pItem);
+    m_nCurUndoPos = m_UndoItemStack.GetSize();
 
-	m_bModified = (m_nCurUndoPos != 0);
+    m_bModified = (m_nCurUndoPos != 0);
 }
 
-FX_BOOL	CFX_Edit_Undo::IsModified() const
+FX_BOOL CFX_Edit_Undo::IsModified() const
 {
-	if (m_bVirgin)
-		return m_bModified;
-	else
-		return TRUE;
+    return m_bVirgin ? m_bModified : TRUE;
 }
 
 IFX_Edit_UndoItem* CFX_Edit_Undo::GetItem(int32_t nIndex)
 {
-	if (nIndex>=0 && nIndex < m_UndoItemStack.GetSize())
-		return m_UndoItemStack.GetAt(nIndex);
+    if (nIndex>=0 && nIndex < m_UndoItemStack.GetSize())
+        return m_UndoItemStack.GetAt(nIndex);
 
-	return NULL;
+    return NULL;
 }
 
 void CFX_Edit_Undo::RemoveHeads()
 {
-	ASSERT(m_UndoItemStack.GetSize() > 1);
+    ASSERT(m_UndoItemStack.GetSize() > 1);
 
-	delete m_UndoItemStack.GetAt(0);
-	m_UndoItemStack.RemoveAt(0);
+    delete m_UndoItemStack.GetAt(0);
+    m_UndoItemStack.RemoveAt(0);
 }
 
 void CFX_Edit_Undo::RemoveTails()
 {
-	for (int32_t i = m_UndoItemStack.GetSize()-1; i >= m_nCurUndoPos; i--)
-	{
-		delete m_UndoItemStack.GetAt(i);
-		m_UndoItemStack.RemoveAt(i);
-	}
+    for (int32_t i = m_UndoItemStack.GetSize()-1; i >= m_nCurUndoPos; i--)
+    {
+        delete m_UndoItemStack.GetAt(i);
+        m_UndoItemStack.RemoveAt(i);
+    }
 }
 
 void CFX_Edit_Undo::Reset()
 {
-	for (int32_t i=0, sz=m_UndoItemStack.GetSize(); i < sz; i++)
-	{
-		delete m_UndoItemStack.GetAt(i);
-	}
-	m_nCurUndoPos = 0;
-	m_UndoItemStack.RemoveAll();
+    for (int32_t i=0, sz=m_UndoItemStack.GetSize(); i < sz; i++)
+    {
+        delete m_UndoItemStack.GetAt(i);
+    }
+    m_nCurUndoPos = 0;
+    m_UndoItemStack.RemoveAll();
 }
 
 /* -------------------------------- CFX_Edit_GroupUndoItem -------------------------------- */
@@ -484,76 +457,76 @@
 
 CFX_Edit_GroupUndoItem::~CFX_Edit_GroupUndoItem()
 {
-	for (int i=0,sz=m_Items.GetSize(); i<sz; i++)
-	{
-		delete m_Items[i];
-	}
+    for (int i=0,sz=m_Items.GetSize(); i<sz; i++)
+    {
+        delete m_Items[i];
+    }
 
-	m_Items.RemoveAll();
+    m_Items.RemoveAll();
 }
 
 void CFX_Edit_GroupUndoItem::AddUndoItem(CFX_Edit_UndoItem* pUndoItem)
 {
-	ASSERT(pUndoItem != NULL);
+    ASSERT(pUndoItem != NULL);
 
-	pUndoItem->SetFirst(FALSE);
-	pUndoItem->SetLast(FALSE);
+    pUndoItem->SetFirst(FALSE);
+    pUndoItem->SetLast(FALSE);
 
-	m_Items.Add(pUndoItem);
+    m_Items.Add(pUndoItem);
 
-	if (m_sTitle.IsEmpty())
-		m_sTitle = pUndoItem->GetUndoTitle();
+    if (m_sTitle.IsEmpty())
+        m_sTitle = pUndoItem->GetUndoTitle();
 }
 
 void CFX_Edit_GroupUndoItem::UpdateItems()
 {
-	if (m_Items.GetSize() > 0)
-	{
-		CFX_Edit_UndoItem* pFirstItem = m_Items[0];
-		ASSERT(pFirstItem != NULL);
-		pFirstItem->SetFirst(TRUE);
+    if (m_Items.GetSize() > 0)
+    {
+        CFX_Edit_UndoItem* pFirstItem = m_Items[0];
+        ASSERT(pFirstItem != NULL);
+        pFirstItem->SetFirst(TRUE);
 
-		CFX_Edit_UndoItem* pLastItem = m_Items[m_Items.GetSize() - 1];
-		ASSERT(pLastItem != NULL);
-		pLastItem->SetLast(TRUE);
-	}
+        CFX_Edit_UndoItem* pLastItem = m_Items[m_Items.GetSize() - 1];
+        ASSERT(pLastItem != NULL);
+        pLastItem->SetLast(TRUE);
+    }
 }
 
 void CFX_Edit_GroupUndoItem::Undo()
 {
-	for (int i=m_Items.GetSize()-1; i>=0; i--)
-	{
-		CFX_Edit_UndoItem* pUndoItem = m_Items[i];
-		ASSERT(pUndoItem != NULL);
+    for (int i=m_Items.GetSize()-1; i>=0; i--)
+    {
+        CFX_Edit_UndoItem* pUndoItem = m_Items[i];
+        ASSERT(pUndoItem != NULL);
 
-		pUndoItem->Undo();
-	}
+        pUndoItem->Undo();
+    }
 }
 
 void CFX_Edit_GroupUndoItem::Redo()
 {
-	for (int i=0,sz=m_Items.GetSize(); i<sz; i++)
-	{
-		CFX_Edit_UndoItem* pUndoItem = m_Items[i];
-		ASSERT(pUndoItem != NULL);
+    for (int i=0,sz=m_Items.GetSize(); i<sz; i++)
+    {
+        CFX_Edit_UndoItem* pUndoItem = m_Items[i];
+        ASSERT(pUndoItem != NULL);
 
-		pUndoItem->Redo();
-	}
+        pUndoItem->Redo();
+    }
 }
 
 CFX_WideString CFX_Edit_GroupUndoItem::GetUndoTitle()
 {
-	return m_sTitle;
+    return m_sTitle;
 }
 
 /* ------------------------------------- CFX_Edit_UndoItem derived classes ------------------------------------- */
 
 CFXEU_InsertWord::CFXEU_InsertWord(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,
-								 FX_WORD word, int32_t charset, const CPVT_WordProps * pWordProps)
-	: m_pEdit(pEdit), m_wpOld(wpOldPlace), m_wpNew(wpNewPlace), m_Word(word), m_nCharset(charset), m_WordProps()
+                                 FX_WORD word, int32_t charset, const CPVT_WordProps * pWordProps)
+    : m_pEdit(pEdit), m_wpOld(wpOldPlace), m_wpNew(wpNewPlace), m_Word(word), m_nCharset(charset), m_WordProps()
 {
-	if (pWordProps)
-		m_WordProps = *pWordProps;
+    if (pWordProps)
+        m_WordProps = *pWordProps;
 }
 
 CFXEU_InsertWord::~CFXEU_InsertWord()
@@ -562,38 +535,38 @@
 
 void CFXEU_InsertWord::Redo()
 {
-	if (m_pEdit)
-	{
-		m_pEdit->SelectNone();
-		m_pEdit->SetCaret(m_wpOld);
-		m_pEdit->InsertWord(m_Word,m_nCharset,&m_WordProps,FALSE,TRUE);
-	}
+    if (m_pEdit)
+    {
+        m_pEdit->SelectNone();
+        m_pEdit->SetCaret(m_wpOld);
+        m_pEdit->InsertWord(m_Word,m_nCharset,&m_WordProps,FALSE,TRUE);
+    }
 }
 
 void CFXEU_InsertWord::Undo()
 {
-	if (m_pEdit)
-	{
-		m_pEdit->SelectNone();
-		m_pEdit->SetCaret(m_wpNew);
-		m_pEdit->Backspace(FALSE,TRUE);
-	}
+    if (m_pEdit)
+    {
+        m_pEdit->SelectNone();
+        m_pEdit->SetCaret(m_wpNew);
+        m_pEdit->Backspace(FALSE,TRUE);
+    }
 }
 
 /* -------------------------------------------------------------------------- */
 
 CFXEU_InsertReturn::CFXEU_InsertReturn(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,
-			 const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps) :
-			m_pEdit(pEdit),
-			m_wpOld(wpOldPlace),
-			m_wpNew(wpNewPlace),
-			m_SecProps(),
-			m_WordProps()
+             const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps) :
+            m_pEdit(pEdit),
+            m_wpOld(wpOldPlace),
+            m_wpNew(wpNewPlace),
+            m_SecProps(),
+            m_WordProps()
 {
-	if (pSecProps)
-		m_SecProps = *pSecProps;
-	if (pWordProps)
-		m_WordProps = *pWordProps;
+    if (pSecProps)
+        m_SecProps = *pSecProps;
+    if (pWordProps)
+        m_WordProps = *pWordProps;
 }
 
 CFXEU_InsertReturn::~CFXEU_InsertReturn()
@@ -602,37 +575,37 @@
 
 void CFXEU_InsertReturn::Redo()
 {
-	if (m_pEdit)
-	{
-		m_pEdit->SelectNone();
-		m_pEdit->SetCaret(m_wpOld);
-		m_pEdit->InsertReturn(&m_SecProps,&m_WordProps,FALSE,TRUE);
-	}
+    if (m_pEdit)
+    {
+        m_pEdit->SelectNone();
+        m_pEdit->SetCaret(m_wpOld);
+        m_pEdit->InsertReturn(&m_SecProps,&m_WordProps,FALSE,TRUE);
+    }
 }
 
 void CFXEU_InsertReturn::Undo()
 {
-	if (m_pEdit)
-	{
-		m_pEdit->SelectNone();
-		m_pEdit->SetCaret(m_wpNew);
-		m_pEdit->Backspace(FALSE,TRUE);
-	}
+    if (m_pEdit)
+    {
+        m_pEdit->SelectNone();
+        m_pEdit->SetCaret(m_wpNew);
+        m_pEdit->Backspace(FALSE,TRUE);
+    }
 }
 
 /* -------------------------------------------------------------------------- */
 //CFXEU_Backspace
 
 CFXEU_Backspace::CFXEU_Backspace(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,
-							   FX_WORD word, int32_t charset,
-							   const CPVT_SecProps & SecProps, const CPVT_WordProps & WordProps) :
-			m_pEdit(pEdit),
-			m_wpOld(wpOldPlace),
-			m_wpNew(wpNewPlace),
-			m_Word(word),
-			m_nCharset(charset),
-			m_SecProps(SecProps),
-			m_WordProps(WordProps)
+                               FX_WORD word, int32_t charset,
+                               const CPVT_SecProps & SecProps, const CPVT_WordProps & WordProps) :
+            m_pEdit(pEdit),
+            m_wpOld(wpOldPlace),
+            m_wpNew(wpNewPlace),
+            m_Word(word),
+            m_nCharset(charset),
+            m_SecProps(SecProps),
+            m_WordProps(WordProps)
 {
 }
 
@@ -642,45 +615,45 @@
 
 void CFXEU_Backspace::Redo()
 {
-	if (m_pEdit)
-	{
-		m_pEdit->SelectNone();
-		m_pEdit->SetCaret(m_wpOld);
-		m_pEdit->Backspace(FALSE,TRUE);
-	}
+    if (m_pEdit)
+    {
+        m_pEdit->SelectNone();
+        m_pEdit->SetCaret(m_wpOld);
+        m_pEdit->Backspace(FALSE,TRUE);
+    }
 }
 
 void CFXEU_Backspace::Undo()
 {
-	if (m_pEdit)
-	{
-		m_pEdit->SelectNone();
-		m_pEdit->SetCaret(m_wpNew);
-		if (m_wpNew.SecCmp(m_wpOld) != 0)
-		{
-			m_pEdit->InsertReturn(&m_SecProps,&m_WordProps,FALSE,TRUE);
-		}
-		else
-		{
-			m_pEdit->InsertWord(m_Word,m_nCharset,&m_WordProps,FALSE,TRUE);
-		}
-	}
+    if (m_pEdit)
+    {
+        m_pEdit->SelectNone();
+        m_pEdit->SetCaret(m_wpNew);
+        if (m_wpNew.SecCmp(m_wpOld) != 0)
+        {
+            m_pEdit->InsertReturn(&m_SecProps,&m_WordProps,FALSE,TRUE);
+        }
+        else
+        {
+            m_pEdit->InsertWord(m_Word,m_nCharset,&m_WordProps,FALSE,TRUE);
+        }
+    }
 }
 
 /* -------------------------------------------------------------------------- */
 //CFXEU_Delete
 
 CFXEU_Delete::CFXEU_Delete(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,
-							   FX_WORD word, int32_t charset,
-							   const CPVT_SecProps & SecProps, const CPVT_WordProps & WordProps, FX_BOOL bSecEnd) :
-			m_pEdit(pEdit),
-			m_wpOld(wpOldPlace),
-			m_wpNew(wpNewPlace),
-			m_Word(word),
-			m_nCharset(charset),
-			m_SecProps(SecProps),
-			m_WordProps(WordProps),
-			m_bSecEnd(bSecEnd)
+                               FX_WORD word, int32_t charset,
+                               const CPVT_SecProps & SecProps, const CPVT_WordProps & WordProps, FX_BOOL bSecEnd) :
+            m_pEdit(pEdit),
+            m_wpOld(wpOldPlace),
+            m_wpNew(wpNewPlace),
+            m_Word(word),
+            m_nCharset(charset),
+            m_SecProps(SecProps),
+            m_WordProps(WordProps),
+            m_bSecEnd(bSecEnd)
 {
 }
 
@@ -690,38 +663,38 @@
 
 void CFXEU_Delete::Redo()
 {
-	if (m_pEdit)
-	{
-		m_pEdit->SelectNone();
-		m_pEdit->SetCaret(m_wpOld);
-		m_pEdit->Delete(FALSE,TRUE);
-	}
+    if (m_pEdit)
+    {
+        m_pEdit->SelectNone();
+        m_pEdit->SetCaret(m_wpOld);
+        m_pEdit->Delete(FALSE,TRUE);
+    }
 }
 
 void CFXEU_Delete::Undo()
 {
-	if (m_pEdit)
-	{
-		m_pEdit->SelectNone();
-		m_pEdit->SetCaret(m_wpNew);
-		if (m_bSecEnd)
-		{
-			m_pEdit->InsertReturn(&m_SecProps,&m_WordProps,FALSE,TRUE);
-		}
-		else
-		{
-			m_pEdit->InsertWord(m_Word,m_nCharset,&m_WordProps,FALSE,TRUE);
-		}
-	}
+    if (m_pEdit)
+    {
+        m_pEdit->SelectNone();
+        m_pEdit->SetCaret(m_wpNew);
+        if (m_bSecEnd)
+        {
+            m_pEdit->InsertReturn(&m_SecProps,&m_WordProps,FALSE,TRUE);
+        }
+        else
+        {
+            m_pEdit->InsertWord(m_Word,m_nCharset,&m_WordProps,FALSE,TRUE);
+        }
+    }
 }
 
 /* -------------------------------------------------------------------------- */
 //CFXEU_Clear
 
 CFXEU_Clear::CFXEU_Clear(CFX_Edit * pEdit,  const CPVT_WordRange & wrSel, const CFX_WideString & swText) :
-			m_pEdit(pEdit),
-			m_wrSel(wrSel),
-			m_swText(swText)
+            m_pEdit(pEdit),
+            m_wrSel(wrSel),
+            m_swText(swText)
 {
 }
 
@@ -731,39 +704,39 @@
 
 void CFXEU_Clear::Redo()
 {
-	if (m_pEdit)
-	{
-		m_pEdit->SelectNone();
-		m_pEdit->SetSel(m_wrSel.BeginPos,m_wrSel.EndPos);
-		m_pEdit->Clear(FALSE,TRUE);
-	}
+    if (m_pEdit)
+    {
+        m_pEdit->SelectNone();
+        m_pEdit->SetSel(m_wrSel.BeginPos,m_wrSel.EndPos);
+        m_pEdit->Clear(FALSE,TRUE);
+    }
 }
 
 void CFXEU_Clear::Undo()
 {
-	if (m_pEdit)
-	{
-		m_pEdit->SelectNone();
-		m_pEdit->SetCaret(m_wrSel.BeginPos);
-		m_pEdit->InsertText(m_swText.c_str(), DEFAULT_CHARSET, NULL, NULL, FALSE, TRUE);
-		m_pEdit->SetSel(m_wrSel.BeginPos,m_wrSel.EndPos);
-	}
+    if (m_pEdit)
+    {
+        m_pEdit->SelectNone();
+        m_pEdit->SetCaret(m_wrSel.BeginPos);
+        m_pEdit->InsertText(m_swText.c_str(), DEFAULT_CHARSET, NULL, NULL, FALSE, TRUE);
+        m_pEdit->SetSel(m_wrSel.BeginPos,m_wrSel.EndPos);
+    }
 }
 
 /* -------------------------------------------------------------------------- */
 //CFXEU_ClearRich
 
 CFXEU_ClearRich::CFXEU_ClearRich(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,
-							   const CPVT_WordRange & wrSel, FX_WORD word, int32_t charset,
-							   const CPVT_SecProps & SecProps, const CPVT_WordProps & WordProps) :
-			m_pEdit(pEdit),
-			m_wpOld(wpOldPlace),
-			m_wpNew(wpNewPlace),
-			m_wrSel(wrSel),
-			m_Word(word),
-			m_nCharset(charset),
-			m_SecProps(SecProps),
-			m_WordProps(WordProps)
+                               const CPVT_WordRange & wrSel, FX_WORD word, int32_t charset,
+                               const CPVT_SecProps & SecProps, const CPVT_WordProps & WordProps) :
+            m_pEdit(pEdit),
+            m_wpOld(wpOldPlace),
+            m_wpNew(wpNewPlace),
+            m_wrSel(wrSel),
+            m_Word(word),
+            m_nCharset(charset),
+            m_SecProps(SecProps),
+            m_WordProps(WordProps)
 {
 }
 
@@ -773,54 +746,54 @@
 
 void CFXEU_ClearRich::Redo()
 {
-	if (m_pEdit && IsLast())
-	{
-		m_pEdit->SelectNone();
-		m_pEdit->SetSel(m_wrSel.BeginPos,m_wrSel.EndPos);
-		m_pEdit->Clear(FALSE,TRUE);
-	}
+    if (m_pEdit && IsLast())
+    {
+        m_pEdit->SelectNone();
+        m_pEdit->SetSel(m_wrSel.BeginPos,m_wrSel.EndPos);
+        m_pEdit->Clear(FALSE,TRUE);
+    }
 }
 
 void CFXEU_ClearRich::Undo()
 {
-	if (m_pEdit)
-	{
-		m_pEdit->SelectNone();
-		m_pEdit->SetCaret(m_wpOld);
-		if (m_wpNew.SecCmp(m_wpOld) != 0)
-		{
-			m_pEdit->InsertReturn(&m_SecProps,&m_WordProps,FALSE,FALSE);
-		}
-		else
-		{
-			m_pEdit->InsertWord(m_Word,m_nCharset,&m_WordProps,FALSE,FALSE);
-		}
+    if (m_pEdit)
+    {
+        m_pEdit->SelectNone();
+        m_pEdit->SetCaret(m_wpOld);
+        if (m_wpNew.SecCmp(m_wpOld) != 0)
+        {
+            m_pEdit->InsertReturn(&m_SecProps,&m_WordProps,FALSE,FALSE);
+        }
+        else
+        {
+            m_pEdit->InsertWord(m_Word,m_nCharset,&m_WordProps,FALSE,FALSE);
+        }
 
-		if (IsFirst())
-		{
-			m_pEdit->PaintInsertText(m_wrSel.BeginPos,m_wrSel.EndPos);
-			m_pEdit->SetSel(m_wrSel.BeginPos,m_wrSel.EndPos);
-		}
-	}
+        if (IsFirst())
+        {
+            m_pEdit->PaintInsertText(m_wrSel.BeginPos,m_wrSel.EndPos);
+            m_pEdit->SetSel(m_wrSel.BeginPos,m_wrSel.EndPos);
+        }
+    }
 }
 /* -------------------------------------------------------------------------- */
 //CFXEU_InsertText
 
 CFXEU_InsertText::CFXEU_InsertText(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,
-							   const CFX_WideString & swText, int32_t charset,
-							   const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps) :
-			m_pEdit(pEdit),
-			m_wpOld(wpOldPlace),
-			m_wpNew(wpNewPlace),
-			m_swText(swText),
-			m_nCharset(charset),
-			m_SecProps(),
-			m_WordProps()
+                               const CFX_WideString & swText, int32_t charset,
+                               const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps) :
+            m_pEdit(pEdit),
+            m_wpOld(wpOldPlace),
+            m_wpNew(wpNewPlace),
+            m_swText(swText),
+            m_nCharset(charset),
+            m_SecProps(),
+            m_WordProps()
 {
-	if (pSecProps)
-		m_SecProps = *pSecProps;
-	if (pWordProps)
-		m_WordProps = *pWordProps;
+    if (pSecProps)
+        m_SecProps = *pSecProps;
+    if (pWordProps)
+        m_WordProps = *pWordProps;
 }
 
 CFXEU_InsertText::~CFXEU_InsertText()
@@ -829,37 +802,37 @@
 
 void CFXEU_InsertText::Redo()
 {
-	if (m_pEdit && IsLast())
-	{
-		m_pEdit->SelectNone();
-		m_pEdit->SetCaret(m_wpOld);
-		m_pEdit->InsertText(m_swText.c_str(), m_nCharset, &m_SecProps, &m_WordProps, FALSE, TRUE);
-	}
+    if (m_pEdit && IsLast())
+    {
+        m_pEdit->SelectNone();
+        m_pEdit->SetCaret(m_wpOld);
+        m_pEdit->InsertText(m_swText.c_str(), m_nCharset, &m_SecProps, &m_WordProps, FALSE, TRUE);
+    }
 }
 
 void CFXEU_InsertText::Undo()
 {
-	if (m_pEdit)
-	{
-		m_pEdit->SelectNone();
-		m_pEdit->SetSel(m_wpOld,m_wpNew);
-		m_pEdit->Clear(FALSE,TRUE);
-	}
+    if (m_pEdit)
+    {
+        m_pEdit->SelectNone();
+        m_pEdit->SetSel(m_wpOld,m_wpNew);
+        m_pEdit->Clear(FALSE,TRUE);
+    }
 }
 
 /* -------------------------------------------------------------------------- */
 
 CFXEU_SetSecProps::CFXEU_SetSecProps(CFX_Edit * pEdit, const CPVT_WordPlace & place, EDIT_PROPS_E ep,
-		const CPVT_SecProps & oldsecprops, const CPVT_WordProps & oldwordprops,
-		const CPVT_SecProps & newsecprops, const CPVT_WordProps & newwordprops, const CPVT_WordRange & range)
-		: m_pEdit(pEdit),
-		m_wpPlace(place),
-		m_wrPlace(range),
-		m_eProps(ep),
-		m_OldSecProps(oldsecprops),
-		m_NewSecProps(newsecprops),
-		m_OldWordProps(oldwordprops),
-		m_NewWordProps(newwordprops)
+        const CPVT_SecProps & oldsecprops, const CPVT_WordProps & oldwordprops,
+        const CPVT_SecProps & newsecprops, const CPVT_WordProps & newwordprops, const CPVT_WordRange & range)
+        : m_pEdit(pEdit),
+        m_wpPlace(place),
+        m_wrPlace(range),
+        m_eProps(ep),
+        m_OldSecProps(oldsecprops),
+        m_NewSecProps(newsecprops),
+        m_OldWordProps(oldwordprops),
+        m_NewWordProps(newwordprops)
 {
 }
 
@@ -869,42 +842,42 @@
 
 void CFXEU_SetSecProps::Redo()
 {
-	if (m_pEdit)
-	{
-		m_pEdit->SetSecProps(m_eProps,m_wpPlace,&m_NewSecProps,&m_NewWordProps,m_wrPlace,FALSE);
-		if (IsLast())
-		{
-			m_pEdit->SelectNone();
-			m_pEdit->PaintSetProps(m_eProps,m_wrPlace);
-			m_pEdit->SetSel(m_wrPlace.BeginPos,m_wrPlace.EndPos);
-		}
-	}
+    if (m_pEdit)
+    {
+        m_pEdit->SetSecProps(m_eProps,m_wpPlace,&m_NewSecProps,&m_NewWordProps,m_wrPlace,FALSE);
+        if (IsLast())
+        {
+            m_pEdit->SelectNone();
+            m_pEdit->PaintSetProps(m_eProps,m_wrPlace);
+            m_pEdit->SetSel(m_wrPlace.BeginPos,m_wrPlace.EndPos);
+        }
+    }
 }
 
 void CFXEU_SetSecProps::Undo()
 {
-	if (m_pEdit)
-	{
-		m_pEdit->SetSecProps(m_eProps,m_wpPlace,&m_OldSecProps,&m_OldWordProps,m_wrPlace,FALSE);
-		if (IsFirst())
-		{
-			m_pEdit->SelectNone();
-			m_pEdit->PaintSetProps(m_eProps,m_wrPlace);
-			m_pEdit->SetSel(m_wrPlace.BeginPos,m_wrPlace.EndPos);
-		}
-	}
+    if (m_pEdit)
+    {
+        m_pEdit->SetSecProps(m_eProps,m_wpPlace,&m_OldSecProps,&m_OldWordProps,m_wrPlace,FALSE);
+        if (IsFirst())
+        {
+            m_pEdit->SelectNone();
+            m_pEdit->PaintSetProps(m_eProps,m_wrPlace);
+            m_pEdit->SetSel(m_wrPlace.BeginPos,m_wrPlace.EndPos);
+        }
+    }
 }
 
 /* -------------------------------------------------------------------------- */
 
 CFXEU_SetWordProps::CFXEU_SetWordProps(CFX_Edit * pEdit, const CPVT_WordPlace & place, EDIT_PROPS_E ep,
-		const CPVT_WordProps & oldprops, const CPVT_WordProps & newprops, const CPVT_WordRange & range)
-		: m_pEdit(pEdit),
-		m_wpPlace(place),
-		m_wrPlace(range),
-		m_eProps(ep),
-		m_OldWordProps(oldprops),
-		m_NewWordProps(newprops)
+        const CPVT_WordProps & oldprops, const CPVT_WordProps & newprops, const CPVT_WordRange & range)
+        : m_pEdit(pEdit),
+        m_wpPlace(place),
+        m_wrPlace(range),
+        m_eProps(ep),
+        m_OldWordProps(oldprops),
+        m_NewWordProps(newprops)
 {
 }
 
@@ -914,59 +887,59 @@
 
 void CFXEU_SetWordProps::Redo()
 {
-	if (m_pEdit)
-	{
-		m_pEdit->SetWordProps(m_eProps,m_wpPlace,&m_NewWordProps,m_wrPlace,FALSE);
-		if (IsLast())
-		{
-			m_pEdit->SelectNone();
-			m_pEdit->PaintSetProps(m_eProps,m_wrPlace);
-			m_pEdit->SetSel(m_wrPlace.BeginPos,m_wrPlace.EndPos);
-		}
-	}
+    if (m_pEdit)
+    {
+        m_pEdit->SetWordProps(m_eProps,m_wpPlace,&m_NewWordProps,m_wrPlace,FALSE);
+        if (IsLast())
+        {
+            m_pEdit->SelectNone();
+            m_pEdit->PaintSetProps(m_eProps,m_wrPlace);
+            m_pEdit->SetSel(m_wrPlace.BeginPos,m_wrPlace.EndPos);
+        }
+    }
 }
 
 void CFXEU_SetWordProps::Undo()
 {
-	if (m_pEdit)
-	{
-		m_pEdit->SetWordProps(m_eProps,m_wpPlace,&m_OldWordProps,m_wrPlace,FALSE);
-		if (IsFirst())
-		{
-			m_pEdit->SelectNone();
-			m_pEdit->PaintSetProps(m_eProps,m_wrPlace);
-			m_pEdit->SetSel(m_wrPlace.BeginPos,m_wrPlace.EndPos);
-		}
-	}
+    if (m_pEdit)
+    {
+        m_pEdit->SetWordProps(m_eProps,m_wpPlace,&m_OldWordProps,m_wrPlace,FALSE);
+        if (IsFirst())
+        {
+            m_pEdit->SelectNone();
+            m_pEdit->PaintSetProps(m_eProps,m_wrPlace);
+            m_pEdit->SetSel(m_wrPlace.BeginPos,m_wrPlace.EndPos);
+        }
+    }
 }
 
 /* ------------------------------------- CFX_Edit ------------------------------------- */
 
 CFX_Edit::CFX_Edit(IPDF_VariableText * pVT) :
-	m_pVT(pVT),
-	m_pNotify(NULL),
-	m_pOprNotify(NULL),
-	m_pVTProvide(NULL),
-	m_wpCaret(-1,-1,-1),
-	m_wpOldCaret(-1,-1,-1),
-	m_SelState(),
-	m_ptScrollPos(0,0),
-	m_ptRefreshScrollPos(0,0),
-	m_bEnableScroll(FALSE),
-	m_pIterator(NULL),
-	m_ptCaret(0.0f,0.0f),
-	m_Undo(FX_EDIT_UNDO_MAXITEM),
-	m_nAlignment(0),
-	m_bNotifyFlag(FALSE),
-	m_bEnableOverflow(FALSE),
-	m_bEnableRefresh(TRUE),
-	m_rcOldContent(0.0f,0.0f,0.0f,0.0f),
-	m_bEnableUndo(TRUE),
-	m_bNotify(TRUE),
-	m_bOprNotify(FALSE),
-	m_pGroupUndoItem(NULL)
+    m_pVT(pVT),
+    m_pNotify(NULL),
+    m_pOprNotify(NULL),
+    m_pVTProvide(NULL),
+    m_wpCaret(-1,-1,-1),
+    m_wpOldCaret(-1,-1,-1),
+    m_SelState(),
+    m_ptScrollPos(0,0),
+    m_ptRefreshScrollPos(0,0),
+    m_bEnableScroll(FALSE),
+    m_pIterator(NULL),
+    m_ptCaret(0.0f,0.0f),
+    m_Undo(FX_EDIT_UNDO_MAXITEM),
+    m_nAlignment(0),
+    m_bNotifyFlag(FALSE),
+    m_bEnableOverflow(FALSE),
+    m_bEnableRefresh(TRUE),
+    m_rcOldContent(0.0f,0.0f,0.0f,0.0f),
+    m_bEnableUndo(TRUE),
+    m_bNotify(TRUE),
+    m_bOprNotify(FALSE),
+    m_pGroupUndoItem(NULL)
 {
-	ASSERT(pVT != NULL);
+    ASSERT(pVT != NULL);
 }
 
 CFX_Edit::~CFX_Edit()
@@ -982,9 +955,9 @@
 
 void CFX_Edit::Initialize()
 {
-	m_pVT->Initialize();
-	SetCaret(m_pVT->GetBeginWordPlace());
-	SetCaretOrigin();
+    m_pVT->Initialize();
+    SetCaret(m_pVT->GetBeginWordPlace());
+    SetCaretOrigin();
 }
 
 void CFX_Edit::SetFontMap(IFX_Edit_FontMap * pFontMap)
@@ -995,2458 +968,2458 @@
 
 void CFX_Edit::SetVTProvider(IPDF_VariableText_Provider* pProvider)
 {
-	m_pVT->SetProvider(pProvider);
+    m_pVT->SetProvider(pProvider);
 }
 
 void CFX_Edit::SetNotify(IFX_Edit_Notify* pNotify)
 {
-	m_pNotify = pNotify;
+    m_pNotify = pNotify;
 }
 
 void CFX_Edit::SetOprNotify(IFX_Edit_OprNotify* pOprNotify)
 {
-	m_pOprNotify = pOprNotify;
+    m_pOprNotify = pOprNotify;
 }
 
 IFX_Edit_Iterator * CFX_Edit::GetIterator()
 {
-	if (!m_pIterator)
-		m_pIterator = new CFX_Edit_Iterator(this,m_pVT->GetIterator());
+    if (!m_pIterator)
+        m_pIterator = new CFX_Edit_Iterator(this,m_pVT->GetIterator());
 
-	return m_pIterator;
+    return m_pIterator;
 }
 
-IPDF_VariableText *	CFX_Edit::GetVariableText()
+IPDF_VariableText * CFX_Edit::GetVariableText()
 {
-	return m_pVT;
+    return m_pVT;
 }
 
 IFX_Edit_FontMap* CFX_Edit::GetFontMap()
 {
-	if (m_pVTProvide)
-		return m_pVTProvide->GetFontMap();
+    if (m_pVTProvide)
+        return m_pVTProvide->GetFontMap();
 
-	return NULL;
+    return NULL;
 }
 
 void CFX_Edit::SetPlateRect(const CPDF_Rect & rect, FX_BOOL bPaint/* = TRUE*/)
 {
-	m_pVT->SetPlateRect(rect);
-	m_ptScrollPos = CPDF_Point(rect.left,rect.top);
-	if (bPaint) Paint();
+    m_pVT->SetPlateRect(rect);
+    m_ptScrollPos = CPDF_Point(rect.left,rect.top);
+    if (bPaint) Paint();
 }
 
 void CFX_Edit::SetAlignmentH(int32_t nFormat/* =0 */, FX_BOOL bPaint/* = TRUE*/)
 {
-	m_pVT->SetAlignment(nFormat);
-	if (bPaint) Paint();
+    m_pVT->SetAlignment(nFormat);
+    if (bPaint) Paint();
 }
 
 void CFX_Edit::SetAlignmentV(int32_t nFormat/* =0 */, FX_BOOL bPaint/* = TRUE*/)
 {
-	m_nAlignment = nFormat;
-	if (bPaint) Paint();
+    m_nAlignment = nFormat;
+    if (bPaint) Paint();
 }
 
 void CFX_Edit::SetPasswordChar(FX_WORD wSubWord/* ='*' */, FX_BOOL bPaint/* = TRUE*/)
 {
-	m_pVT->SetPasswordChar(wSubWord);
-	if (bPaint) Paint();
+    m_pVT->SetPasswordChar(wSubWord);
+    if (bPaint) Paint();
 }
 
 void CFX_Edit::SetLimitChar(int32_t nLimitChar/* =0 */, FX_BOOL bPaint/* = TRUE*/)
 {
-	m_pVT->SetLimitChar(nLimitChar);
-	if (bPaint) Paint();
+    m_pVT->SetLimitChar(nLimitChar);
+    if (bPaint) Paint();
 }
 
 void CFX_Edit::SetCharArray(int32_t nCharArray/* =0 */, FX_BOOL bPaint/* = TRUE*/)
 {
-	m_pVT->SetCharArray(nCharArray);
-	if (bPaint) Paint();
+    m_pVT->SetCharArray(nCharArray);
+    if (bPaint) Paint();
 }
 
 void CFX_Edit::SetCharSpace(FX_FLOAT fCharSpace/* =0.0f */, FX_BOOL bPaint/* = TRUE*/)
 {
-	m_pVT->SetCharSpace(fCharSpace);
-	if (bPaint) Paint();
+    m_pVT->SetCharSpace(fCharSpace);
+    if (bPaint) Paint();
 }
 
 void CFX_Edit::SetHorzScale(int32_t nHorzScale/* =100 */, FX_BOOL bPaint/* = TRUE*/)
 {
-	m_pVT->SetHorzScale(nHorzScale);
-	if (bPaint) Paint();
+    m_pVT->SetHorzScale(nHorzScale);
+    if (bPaint) Paint();
 }
 
 void CFX_Edit::SetMultiLine(FX_BOOL bMultiLine/* =TRUE */, FX_BOOL bPaint/* = TRUE*/)
 {
-	m_pVT->SetMultiLine(bMultiLine);
-	if (bPaint) Paint();
+    m_pVT->SetMultiLine(bMultiLine);
+    if (bPaint) Paint();
 }
 
 void CFX_Edit::SetAutoReturn(FX_BOOL bAuto/* =TRUE */, FX_BOOL bPaint/* = TRUE*/)
 {
-	m_pVT->SetAutoReturn(bAuto);
-	if (bPaint) Paint();
+    m_pVT->SetAutoReturn(bAuto);
+    if (bPaint) Paint();
 }
 
 void CFX_Edit::SetLineLeading(FX_FLOAT fLineLeading/* =TRUE */, FX_BOOL bPaint/* = TRUE*/)
 {
-	m_pVT->SetLineLeading(fLineLeading);
-	if (bPaint) Paint();
+    m_pVT->SetLineLeading(fLineLeading);
+    if (bPaint) Paint();
 }
 
 void CFX_Edit::SetAutoFontSize(FX_BOOL bAuto/* =TRUE */, FX_BOOL bPaint/* = TRUE*/)
 {
-	m_pVT->SetAutoFontSize(bAuto);
-	if (bPaint) Paint();
+    m_pVT->SetAutoFontSize(bAuto);
+    if (bPaint) Paint();
 }
 
 void CFX_Edit::SetFontSize(FX_FLOAT fFontSize, FX_BOOL bPaint/* = TRUE*/)
 {
-	m_pVT->SetFontSize(fFontSize);
-	if (bPaint) Paint();
+    m_pVT->SetFontSize(fFontSize);
+    if (bPaint) Paint();
 }
 
 void CFX_Edit::SetAutoScroll(FX_BOOL bAuto/* =TRUE */, FX_BOOL bPaint/* = TRUE*/)
 {
-	m_bEnableScroll = bAuto;
-	if (bPaint) Paint();
+    m_bEnableScroll = bAuto;
+    if (bPaint) Paint();
 }
 
 void CFX_Edit::SetTextOverflow(FX_BOOL bAllowed /*= FALSE*/, FX_BOOL bPaint/* = TRUE*/)
 {
-	m_bEnableOverflow = bAllowed;
-	if (bPaint) Paint();
+    m_bEnableOverflow = bAllowed;
+    if (bPaint) Paint();
 }
 
 void CFX_Edit::SetSel(int32_t nStartChar,int32_t nEndChar)
 {
-	if (m_pVT->IsValid())
-	{
-		if (nStartChar == 0 && nEndChar < 0)
-		{
-			SelectAll();
-		}
-		else if (nStartChar < 0)
-		{
-			SelectNone();
-		}
-		else
-		{
-			if (nStartChar < nEndChar)
-			{
-				SetSel(m_pVT->WordIndexToWordPlace(nStartChar),m_pVT->WordIndexToWordPlace(nEndChar));
-			}
-			else
-			{
-				SetSel(m_pVT->WordIndexToWordPlace(nEndChar),m_pVT->WordIndexToWordPlace(nStartChar));
-			}
-		}
-	}
+    if (m_pVT->IsValid())
+    {
+        if (nStartChar == 0 && nEndChar < 0)
+        {
+            SelectAll();
+        }
+        else if (nStartChar < 0)
+        {
+            SelectNone();
+        }
+        else
+        {
+            if (nStartChar < nEndChar)
+            {
+                SetSel(m_pVT->WordIndexToWordPlace(nStartChar),m_pVT->WordIndexToWordPlace(nEndChar));
+            }
+            else
+            {
+                SetSel(m_pVT->WordIndexToWordPlace(nEndChar),m_pVT->WordIndexToWordPlace(nStartChar));
+            }
+        }
+    }
 }
 
 void CFX_Edit::SetSel(const CPVT_WordPlace & begin,const CPVT_WordPlace & end)
 {
-	if (m_pVT->IsValid())
-	{
-		SelectNone();
+    if (m_pVT->IsValid())
+    {
+        SelectNone();
 
-		m_SelState.Set(begin,end);
+        m_SelState.Set(begin,end);
 
-		SetCaret(m_SelState.EndPos);
+        SetCaret(m_SelState.EndPos);
 
-		if (m_SelState.IsExist())
-		{
-			ScrollToCaret();
-			CPVT_WordRange wr(m_SelState.BeginPos,m_SelState.EndPos);
-			Refresh(RP_OPTIONAL,&wr);
-			SetCaretInfo();
-		}
-		else
-		{
-			ScrollToCaret();
-			SetCaretInfo();
-		}
-	}
+        if (m_SelState.IsExist())
+        {
+            ScrollToCaret();
+            CPVT_WordRange wr(m_SelState.BeginPos,m_SelState.EndPos);
+            Refresh(RP_OPTIONAL,&wr);
+            SetCaretInfo();
+        }
+        else
+        {
+            ScrollToCaret();
+            SetCaretInfo();
+        }
+    }
 }
 
 void CFX_Edit::GetSel(int32_t & nStartChar, int32_t & nEndChar) const
 {
-	nStartChar = -1;
-	nEndChar = -1;
+    nStartChar = -1;
+    nEndChar = -1;
 
-	if (m_pVT->IsValid())
-	{
-		if (m_SelState.IsExist())
-		{
-			if (m_SelState.BeginPos.WordCmp(m_SelState.EndPos)<0)
-			{
-				nStartChar = m_pVT->WordPlaceToWordIndex(m_SelState.BeginPos);
-				nEndChar = m_pVT->WordPlaceToWordIndex(m_SelState.EndPos);
-			}
-			else
-			{
-				nStartChar = m_pVT->WordPlaceToWordIndex(m_SelState.EndPos);
-				nEndChar = m_pVT->WordPlaceToWordIndex(m_SelState.BeginPos);
-			}
-		}
-		else
-		{
-			nStartChar = m_pVT->WordPlaceToWordIndex(m_wpCaret);
-			nEndChar = m_pVT->WordPlaceToWordIndex(m_wpCaret);
-		}
-	}
+    if (m_pVT->IsValid())
+    {
+        if (m_SelState.IsExist())
+        {
+            if (m_SelState.BeginPos.WordCmp(m_SelState.EndPos)<0)
+            {
+                nStartChar = m_pVT->WordPlaceToWordIndex(m_SelState.BeginPos);
+                nEndChar = m_pVT->WordPlaceToWordIndex(m_SelState.EndPos);
+            }
+            else
+            {
+                nStartChar = m_pVT->WordPlaceToWordIndex(m_SelState.EndPos);
+                nEndChar = m_pVT->WordPlaceToWordIndex(m_SelState.BeginPos);
+            }
+        }
+        else
+        {
+            nStartChar = m_pVT->WordPlaceToWordIndex(m_wpCaret);
+            nEndChar = m_pVT->WordPlaceToWordIndex(m_wpCaret);
+        }
+    }
 }
 
 int32_t CFX_Edit::GetCaret() const
 {
-	if (m_pVT->IsValid())
-		return m_pVT->WordPlaceToWordIndex(m_wpCaret);
+    if (m_pVT->IsValid())
+        return m_pVT->WordPlaceToWordIndex(m_wpCaret);
 
-	return -1;
+    return -1;
 }
 
 CPVT_WordPlace CFX_Edit::GetCaretWordPlace() const
 {
-	return m_wpCaret;
+    return m_wpCaret;
 }
 
 CFX_WideString CFX_Edit::GetText() const
 {
-	CFX_WideString swRet;
+    CFX_WideString swRet;
 
-	if (m_pVT->IsValid())
-	{
-		if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
-		{
-			FX_BOOL bRich = m_pVT->IsRichText();
+    if (m_pVT->IsValid())
+    {
+        if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
+        {
+            FX_BOOL bRich = m_pVT->IsRichText();
 
-			pIterator->SetAt(0);
+            pIterator->SetAt(0);
 
-			CPVT_Word wordinfo;
-			CPVT_WordPlace oldplace = pIterator->GetAt();
-			while (pIterator->NextWord())
-			{
-				CPVT_WordPlace place = pIterator->GetAt();
+            CPVT_Word wordinfo;
+            CPVT_WordPlace oldplace = pIterator->GetAt();
+            while (pIterator->NextWord())
+            {
+                CPVT_WordPlace place = pIterator->GetAt();
 
-				if (pIterator->GetWord(wordinfo))
-				{
-					if (bRich)
-					{
-						swRet += wordinfo.Word;
-					}
-					else
-					{
-						swRet += wordinfo.Word;
-					}
-				}
+                if (pIterator->GetWord(wordinfo))
+                {
+                    if (bRich)
+                    {
+                        swRet += wordinfo.Word;
+                    }
+                    else
+                    {
+                        swRet += wordinfo.Word;
+                    }
+                }
 
-				if (oldplace.SecCmp(place) != 0)
-				{
-					swRet += 0x0D;
-					swRet += 0x0A;
-				}
+                if (oldplace.SecCmp(place) != 0)
+                {
+                    swRet += 0x0D;
+                    swRet += 0x0A;
+                }
 
-				oldplace = place;
-			}
-		}
-	}
+                oldplace = place;
+            }
+        }
+    }
 
-	return swRet;
+    return swRet;
 }
 
 CFX_WideString CFX_Edit::GetRangeText(const CPVT_WordRange & range) const
 {
-	CFX_WideString swRet;
+    CFX_WideString swRet;
 
-	if (m_pVT->IsValid())
-	{
-		FX_BOOL bRich = m_pVT->IsRichText();
+    if (m_pVT->IsValid())
+    {
+        FX_BOOL bRich = m_pVT->IsRichText();
 
-		if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
-		{
-			CPVT_WordRange wrTemp = range;
-			m_pVT->UpdateWordPlace(wrTemp.BeginPos);
-			m_pVT->UpdateWordPlace(wrTemp.EndPos);
-			pIterator->SetAt(wrTemp.BeginPos);
+        if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
+        {
+            CPVT_WordRange wrTemp = range;
+            m_pVT->UpdateWordPlace(wrTemp.BeginPos);
+            m_pVT->UpdateWordPlace(wrTemp.EndPos);
+            pIterator->SetAt(wrTemp.BeginPos);
 
-			CPVT_Word wordinfo;
-			CPVT_WordPlace oldplace = wrTemp.BeginPos;
-			while (pIterator->NextWord())
-			{
-				CPVT_WordPlace place = pIterator->GetAt();
-				if (place.WordCmp(wrTemp.EndPos) > 0)break;
+            CPVT_Word wordinfo;
+            CPVT_WordPlace oldplace = wrTemp.BeginPos;
+            while (pIterator->NextWord())
+            {
+                CPVT_WordPlace place = pIterator->GetAt();
+                if (place.WordCmp(wrTemp.EndPos) > 0)break;
 
-				if (pIterator->GetWord(wordinfo))
-				{
-					if (bRich)
-					{
-						swRet += wordinfo.Word;
-					}
-					else
-					{
-						swRet += wordinfo.Word;
-					}
-				}
+                if (pIterator->GetWord(wordinfo))
+                {
+                    if (bRich)
+                    {
+                        swRet += wordinfo.Word;
+                    }
+                    else
+                    {
+                        swRet += wordinfo.Word;
+                    }
+                }
 
-				if (oldplace.SecCmp(place) != 0)
-				{
-					swRet += 0x0D;
-					swRet += 0x0A;
-				}
+                if (oldplace.SecCmp(place) != 0)
+                {
+                    swRet += 0x0D;
+                    swRet += 0x0A;
+                }
 
-				oldplace = place;
-			}
-		}
-	}
+                oldplace = place;
+            }
+        }
+    }
 
-	return swRet;
+    return swRet;
 }
 
 CFX_WideString CFX_Edit::GetSelText() const
 {
-	return GetRangeText(m_SelState.ConvertToWordRange());
+    return GetRangeText(m_SelState.ConvertToWordRange());
 }
 
 int32_t CFX_Edit::GetTotalWords() const
 {
-	return m_pVT->GetTotalWords();
+    return m_pVT->GetTotalWords();
 }
 
 int32_t CFX_Edit::GetTotalLines() const
 {
-	int32_t nLines = 0;
+    int32_t nLines = 0;
 
-	if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
-	{
-		pIterator->SetAt(0);
-		while (pIterator->NextLine())
-			nLines++;
-	}
+    if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
+    {
+        pIterator->SetAt(0);
+        while (pIterator->NextLine())
+            nLines++;
+    }
 
-	return nLines+1;
+    return nLines+1;
 }
 
 CPVT_WordRange CFX_Edit::GetSelectWordRange() const
 {
-	return m_SelState.ConvertToWordRange();
+    return m_SelState.ConvertToWordRange();
 }
 
 CPVT_WordRange CFX_Edit::CombineWordRange(const CPVT_WordRange & wr1, const CPVT_WordRange & wr2)
 {
-	CPVT_WordRange wrRet;
+    CPVT_WordRange wrRet;
 
-	if (wr1.BeginPos.WordCmp(wr2.BeginPos) < 0)
-	{
-		wrRet.BeginPos = wr1.BeginPos;
-	}
-	else
-	{
-		wrRet.BeginPos = wr2.BeginPos;
-	}
+    if (wr1.BeginPos.WordCmp(wr2.BeginPos) < 0)
+    {
+        wrRet.BeginPos = wr1.BeginPos;
+    }
+    else
+    {
+        wrRet.BeginPos = wr2.BeginPos;
+    }
 
-	if (wr1.EndPos.WordCmp(wr2.EndPos) < 0)
-	{
-		wrRet.EndPos = wr2.EndPos;
-	}
-	else
-	{
-		wrRet.EndPos = wr1.EndPos;
-	}
+    if (wr1.EndPos.WordCmp(wr2.EndPos) < 0)
+    {
+        wrRet.EndPos = wr2.EndPos;
+    }
+    else
+    {
+        wrRet.EndPos = wr1.EndPos;
+    }
 
-	return wrRet;
+    return wrRet;
 }
 
-FX_BOOL	CFX_Edit::IsRichText() const
+FX_BOOL CFX_Edit::IsRichText() const
 {
-	return m_pVT->IsRichText();
+    return m_pVT->IsRichText();
 }
 
 void CFX_Edit::SetRichText(FX_BOOL bRichText/* =TRUE */, FX_BOOL bPaint/* = TRUE*/)
 {
-	m_pVT->SetRichText(bRichText);
-	if (bPaint) Paint();
+    m_pVT->SetRichText(bRichText);
+    if (bPaint) Paint();
 }
 
 FX_BOOL CFX_Edit::SetRichFontIndex(int32_t nFontIndex)
 {
-	CPVT_WordProps WordProps;
-	WordProps.nFontIndex = nFontIndex;
-	return SetRichTextProps(EP_FONTINDEX,NULL,&WordProps);
+    CPVT_WordProps WordProps;
+    WordProps.nFontIndex = nFontIndex;
+    return SetRichTextProps(EP_FONTINDEX,NULL,&WordProps);
 }
 
 FX_BOOL CFX_Edit::SetRichFontSize(FX_FLOAT fFontSize)
 {
-	CPVT_WordProps WordProps;
-	WordProps.fFontSize = fFontSize;
-	return SetRichTextProps(EP_FONTSIZE,NULL,&WordProps);
+    CPVT_WordProps WordProps;
+    WordProps.fFontSize = fFontSize;
+    return SetRichTextProps(EP_FONTSIZE,NULL,&WordProps);
 }
 
 FX_BOOL CFX_Edit::SetRichTextColor(FX_COLORREF dwColor)
 {
-	CPVT_WordProps WordProps;
-	WordProps.dwWordColor = dwColor;
-	return SetRichTextProps(EP_WORDCOLOR,NULL,&WordProps);
+    CPVT_WordProps WordProps;
+    WordProps.dwWordColor = dwColor;
+    return SetRichTextProps(EP_WORDCOLOR,NULL,&WordProps);
 }
 
 FX_BOOL CFX_Edit::SetRichTextScript(int32_t nScriptType)
 {
-	CPVT_WordProps WordProps;
-	WordProps.nScriptType = nScriptType;
-	return SetRichTextProps(EP_SCRIPTTYPE,NULL,&WordProps);
+    CPVT_WordProps WordProps;
+    WordProps.nScriptType = nScriptType;
+    return SetRichTextProps(EP_SCRIPTTYPE,NULL,&WordProps);
 }
 
 FX_BOOL CFX_Edit::SetRichTextBold(FX_BOOL bBold)
 {
-	CPVT_WordProps WordProps;
-	if (bBold)
-		WordProps.nWordStyle |= PVTWORD_STYLE_BOLD;
-	return SetRichTextProps(EP_BOLD,NULL,&WordProps);
+    CPVT_WordProps WordProps;
+    if (bBold)
+        WordProps.nWordStyle |= PVTWORD_STYLE_BOLD;
+    return SetRichTextProps(EP_BOLD,NULL,&WordProps);
 }
 
 FX_BOOL CFX_Edit::SetRichTextItalic(FX_BOOL bItalic)
 {
-	CPVT_WordProps WordProps;
-	if (bItalic)
-		WordProps.nWordStyle |= PVTWORD_STYLE_ITALIC;
-	return SetRichTextProps(EP_ITALIC,NULL,&WordProps);
+    CPVT_WordProps WordProps;
+    if (bItalic)
+        WordProps.nWordStyle |= PVTWORD_STYLE_ITALIC;
+    return SetRichTextProps(EP_ITALIC,NULL,&WordProps);
 }
 
 FX_BOOL CFX_Edit::SetRichTextUnderline(FX_BOOL bUnderline)
 {
-	CPVT_WordProps WordProps;
-	if (bUnderline)
-		WordProps.nWordStyle |= PVTWORD_STYLE_UNDERLINE;
-	return SetRichTextProps(EP_UNDERLINE,NULL,&WordProps);
+    CPVT_WordProps WordProps;
+    if (bUnderline)
+        WordProps.nWordStyle |= PVTWORD_STYLE_UNDERLINE;
+    return SetRichTextProps(EP_UNDERLINE,NULL,&WordProps);
 }
 
 FX_BOOL CFX_Edit::SetRichTextCrossout(FX_BOOL bCrossout)
 {
-	CPVT_WordProps WordProps;
-	if (bCrossout)
-		WordProps.nWordStyle |= PVTWORD_STYLE_CROSSOUT;
-	return SetRichTextProps(EP_CROSSOUT,NULL,&WordProps);
+    CPVT_WordProps WordProps;
+    if (bCrossout)
+        WordProps.nWordStyle |= PVTWORD_STYLE_CROSSOUT;
+    return SetRichTextProps(EP_CROSSOUT,NULL,&WordProps);
 }
 
 FX_BOOL CFX_Edit::SetRichTextCharSpace(FX_FLOAT fCharSpace)
 {
-	CPVT_WordProps WordProps;
-	WordProps.fCharSpace = fCharSpace;
-	return SetRichTextProps(EP_CHARSPACE,NULL,&WordProps);
+    CPVT_WordProps WordProps;
+    WordProps.fCharSpace = fCharSpace;
+    return SetRichTextProps(EP_CHARSPACE,NULL,&WordProps);
 }
 
 FX_BOOL CFX_Edit::SetRichTextHorzScale(int32_t nHorzScale /*= 100*/)
 {
-	CPVT_WordProps WordProps;
-	WordProps.nHorzScale = nHorzScale;
-	return SetRichTextProps(EP_HORZSCALE,NULL,&WordProps);
+    CPVT_WordProps WordProps;
+    WordProps.nHorzScale = nHorzScale;
+    return SetRichTextProps(EP_HORZSCALE,NULL,&WordProps);
 }
 
 FX_BOOL CFX_Edit::SetRichTextLineLeading(FX_FLOAT fLineLeading)
 {
-	CPVT_SecProps SecProps;
-	SecProps.fLineLeading = fLineLeading;
-	return SetRichTextProps(EP_LINELEADING,&SecProps,NULL);
+    CPVT_SecProps SecProps;
+    SecProps.fLineLeading = fLineLeading;
+    return SetRichTextProps(EP_LINELEADING,&SecProps,NULL);
 }
 
 FX_BOOL CFX_Edit::SetRichTextLineIndent(FX_FLOAT fLineIndent)
 {
-	CPVT_SecProps SecProps;
-	SecProps.fLineIndent = fLineIndent;
-	return SetRichTextProps(EP_LINEINDENT,&SecProps,NULL);
+    CPVT_SecProps SecProps;
+    SecProps.fLineIndent = fLineIndent;
+    return SetRichTextProps(EP_LINEINDENT,&SecProps,NULL);
 }
 
-FX_BOOL	CFX_Edit::SetRichTextAlignment(int32_t nAlignment)
+FX_BOOL CFX_Edit::SetRichTextAlignment(int32_t nAlignment)
 {
-	CPVT_SecProps SecProps;
-	SecProps.nAlignment = nAlignment;
-	return SetRichTextProps(EP_ALIGNMENT,&SecProps,NULL);
+    CPVT_SecProps SecProps;
+    SecProps.nAlignment = nAlignment;
+    return SetRichTextProps(EP_ALIGNMENT,&SecProps,NULL);
 }
 
 FX_BOOL CFX_Edit::SetRichTextProps(EDIT_PROPS_E eProps, const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps)
 {
-	FX_BOOL bSet = FALSE;
-	FX_BOOL bSet1,bSet2;
-	if (m_pVT->IsValid() && m_pVT->IsRichText())
-	{
-		if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
-		{
-			CPVT_WordRange wrTemp = m_SelState.ConvertToWordRange();
+    FX_BOOL bSet = FALSE;
+    FX_BOOL bSet1,bSet2;
+    if (m_pVT->IsValid() && m_pVT->IsRichText())
+    {
+        if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
+        {
+            CPVT_WordRange wrTemp = m_SelState.ConvertToWordRange();
 
-			m_pVT->UpdateWordPlace(wrTemp.BeginPos);
-			m_pVT->UpdateWordPlace(wrTemp.EndPos);
-			pIterator->SetAt(wrTemp.BeginPos);
+            m_pVT->UpdateWordPlace(wrTemp.BeginPos);
+            m_pVT->UpdateWordPlace(wrTemp.EndPos);
+            pIterator->SetAt(wrTemp.BeginPos);
 
-			BeginGroupUndo(L"");;
+            BeginGroupUndo(L"");;
 
-			bSet = SetSecProps(eProps,wrTemp.BeginPos,pSecProps,pWordProps,wrTemp,TRUE);
+            bSet = SetSecProps(eProps,wrTemp.BeginPos,pSecProps,pWordProps,wrTemp,TRUE);
 
-			while (pIterator->NextWord())
-			{
-				CPVT_WordPlace place = pIterator->GetAt();
-				if (place.WordCmp(wrTemp.EndPos) > 0) break;
-				bSet1 = SetSecProps(eProps,place,pSecProps,pWordProps,wrTemp,TRUE);
-				bSet2 = SetWordProps(eProps,place,pWordProps,wrTemp,TRUE);
+            while (pIterator->NextWord())
+            {
+                CPVT_WordPlace place = pIterator->GetAt();
+                if (place.WordCmp(wrTemp.EndPos) > 0) break;
+                bSet1 = SetSecProps(eProps,place,pSecProps,pWordProps,wrTemp,TRUE);
+                bSet2 = SetWordProps(eProps,place,pWordProps,wrTemp,TRUE);
 
-				if (!bSet)
-					bSet = (bSet1 || bSet2);
-			}
+                if (!bSet)
+                    bSet = (bSet1 || bSet2);
+            }
 
-			EndGroupUndo();
+            EndGroupUndo();
 
-			if (bSet)
-			{
-				PaintSetProps(eProps,wrTemp);
-			}
-		}
-	}
+            if (bSet)
+            {
+                PaintSetProps(eProps,wrTemp);
+            }
+        }
+    }
 
-	return bSet;
+    return bSet;
 }
 
 void CFX_Edit::PaintSetProps(EDIT_PROPS_E eProps, const CPVT_WordRange & wr)
 {
-	switch(eProps)
-	{
-	case EP_LINELEADING:
-	case EP_LINEINDENT:
-	case EP_ALIGNMENT:
-		RearrangePart(wr);
-		ScrollToCaret();
-		Refresh(RP_ANALYSE);
-		SetCaretOrigin();
-		SetCaretInfo();
-		break;
-	case EP_WORDCOLOR:
-	case EP_UNDERLINE:
-	case EP_CROSSOUT:
-		Refresh(RP_OPTIONAL,&wr);
-		break;
-	case EP_FONTINDEX:
-	case EP_FONTSIZE:
-	case EP_SCRIPTTYPE:
-	case EP_CHARSPACE:
-	case EP_HORZSCALE:
-	case EP_BOLD:
-	case EP_ITALIC:
-		RearrangePart(wr);
-		ScrollToCaret();
+    switch(eProps)
+    {
+    case EP_LINELEADING:
+    case EP_LINEINDENT:
+    case EP_ALIGNMENT:
+        RearrangePart(wr);
+        ScrollToCaret();
+        Refresh(RP_ANALYSE);
+        SetCaretOrigin();
+        SetCaretInfo();
+        break;
+    case EP_WORDCOLOR:
+    case EP_UNDERLINE:
+    case EP_CROSSOUT:
+        Refresh(RP_OPTIONAL,&wr);
+        break;
+    case EP_FONTINDEX:
+    case EP_FONTSIZE:
+    case EP_SCRIPTTYPE:
+    case EP_CHARSPACE:
+    case EP_HORZSCALE:
+    case EP_BOLD:
+    case EP_ITALIC:
+        RearrangePart(wr);
+        ScrollToCaret();
 
-		CPVT_WordRange wrRefresh(m_pVT->GetSectionBeginPlace(wr.BeginPos),
-			m_pVT->GetSectionEndPlace(wr.EndPos));
-		Refresh(RP_ANALYSE,&wrRefresh);
+        CPVT_WordRange wrRefresh(m_pVT->GetSectionBeginPlace(wr.BeginPos),
+            m_pVT->GetSectionEndPlace(wr.EndPos));
+        Refresh(RP_ANALYSE,&wrRefresh);
 
-		SetCaretOrigin();
-		SetCaretInfo();
-		break;
-	}
+        SetCaretOrigin();
+        SetCaretInfo();
+        break;
+    }
 }
 
 FX_BOOL CFX_Edit::SetSecProps(EDIT_PROPS_E eProps, const CPVT_WordPlace & place,
-							   const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps,
-							   const CPVT_WordRange & wr, FX_BOOL bAddUndo)
+                               const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps,
+                               const CPVT_WordRange & wr, FX_BOOL bAddUndo)
 {
-	if (m_pVT->IsValid() && m_pVT->IsRichText())
-	{
-		if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
-		{
-			FX_BOOL bSet = FALSE;
-			CPVT_Section secinfo;
-			CPVT_Section OldSecinfo;
+    if (m_pVT->IsValid() && m_pVT->IsRichText())
+    {
+        if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
+        {
+            FX_BOOL bSet = FALSE;
+            CPVT_Section secinfo;
+            CPVT_Section OldSecinfo;
 
-			CPVT_WordPlace oldplace = pIterator->GetAt();
+            CPVT_WordPlace oldplace = pIterator->GetAt();
 
-			if (eProps == EP_LINELEADING || eProps == EP_LINEINDENT || eProps == EP_ALIGNMENT)
-			{
-				if (pSecProps)
-				{
-					pIterator->SetAt(place);
-					if (pIterator->GetSection(secinfo))
-					{
-						if (bAddUndo) OldSecinfo = secinfo;
+            if (eProps == EP_LINELEADING || eProps == EP_LINEINDENT || eProps == EP_ALIGNMENT)
+            {
+                if (pSecProps)
+                {
+                    pIterator->SetAt(place);
+                    if (pIterator->GetSection(secinfo))
+                    {
+                        if (bAddUndo) OldSecinfo = secinfo;
 
-						switch(eProps)
-						{
-						case EP_LINELEADING:
-							if (!FX_EDIT_IsFloatEqual(secinfo.SecProps.fLineLeading,pSecProps->fLineLeading))
-							{
-								secinfo.SecProps.fLineLeading = pSecProps->fLineLeading;
-								bSet = TRUE;
-							}
-							break;
-						case EP_LINEINDENT:
-							if (!FX_EDIT_IsFloatEqual(secinfo.SecProps.fLineIndent,pSecProps->fLineIndent))
-							{
-								secinfo.SecProps.fLineIndent = pSecProps->fLineIndent;
-								bSet = TRUE;
-							}
-							break;
-						case EP_ALIGNMENT:
-							if (secinfo.SecProps.nAlignment != pSecProps->nAlignment)
-							{
-								secinfo.SecProps.nAlignment = pSecProps->nAlignment;
-								bSet = TRUE;
-							}
-							break;
-						default:
-							break;
-						}
-					}
-				}
-			}
-			else
-			{
-				if (pWordProps && place == m_pVT->GetSectionBeginPlace(place))
-				{
-					pIterator->SetAt(place);
-					if (pIterator->GetSection(secinfo))
-					{
-						if (bAddUndo) OldSecinfo = secinfo;
+                        switch(eProps)
+                        {
+                        case EP_LINELEADING:
+                            if (!FX_EDIT_IsFloatEqual(secinfo.SecProps.fLineLeading,pSecProps->fLineLeading))
+                            {
+                                secinfo.SecProps.fLineLeading = pSecProps->fLineLeading;
+                                bSet = TRUE;
+                            }
+                            break;
+                        case EP_LINEINDENT:
+                            if (!FX_EDIT_IsFloatEqual(secinfo.SecProps.fLineIndent,pSecProps->fLineIndent))
+                            {
+                                secinfo.SecProps.fLineIndent = pSecProps->fLineIndent;
+                                bSet = TRUE;
+                            }
+                            break;
+                        case EP_ALIGNMENT:
+                            if (secinfo.SecProps.nAlignment != pSecProps->nAlignment)
+                            {
+                                secinfo.SecProps.nAlignment = pSecProps->nAlignment;
+                                bSet = TRUE;
+                            }
+                            break;
+                        default:
+                            break;
+                        }
+                    }
+                }
+            }
+            else
+            {
+                if (pWordProps && place == m_pVT->GetSectionBeginPlace(place))
+                {
+                    pIterator->SetAt(place);
+                    if (pIterator->GetSection(secinfo))
+                    {
+                        if (bAddUndo) OldSecinfo = secinfo;
 
-						switch(eProps)
-						{
-						case EP_FONTINDEX:
-							if (secinfo.WordProps.nFontIndex != pWordProps->nFontIndex)
-							{
-								secinfo.WordProps.nFontIndex = pWordProps->nFontIndex;
-								bSet = TRUE;
-							}
-							break;
-						case EP_FONTSIZE:
-							if (!FX_EDIT_IsFloatEqual(secinfo.WordProps.fFontSize,pWordProps->fFontSize))
-							{
-								secinfo.WordProps.fFontSize = pWordProps->fFontSize;
-								bSet = TRUE;
-							}
-							break;
-						case EP_WORDCOLOR:
-							if (secinfo.WordProps.dwWordColor != pWordProps->dwWordColor)
-							{
-								secinfo.WordProps.dwWordColor = pWordProps->dwWordColor;
-								bSet = TRUE;
-							}
-							break;
-						case EP_SCRIPTTYPE:
-							if (secinfo.WordProps.nScriptType != pWordProps->nScriptType)
-							{
-								secinfo.WordProps.nScriptType = pWordProps->nScriptType;
-								bSet = TRUE;
-							}
-							break;
-						case EP_CHARSPACE:
-							if (!FX_EDIT_IsFloatEqual(secinfo.WordProps.fCharSpace,pWordProps->fCharSpace))
-							{
-								secinfo.WordProps.fCharSpace = pWordProps->fCharSpace;
-								bSet = TRUE;
-							}
-							break;
-						case EP_HORZSCALE:
-							if (secinfo.WordProps.nHorzScale != pWordProps->nHorzScale)
-							{
-								secinfo.WordProps.nHorzScale = pWordProps->nHorzScale;
-								bSet = TRUE;
-							}
-							break;
-						case EP_UNDERLINE:
-							if (pWordProps->nWordStyle & PVTWORD_STYLE_UNDERLINE)
-							{
-								if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE) == 0)
-								{
-									secinfo.WordProps.nWordStyle |= PVTWORD_STYLE_UNDERLINE;
-									bSet = TRUE;
-								}
-							}
-							else
-							{
-								if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE) != 0)
-								{
-									secinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_UNDERLINE;
-									bSet = TRUE;
-								}
-							}
-							break;
-						case EP_CROSSOUT:
-							if (pWordProps->nWordStyle & PVTWORD_STYLE_CROSSOUT)
-							{
-								if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) == 0)
-								{
-									secinfo.WordProps.nWordStyle |= PVTWORD_STYLE_CROSSOUT;
-									bSet = TRUE;
-								}
-							}
-							else
-							{
-								if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) != 0)
-								{
-									secinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_CROSSOUT;
-									bSet = TRUE;
-								}
-							}
-							break;
-						case EP_BOLD:
-							if (pWordProps->nWordStyle & PVTWORD_STYLE_BOLD)
-							{
-								if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_BOLD) == 0)
-								{
-									secinfo.WordProps.nWordStyle |= PVTWORD_STYLE_BOLD;
-									bSet = TRUE;
-								}
-							}
-							else
-							{
-								if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_BOLD) != 0)
-								{
-									secinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_BOLD;
-									bSet = TRUE;
-								}
-							}
-							break;
-						case EP_ITALIC:
-							if (pWordProps->nWordStyle & PVTWORD_STYLE_ITALIC)
-							{
-								if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_ITALIC) == 0)
-								{
-									secinfo.WordProps.nWordStyle |= PVTWORD_STYLE_ITALIC;
-									bSet = TRUE;
-								}
-							}
-							else
-							{
-								if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_ITALIC) != 0)
-								{
-									secinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_ITALIC;
-									bSet = TRUE;
-								}
-							}
-							break;
-						default:
-							break;
-						}
-					}
-				}
-			}
+                        switch(eProps)
+                        {
+                        case EP_FONTINDEX:
+                            if (secinfo.WordProps.nFontIndex != pWordProps->nFontIndex)
+                            {
+                                secinfo.WordProps.nFontIndex = pWordProps->nFontIndex;
+                                bSet = TRUE;
+                            }
+                            break;
+                        case EP_FONTSIZE:
+                            if (!FX_EDIT_IsFloatEqual(secinfo.WordProps.fFontSize,pWordProps->fFontSize))
+                            {
+                                secinfo.WordProps.fFontSize = pWordProps->fFontSize;
+                                bSet = TRUE;
+                            }
+                            break;
+                        case EP_WORDCOLOR:
+                            if (secinfo.WordProps.dwWordColor != pWordProps->dwWordColor)
+                            {
+                                secinfo.WordProps.dwWordColor = pWordProps->dwWordColor;
+                                bSet = TRUE;
+                            }
+                            break;
+                        case EP_SCRIPTTYPE:
+                            if (secinfo.WordProps.nScriptType != pWordProps->nScriptType)
+                            {
+                                secinfo.WordProps.nScriptType = pWordProps->nScriptType;
+                                bSet = TRUE;
+                            }
+                            break;
+                        case EP_CHARSPACE:
+                            if (!FX_EDIT_IsFloatEqual(secinfo.WordProps.fCharSpace,pWordProps->fCharSpace))
+                            {
+                                secinfo.WordProps.fCharSpace = pWordProps->fCharSpace;
+                                bSet = TRUE;
+                            }
+                            break;
+                        case EP_HORZSCALE:
+                            if (secinfo.WordProps.nHorzScale != pWordProps->nHorzScale)
+                            {
+                                secinfo.WordProps.nHorzScale = pWordProps->nHorzScale;
+                                bSet = TRUE;
+                            }
+                            break;
+                        case EP_UNDERLINE:
+                            if (pWordProps->nWordStyle & PVTWORD_STYLE_UNDERLINE)
+                            {
+                                if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE) == 0)
+                                {
+                                    secinfo.WordProps.nWordStyle |= PVTWORD_STYLE_UNDERLINE;
+                                    bSet = TRUE;
+                                }
+                            }
+                            else
+                            {
+                                if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE) != 0)
+                                {
+                                    secinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_UNDERLINE;
+                                    bSet = TRUE;
+                                }
+                            }
+                            break;
+                        case EP_CROSSOUT:
+                            if (pWordProps->nWordStyle & PVTWORD_STYLE_CROSSOUT)
+                            {
+                                if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) == 0)
+                                {
+                                    secinfo.WordProps.nWordStyle |= PVTWORD_STYLE_CROSSOUT;
+                                    bSet = TRUE;
+                                }
+                            }
+                            else
+                            {
+                                if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) != 0)
+                                {
+                                    secinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_CROSSOUT;
+                                    bSet = TRUE;
+                                }
+                            }
+                            break;
+                        case EP_BOLD:
+                            if (pWordProps->nWordStyle & PVTWORD_STYLE_BOLD)
+                            {
+                                if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_BOLD) == 0)
+                                {
+                                    secinfo.WordProps.nWordStyle |= PVTWORD_STYLE_BOLD;
+                                    bSet = TRUE;
+                                }
+                            }
+                            else
+                            {
+                                if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_BOLD) != 0)
+                                {
+                                    secinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_BOLD;
+                                    bSet = TRUE;
+                                }
+                            }
+                            break;
+                        case EP_ITALIC:
+                            if (pWordProps->nWordStyle & PVTWORD_STYLE_ITALIC)
+                            {
+                                if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_ITALIC) == 0)
+                                {
+                                    secinfo.WordProps.nWordStyle |= PVTWORD_STYLE_ITALIC;
+                                    bSet = TRUE;
+                                }
+                            }
+                            else
+                            {
+                                if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_ITALIC) != 0)
+                                {
+                                    secinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_ITALIC;
+                                    bSet = TRUE;
+                                }
+                            }
+                            break;
+                        default:
+                            break;
+                        }
+                    }
+                }
+            }
 
-			if (bSet)
-			{
-				pIterator->SetSection(secinfo);
+            if (bSet)
+            {
+                pIterator->SetSection(secinfo);
 
-				if (bAddUndo && m_bEnableUndo)
-				{
-					AddEditUndoItem(new CFXEU_SetSecProps
-						(this,place,eProps,OldSecinfo.SecProps,OldSecinfo.WordProps,secinfo.SecProps,secinfo.WordProps,wr));
-				}
-			}
+                if (bAddUndo && m_bEnableUndo)
+                {
+                    AddEditUndoItem(new CFXEU_SetSecProps
+                        (this,place,eProps,OldSecinfo.SecProps,OldSecinfo.WordProps,secinfo.SecProps,secinfo.WordProps,wr));
+                }
+            }
 
-			pIterator->SetAt(oldplace);
+            pIterator->SetAt(oldplace);
 
-			return bSet;
-		}
-	}
+            return bSet;
+        }
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
 FX_BOOL CFX_Edit::SetWordProps(EDIT_PROPS_E eProps, const CPVT_WordPlace & place,
-								const CPVT_WordProps * pWordProps, const CPVT_WordRange & wr, FX_BOOL bAddUndo)
+                                const CPVT_WordProps * pWordProps, const CPVT_WordRange & wr, FX_BOOL bAddUndo)
 {
-	if (m_pVT->IsValid() && m_pVT->IsRichText())
-	{
-		if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
-		{
-			FX_BOOL bSet = FALSE;
-			CPVT_Word wordinfo;
-			CPVT_Word OldWordinfo;
+    if (m_pVT->IsValid() && m_pVT->IsRichText())
+    {
+        if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
+        {
+            FX_BOOL bSet = FALSE;
+            CPVT_Word wordinfo;
+            CPVT_Word OldWordinfo;
 
-			CPVT_WordPlace oldplace = pIterator->GetAt();
+            CPVT_WordPlace oldplace = pIterator->GetAt();
 
-			if (pWordProps)
-			{
-				pIterator->SetAt(place);
-				if (pIterator->GetWord(wordinfo))
-				{
-					if (bAddUndo) OldWordinfo = wordinfo;
+            if (pWordProps)
+            {
+                pIterator->SetAt(place);
+                if (pIterator->GetWord(wordinfo))
+                {
+                    if (bAddUndo) OldWordinfo = wordinfo;
 
-					switch(eProps)
-					{
-					case EP_FONTINDEX:
-						if (wordinfo.WordProps.nFontIndex != pWordProps->nFontIndex)
-						{
-							if (IFX_Edit_FontMap* pFontMap = GetFontMap())
-							{
-								wordinfo.WordProps.nFontIndex = pFontMap->GetWordFontIndex(wordinfo.Word,wordinfo.nCharset,pWordProps->nFontIndex);
-							}
-							bSet = TRUE;
-						}
-						break;
-					case EP_FONTSIZE:
-						if (!FX_EDIT_IsFloatEqual(wordinfo.WordProps.fFontSize,pWordProps->fFontSize))
-						{
-							wordinfo.WordProps.fFontSize = pWordProps->fFontSize;
-							bSet = TRUE;
-						}
-						break;
-					case EP_WORDCOLOR:
-						if (wordinfo.WordProps.dwWordColor != pWordProps->dwWordColor)
-						{
-							wordinfo.WordProps.dwWordColor = pWordProps->dwWordColor;
-							bSet = TRUE;
-						}
-						break;
-					case EP_SCRIPTTYPE:
-						if (wordinfo.WordProps.nScriptType != pWordProps->nScriptType)
-						{
-							wordinfo.WordProps.nScriptType = pWordProps->nScriptType;
-							bSet = TRUE;
-						}
-						break;
-					case EP_CHARSPACE:
-						if (!FX_EDIT_IsFloatEqual(wordinfo.WordProps.fCharSpace,pWordProps->fCharSpace))
-						{
-							wordinfo.WordProps.fCharSpace = pWordProps->fCharSpace;
-							bSet = TRUE;
-						}
-						break;
-					case EP_HORZSCALE:
-						if (wordinfo.WordProps.nHorzScale != pWordProps->nHorzScale)
-						{
-							wordinfo.WordProps.nHorzScale = pWordProps->nHorzScale;
-							bSet = TRUE;
-						}
-						break;
-					case EP_UNDERLINE:
-						if (pWordProps->nWordStyle & PVTWORD_STYLE_UNDERLINE)
-						{
-							if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE) == 0)
-							{
-								wordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_UNDERLINE;
-								bSet = TRUE;
-							}
-						}
-						else
-						{
-							if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE) != 0)
-							{
-								wordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_UNDERLINE;
-								bSet = TRUE;
-							}
-						}
-						break;
-					case EP_CROSSOUT:
-						if (pWordProps->nWordStyle & PVTWORD_STYLE_CROSSOUT)
-						{
-							if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) == 0)
-							{
-								wordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_CROSSOUT;
-								bSet = TRUE;
-							}
-						}
-						else
-						{
-							if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) != 0)
-							{
-								wordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_CROSSOUT;
-								bSet = TRUE;
-							}
-						}
-						break;
-					case EP_BOLD:
-						if (pWordProps->nWordStyle & PVTWORD_STYLE_BOLD)
-						{
-							if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_BOLD) == 0)
-							{
-								wordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_BOLD;
-								bSet = TRUE;
-							}
-						}
-						else
-						{
-							if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_BOLD) != 0)
-							{
-								wordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_BOLD;
-								bSet = TRUE;
-							}
-						}
-						break;
-					case EP_ITALIC:
-						if (pWordProps->nWordStyle & PVTWORD_STYLE_ITALIC)
-						{
-							if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_ITALIC) == 0)
-							{
-								wordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_ITALIC;
-								bSet = TRUE;
-							}
-						}
-						else
-						{
-							if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_ITALIC) != 0)
-							{
-								wordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_ITALIC;
-								bSet = TRUE;
-							}
-						}
-						break;
-					default:
-						break;
-					}
-				}
-			}
+                    switch(eProps)
+                    {
+                    case EP_FONTINDEX:
+                        if (wordinfo.WordProps.nFontIndex != pWordProps->nFontIndex)
+                        {
+                            if (IFX_Edit_FontMap* pFontMap = GetFontMap())
+                            {
+                                wordinfo.WordProps.nFontIndex = pFontMap->GetWordFontIndex(wordinfo.Word,wordinfo.nCharset,pWordProps->nFontIndex);
+                            }
+                            bSet = TRUE;
+                        }
+                        break;
+                    case EP_FONTSIZE:
+                        if (!FX_EDIT_IsFloatEqual(wordinfo.WordProps.fFontSize,pWordProps->fFontSize))
+                        {
+                            wordinfo.WordProps.fFontSize = pWordProps->fFontSize;
+                            bSet = TRUE;
+                        }
+                        break;
+                    case EP_WORDCOLOR:
+                        if (wordinfo.WordProps.dwWordColor != pWordProps->dwWordColor)
+                        {
+                            wordinfo.WordProps.dwWordColor = pWordProps->dwWordColor;
+                            bSet = TRUE;
+                        }
+                        break;
+                    case EP_SCRIPTTYPE:
+                        if (wordinfo.WordProps.nScriptType != pWordProps->nScriptType)
+                        {
+                            wordinfo.WordProps.nScriptType = pWordProps->nScriptType;
+                            bSet = TRUE;
+                        }
+                        break;
+                    case EP_CHARSPACE:
+                        if (!FX_EDIT_IsFloatEqual(wordinfo.WordProps.fCharSpace,pWordProps->fCharSpace))
+                        {
+                            wordinfo.WordProps.fCharSpace = pWordProps->fCharSpace;
+                            bSet = TRUE;
+                        }
+                        break;
+                    case EP_HORZSCALE:
+                        if (wordinfo.WordProps.nHorzScale != pWordProps->nHorzScale)
+                        {
+                            wordinfo.WordProps.nHorzScale = pWordProps->nHorzScale;
+                            bSet = TRUE;
+                        }
+                        break;
+                    case EP_UNDERLINE:
+                        if (pWordProps->nWordStyle & PVTWORD_STYLE_UNDERLINE)
+                        {
+                            if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE) == 0)
+                            {
+                                wordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_UNDERLINE;
+                                bSet = TRUE;
+                            }
+                        }
+                        else
+                        {
+                            if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE) != 0)
+                            {
+                                wordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_UNDERLINE;
+                                bSet = TRUE;
+                            }
+                        }
+                        break;
+                    case EP_CROSSOUT:
+                        if (pWordProps->nWordStyle & PVTWORD_STYLE_CROSSOUT)
+                        {
+                            if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) == 0)
+                            {
+                                wordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_CROSSOUT;
+                                bSet = TRUE;
+                            }
+                        }
+                        else
+                        {
+                            if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) != 0)
+                            {
+                                wordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_CROSSOUT;
+                                bSet = TRUE;
+                            }
+                        }
+                        break;
+                    case EP_BOLD:
+                        if (pWordProps->nWordStyle & PVTWORD_STYLE_BOLD)
+                        {
+                            if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_BOLD) == 0)
+                            {
+                                wordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_BOLD;
+                                bSet = TRUE;
+                            }
+                        }
+                        else
+                        {
+                            if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_BOLD) != 0)
+                            {
+                                wordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_BOLD;
+                                bSet = TRUE;
+                            }
+                        }
+                        break;
+                    case EP_ITALIC:
+                        if (pWordProps->nWordStyle & PVTWORD_STYLE_ITALIC)
+                        {
+                            if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_ITALIC) == 0)
+                            {
+                                wordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_ITALIC;
+                                bSet = TRUE;
+                            }
+                        }
+                        else
+                        {
+                            if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_ITALIC) != 0)
+                            {
+                                wordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_ITALIC;
+                                bSet = TRUE;
+                            }
+                        }
+                        break;
+                    default:
+                        break;
+                    }
+                }
+            }
 
-			if (bSet)
-			{
-				pIterator->SetWord(wordinfo);
+            if (bSet)
+            {
+                pIterator->SetWord(wordinfo);
 
-				if (bAddUndo && m_bEnableUndo)
-				{
-					AddEditUndoItem(new CFXEU_SetWordProps
-						(this,place,eProps,OldWordinfo.WordProps,wordinfo.WordProps,wr));
-				}
-			}
+                if (bAddUndo && m_bEnableUndo)
+                {
+                    AddEditUndoItem(new CFXEU_SetWordProps
+                        (this,place,eProps,OldWordinfo.WordProps,wordinfo.WordProps,wr));
+                }
+            }
 
-			pIterator->SetAt(oldplace);
-			return bSet;
-		}
-	}
+            pIterator->SetAt(oldplace);
+            return bSet;
+        }
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
 void CFX_Edit::SetText(const FX_WCHAR* text,int32_t charset /*= DEFAULT_CHARSET*/,
-						const CPVT_SecProps * pSecProps /*= NULL*/,const CPVT_WordProps * pWordProps /*= NULL*/)
+                        const CPVT_SecProps * pSecProps /*= NULL*/,const CPVT_WordProps * pWordProps /*= NULL*/)
 {
-	SetText(text,charset,pSecProps,pWordProps,TRUE,TRUE);
+    SetText(text,charset,pSecProps,pWordProps,TRUE,TRUE);
 }
 
 FX_BOOL CFX_Edit::InsertWord(FX_WORD word, int32_t charset /*= DEFAULT_CHARSET*/, const CPVT_WordProps * pWordProps /*= NULL*/)
 {
-	return InsertWord(word,charset,pWordProps,TRUE,TRUE);
+    return InsertWord(word,charset,pWordProps,TRUE,TRUE);
 }
 
 FX_BOOL CFX_Edit::InsertReturn(const CPVT_SecProps * pSecProps /*= NULL*/,const CPVT_WordProps * pWordProps /*= NULL*/)
 {
-	return InsertReturn(pSecProps,pWordProps,TRUE,TRUE);
+    return InsertReturn(pSecProps,pWordProps,TRUE,TRUE);
 }
 
 FX_BOOL CFX_Edit::Backspace()
 {
-	return Backspace(TRUE,TRUE);
+    return Backspace(TRUE,TRUE);
 }
 
 FX_BOOL CFX_Edit::Delete()
 {
-	return Delete(TRUE,TRUE);
+    return Delete(TRUE,TRUE);
 }
 
 FX_BOOL CFX_Edit::Clear()
 {
-	return Clear(TRUE,TRUE);
+    return Clear(TRUE,TRUE);
 }
 
 FX_BOOL CFX_Edit::InsertText(const FX_WCHAR* text, int32_t charset /*= DEFAULT_CHARSET*/,
-								const CPVT_SecProps * pSecProps /*= NULL*/,const CPVT_WordProps * pWordProps /*= NULL*/)
+                                const CPVT_SecProps * pSecProps /*= NULL*/,const CPVT_WordProps * pWordProps /*= NULL*/)
 {
-	return InsertText(text,charset,pSecProps,pWordProps,TRUE,TRUE);
+    return InsertText(text,charset,pSecProps,pWordProps,TRUE,TRUE);
 }
 
 FX_FLOAT CFX_Edit::GetFontSize() const
 {
-	return m_pVT->GetFontSize();
+    return m_pVT->GetFontSize();
 }
 
 FX_WORD CFX_Edit::GetPasswordChar() const
 {
-	return m_pVT->GetPasswordChar();
+    return m_pVT->GetPasswordChar();
 }
 
 int32_t CFX_Edit::GetCharArray() const
 {
-	return m_pVT->GetCharArray();
+    return m_pVT->GetCharArray();
 }
 
 CPDF_Rect CFX_Edit::GetPlateRect() const
 {
-	return m_pVT->GetPlateRect();
+    return m_pVT->GetPlateRect();
 }
 
 CPDF_Rect CFX_Edit::GetContentRect() const
 {
-	return VTToEdit(m_pVT->GetContentRect());
+    return VTToEdit(m_pVT->GetContentRect());
 }
 
 int32_t CFX_Edit::GetHorzScale() const
 {
-	return m_pVT->GetHorzScale();
+    return m_pVT->GetHorzScale();
 }
 
 FX_FLOAT CFX_Edit::GetCharSpace() const
 {
-	return m_pVT->GetCharSpace();
+    return m_pVT->GetCharSpace();
 }
 
 // inner methods
 
 CPVT_WordRange CFX_Edit::GetWholeWordRange() const
 {
-	if (m_pVT->IsValid())
-		return CPVT_WordRange(m_pVT->GetBeginWordPlace(),m_pVT->GetEndWordPlace());
+    if (m_pVT->IsValid())
+        return CPVT_WordRange(m_pVT->GetBeginWordPlace(),m_pVT->GetEndWordPlace());
 
-	return CPVT_WordRange();
+    return CPVT_WordRange();
 }
 
 CPVT_WordRange CFX_Edit::GetVisibleWordRange() const
 {
-	if (m_bEnableOverflow) return GetWholeWordRange();
+    if (m_bEnableOverflow) return GetWholeWordRange();
 
-	if (m_pVT->IsValid())
-	{
-		CPDF_Rect rcPlate = m_pVT->GetPlateRect();
+    if (m_pVT->IsValid())
+    {
+        CPDF_Rect rcPlate = m_pVT->GetPlateRect();
 
-		CPVT_WordPlace place1 = m_pVT->SearchWordPlace(EditToVT(CPDF_Point(rcPlate.left,rcPlate.top)));
-		CPVT_WordPlace place2 = m_pVT->SearchWordPlace(EditToVT(CPDF_Point(rcPlate.right,rcPlate.bottom)));
+        CPVT_WordPlace place1 = m_pVT->SearchWordPlace(EditToVT(CPDF_Point(rcPlate.left,rcPlate.top)));
+        CPVT_WordPlace place2 = m_pVT->SearchWordPlace(EditToVT(CPDF_Point(rcPlate.right,rcPlate.bottom)));
 
-		return CPVT_WordRange(place1,place2);
-	}
+        return CPVT_WordRange(place1,place2);
+    }
 
-	return CPVT_WordRange();
+    return CPVT_WordRange();
 }
 
 CPVT_WordPlace CFX_Edit::SearchWordPlace(const CPDF_Point& point) const
 {
-	if (m_pVT->IsValid())
-	{
-		return m_pVT->SearchWordPlace(EditToVT(point));
-	}
+    if (m_pVT->IsValid())
+    {
+        return m_pVT->SearchWordPlace(EditToVT(point));
+    }
 
-	return CPVT_WordPlace();
+    return CPVT_WordPlace();
 }
 
 void CFX_Edit::Paint()
 {
-	if (m_pVT->IsValid())
-	{
-		RearrangeAll();
-		ScrollToCaret();
-		Refresh(RP_NOANALYSE);
-		SetCaretOrigin();
-		SetCaretInfo();
-	}
+    if (m_pVT->IsValid())
+    {
+        RearrangeAll();
+        ScrollToCaret();
+        Refresh(RP_NOANALYSE);
+        SetCaretOrigin();
+        SetCaretInfo();
+    }
 }
 
 void CFX_Edit::RearrangeAll()
 {
-	if (m_pVT->IsValid())
-	{
-		m_pVT->UpdateWordPlace(m_wpCaret);
-		m_pVT->RearrangeAll();
-		m_pVT->UpdateWordPlace(m_wpCaret);
-		SetScrollInfo();
-		SetContentChanged();
-	}
+    if (m_pVT->IsValid())
+    {
+        m_pVT->UpdateWordPlace(m_wpCaret);
+        m_pVT->RearrangeAll();
+        m_pVT->UpdateWordPlace(m_wpCaret);
+        SetScrollInfo();
+        SetContentChanged();
+    }
 }
 
 void CFX_Edit::RearrangePart(const CPVT_WordRange & range)
 {
-	if (m_pVT->IsValid())
-	{
-		m_pVT->UpdateWordPlace(m_wpCaret);
-		m_pVT->RearrangePart(range);
-		m_pVT->UpdateWordPlace(m_wpCaret);
-		SetScrollInfo();
-		SetContentChanged();
-	}
+    if (m_pVT->IsValid())
+    {
+        m_pVT->UpdateWordPlace(m_wpCaret);
+        m_pVT->RearrangePart(range);
+        m_pVT->UpdateWordPlace(m_wpCaret);
+        SetScrollInfo();
+        SetContentChanged();
+    }
 }
 
 void CFX_Edit::SetContentChanged()
 {
-	if (m_bNotify && m_pNotify)
-	{
-		CPDF_Rect rcContent = m_pVT->GetContentRect();
-		if (rcContent.Width() != m_rcOldContent.Width() ||
-			rcContent.Height() != m_rcOldContent.Height())
-		{
-			if (!m_bNotifyFlag)
-			{
-				m_bNotifyFlag = TRUE;
-				m_pNotify->IOnContentChange(rcContent);
-				m_bNotifyFlag = FALSE;
-			}
-			m_rcOldContent = rcContent;
-		}
-	}
+    if (m_bNotify && m_pNotify)
+    {
+        CPDF_Rect rcContent = m_pVT->GetContentRect();
+        if (rcContent.Width() != m_rcOldContent.Width() ||
+            rcContent.Height() != m_rcOldContent.Height())
+        {
+            if (!m_bNotifyFlag)
+            {
+                m_bNotifyFlag = TRUE;
+                m_pNotify->IOnContentChange(rcContent);
+                m_bNotifyFlag = FALSE;
+            }
+            m_rcOldContent = rcContent;
+        }
+    }
 }
 
 void CFX_Edit::SelectAll()
 {
-	if (m_pVT->IsValid())
-	{
-		m_SelState = GetWholeWordRange();
-		SetCaret(m_SelState.EndPos);
+    if (m_pVT->IsValid())
+    {
+        m_SelState = GetWholeWordRange();
+        SetCaret(m_SelState.EndPos);
 
-		ScrollToCaret();
-		CPVT_WordRange wrVisible = GetVisibleWordRange();
-		Refresh(RP_OPTIONAL,&wrVisible);
-		SetCaretInfo();
-	}
+        ScrollToCaret();
+        CPVT_WordRange wrVisible = GetVisibleWordRange();
+        Refresh(RP_OPTIONAL,&wrVisible);
+        SetCaretInfo();
+    }
 }
 
 void CFX_Edit::SelectNone()
 {
-	if (m_pVT->IsValid())
-	{
-		if (m_SelState.IsExist())
-		{
-			CPVT_WordRange wrTemp = m_SelState.ConvertToWordRange();
-			m_SelState.Default();
-			Refresh(RP_OPTIONAL,&wrTemp);
-		}
-	}
+    if (m_pVT->IsValid())
+    {
+        if (m_SelState.IsExist())
+        {
+            CPVT_WordRange wrTemp = m_SelState.ConvertToWordRange();
+            m_SelState.Default();
+            Refresh(RP_OPTIONAL,&wrTemp);
+        }
+    }
 }
 
-FX_BOOL	CFX_Edit::IsSelected() const
+FX_BOOL CFX_Edit::IsSelected() const
 {
-	return m_SelState.IsExist();
+    return m_SelState.IsExist();
 }
 
 CPDF_Point CFX_Edit::VTToEdit(const CPDF_Point & point) const
 {
-	CPDF_Rect rcContent = m_pVT->GetContentRect();
-	CPDF_Rect rcPlate = m_pVT->GetPlateRect();
+    CPDF_Rect rcContent = m_pVT->GetContentRect();
+    CPDF_Rect rcPlate = m_pVT->GetPlateRect();
 
-	FX_FLOAT fPadding = 0.0f;
+    FX_FLOAT fPadding = 0.0f;
 
-	switch (m_nAlignment)
-	{
-	case 0:
-		fPadding = 0.0f;
-		break;
-	case 1:
-		fPadding = (rcPlate.Height() - rcContent.Height()) * 0.5f;
-		break;
-	case 2:
-		fPadding = rcPlate.Height() - rcContent.Height();
-		break;
-	}
+    switch (m_nAlignment)
+    {
+    case 0:
+        fPadding = 0.0f;
+        break;
+    case 1:
+        fPadding = (rcPlate.Height() - rcContent.Height()) * 0.5f;
+        break;
+    case 2:
+        fPadding = rcPlate.Height() - rcContent.Height();
+        break;
+    }
 
-	return CPDF_Point(point.x - (m_ptScrollPos.x - rcPlate.left),
-		point.y - (m_ptScrollPos.y + fPadding - rcPlate.top));
+    return CPDF_Point(point.x - (m_ptScrollPos.x - rcPlate.left),
+        point.y - (m_ptScrollPos.y + fPadding - rcPlate.top));
 }
 
 CPDF_Point CFX_Edit::EditToVT(const CPDF_Point & point) const
 {
-	CPDF_Rect rcContent = m_pVT->GetContentRect();
-	CPDF_Rect rcPlate = m_pVT->GetPlateRect();
+    CPDF_Rect rcContent = m_pVT->GetContentRect();
+    CPDF_Rect rcPlate = m_pVT->GetPlateRect();
 
-	FX_FLOAT fPadding = 0.0f;
+    FX_FLOAT fPadding = 0.0f;
 
-	switch (m_nAlignment)
-	{
-	case 0:
-		fPadding = 0.0f;
-		break;
-	case 1:
-		fPadding = (rcPlate.Height() - rcContent.Height()) * 0.5f;
-		break;
-	case 2:
-		fPadding = rcPlate.Height() - rcContent.Height();
-		break;
-	}
+    switch (m_nAlignment)
+    {
+    case 0:
+        fPadding = 0.0f;
+        break;
+    case 1:
+        fPadding = (rcPlate.Height() - rcContent.Height()) * 0.5f;
+        break;
+    case 2:
+        fPadding = rcPlate.Height() - rcContent.Height();
+        break;
+    }
 
-	return CPDF_Point(point.x + (m_ptScrollPos.x - rcPlate.left),
-		point.y + (m_ptScrollPos.y + fPadding - rcPlate.top));
+    return CPDF_Point(point.x + (m_ptScrollPos.x - rcPlate.left),
+        point.y + (m_ptScrollPos.y + fPadding - rcPlate.top));
 }
 
 CPDF_Rect CFX_Edit::VTToEdit(const CPDF_Rect & rect) const
 {
-	CPDF_Point ptLeftBottom = VTToEdit(CPDF_Point(rect.left,rect.bottom));
-	CPDF_Point ptRightTop = VTToEdit(CPDF_Point(rect.right,rect.top));
+    CPDF_Point ptLeftBottom = VTToEdit(CPDF_Point(rect.left,rect.bottom));
+    CPDF_Point ptRightTop = VTToEdit(CPDF_Point(rect.right,rect.top));
 
-	return CPDF_Rect(ptLeftBottom.x,ptLeftBottom.y,ptRightTop.x,ptRightTop.y);
+    return CPDF_Rect(ptLeftBottom.x,ptLeftBottom.y,ptRightTop.x,ptRightTop.y);
 }
 
 CPDF_Rect CFX_Edit::EditToVT(const CPDF_Rect & rect) const
 {
-	CPDF_Point ptLeftBottom = EditToVT(CPDF_Point(rect.left,rect.bottom));
-	CPDF_Point ptRightTop = EditToVT(CPDF_Point(rect.right,rect.top));
+    CPDF_Point ptLeftBottom = EditToVT(CPDF_Point(rect.left,rect.bottom));
+    CPDF_Point ptRightTop = EditToVT(CPDF_Point(rect.right,rect.top));
 
-	return CPDF_Rect(ptLeftBottom.x,ptLeftBottom.y,ptRightTop.x,ptRightTop.y);
+    return CPDF_Rect(ptLeftBottom.x,ptLeftBottom.y,ptRightTop.x,ptRightTop.y);
 }
 
 void CFX_Edit::SetScrollInfo()
 {
-	if (m_bNotify && m_pNotify)
-	{
-		CPDF_Rect rcPlate = m_pVT->GetPlateRect();
-		CPDF_Rect rcContent = m_pVT->GetContentRect();
+    if (m_bNotify && m_pNotify)
+    {
+        CPDF_Rect rcPlate = m_pVT->GetPlateRect();
+        CPDF_Rect rcContent = m_pVT->GetContentRect();
 
-		if (!m_bNotifyFlag)
-		{
-			m_bNotifyFlag = TRUE;
-			m_pNotify->IOnSetScrollInfoX(rcPlate.left, rcPlate.right,
-								rcContent.left, rcContent.right, rcPlate.Width() / 3, rcPlate.Width());
+        if (!m_bNotifyFlag)
+        {
+            m_bNotifyFlag = TRUE;
+            m_pNotify->IOnSetScrollInfoX(rcPlate.left, rcPlate.right,
+                                rcContent.left, rcContent.right, rcPlate.Width() / 3, rcPlate.Width());
 
-			m_pNotify->IOnSetScrollInfoY(rcPlate.bottom, rcPlate.top,
-					rcContent.bottom, rcContent.top, rcPlate.Height() / 3, rcPlate.Height());
-			m_bNotifyFlag = FALSE;
-		}
-	}
+            m_pNotify->IOnSetScrollInfoY(rcPlate.bottom, rcPlate.top,
+                    rcContent.bottom, rcContent.top, rcPlate.Height() / 3, rcPlate.Height());
+            m_bNotifyFlag = FALSE;
+        }
+    }
 }
 
 void CFX_Edit::SetScrollPosX(FX_FLOAT fx)
 {
-	if (!m_bEnableScroll) return;
+    if (!m_bEnableScroll) return;
 
-	if (m_pVT->IsValid())
-	{
-		if (!FX_EDIT_IsFloatEqual(m_ptScrollPos.x,fx))
-		{
-			m_ptScrollPos.x = fx;
-			Refresh(RP_NOANALYSE);
+    if (m_pVT->IsValid())
+    {
+        if (!FX_EDIT_IsFloatEqual(m_ptScrollPos.x,fx))
+        {
+            m_ptScrollPos.x = fx;
+            Refresh(RP_NOANALYSE);
 
-			if (m_bNotify && m_pNotify)
-			{
-				if (!m_bNotifyFlag)
-				{
-					m_bNotifyFlag = TRUE;
-					m_pNotify->IOnSetScrollPosX(fx);
-					m_bNotifyFlag = FALSE;
-				}
-			}
-		}
-	}
+            if (m_bNotify && m_pNotify)
+            {
+                if (!m_bNotifyFlag)
+                {
+                    m_bNotifyFlag = TRUE;
+                    m_pNotify->IOnSetScrollPosX(fx);
+                    m_bNotifyFlag = FALSE;
+                }
+            }
+        }
+    }
 }
 
 void CFX_Edit::SetScrollPosY(FX_FLOAT fy)
 {
-	if (!m_bEnableScroll) return;
+    if (!m_bEnableScroll) return;
 
-	if (m_pVT->IsValid())
-	{
-		if (!FX_EDIT_IsFloatEqual(m_ptScrollPos.y,fy))
-		{
-			m_ptScrollPos.y = fy;
-			Refresh(RP_NOANALYSE);
+    if (m_pVT->IsValid())
+    {
+        if (!FX_EDIT_IsFloatEqual(m_ptScrollPos.y,fy))
+        {
+            m_ptScrollPos.y = fy;
+            Refresh(RP_NOANALYSE);
 
-			if (m_bNotify && m_pNotify)
-			{
-				if (!m_bNotifyFlag)
-				{
-					m_bNotifyFlag = TRUE;
-					m_pNotify->IOnSetScrollPosY(fy);
-					m_bNotifyFlag = FALSE;
-				}
-			}
-		}
-	}
+            if (m_bNotify && m_pNotify)
+            {
+                if (!m_bNotifyFlag)
+                {
+                    m_bNotifyFlag = TRUE;
+                    m_pNotify->IOnSetScrollPosY(fy);
+                    m_bNotifyFlag = FALSE;
+                }
+            }
+        }
+    }
 }
 
 void CFX_Edit::SetScrollPos(const CPDF_Point & point)
 {
-	SetScrollPosX(point.x);
-	SetScrollPosY(point.y);
-	SetScrollLimit();
-	SetCaretInfo();
+    SetScrollPosX(point.x);
+    SetScrollPosY(point.y);
+    SetScrollLimit();
+    SetCaretInfo();
 }
 
 CPDF_Point CFX_Edit::GetScrollPos() const
 {
-	return m_ptScrollPos;
+    return m_ptScrollPos;
 }
 
 void CFX_Edit::SetScrollLimit()
 {
-	if (m_pVT->IsValid())
-	{
-		CPDF_Rect rcContent = m_pVT->GetContentRect();
-		CPDF_Rect rcPlate = m_pVT->GetPlateRect();
+    if (m_pVT->IsValid())
+    {
+        CPDF_Rect rcContent = m_pVT->GetContentRect();
+        CPDF_Rect rcPlate = m_pVT->GetPlateRect();
 
-		if (rcPlate.Width() > rcContent.Width())
-		{
-			SetScrollPosX(rcPlate.left);
-		}
-		else
-		{
-			if (FX_EDIT_IsFloatSmaller(m_ptScrollPos.x, rcContent.left))
-			{
-				SetScrollPosX(rcContent.left);
-			}
-			else if (FX_EDIT_IsFloatBigger(m_ptScrollPos.x, rcContent.right - rcPlate.Width()))
-			{
-				SetScrollPosX(rcContent.right - rcPlate.Width());
-			}
-		}
+        if (rcPlate.Width() > rcContent.Width())
+        {
+            SetScrollPosX(rcPlate.left);
+        }
+        else
+        {
+            if (FX_EDIT_IsFloatSmaller(m_ptScrollPos.x, rcContent.left))
+            {
+                SetScrollPosX(rcContent.left);
+            }
+            else if (FX_EDIT_IsFloatBigger(m_ptScrollPos.x, rcContent.right - rcPlate.Width()))
+            {
+                SetScrollPosX(rcContent.right - rcPlate.Width());
+            }
+        }
 
-		if (rcPlate.Height() > rcContent.Height())
-		{
-			SetScrollPosY(rcPlate.top);
-		}
-		else
-		{
-			if (FX_EDIT_IsFloatSmaller(m_ptScrollPos.y, rcContent.bottom + rcPlate.Height()))
-			{
-				SetScrollPosY(rcContent.bottom + rcPlate.Height());
-			}
-			else if (FX_EDIT_IsFloatBigger(m_ptScrollPos.y, rcContent.top))
-			{
-				SetScrollPosY(rcContent.top);
-			}
-		}
-	}
+        if (rcPlate.Height() > rcContent.Height())
+        {
+            SetScrollPosY(rcPlate.top);
+        }
+        else
+        {
+            if (FX_EDIT_IsFloatSmaller(m_ptScrollPos.y, rcContent.bottom + rcPlate.Height()))
+            {
+                SetScrollPosY(rcContent.bottom + rcPlate.Height());
+            }
+            else if (FX_EDIT_IsFloatBigger(m_ptScrollPos.y, rcContent.top))
+            {
+                SetScrollPosY(rcContent.top);
+            }
+        }
+    }
 }
 
 void CFX_Edit::ScrollToCaret()
 {
-	SetScrollLimit();
+    SetScrollLimit();
 
-	if (m_pVT->IsValid())
-	{
-		CPDF_Point ptHead(0,0);
-		CPDF_Point ptFoot(0,0);
+    if (m_pVT->IsValid())
+    {
+        CPDF_Point ptHead(0,0);
+        CPDF_Point ptFoot(0,0);
 
-		if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
-		{
-			pIterator->SetAt(m_wpCaret);
+        if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
+        {
+            pIterator->SetAt(m_wpCaret);
 
-			CPVT_Word word;
-			CPVT_Line line;
-			if (pIterator->GetWord(word))
-			{
-				ptHead.x = word.ptWord.x + word.fWidth;
-				ptHead.y = word.ptWord.y + word.fAscent;
-				ptFoot.x = word.ptWord.x + word.fWidth;
-				ptFoot.y = word.ptWord.y + word.fDescent;
-			}
-			else if (pIterator->GetLine(line))
-			{
-				ptHead.x = line.ptLine.x;
-				ptHead.y = line.ptLine.y + line.fLineAscent;
-				ptFoot.x = line.ptLine.x;
-				ptFoot.y = line.ptLine.y + line.fLineDescent;
-			}
-		}
+            CPVT_Word word;
+            CPVT_Line line;
+            if (pIterator->GetWord(word))
+            {
+                ptHead.x = word.ptWord.x + word.fWidth;
+                ptHead.y = word.ptWord.y + word.fAscent;
+                ptFoot.x = word.ptWord.x + word.fWidth;
+                ptFoot.y = word.ptWord.y + word.fDescent;
+            }
+            else if (pIterator->GetLine(line))
+            {
+                ptHead.x = line.ptLine.x;
+                ptHead.y = line.ptLine.y + line.fLineAscent;
+                ptFoot.x = line.ptLine.x;
+                ptFoot.y = line.ptLine.y + line.fLineDescent;
+            }
+        }
 
-		CPDF_Point ptHeadEdit = VTToEdit(ptHead);
-		CPDF_Point ptFootEdit = VTToEdit(ptFoot);
+        CPDF_Point ptHeadEdit = VTToEdit(ptHead);
+        CPDF_Point ptFootEdit = VTToEdit(ptFoot);
 
-		CPDF_Rect rcPlate = m_pVT->GetPlateRect();
+        CPDF_Rect rcPlate = m_pVT->GetPlateRect();
 
-		if (!FX_EDIT_IsFloatEqual(rcPlate.left,rcPlate.right))
-		{
-			if (FX_EDIT_IsFloatSmaller(ptHeadEdit.x, rcPlate.left) ||
-				FX_EDIT_IsFloatEqual(ptHeadEdit.x, rcPlate.left))
-			{
-				SetScrollPosX(ptHead.x);
-			}
-			else if (FX_EDIT_IsFloatBigger(ptHeadEdit.x, rcPlate.right))
-			{
-				SetScrollPosX(ptHead.x - rcPlate.Width());
-			}
-		}
+        if (!FX_EDIT_IsFloatEqual(rcPlate.left,rcPlate.right))
+        {
+            if (FX_EDIT_IsFloatSmaller(ptHeadEdit.x, rcPlate.left) ||
+                FX_EDIT_IsFloatEqual(ptHeadEdit.x, rcPlate.left))
+            {
+                SetScrollPosX(ptHead.x);
+            }
+            else if (FX_EDIT_IsFloatBigger(ptHeadEdit.x, rcPlate.right))
+            {
+                SetScrollPosX(ptHead.x - rcPlate.Width());
+            }
+        }
 
-		if (!FX_EDIT_IsFloatEqual(rcPlate.top,rcPlate.bottom))
-		{
-			if (FX_EDIT_IsFloatSmaller(ptFootEdit.y, rcPlate.bottom) ||
-				FX_EDIT_IsFloatEqual(ptFootEdit.y, rcPlate.bottom))
-			{
-				if (FX_EDIT_IsFloatSmaller(ptHeadEdit.y, rcPlate.top))
-				{
-					SetScrollPosY(ptFoot.y + rcPlate.Height());
-				}
-			}
-			else if (FX_EDIT_IsFloatBigger(ptHeadEdit.y, rcPlate.top))
-			{
-				if (FX_EDIT_IsFloatBigger(ptFootEdit.y, rcPlate.bottom))
-				{
-					SetScrollPosY(ptHead.y);
-				}
-			}
-		}
-	}
+        if (!FX_EDIT_IsFloatEqual(rcPlate.top,rcPlate.bottom))
+        {
+            if (FX_EDIT_IsFloatSmaller(ptFootEdit.y, rcPlate.bottom) ||
+                FX_EDIT_IsFloatEqual(ptFootEdit.y, rcPlate.bottom))
+            {
+                if (FX_EDIT_IsFloatSmaller(ptHeadEdit.y, rcPlate.top))
+                {
+                    SetScrollPosY(ptFoot.y + rcPlate.Height());
+                }
+            }
+            else if (FX_EDIT_IsFloatBigger(ptHeadEdit.y, rcPlate.top))
+            {
+                if (FX_EDIT_IsFloatBigger(ptFootEdit.y, rcPlate.bottom))
+                {
+                    SetScrollPosY(ptHead.y);
+                }
+            }
+        }
+    }
 }
 
 void CFX_Edit::Refresh(REFRESH_PLAN_E ePlan,const CPVT_WordRange * pRange1,const CPVT_WordRange * pRange2)
 {
-	if (m_bEnableRefresh && m_pVT->IsValid())
-	{
-		m_Refresh.BeginRefresh();
-		RefreshPushLineRects(GetVisibleWordRange());
+    if (m_bEnableRefresh && m_pVT->IsValid())
+    {
+        m_Refresh.BeginRefresh();
+        RefreshPushLineRects(GetVisibleWordRange());
 
-// 		if (!FX_EDIT_IsFloatEqual(m_ptRefreshScrollPos.x,m_ptScrollPos.x) ||
-// 			!FX_EDIT_IsFloatEqual(m_ptRefreshScrollPos.y,m_ptScrollPos.y))
-// 		{
-			m_Refresh.NoAnalyse();
-			m_ptRefreshScrollPos = m_ptScrollPos;
-// 		}
-// 		else
-// 		{
-// 			switch (ePlan)
-// 			{
-// 			case RP_ANALYSE:
-// 				m_Refresh.Analyse(m_pVT->GetAlignment());
+//      if (!FX_EDIT_IsFloatEqual(m_ptRefreshScrollPos.x,m_ptScrollPos.x) ||
+//          !FX_EDIT_IsFloatEqual(m_ptRefreshScrollPos.y,m_ptScrollPos.y))
+//      {
+            m_Refresh.NoAnalyse();
+            m_ptRefreshScrollPos = m_ptScrollPos;
+//      }
+//      else
+//      {
+//          switch (ePlan)
+//          {
+//          case RP_ANALYSE:
+//              m_Refresh.Analyse(m_pVT->GetAlignment());
 //
-// 				if (pRange1) RefreshPushRandomRects(*pRange1);
-// 				if (pRange2) RefreshPushRandomRects(*pRange2);
-// 				break;
-// 			case RP_NOANALYSE:
-// 				m_Refresh.NoAnalyse();
-// 				break;
-// 			case RP_OPTIONAL:
-// 				if (pRange1) RefreshPushRandomRects(*pRange1);
-// 				if (pRange2) RefreshPushRandomRects(*pRange2);
-// 				break;
-// 			}
-// 		}
+//              if (pRange1) RefreshPushRandomRects(*pRange1);
+//              if (pRange2) RefreshPushRandomRects(*pRange2);
+//              break;
+//          case RP_NOANALYSE:
+//              m_Refresh.NoAnalyse();
+//              break;
+//          case RP_OPTIONAL:
+//              if (pRange1) RefreshPushRandomRects(*pRange1);
+//              if (pRange2) RefreshPushRandomRects(*pRange2);
+//              break;
+//          }
+//      }
 
-		if (m_bNotify && m_pNotify)
-		{
-			if (!m_bNotifyFlag)
-			{
-				m_bNotifyFlag = TRUE;
-				if (const CFX_Edit_RectArray * pRects = m_Refresh.GetRefreshRects())
-				{
-					for (int32_t i = 0, sz = pRects->GetSize(); i < sz; i++)
-						m_pNotify->IOnInvalidateRect(pRects->GetAt(i));
-				}
-				m_bNotifyFlag = FALSE;
-			}
-		}
+        if (m_bNotify && m_pNotify)
+        {
+            if (!m_bNotifyFlag)
+            {
+                m_bNotifyFlag = TRUE;
+                if (const CFX_Edit_RectArray * pRects = m_Refresh.GetRefreshRects())
+                {
+                    for (int32_t i = 0, sz = pRects->GetSize(); i < sz; i++)
+                        m_pNotify->IOnInvalidateRect(pRects->GetAt(i));
+                }
+                m_bNotifyFlag = FALSE;
+            }
+        }
 
-		m_Refresh.EndRefresh();
-	}
+        m_Refresh.EndRefresh();
+    }
 }
 
 void CFX_Edit::RefreshPushLineRects(const CPVT_WordRange & wr)
 {
-	if (m_pVT->IsValid())
-	{
-		if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
-		{
-			CPVT_WordPlace wpBegin = wr.BeginPos;
-			m_pVT->UpdateWordPlace(wpBegin);
-			CPVT_WordPlace wpEnd = wr.EndPos;
-			m_pVT->UpdateWordPlace(wpEnd);
-			pIterator->SetAt(wpBegin);
+    if (m_pVT->IsValid())
+    {
+        if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
+        {
+            CPVT_WordPlace wpBegin = wr.BeginPos;
+            m_pVT->UpdateWordPlace(wpBegin);
+            CPVT_WordPlace wpEnd = wr.EndPos;
+            m_pVT->UpdateWordPlace(wpEnd);
+            pIterator->SetAt(wpBegin);
 
-			CPVT_Line lineinfo;
-			do
-			{
-				if (!pIterator->GetLine(lineinfo))break;
-				if (lineinfo.lineplace.LineCmp(wpEnd) > 0)break;
+            CPVT_Line lineinfo;
+            do
+            {
+                if (!pIterator->GetLine(lineinfo))break;
+                if (lineinfo.lineplace.LineCmp(wpEnd) > 0)break;
 
-				CPDF_Rect rcLine(lineinfo.ptLine.x,
-									lineinfo.ptLine.y + lineinfo.fLineDescent,
-									lineinfo.ptLine.x + lineinfo.fLineWidth,
-									lineinfo.ptLine.y + lineinfo.fLineAscent);
+                CPDF_Rect rcLine(lineinfo.ptLine.x,
+                                    lineinfo.ptLine.y + lineinfo.fLineDescent,
+                                    lineinfo.ptLine.x + lineinfo.fLineWidth,
+                                    lineinfo.ptLine.y + lineinfo.fLineAscent);
 
-				m_Refresh.Push(CPVT_WordRange(lineinfo.lineplace,lineinfo.lineEnd),VTToEdit(rcLine));
+                m_Refresh.Push(CPVT_WordRange(lineinfo.lineplace,lineinfo.lineEnd),VTToEdit(rcLine));
 
-			}while (pIterator->NextLine());
-		}
-	}
+            }while (pIterator->NextLine());
+        }
+    }
 }
 
 void CFX_Edit::RefreshPushRandomRects(const CPVT_WordRange & wr)
 {
-	if (m_pVT->IsValid())
-	{
-		if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
-		{
-			CPVT_WordRange wrTemp = wr;
+    if (m_pVT->IsValid())
+    {
+        if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
+        {
+            CPVT_WordRange wrTemp = wr;
 
-			m_pVT->UpdateWordPlace(wrTemp.BeginPos);
-			m_pVT->UpdateWordPlace(wrTemp.EndPos);
-			pIterator->SetAt(wrTemp.BeginPos);
+            m_pVT->UpdateWordPlace(wrTemp.BeginPos);
+            m_pVT->UpdateWordPlace(wrTemp.EndPos);
+            pIterator->SetAt(wrTemp.BeginPos);
 
-			CPVT_Word wordinfo;
-			CPVT_Line lineinfo;
-			CPVT_WordPlace place;
+            CPVT_Word wordinfo;
+            CPVT_Line lineinfo;
+            CPVT_WordPlace place;
 
-			while (pIterator->NextWord())
-			{
-				place = pIterator->GetAt();
-				if (place.WordCmp(wrTemp.EndPos) > 0) break;
+            while (pIterator->NextWord())
+            {
+                place = pIterator->GetAt();
+                if (place.WordCmp(wrTemp.EndPos) > 0) break;
 
-				pIterator->GetWord(wordinfo);
-				pIterator->GetLine(lineinfo);
+                pIterator->GetWord(wordinfo);
+                pIterator->GetLine(lineinfo);
 
-				if (place.LineCmp(wrTemp.BeginPos) == 0 || place.LineCmp(wrTemp.EndPos) == 0)
-				{
-					CPDF_Rect rcWord(wordinfo.ptWord.x,
-										lineinfo.ptLine.y + lineinfo.fLineDescent,
-										wordinfo.ptWord.x + wordinfo.fWidth,
-										lineinfo.ptLine.y + lineinfo.fLineAscent);
+                if (place.LineCmp(wrTemp.BeginPos) == 0 || place.LineCmp(wrTemp.EndPos) == 0)
+                {
+                    CPDF_Rect rcWord(wordinfo.ptWord.x,
+                                        lineinfo.ptLine.y + lineinfo.fLineDescent,
+                                        wordinfo.ptWord.x + wordinfo.fWidth,
+                                        lineinfo.ptLine.y + lineinfo.fLineAscent);
 
-					m_Refresh.AddRefresh(VTToEdit(rcWord));
-				}
-				else
-				{
-					CPDF_Rect rcLine(lineinfo.ptLine.x,
-										lineinfo.ptLine.y + lineinfo.fLineDescent,
-										lineinfo.ptLine.x + lineinfo.fLineWidth,
-										lineinfo.ptLine.y + lineinfo.fLineAscent);
+                    m_Refresh.AddRefresh(VTToEdit(rcWord));
+                }
+                else
+                {
+                    CPDF_Rect rcLine(lineinfo.ptLine.x,
+                                        lineinfo.ptLine.y + lineinfo.fLineDescent,
+                                        lineinfo.ptLine.x + lineinfo.fLineWidth,
+                                        lineinfo.ptLine.y + lineinfo.fLineAscent);
 
-					m_Refresh.AddRefresh(VTToEdit(rcLine));
+                    m_Refresh.AddRefresh(VTToEdit(rcLine));
 
-					pIterator->NextLine();
-				}
-			}
-		}
-	}
+                    pIterator->NextLine();
+                }
+            }
+        }
+    }
 }
 
 void CFX_Edit::RefreshWordRange(const CPVT_WordRange& wr)
 {
-	if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
-	{
-		CPVT_WordRange wrTemp = wr;
+    if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
+    {
+        CPVT_WordRange wrTemp = wr;
 
-		m_pVT->UpdateWordPlace(wrTemp.BeginPos);
-		m_pVT->UpdateWordPlace(wrTemp.EndPos);
-		pIterator->SetAt(wrTemp.BeginPos);
+        m_pVT->UpdateWordPlace(wrTemp.BeginPos);
+        m_pVT->UpdateWordPlace(wrTemp.EndPos);
+        pIterator->SetAt(wrTemp.BeginPos);
 
-		CPVT_Word wordinfo;
-		CPVT_Line lineinfo;
-		CPVT_WordPlace place;
+        CPVT_Word wordinfo;
+        CPVT_Line lineinfo;
+        CPVT_WordPlace place;
 
-		while (pIterator->NextWord())
-		{
-			place = pIterator->GetAt();
-			if (place.WordCmp(wrTemp.EndPos) > 0) break;
+        while (pIterator->NextWord())
+        {
+            place = pIterator->GetAt();
+            if (place.WordCmp(wrTemp.EndPos) > 0) break;
 
-			pIterator->GetWord(wordinfo);
-			pIterator->GetLine(lineinfo);
+            pIterator->GetWord(wordinfo);
+            pIterator->GetLine(lineinfo);
 
-			if (place.LineCmp(wrTemp.BeginPos) == 0 || place.LineCmp(wrTemp.EndPos) == 0)
-			{
-				CPDF_Rect rcWord(wordinfo.ptWord.x,
-									lineinfo.ptLine.y + lineinfo.fLineDescent,
-									wordinfo.ptWord.x + wordinfo.fWidth,
-									lineinfo.ptLine.y + lineinfo.fLineAscent);
+            if (place.LineCmp(wrTemp.BeginPos) == 0 || place.LineCmp(wrTemp.EndPos) == 0)
+            {
+                CPDF_Rect rcWord(wordinfo.ptWord.x,
+                                    lineinfo.ptLine.y + lineinfo.fLineDescent,
+                                    wordinfo.ptWord.x + wordinfo.fWidth,
+                                    lineinfo.ptLine.y + lineinfo.fLineAscent);
 
-				if (m_bNotify && m_pNotify)
-				{
-					if (!m_bNotifyFlag)
-					{
-						m_bNotifyFlag = TRUE;
-						CPDF_Rect rcRefresh = VTToEdit(rcWord);
-						m_pNotify->IOnInvalidateRect(&rcRefresh);
-						m_bNotifyFlag = FALSE;
-					}
-				}
-			}
-			else
-			{
-				CPDF_Rect rcLine(lineinfo.ptLine.x,
-									lineinfo.ptLine.y + lineinfo.fLineDescent,
-									lineinfo.ptLine.x + lineinfo.fLineWidth,
-									lineinfo.ptLine.y + lineinfo.fLineAscent);
+                if (m_bNotify && m_pNotify)
+                {
+                    if (!m_bNotifyFlag)
+                    {
+                        m_bNotifyFlag = TRUE;
+                        CPDF_Rect rcRefresh = VTToEdit(rcWord);
+                        m_pNotify->IOnInvalidateRect(&rcRefresh);
+                        m_bNotifyFlag = FALSE;
+                    }
+                }
+            }
+            else
+            {
+                CPDF_Rect rcLine(lineinfo.ptLine.x,
+                                    lineinfo.ptLine.y + lineinfo.fLineDescent,
+                                    lineinfo.ptLine.x + lineinfo.fLineWidth,
+                                    lineinfo.ptLine.y + lineinfo.fLineAscent);
 
-				if (m_bNotify && m_pNotify)
-				{
-					if (!m_bNotifyFlag)
-					{
-						m_bNotifyFlag = TRUE;
-						CPDF_Rect rcRefresh = VTToEdit(rcLine);
-						m_pNotify->IOnInvalidateRect(&rcRefresh);
-						m_bNotifyFlag = FALSE;
-					}
-				}
+                if (m_bNotify && m_pNotify)
+                {
+                    if (!m_bNotifyFlag)
+                    {
+                        m_bNotifyFlag = TRUE;
+                        CPDF_Rect rcRefresh = VTToEdit(rcLine);
+                        m_pNotify->IOnInvalidateRect(&rcRefresh);
+                        m_bNotifyFlag = FALSE;
+                    }
+                }
 
-				pIterator->NextLine();
-			}
-		}
-	}
+                pIterator->NextLine();
+            }
+        }
+    }
 }
 
 void CFX_Edit::SetCaret(const CPVT_WordPlace & place)
 {
-	m_wpOldCaret = m_wpCaret;
-	m_wpCaret = place;
+    m_wpOldCaret = m_wpCaret;
+    m_wpCaret = place;
 }
 
 void CFX_Edit::SetCaretInfo()
 {
-	if (m_bNotify && m_pNotify)
-	{
-		if (!m_bNotifyFlag)
-		{
-			CPDF_Point ptHead(0.0f,0.0f),ptFoot(0.0f,0.0f);
+    if (m_bNotify && m_pNotify)
+    {
+        if (!m_bNotifyFlag)
+        {
+            CPDF_Point ptHead(0.0f,0.0f),ptFoot(0.0f,0.0f);
 
-			if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
-			{
-				pIterator->SetAt(m_wpCaret);
-				CPVT_Word word;
-				CPVT_Line line;
-				if (pIterator->GetWord(word))
-				{
-					ptHead.x = word.ptWord.x + word.fWidth;
-					ptHead.y = word.ptWord.y + word.fAscent;
-					ptFoot.x = word.ptWord.x + word.fWidth;
-					ptFoot.y = word.ptWord.y + word.fDescent;
-				}
-				else if (pIterator->GetLine(line))
-				{
-					ptHead.x = line.ptLine.x;
-					ptHead.y = line.ptLine.y + line.fLineAscent;
-					ptFoot.x = line.ptLine.x;
-					ptFoot.y = line.ptLine.y + line.fLineDescent;
-				}
-			}
+            if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
+            {
+                pIterator->SetAt(m_wpCaret);
+                CPVT_Word word;
+                CPVT_Line line;
+                if (pIterator->GetWord(word))
+                {
+                    ptHead.x = word.ptWord.x + word.fWidth;
+                    ptHead.y = word.ptWord.y + word.fAscent;
+                    ptFoot.x = word.ptWord.x + word.fWidth;
+                    ptFoot.y = word.ptWord.y + word.fDescent;
+                }
+                else if (pIterator->GetLine(line))
+                {
+                    ptHead.x = line.ptLine.x;
+                    ptHead.y = line.ptLine.y + line.fLineAscent;
+                    ptFoot.x = line.ptLine.x;
+                    ptFoot.y = line.ptLine.y + line.fLineDescent;
+                }
+            }
 
-			m_bNotifyFlag = TRUE;
-			m_pNotify->IOnSetCaret(!m_SelState.IsExist(),VTToEdit(ptHead),VTToEdit(ptFoot), m_wpCaret);
-			m_bNotifyFlag = FALSE;
-		}
-	}
+            m_bNotifyFlag = TRUE;
+            m_pNotify->IOnSetCaret(!m_SelState.IsExist(),VTToEdit(ptHead),VTToEdit(ptFoot), m_wpCaret);
+            m_bNotifyFlag = FALSE;
+        }
+    }
 
-	SetCaretChange();
+    SetCaretChange();
 }
 
 void CFX_Edit::SetCaretChange()
 {
-	if (m_wpCaret == m_wpOldCaret) return;
+    if (m_wpCaret == m_wpOldCaret) return;
 
-	if (m_bNotify && m_pVT->IsRichText() && m_pNotify)
-	{
-		CPVT_SecProps SecProps;
-		CPVT_WordProps WordProps;
+    if (m_bNotify && m_pVT->IsRichText() && m_pNotify)
+    {
+        CPVT_SecProps SecProps;
+        CPVT_WordProps WordProps;
 
-		if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
-		{
-			pIterator->SetAt(m_wpCaret);
-			CPVT_Word word;
-			CPVT_Section section;
+        if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
+        {
+            pIterator->SetAt(m_wpCaret);
+            CPVT_Word word;
+            CPVT_Section section;
 
-			if (pIterator->GetSection(section))
-			{
-				SecProps = section.SecProps;
-				WordProps = section.WordProps;
-			}
+            if (pIterator->GetSection(section))
+            {
+                SecProps = section.SecProps;
+                WordProps = section.WordProps;
+            }
 
-			if (pIterator->GetWord(word))
-			{
-				WordProps = word.WordProps;
-			}
-		}
+            if (pIterator->GetWord(word))
+            {
+                WordProps = word.WordProps;
+            }
+        }
 
-		if (!m_bNotifyFlag)
-		{
-			m_bNotifyFlag = TRUE;
-			m_pNotify->IOnCaretChange(SecProps,WordProps);
-			m_bNotifyFlag = FALSE;
-		}
-	}
+        if (!m_bNotifyFlag)
+        {
+            m_bNotifyFlag = TRUE;
+            m_pNotify->IOnCaretChange(SecProps,WordProps);
+            m_bNotifyFlag = FALSE;
+        }
+    }
 }
 
 void CFX_Edit::SetCaret(int32_t nPos)
 {
-	if (m_pVT->IsValid())
-	{
-		SelectNone();
-		SetCaret(m_pVT->WordIndexToWordPlace(nPos));
-		m_SelState.Set(m_wpCaret,m_wpCaret);
+    if (m_pVT->IsValid())
+    {
+        SelectNone();
+        SetCaret(m_pVT->WordIndexToWordPlace(nPos));
+        m_SelState.Set(m_wpCaret,m_wpCaret);
 
-		ScrollToCaret();
-		SetCaretOrigin();
-		SetCaretInfo();
-	}
+        ScrollToCaret();
+        SetCaretOrigin();
+        SetCaretInfo();
+    }
 }
 
 void CFX_Edit::OnMouseDown(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl)
 {
-	if (m_pVT->IsValid())
-	{
-		SelectNone();
-		SetCaret(m_pVT->SearchWordPlace(EditToVT(point)));
-		m_SelState.Set(m_wpCaret,m_wpCaret);
+    if (m_pVT->IsValid())
+    {
+        SelectNone();
+        SetCaret(m_pVT->SearchWordPlace(EditToVT(point)));
+        m_SelState.Set(m_wpCaret,m_wpCaret);
 
-		ScrollToCaret();
-		SetCaretOrigin();
-		SetCaretInfo();
-	}
+        ScrollToCaret();
+        SetCaretOrigin();
+        SetCaretInfo();
+    }
 }
 
 void CFX_Edit::OnMouseMove(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl)
 {
-	if (m_pVT->IsValid())
-	{
-		SetCaret(m_pVT->SearchWordPlace(EditToVT(point)));
+    if (m_pVT->IsValid())
+    {
+        SetCaret(m_pVT->SearchWordPlace(EditToVT(point)));
 
-		if (m_wpCaret != m_wpOldCaret)
-		{
-			m_SelState.SetEndPos(m_wpCaret);
+        if (m_wpCaret != m_wpOldCaret)
+        {
+            m_SelState.SetEndPos(m_wpCaret);
 
-			ScrollToCaret();
-			CPVT_WordRange wr(m_wpOldCaret,m_wpCaret);
-			Refresh(RP_OPTIONAL,&wr);
-			SetCaretOrigin();
-			SetCaretInfo();
-		}
-	}
+            ScrollToCaret();
+            CPVT_WordRange wr(m_wpOldCaret,m_wpCaret);
+            Refresh(RP_OPTIONAL,&wr);
+            SetCaretOrigin();
+            SetCaretInfo();
+        }
+    }
 }
 
 void CFX_Edit::OnVK_UP(FX_BOOL bShift,FX_BOOL bCtrl)
 {
-	if (m_pVT->IsValid())
-	{
-		SetCaret(m_pVT->GetUpWordPlace(m_wpCaret,m_ptCaret));
+    if (m_pVT->IsValid())
+    {
+        SetCaret(m_pVT->GetUpWordPlace(m_wpCaret,m_ptCaret));
 
-		if (bShift)
-		{
-			if (m_SelState.IsExist())
-				m_SelState.SetEndPos(m_wpCaret);
-			else
-				m_SelState.Set(m_wpOldCaret,m_wpCaret);
+        if (bShift)
+        {
+            if (m_SelState.IsExist())
+                m_SelState.SetEndPos(m_wpCaret);
+            else
+                m_SelState.Set(m_wpOldCaret,m_wpCaret);
 
-			if (m_wpOldCaret != m_wpCaret)
-			{
-				ScrollToCaret();
-				CPVT_WordRange wr(m_wpOldCaret, m_wpCaret);
-				Refresh(RP_OPTIONAL, &wr);
-				SetCaretInfo();
-			}
-		}
-		else
-		{
-			SelectNone();
+            if (m_wpOldCaret != m_wpCaret)
+            {
+                ScrollToCaret();
+                CPVT_WordRange wr(m_wpOldCaret, m_wpCaret);
+                Refresh(RP_OPTIONAL, &wr);
+                SetCaretInfo();
+            }
+        }
+        else
+        {
+            SelectNone();
 
-			ScrollToCaret();
-			SetCaretInfo();
-		}
-	}
+            ScrollToCaret();
+            SetCaretInfo();
+        }
+    }
 }
 
 void CFX_Edit::OnVK_DOWN(FX_BOOL bShift,FX_BOOL bCtrl)
 {
-	if (m_pVT->IsValid())
-	{
-		SetCaret(m_pVT->GetDownWordPlace(m_wpCaret,m_ptCaret));
+    if (m_pVT->IsValid())
+    {
+        SetCaret(m_pVT->GetDownWordPlace(m_wpCaret,m_ptCaret));
 
-		if (bShift)
-		{
-			if (m_SelState.IsExist())
-				m_SelState.SetEndPos(m_wpCaret);
-			else
-				m_SelState.Set(m_wpOldCaret,m_wpCaret);
+        if (bShift)
+        {
+            if (m_SelState.IsExist())
+                m_SelState.SetEndPos(m_wpCaret);
+            else
+                m_SelState.Set(m_wpOldCaret,m_wpCaret);
 
-			if (m_wpOldCaret != m_wpCaret)
-			{
-				ScrollToCaret();
-				CPVT_WordRange wr(m_wpOldCaret,m_wpCaret);
-				Refresh(RP_OPTIONAL, &wr);
-				SetCaretInfo();
-			}
-		}
-		else
-		{
-			SelectNone();
+            if (m_wpOldCaret != m_wpCaret)
+            {
+                ScrollToCaret();
+                CPVT_WordRange wr(m_wpOldCaret,m_wpCaret);
+                Refresh(RP_OPTIONAL, &wr);
+                SetCaretInfo();
+            }
+        }
+        else
+        {
+            SelectNone();
 
-			ScrollToCaret();
-			SetCaretInfo();
-		}
-	}
+            ScrollToCaret();
+            SetCaretInfo();
+        }
+    }
 }
 
 void CFX_Edit::OnVK_LEFT(FX_BOOL bShift,FX_BOOL bCtrl)
 {
-	if (m_pVT->IsValid())
-	{
-		if (bShift)
-		{
-			if (m_wpCaret == m_pVT->GetLineBeginPlace(m_wpCaret) &&
-				m_wpCaret != m_pVT->GetSectionBeginPlace(m_wpCaret))
-				SetCaret(m_pVT->GetPrevWordPlace(m_wpCaret));
+    if (m_pVT->IsValid())
+    {
+        if (bShift)
+        {
+            if (m_wpCaret == m_pVT->GetLineBeginPlace(m_wpCaret) &&
+                m_wpCaret != m_pVT->GetSectionBeginPlace(m_wpCaret))
+                SetCaret(m_pVT->GetPrevWordPlace(m_wpCaret));
 
-			SetCaret(m_pVT->GetPrevWordPlace(m_wpCaret));
+            SetCaret(m_pVT->GetPrevWordPlace(m_wpCaret));
 
-			if (m_SelState.IsExist())
-				m_SelState.SetEndPos(m_wpCaret);
-			else
-				m_SelState.Set(m_wpOldCaret, m_wpCaret);
+            if (m_SelState.IsExist())
+                m_SelState.SetEndPos(m_wpCaret);
+            else
+                m_SelState.Set(m_wpOldCaret, m_wpCaret);
 
-			if (m_wpOldCaret != m_wpCaret)
-			{
-				ScrollToCaret();
-				CPVT_WordRange wr(m_wpOldCaret,m_wpCaret);
-				Refresh(RP_OPTIONAL,&wr);
-				SetCaretInfo();
-			}
-		}
-		else
-		{
-			if (m_SelState.IsExist())
-			{
-				if (m_SelState.BeginPos.WordCmp(m_SelState.EndPos)<0)
-					SetCaret(m_SelState.BeginPos);
-				else
-					SetCaret(m_SelState.EndPos);
+            if (m_wpOldCaret != m_wpCaret)
+            {
+                ScrollToCaret();
+                CPVT_WordRange wr(m_wpOldCaret,m_wpCaret);
+                Refresh(RP_OPTIONAL,&wr);
+                SetCaretInfo();
+            }
+        }
+        else
+        {
+            if (m_SelState.IsExist())
+            {
+                if (m_SelState.BeginPos.WordCmp(m_SelState.EndPos)<0)
+                    SetCaret(m_SelState.BeginPos);
+                else
+                    SetCaret(m_SelState.EndPos);
 
-				SelectNone();
-				ScrollToCaret();
-				SetCaretInfo();
-			}
-			else
-			{
-				if (m_wpCaret == m_pVT->GetLineBeginPlace(m_wpCaret) &&
-					m_wpCaret != m_pVT->GetSectionBeginPlace(m_wpCaret))
-					SetCaret(m_pVT->GetPrevWordPlace(m_wpCaret));
+                SelectNone();
+                ScrollToCaret();
+                SetCaretInfo();
+            }
+            else
+            {
+                if (m_wpCaret == m_pVT->GetLineBeginPlace(m_wpCaret) &&
+                    m_wpCaret != m_pVT->GetSectionBeginPlace(m_wpCaret))
+                    SetCaret(m_pVT->GetPrevWordPlace(m_wpCaret));
 
-				SetCaret(m_pVT->GetPrevWordPlace(m_wpCaret));
+                SetCaret(m_pVT->GetPrevWordPlace(m_wpCaret));
 
-				ScrollToCaret();
-				SetCaretOrigin();
-				SetCaretInfo();
-			}
-		}
-	}
+                ScrollToCaret();
+                SetCaretOrigin();
+                SetCaretInfo();
+            }
+        }
+    }
 }
 
 void CFX_Edit::OnVK_RIGHT(FX_BOOL bShift,FX_BOOL bCtrl)
 {
-	if (m_pVT->IsValid())
-	{
-		if (bShift)
-		{
-			SetCaret(m_pVT->GetNextWordPlace(m_wpCaret));
+    if (m_pVT->IsValid())
+    {
+        if (bShift)
+        {
+            SetCaret(m_pVT->GetNextWordPlace(m_wpCaret));
 
-			if (m_wpCaret == m_pVT->GetLineEndPlace(m_wpCaret) &&
-				m_wpCaret != m_pVT->GetSectionEndPlace(m_wpCaret))
-				SetCaret(m_pVT->GetNextWordPlace(m_wpCaret));
+            if (m_wpCaret == m_pVT->GetLineEndPlace(m_wpCaret) &&
+                m_wpCaret != m_pVT->GetSectionEndPlace(m_wpCaret))
+                SetCaret(m_pVT->GetNextWordPlace(m_wpCaret));
 
-			if (m_SelState.IsExist())
-				m_SelState.SetEndPos(m_wpCaret);
-			else
-				m_SelState.Set(m_wpOldCaret,m_wpCaret);
+            if (m_SelState.IsExist())
+                m_SelState.SetEndPos(m_wpCaret);
+            else
+                m_SelState.Set(m_wpOldCaret,m_wpCaret);
 
-			if (m_wpOldCaret != m_wpCaret)
-			{
-				ScrollToCaret();
-				CPVT_WordRange wr(m_wpOldCaret,m_wpCaret);
-				Refresh(RP_OPTIONAL,&wr);
-				SetCaretInfo();
-			}
-		}
-		else
-		{
-			if (m_SelState.IsExist())
-			{
-				if (m_SelState.BeginPos.WordCmp(m_SelState.EndPos)>0)
-					SetCaret(m_SelState.BeginPos);
-				else
-					SetCaret(m_SelState.EndPos);
+            if (m_wpOldCaret != m_wpCaret)
+            {
+                ScrollToCaret();
+                CPVT_WordRange wr(m_wpOldCaret,m_wpCaret);
+                Refresh(RP_OPTIONAL,&wr);
+                SetCaretInfo();
+            }
+        }
+        else
+        {
+            if (m_SelState.IsExist())
+            {
+                if (m_SelState.BeginPos.WordCmp(m_SelState.EndPos)>0)
+                    SetCaret(m_SelState.BeginPos);
+                else
+                    SetCaret(m_SelState.EndPos);
 
-				SelectNone();
-				ScrollToCaret();
-				SetCaretInfo();
-			}
-			else
-			{
-				SetCaret(m_pVT->GetNextWordPlace(m_wpCaret));
+                SelectNone();
+                ScrollToCaret();
+                SetCaretInfo();
+            }
+            else
+            {
+                SetCaret(m_pVT->GetNextWordPlace(m_wpCaret));
 
-				if (m_wpCaret == m_pVT->GetLineEndPlace(m_wpCaret) &&
-					m_wpCaret != m_pVT->GetSectionEndPlace(m_wpCaret))
-					SetCaret(m_pVT->GetNextWordPlace(m_wpCaret));
+                if (m_wpCaret == m_pVT->GetLineEndPlace(m_wpCaret) &&
+                    m_wpCaret != m_pVT->GetSectionEndPlace(m_wpCaret))
+                    SetCaret(m_pVT->GetNextWordPlace(m_wpCaret));
 
-				ScrollToCaret();
-				SetCaretOrigin();
-				SetCaretInfo();
-			}
-		}
-	}
+                ScrollToCaret();
+                SetCaretOrigin();
+                SetCaretInfo();
+            }
+        }
+    }
 }
 
 void CFX_Edit::OnVK_HOME(FX_BOOL bShift,FX_BOOL bCtrl)
 {
-	if (m_pVT->IsValid())
-	{
-		if (bShift)
-		{
-			if (bCtrl)
-				SetCaret(m_pVT->GetBeginWordPlace());
-			else
-				SetCaret(m_pVT->GetLineBeginPlace(m_wpCaret));
+    if (m_pVT->IsValid())
+    {
+        if (bShift)
+        {
+            if (bCtrl)
+                SetCaret(m_pVT->GetBeginWordPlace());
+            else
+                SetCaret(m_pVT->GetLineBeginPlace(m_wpCaret));
 
-			if (m_SelState.IsExist())
-				m_SelState.SetEndPos(m_wpCaret);
-			else
-				m_SelState.Set(m_wpOldCaret,m_wpCaret);
+            if (m_SelState.IsExist())
+                m_SelState.SetEndPos(m_wpCaret);
+            else
+                m_SelState.Set(m_wpOldCaret,m_wpCaret);
 
-			ScrollToCaret();
-			CPVT_WordRange wr(m_wpOldCaret, m_wpCaret);
-			Refresh(RP_OPTIONAL, &wr);
-			SetCaretInfo();
-		}
-		else
-		{
-			if (m_SelState.IsExist())
-			{
-				if (m_SelState.BeginPos.WordCmp(m_SelState.EndPos)<0)
-					SetCaret(m_SelState.BeginPos);
-				else
-					SetCaret(m_SelState.EndPos);
+            ScrollToCaret();
+            CPVT_WordRange wr(m_wpOldCaret, m_wpCaret);
+            Refresh(RP_OPTIONAL, &wr);
+            SetCaretInfo();
+        }
+        else
+        {
+            if (m_SelState.IsExist())
+            {
+                if (m_SelState.BeginPos.WordCmp(m_SelState.EndPos)<0)
+                    SetCaret(m_SelState.BeginPos);
+                else
+                    SetCaret(m_SelState.EndPos);
 
-				SelectNone();
-				ScrollToCaret();
-				SetCaretInfo();
-			}
-			else
-			{
-				if (bCtrl)
-					SetCaret(m_pVT->GetBeginWordPlace());
-				else
-					SetCaret(m_pVT->GetLineBeginPlace(m_wpCaret));
+                SelectNone();
+                ScrollToCaret();
+                SetCaretInfo();
+            }
+            else
+            {
+                if (bCtrl)
+                    SetCaret(m_pVT->GetBeginWordPlace());
+                else
+                    SetCaret(m_pVT->GetLineBeginPlace(m_wpCaret));
 
-				ScrollToCaret();
-				SetCaretOrigin();
-				SetCaretInfo();
-			}
-		}
-	}
+                ScrollToCaret();
+                SetCaretOrigin();
+                SetCaretInfo();
+            }
+        }
+    }
 }
 
 void CFX_Edit::OnVK_END(FX_BOOL bShift,FX_BOOL bCtrl)
 {
-	if (m_pVT->IsValid())
-	{
-		if (bShift)
-		{
-			if (bCtrl)
-				SetCaret(m_pVT->GetEndWordPlace());
-			else
-				SetCaret(m_pVT->GetLineEndPlace(m_wpCaret));
+    if (m_pVT->IsValid())
+    {
+        if (bShift)
+        {
+            if (bCtrl)
+                SetCaret(m_pVT->GetEndWordPlace());
+            else
+                SetCaret(m_pVT->GetLineEndPlace(m_wpCaret));
 
-			if (m_SelState.IsExist())
-				m_SelState.SetEndPos(m_wpCaret);
-			else
-				m_SelState.Set(m_wpOldCaret, m_wpCaret);
+            if (m_SelState.IsExist())
+                m_SelState.SetEndPos(m_wpCaret);
+            else
+                m_SelState.Set(m_wpOldCaret, m_wpCaret);
 
-			ScrollToCaret();
-			CPVT_WordRange wr(m_wpOldCaret, m_wpCaret);
-			Refresh(RP_OPTIONAL, &wr);
-			SetCaretInfo();
-		}
-		else
-		{
-			if (m_SelState.IsExist())
-			{
-				if (m_SelState.BeginPos.WordCmp(m_SelState.EndPos)>0)
-					SetCaret(m_SelState.BeginPos);
-				else
-					SetCaret(m_SelState.EndPos);
+            ScrollToCaret();
+            CPVT_WordRange wr(m_wpOldCaret, m_wpCaret);
+            Refresh(RP_OPTIONAL, &wr);
+            SetCaretInfo();
+        }
+        else
+        {
+            if (m_SelState.IsExist())
+            {
+                if (m_SelState.BeginPos.WordCmp(m_SelState.EndPos)>0)
+                    SetCaret(m_SelState.BeginPos);
+                else
+                    SetCaret(m_SelState.EndPos);
 
-				SelectNone();
-				ScrollToCaret();
-				SetCaretInfo();
-			}
-			else
-			{
-				if (bCtrl)
-					SetCaret(m_pVT->GetEndWordPlace());
-				else
-					SetCaret(m_pVT->GetLineEndPlace(m_wpCaret));
+                SelectNone();
+                ScrollToCaret();
+                SetCaretInfo();
+            }
+            else
+            {
+                if (bCtrl)
+                    SetCaret(m_pVT->GetEndWordPlace());
+                else
+                    SetCaret(m_pVT->GetLineEndPlace(m_wpCaret));
 
-				ScrollToCaret();
-				SetCaretOrigin();
-				SetCaretInfo();
-			}
-		}
-	}
+                ScrollToCaret();
+                SetCaretOrigin();
+                SetCaretInfo();
+            }
+        }
+    }
 }
 
 void CFX_Edit::SetText(const FX_WCHAR* text,int32_t charset,
-						const CPVT_SecProps * pSecProps,const CPVT_WordProps * pWordProps, FX_BOOL bAddUndo, FX_BOOL bPaint)
+                        const CPVT_SecProps * pSecProps,const CPVT_WordProps * pWordProps, FX_BOOL bAddUndo, FX_BOOL bPaint)
 {
-	Empty();
-	DoInsertText(CPVT_WordPlace(0,0,-1), text, charset, pSecProps, pWordProps);
-	if (bPaint) Paint();
-	if (m_bOprNotify && m_pOprNotify)
-		m_pOprNotify->OnSetText(m_wpCaret, m_wpOldCaret);
-	//if (bAddUndo)
+    Empty();
+    DoInsertText(CPVT_WordPlace(0,0,-1), text, charset, pSecProps, pWordProps);
+    if (bPaint) Paint();
+    if (m_bOprNotify && m_pOprNotify)
+        m_pOprNotify->OnSetText(m_wpCaret, m_wpOldCaret);
+    //if (bAddUndo)
 }
 
 FX_BOOL CFX_Edit::InsertWord(FX_WORD word, int32_t charset, const CPVT_WordProps * pWordProps, FX_BOOL bAddUndo, FX_BOOL bPaint)
 {
-	if (IsTextOverflow()) return FALSE;
+    if (IsTextOverflow()) return FALSE;
 
-	if (m_pVT->IsValid())
-	{
-		m_pVT->UpdateWordPlace(m_wpCaret);
+    if (m_pVT->IsValid())
+    {
+        m_pVT->UpdateWordPlace(m_wpCaret);
 
-		SetCaret(m_pVT->InsertWord(m_wpCaret,word,GetCharSetFromUnicode(word, charset),pWordProps));
-		m_SelState.Set(m_wpCaret,m_wpCaret);
+        SetCaret(m_pVT->InsertWord(m_wpCaret,word,GetCharSetFromUnicode(word, charset),pWordProps));
+        m_SelState.Set(m_wpCaret,m_wpCaret);
 
-		if (m_wpCaret != m_wpOldCaret)
-		{
-			if (bAddUndo && m_bEnableUndo)
-			{
-				AddEditUndoItem(new CFXEU_InsertWord(this,m_wpOldCaret,m_wpCaret,word,charset,pWordProps));
-			}
+        if (m_wpCaret != m_wpOldCaret)
+        {
+            if (bAddUndo && m_bEnableUndo)
+            {
+                AddEditUndoItem(new CFXEU_InsertWord(this,m_wpOldCaret,m_wpCaret,word,charset,pWordProps));
+            }
 
-			if (bPaint)
-				PaintInsertText(m_wpOldCaret, m_wpCaret);
+            if (bPaint)
+                PaintInsertText(m_wpOldCaret, m_wpCaret);
 
-			if (m_bOprNotify && m_pOprNotify)
-				m_pOprNotify->OnInsertWord(m_wpCaret, m_wpOldCaret);
+            if (m_bOprNotify && m_pOprNotify)
+                m_pOprNotify->OnInsertWord(m_wpCaret, m_wpOldCaret);
 
-			return TRUE;
-		}
-	}
+            return TRUE;
+        }
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
 FX_BOOL CFX_Edit::InsertReturn(const CPVT_SecProps * pSecProps,const CPVT_WordProps * pWordProps,
-							   FX_BOOL bAddUndo, FX_BOOL bPaint)
+                               FX_BOOL bAddUndo, FX_BOOL bPaint)
 {
-	if (IsTextOverflow()) return FALSE;
+    if (IsTextOverflow()) return FALSE;
 
-	if (m_pVT->IsValid())
-	{
-		m_pVT->UpdateWordPlace(m_wpCaret);
-		SetCaret(m_pVT->InsertSection(m_wpCaret,pSecProps,pWordProps));
-		m_SelState.Set(m_wpCaret,m_wpCaret);
+    if (m_pVT->IsValid())
+    {
+        m_pVT->UpdateWordPlace(m_wpCaret);
+        SetCaret(m_pVT->InsertSection(m_wpCaret,pSecProps,pWordProps));
+        m_SelState.Set(m_wpCaret,m_wpCaret);
 
-		if (m_wpCaret != m_wpOldCaret)
-		{
-			if (bAddUndo && m_bEnableUndo)
-			{
-				AddEditUndoItem(new CFXEU_InsertReturn(this,m_wpOldCaret,m_wpCaret,pSecProps,pWordProps));
-			}
+        if (m_wpCaret != m_wpOldCaret)
+        {
+            if (bAddUndo && m_bEnableUndo)
+            {
+                AddEditUndoItem(new CFXEU_InsertReturn(this,m_wpOldCaret,m_wpCaret,pSecProps,pWordProps));
+            }
 
-			if (bPaint)
-			{
-				RearrangePart(CPVT_WordRange(m_wpOldCaret, m_wpCaret));
-				ScrollToCaret();
-				CPVT_WordRange wr(m_wpOldCaret, GetVisibleWordRange().EndPos);
-				Refresh(RP_ANALYSE, &wr);
-				SetCaretOrigin();
-				SetCaretInfo();
-			}
+            if (bPaint)
+            {
+                RearrangePart(CPVT_WordRange(m_wpOldCaret, m_wpCaret));
+                ScrollToCaret();
+                CPVT_WordRange wr(m_wpOldCaret, GetVisibleWordRange().EndPos);
+                Refresh(RP_ANALYSE, &wr);
+                SetCaretOrigin();
+                SetCaretInfo();
+            }
 
-			if (m_bOprNotify && m_pOprNotify)
-				m_pOprNotify->OnInsertReturn(m_wpCaret, m_wpOldCaret);
+            if (m_bOprNotify && m_pOprNotify)
+                m_pOprNotify->OnInsertReturn(m_wpCaret, m_wpOldCaret);
 
-			return TRUE;
-		}
-	}
+            return TRUE;
+        }
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
 FX_BOOL CFX_Edit::Backspace(FX_BOOL bAddUndo, FX_BOOL bPaint)
 {
-	if (m_pVT->IsValid())
-	{
-		if (m_wpCaret == m_pVT->GetBeginWordPlace()) return FALSE;
+    if (m_pVT->IsValid())
+    {
+        if (m_wpCaret == m_pVT->GetBeginWordPlace()) return FALSE;
 
-		CPVT_Section section;
-		CPVT_Word word;
+        CPVT_Section section;
+        CPVT_Word word;
 
-		if (bAddUndo)
-		{
-			if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
-			{
-				pIterator->SetAt(m_wpCaret);
-				pIterator->GetSection(section);
-				pIterator->GetWord(word);
-			}
-		}
+        if (bAddUndo)
+        {
+            if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
+            {
+                pIterator->SetAt(m_wpCaret);
+                pIterator->GetSection(section);
+                pIterator->GetWord(word);
+            }
+        }
 
-		m_pVT->UpdateWordPlace(m_wpCaret);
-		SetCaret(m_pVT->BackSpaceWord(m_wpCaret));
-		m_SelState.Set(m_wpCaret,m_wpCaret);
+        m_pVT->UpdateWordPlace(m_wpCaret);
+        SetCaret(m_pVT->BackSpaceWord(m_wpCaret));
+        m_SelState.Set(m_wpCaret,m_wpCaret);
 
-		if (m_wpCaret != m_wpOldCaret)
-		{
-			if (bAddUndo && m_bEnableUndo)
-			{
-				if (m_wpCaret.SecCmp(m_wpOldCaret) != 0)
-					AddEditUndoItem(new CFXEU_Backspace(this,m_wpOldCaret,m_wpCaret,word.Word,word.nCharset,
-						section.SecProps,section.WordProps));
-				else
-					AddEditUndoItem(new CFXEU_Backspace(this,m_wpOldCaret,m_wpCaret,word.Word,word.nCharset,
-						section.SecProps,word.WordProps));
-			}
+        if (m_wpCaret != m_wpOldCaret)
+        {
+            if (bAddUndo && m_bEnableUndo)
+            {
+                if (m_wpCaret.SecCmp(m_wpOldCaret) != 0)
+                    AddEditUndoItem(new CFXEU_Backspace(this,m_wpOldCaret,m_wpCaret,word.Word,word.nCharset,
+                        section.SecProps,section.WordProps));
+                else
+                    AddEditUndoItem(new CFXEU_Backspace(this,m_wpOldCaret,m_wpCaret,word.Word,word.nCharset,
+                        section.SecProps,word.WordProps));
+            }
 
-			if (bPaint)
-			{
-				RearrangePart(CPVT_WordRange(m_wpCaret,m_wpOldCaret));
-				ScrollToCaret();
+            if (bPaint)
+            {
+                RearrangePart(CPVT_WordRange(m_wpCaret,m_wpOldCaret));
+                ScrollToCaret();
 
-				CPVT_WordRange wr;
-				if (m_wpCaret.SecCmp(m_wpOldCaret) !=0)
-					wr = CPVT_WordRange(m_pVT->GetPrevWordPlace(m_wpCaret),GetVisibleWordRange().EndPos);
-				else if (m_wpCaret.LineCmp(m_wpOldCaret) !=0)
-					wr = CPVT_WordRange(m_pVT->GetLineBeginPlace(m_wpCaret),m_pVT->GetSectionEndPlace(m_wpCaret));
-				else
-					wr = CPVT_WordRange(m_pVT->GetPrevWordPlace(m_wpCaret),m_pVT->GetSectionEndPlace(m_wpCaret));
+                CPVT_WordRange wr;
+                if (m_wpCaret.SecCmp(m_wpOldCaret) !=0)
+                    wr = CPVT_WordRange(m_pVT->GetPrevWordPlace(m_wpCaret),GetVisibleWordRange().EndPos);
+                else if (m_wpCaret.LineCmp(m_wpOldCaret) !=0)
+                    wr = CPVT_WordRange(m_pVT->GetLineBeginPlace(m_wpCaret),m_pVT->GetSectionEndPlace(m_wpCaret));
+                else
+                    wr = CPVT_WordRange(m_pVT->GetPrevWordPlace(m_wpCaret),m_pVT->GetSectionEndPlace(m_wpCaret));
 
-				Refresh(RP_ANALYSE, &wr);
+                Refresh(RP_ANALYSE, &wr);
 
-				SetCaretOrigin();
-				SetCaretInfo();
-			}
+                SetCaretOrigin();
+                SetCaretInfo();
+            }
 
-			if (m_bOprNotify && m_pOprNotify)
-				m_pOprNotify->OnBackSpace(m_wpCaret, m_wpOldCaret);
+            if (m_bOprNotify && m_pOprNotify)
+                m_pOprNotify->OnBackSpace(m_wpCaret, m_wpOldCaret);
 
-			return TRUE;
-		}
-	}
+            return TRUE;
+        }
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
 FX_BOOL CFX_Edit::Delete(FX_BOOL bAddUndo, FX_BOOL bPaint)
 {
-	if (m_pVT->IsValid())
-	{
-		if (m_wpCaret == m_pVT->GetEndWordPlace()) return FALSE;
+    if (m_pVT->IsValid())
+    {
+        if (m_wpCaret == m_pVT->GetEndWordPlace()) return FALSE;
 
-		CPVT_Section section;
-		CPVT_Word word;
+        CPVT_Section section;
+        CPVT_Word word;
 
-		if (bAddUndo)
-		{
-			if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
-			{
-				pIterator->SetAt(m_pVT->GetNextWordPlace(m_wpCaret));
-				pIterator->GetSection(section);
-				pIterator->GetWord(word);
-			}
-		}
+        if (bAddUndo)
+        {
+            if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
+            {
+                pIterator->SetAt(m_pVT->GetNextWordPlace(m_wpCaret));
+                pIterator->GetSection(section);
+                pIterator->GetWord(word);
+            }
+        }
 
-		m_pVT->UpdateWordPlace(m_wpCaret);
-		FX_BOOL bSecEnd = (m_wpCaret == m_pVT->GetSectionEndPlace(m_wpCaret));
+        m_pVT->UpdateWordPlace(m_wpCaret);
+        FX_BOOL bSecEnd = (m_wpCaret == m_pVT->GetSectionEndPlace(m_wpCaret));
 
-		SetCaret(m_pVT->DeleteWord(m_wpCaret));
-		m_SelState.Set(m_wpCaret,m_wpCaret);
+        SetCaret(m_pVT->DeleteWord(m_wpCaret));
+        m_SelState.Set(m_wpCaret,m_wpCaret);
 
-		if (bAddUndo && m_bEnableUndo)
-		{
-			if (bSecEnd)
-				AddEditUndoItem(new CFXEU_Delete(this,m_wpOldCaret,m_wpCaret,word.Word,word.nCharset,
-					section.SecProps,section.WordProps,bSecEnd));
-			else
-				AddEditUndoItem(new CFXEU_Delete(this,m_wpOldCaret,m_wpCaret,word.Word,word.nCharset,
-					section.SecProps,word.WordProps,bSecEnd));
-		}
+        if (bAddUndo && m_bEnableUndo)
+        {
+            if (bSecEnd)
+                AddEditUndoItem(new CFXEU_Delete(this,m_wpOldCaret,m_wpCaret,word.Word,word.nCharset,
+                    section.SecProps,section.WordProps,bSecEnd));
+            else
+                AddEditUndoItem(new CFXEU_Delete(this,m_wpOldCaret,m_wpCaret,word.Word,word.nCharset,
+                    section.SecProps,word.WordProps,bSecEnd));
+        }
 
-		if (bPaint)
-		{
-			RearrangePart(CPVT_WordRange(m_wpOldCaret,m_wpCaret));
-			ScrollToCaret();
+        if (bPaint)
+        {
+            RearrangePart(CPVT_WordRange(m_wpOldCaret,m_wpCaret));
+            ScrollToCaret();
 
-			CPVT_WordRange wr;
-			if (bSecEnd)
-				wr = CPVT_WordRange(m_pVT->GetPrevWordPlace(m_wpOldCaret),GetVisibleWordRange().EndPos);
-			else if (m_wpCaret.LineCmp(m_wpOldCaret) !=0)
-				wr = CPVT_WordRange(m_pVT->GetLineBeginPlace(m_wpCaret),m_pVT->GetSectionEndPlace(m_wpCaret));
-			else
-				wr = CPVT_WordRange(m_pVT->GetPrevWordPlace(m_wpOldCaret),m_pVT->GetSectionEndPlace(m_wpCaret));
+            CPVT_WordRange wr;
+            if (bSecEnd)
+                wr = CPVT_WordRange(m_pVT->GetPrevWordPlace(m_wpOldCaret),GetVisibleWordRange().EndPos);
+            else if (m_wpCaret.LineCmp(m_wpOldCaret) !=0)
+                wr = CPVT_WordRange(m_pVT->GetLineBeginPlace(m_wpCaret),m_pVT->GetSectionEndPlace(m_wpCaret));
+            else
+                wr = CPVT_WordRange(m_pVT->GetPrevWordPlace(m_wpOldCaret),m_pVT->GetSectionEndPlace(m_wpCaret));
 
-			Refresh(RP_ANALYSE, &wr);
+            Refresh(RP_ANALYSE, &wr);
 
-			SetCaretOrigin();
-			SetCaretInfo();
-		}
+            SetCaretOrigin();
+            SetCaretInfo();
+        }
 
-		if (m_bOprNotify && m_pOprNotify)
-			m_pOprNotify->OnDelete(m_wpCaret, m_wpOldCaret);
+        if (m_bOprNotify && m_pOprNotify)
+            m_pOprNotify->OnDelete(m_wpCaret, m_wpOldCaret);
 
-		return TRUE;
-	}
+        return TRUE;
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
-FX_BOOL	CFX_Edit::Empty()
+FX_BOOL CFX_Edit::Empty()
 {
-	if (m_pVT->IsValid())
-	{
-		m_pVT->DeleteWords(GetWholeWordRange());
-		SetCaret(m_pVT->GetBeginWordPlace());
+    if (m_pVT->IsValid())
+    {
+        m_pVT->DeleteWords(GetWholeWordRange());
+        SetCaret(m_pVT->GetBeginWordPlace());
 
-		return TRUE;
-	}
+        return TRUE;
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
 FX_BOOL CFX_Edit::Clear(FX_BOOL bAddUndo, FX_BOOL bPaint)
 {
-	if (m_pVT->IsValid())
-	{
-		if (m_SelState.IsExist())
-		{
-			CPVT_WordRange range = m_SelState.ConvertToWordRange();
+    if (m_pVT->IsValid())
+    {
+        if (m_SelState.IsExist())
+        {
+            CPVT_WordRange range = m_SelState.ConvertToWordRange();
 
-			if (bAddUndo && m_bEnableUndo)
-			{
-				if (m_pVT->IsRichText())
-				{
-					BeginGroupUndo(L"");
+            if (bAddUndo && m_bEnableUndo)
+            {
+                if (m_pVT->IsRichText())
+                {
+                    BeginGroupUndo(L"");
 
-					if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
-					{
-						pIterator->SetAt(range.EndPos);
+                    if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
+                    {
+                        pIterator->SetAt(range.EndPos);
 
-						CPVT_Word wordinfo;
-						CPVT_Section secinfo;
-						do
-						{
-							CPVT_WordPlace place = pIterator->GetAt();
-							if (place.WordCmp(range.BeginPos) <= 0)break;
+                        CPVT_Word wordinfo;
+                        CPVT_Section secinfo;
+                        do
+                        {
+                            CPVT_WordPlace place = pIterator->GetAt();
+                            if (place.WordCmp(range.BeginPos) <= 0)break;
 
-							CPVT_WordPlace oldplace = m_pVT->GetPrevWordPlace(place);
+                            CPVT_WordPlace oldplace = m_pVT->GetPrevWordPlace(place);
 
-							if (oldplace.SecCmp(place) != 0)
-							{
-								if (pIterator->GetSection(secinfo))
-								{
-									AddEditUndoItem(new CFXEU_ClearRich(this,oldplace,place,range,wordinfo.Word,
-										wordinfo.nCharset,secinfo.SecProps,secinfo.WordProps));
-								}
-							}
-							else
-							{
-								if (pIterator->GetWord(wordinfo))
-								{
-									oldplace = m_pVT->AjustLineHeader(oldplace,TRUE);
-									place = m_pVT->AjustLineHeader(place,TRUE);
+                            if (oldplace.SecCmp(place) != 0)
+                            {
+                                if (pIterator->GetSection(secinfo))
+                                {
+                                    AddEditUndoItem(new CFXEU_ClearRich(this,oldplace,place,range,wordinfo.Word,
+                                        wordinfo.nCharset,secinfo.SecProps,secinfo.WordProps));
+                                }
+                            }
+                            else
+                            {
+                                if (pIterator->GetWord(wordinfo))
+                                {
+                                    oldplace = m_pVT->AjustLineHeader(oldplace,TRUE);
+                                    place = m_pVT->AjustLineHeader(place,TRUE);
 
-									AddEditUndoItem(new CFXEU_ClearRich(this,oldplace,place,range,wordinfo.Word,
-										wordinfo.nCharset,secinfo.SecProps,wordinfo.WordProps));
-								}
-							}
-						}while (pIterator->PrevWord());
-					}
-					EndGroupUndo();
-				}
-				else
-				{
-					AddEditUndoItem(new CFXEU_Clear(this,range,GetSelText()));
-				}
-			}
+                                    AddEditUndoItem(new CFXEU_ClearRich(this,oldplace,place,range,wordinfo.Word,
+                                        wordinfo.nCharset,secinfo.SecProps,wordinfo.WordProps));
+                                }
+                            }
+                        }while (pIterator->PrevWord());
+                    }
+                    EndGroupUndo();
+                }
+                else
+                {
+                    AddEditUndoItem(new CFXEU_Clear(this,range,GetSelText()));
+                }
+            }
 
-			SelectNone();
-			SetCaret(m_pVT->DeleteWords(range));
-			m_SelState.Set(m_wpCaret,m_wpCaret);
+            SelectNone();
+            SetCaret(m_pVT->DeleteWords(range));
+            m_SelState.Set(m_wpCaret,m_wpCaret);
 
-			if (bPaint)
-			{
-				RearrangePart(range);
-				ScrollToCaret();
+            if (bPaint)
+            {
+                RearrangePart(range);
+                ScrollToCaret();
 
-				CPVT_WordRange wr(m_wpOldCaret, GetVisibleWordRange().EndPos);
-				Refresh(RP_ANALYSE, &wr);
+                CPVT_WordRange wr(m_wpOldCaret, GetVisibleWordRange().EndPos);
+                Refresh(RP_ANALYSE, &wr);
 
-				SetCaretOrigin();
-				SetCaretInfo();
-			}
+                SetCaretOrigin();
+                SetCaretInfo();
+            }
 
-			if (m_bOprNotify && m_pOprNotify)
-				m_pOprNotify->OnClear(m_wpCaret, m_wpOldCaret);
+            if (m_bOprNotify && m_pOprNotify)
+                m_pOprNotify->OnClear(m_wpCaret, m_wpOldCaret);
 
-			return TRUE;
-		}
-	}
+            return TRUE;
+        }
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
 FX_BOOL CFX_Edit::InsertText(const FX_WCHAR* text, int32_t charset,
-					const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps, FX_BOOL bAddUndo, FX_BOOL bPaint)
+                    const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps, FX_BOOL bAddUndo, FX_BOOL bPaint)
 {
-	if (IsTextOverflow()) return FALSE;
+    if (IsTextOverflow()) return FALSE;
 
-	m_pVT->UpdateWordPlace(m_wpCaret);
-	SetCaret(DoInsertText(m_wpCaret, text, charset, pSecProps, pWordProps));
-	m_SelState.Set(m_wpCaret,m_wpCaret);
+    m_pVT->UpdateWordPlace(m_wpCaret);
+    SetCaret(DoInsertText(m_wpCaret, text, charset, pSecProps, pWordProps));
+    m_SelState.Set(m_wpCaret,m_wpCaret);
 
-	if (m_wpCaret != m_wpOldCaret)
-	{
-		if (bAddUndo && m_bEnableUndo)
-		{
-			AddEditUndoItem(new CFXEU_InsertText(this,m_wpOldCaret,m_wpCaret,text,charset,pSecProps,pWordProps));
-		}
+    if (m_wpCaret != m_wpOldCaret)
+    {
+        if (bAddUndo && m_bEnableUndo)
+        {
+            AddEditUndoItem(new CFXEU_InsertText(this,m_wpOldCaret,m_wpCaret,text,charset,pSecProps,pWordProps));
+        }
 
-		if (bPaint)
-			PaintInsertText(m_wpOldCaret, m_wpCaret);
+        if (bPaint)
+            PaintInsertText(m_wpOldCaret, m_wpCaret);
 
-		if (m_bOprNotify && m_pOprNotify)
-			m_pOprNotify->OnInsertText(m_wpCaret, m_wpOldCaret);
+        if (m_bOprNotify && m_pOprNotify)
+            m_pOprNotify->OnInsertText(m_wpCaret, m_wpOldCaret);
 
-		return TRUE;
-	}
-	return FALSE;
+        return TRUE;
+    }
+    return FALSE;
 }
 
 void CFX_Edit::PaintInsertText(const CPVT_WordPlace & wpOld, const CPVT_WordPlace & wpNew)
 {
-	if (m_pVT->IsValid())
-	{
-		RearrangePart(CPVT_WordRange(wpOld,wpNew));
-		ScrollToCaret();
+    if (m_pVT->IsValid())
+    {
+        RearrangePart(CPVT_WordRange(wpOld,wpNew));
+        ScrollToCaret();
 
-		CPVT_WordRange wr;
-		if (m_wpCaret.LineCmp(wpOld) !=0)
-			wr = CPVT_WordRange(m_pVT->GetLineBeginPlace(wpOld),m_pVT->GetSectionEndPlace(wpNew));
-		else
-			wr = CPVT_WordRange(wpOld,m_pVT->GetSectionEndPlace(wpNew));
-		Refresh(RP_ANALYSE, &wr);
-		SetCaretOrigin();
-		SetCaretInfo();
-	}
+        CPVT_WordRange wr;
+        if (m_wpCaret.LineCmp(wpOld) !=0)
+            wr = CPVT_WordRange(m_pVT->GetLineBeginPlace(wpOld),m_pVT->GetSectionEndPlace(wpNew));
+        else
+            wr = CPVT_WordRange(wpOld,m_pVT->GetSectionEndPlace(wpNew));
+        Refresh(RP_ANALYSE, &wr);
+        SetCaretOrigin();
+        SetCaretInfo();
+    }
 }
 
 FX_BOOL CFX_Edit::Redo()
 {
-	if (m_bEnableUndo)
-	{
-		if (m_Undo.CanRedo())
-		{
-			m_Undo.Redo();
-			return TRUE;
-		}
-	}
+    if (m_bEnableUndo)
+    {
+        if (m_Undo.CanRedo())
+        {
+            m_Undo.Redo();
+            return TRUE;
+        }
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
 FX_BOOL CFX_Edit::Undo()
 {
-	if (m_bEnableUndo)
-	{
-		if (m_Undo.CanUndo())
-		{
-			m_Undo.Undo();
-			return TRUE;
-		}
-	}
+    if (m_bEnableUndo)
+    {
+        if (m_Undo.CanUndo())
+        {
+            m_Undo.Undo();
+            return TRUE;
+        }
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
 void CFX_Edit::SetCaretOrigin()
 {
-	if (m_pVT->IsValid())
-	{
-		if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
-		{
-			pIterator->SetAt(m_wpCaret);
-			CPVT_Word word;
-			CPVT_Line line;
-			if (pIterator->GetWord(word))
-			{
-				m_ptCaret.x = word.ptWord.x + word.fWidth;
-				m_ptCaret.y = word.ptWord.y;
-			}
-			else if (pIterator->GetLine(line))
-			{
-				m_ptCaret.x = line.ptLine.x;
-				m_ptCaret.y = line.ptLine.y;
-			}
-		}
-	}
+    if (m_pVT->IsValid())
+    {
+        if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
+        {
+            pIterator->SetAt(m_wpCaret);
+            CPVT_Word word;
+            CPVT_Line line;
+            if (pIterator->GetWord(word))
+            {
+                m_ptCaret.x = word.ptWord.x + word.fWidth;
+                m_ptCaret.y = word.ptWord.y;
+            }
+            else if (pIterator->GetLine(line))
+            {
+                m_ptCaret.x = line.ptLine.x;
+                m_ptCaret.y = line.ptLine.y;
+            }
+        }
+    }
 }
 
 int32_t CFX_Edit::WordPlaceToWordIndex(const CPVT_WordPlace & place) const
 {
-	if (m_pVT->IsValid())
-		return m_pVT->WordPlaceToWordIndex(place);
+    if (m_pVT->IsValid())
+        return m_pVT->WordPlaceToWordIndex(place);
 
-	return -1;
+    return -1;
 }
 
 CPVT_WordPlace CFX_Edit::WordIndexToWordPlace(int32_t index) const
 {
-	if (m_pVT->IsValid())
-		return m_pVT->WordIndexToWordPlace(index);
+    if (m_pVT->IsValid())
+        return m_pVT->WordIndexToWordPlace(index);
 
-	return CPVT_WordPlace();
+    return CPVT_WordPlace();
 }
 
-FX_BOOL	CFX_Edit::IsTextFull() const
+FX_BOOL CFX_Edit::IsTextFull() const
 {
-	int32_t nTotalWords = m_pVT->GetTotalWords();
-	int32_t nLimitChar = m_pVT->GetLimitChar();
-	int32_t nCharArray = m_pVT->GetCharArray();
+    int32_t nTotalWords = m_pVT->GetTotalWords();
+    int32_t nLimitChar = m_pVT->GetLimitChar();
+    int32_t nCharArray = m_pVT->GetCharArray();
 
-	return IsTextOverflow() || (nLimitChar>0 && nTotalWords >= nLimitChar)
-		|| (nCharArray>0 && nTotalWords >= nCharArray);
+    return IsTextOverflow() || (nLimitChar>0 && nTotalWords >= nLimitChar)
+        || (nCharArray>0 && nTotalWords >= nCharArray);
 }
 
-FX_BOOL	CFX_Edit::IsTextOverflow() const
+FX_BOOL CFX_Edit::IsTextOverflow() const
 {
-	if (!m_bEnableScroll && !m_bEnableOverflow)
-	{
-		CPDF_Rect rcPlate = m_pVT->GetPlateRect();
-		CPDF_Rect rcContent = m_pVT->GetContentRect();
+    if (!m_bEnableScroll && !m_bEnableOverflow)
+    {
+        CPDF_Rect rcPlate = m_pVT->GetPlateRect();
+        CPDF_Rect rcContent = m_pVT->GetContentRect();
 
-		if (m_pVT->IsMultiLine() && GetTotalLines() > 1)
-		{
-			if (FX_EDIT_IsFloatBigger(rcContent.Height(),rcPlate.Height())) return TRUE;
-		}
+        if (m_pVT->IsMultiLine() && GetTotalLines() > 1)
+        {
+            if (FX_EDIT_IsFloatBigger(rcContent.Height(),rcPlate.Height())) return TRUE;
+        }
 
-		if (FX_EDIT_IsFloatBigger(rcContent.Width(),rcPlate.Width())) return TRUE;
-	}
+        if (FX_EDIT_IsFloatBigger(rcContent.Width(),rcPlate.Width())) return TRUE;
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
 CPVT_WordPlace CFX_Edit::GetLineBeginPlace(const CPVT_WordPlace & place) const
 {
-	return m_pVT->GetLineBeginPlace(place);
+    return m_pVT->GetLineBeginPlace(place);
 }
 
 CPVT_WordPlace CFX_Edit::GetLineEndPlace(const CPVT_WordPlace & place) const
 {
-	return m_pVT->GetLineEndPlace(place);
+    return m_pVT->GetLineEndPlace(place);
 }
 
 CPVT_WordPlace CFX_Edit::GetSectionBeginPlace(const CPVT_WordPlace & place) const
 {
-	return m_pVT->GetSectionBeginPlace(place);
+    return m_pVT->GetSectionBeginPlace(place);
 }
 
 CPVT_WordPlace CFX_Edit::GetSectionEndPlace(const CPVT_WordPlace & place) const
 {
-	return m_pVT->GetSectionEndPlace(place);
+    return m_pVT->GetSectionEndPlace(place);
 }
 
-FX_BOOL	CFX_Edit::CanUndo() const
+FX_BOOL CFX_Edit::CanUndo() const
 {
-	if (m_bEnableUndo)
-	{
-		return m_Undo.CanUndo();
-	}
+    if (m_bEnableUndo)
+    {
+        return m_Undo.CanUndo();
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
-FX_BOOL	CFX_Edit::CanRedo() const
+FX_BOOL CFX_Edit::CanRedo() const
 {
-	if (m_bEnableUndo)
-	{
-		return m_Undo.CanRedo();
-	}
+    if (m_bEnableUndo)
+    {
+        return m_Undo.CanRedo();
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
-FX_BOOL	CFX_Edit::IsModified() const
+FX_BOOL CFX_Edit::IsModified() const
 {
-	if (m_bEnableUndo)
-	{
-		return m_Undo.IsModified();
-	}
+    if (m_bEnableUndo)
+    {
+        return m_Undo.IsModified();
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
 void CFX_Edit::EnableRefresh(FX_BOOL bRefresh)
 {
-	m_bEnableRefresh = bRefresh;
+    m_bEnableRefresh = bRefresh;
 }
 
 void CFX_Edit::EnableUndo(FX_BOOL bUndo)
@@ -3466,74 +3439,74 @@
 
 FX_FLOAT CFX_Edit::GetLineTop(const CPVT_WordPlace& place) const
 {
-	if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator())
-	{
-		CPVT_WordPlace wpOld = pIterator->GetAt();
+    if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator())
+    {
+        CPVT_WordPlace wpOld = pIterator->GetAt();
 
-		pIterator->SetAt(place);
-		CPVT_Line line;
-		pIterator->GetLine(line);
+        pIterator->SetAt(place);
+        CPVT_Line line;
+        pIterator->GetLine(line);
 
-		pIterator->SetAt(wpOld);
+        pIterator->SetAt(wpOld);
 
-		return line.ptLine.y + line.fLineAscent;
-	}
+        return line.ptLine.y + line.fLineAscent;
+    }
 
-	return 0.0f;
+    return 0.0f;
 }
 
 FX_FLOAT CFX_Edit::GetLineBottom(const CPVT_WordPlace& place) const
 {
-	if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator())
-	{
-		CPVT_WordPlace wpOld = pIterator->GetAt();
+    if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator())
+    {
+        CPVT_WordPlace wpOld = pIterator->GetAt();
 
-		pIterator->SetAt(place);
-		CPVT_Line line;
-		pIterator->GetLine(line);
+        pIterator->SetAt(place);
+        CPVT_Line line;
+        pIterator->GetLine(line);
 
-		pIterator->SetAt(wpOld);
+        pIterator->SetAt(wpOld);
 
-		return line.ptLine.y + line.fLineDescent;
-	}
+        return line.ptLine.y + line.fLineDescent;
+    }
 
-	return 0.0f;
+    return 0.0f;
 }
 
 CPVT_WordPlace CFX_Edit::DoInsertText(const CPVT_WordPlace& place, const FX_WCHAR* text, int32_t charset,
-									  const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps)
+                                      const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps)
 {
-	CPVT_WordPlace wp = place;
+    CPVT_WordPlace wp = place;
 
-	if (m_pVT->IsValid())
-	{
-		CFX_WideString sText = text;
+    if (m_pVT->IsValid())
+    {
+        CFX_WideString sText = text;
 
-		for (int32_t i = 0, sz = sText.GetLength(); i < sz; i++)
-		{
-			FX_WORD word = sText[i];
-			switch (word)
-			{
-			case 0x0D:
-				wp = m_pVT->InsertSection(wp,pSecProps,pWordProps);
-				if (sText[i+1] == 0x0A)
-					i++;
-				break;
-			case 0x0A:
-				wp = m_pVT->InsertSection(wp,pSecProps,pWordProps);
-				if (sText[i+1] == 0x0D)
-					i++;
-				break;
-			case 0x09:
-				word = 0x20;
-			default:
-				wp = m_pVT->InsertWord(wp,word,GetCharSetFromUnicode(word, charset),pWordProps);
-				break;
-			}
-		}
-	}
+        for (int32_t i = 0, sz = sText.GetLength(); i < sz; i++)
+        {
+            FX_WORD word = sText[i];
+            switch (word)
+            {
+            case 0x0D:
+                wp = m_pVT->InsertSection(wp,pSecProps,pWordProps);
+                if (sText[i+1] == 0x0A)
+                    i++;
+                break;
+            case 0x0A:
+                wp = m_pVT->InsertSection(wp,pSecProps,pWordProps);
+                if (sText[i+1] == 0x0D)
+                    i++;
+                break;
+            case 0x09:
+                word = 0x20;
+            default:
+                wp = m_pVT->InsertWord(wp,word,GetCharSetFromUnicode(word, charset),pWordProps);
+                break;
+            }
+        }
+    }
 
-	return wp;
+    return wp;
 }
 
 int32_t CFX_Edit::GetCharSetFromUnicode(FX_WORD word, int32_t nOldCharset)
@@ -3545,38 +3518,38 @@
 
 void CFX_Edit::BeginGroupUndo(const CFX_WideString& sTitle)
 {
-	ASSERT(m_pGroupUndoItem == NULL);
+    ASSERT(m_pGroupUndoItem == NULL);
 
-	m_pGroupUndoItem = new CFX_Edit_GroupUndoItem(sTitle);
+    m_pGroupUndoItem = new CFX_Edit_GroupUndoItem(sTitle);
 }
 
 void CFX_Edit::EndGroupUndo()
 {
-	ASSERT(m_pGroupUndoItem != NULL);
+    ASSERT(m_pGroupUndoItem != NULL);
 
-	m_pGroupUndoItem->UpdateItems();
-	m_Undo.AddItem(m_pGroupUndoItem);
-	if (m_bOprNotify && m_pOprNotify)
-		m_pOprNotify->OnAddUndo(m_pGroupUndoItem);
-	m_pGroupUndoItem = NULL;
+    m_pGroupUndoItem->UpdateItems();
+    m_Undo.AddItem(m_pGroupUndoItem);
+    if (m_bOprNotify && m_pOprNotify)
+        m_pOprNotify->OnAddUndo(m_pGroupUndoItem);
+    m_pGroupUndoItem = NULL;
 }
 
 void CFX_Edit::AddEditUndoItem(CFX_Edit_UndoItem* pEditUndoItem)
 {
-	if (m_pGroupUndoItem)
-		m_pGroupUndoItem->AddUndoItem(pEditUndoItem);
-	else
-	{
-		m_Undo.AddItem(pEditUndoItem);
-		if (m_bOprNotify && m_pOprNotify)
-			m_pOprNotify->OnAddUndo(pEditUndoItem);
-	}
+    if (m_pGroupUndoItem)
+        m_pGroupUndoItem->AddUndoItem(pEditUndoItem);
+    else
+    {
+        m_Undo.AddItem(pEditUndoItem);
+        if (m_bOprNotify && m_pOprNotify)
+            m_pOprNotify->OnAddUndo(pEditUndoItem);
+    }
 }
 
 void CFX_Edit::AddUndoItem(IFX_Edit_UndoItem* pUndoItem)
 {
-	m_Undo.AddItem(pUndoItem);
-	if (m_bOprNotify && m_pOprNotify)
-		m_pOprNotify->OnAddUndo(pUndoItem);
+    m_Undo.AddItem(pUndoItem);
+    if (m_bOprNotify && m_pOprNotify)
+        m_pOprNotify->OnAddUndo(pUndoItem);
 }
 
diff --git a/fpdfsdk/src/javascript/Document.cpp b/fpdfsdk/src/javascript/Document.cpp
index d52ef05..3f55058 100644
--- a/fpdfsdk/src/javascript/Document.cpp
+++ b/fpdfsdk/src/javascript/Document.cpp
@@ -22,13 +22,13 @@
 
 static v8::Isolate* GetIsolate(IFXJS_Context* cc)
 {
-	CJS_Context* pContext = (CJS_Context *)cc;
-	ASSERT(pContext != NULL);
+    CJS_Context* pContext = (CJS_Context *)cc;
+    ASSERT(pContext != NULL);
 
-	CJS_Runtime* pRuntime = pContext->GetJSRuntime();
-	ASSERT(pRuntime != NULL);
+    CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+    ASSERT(pRuntime != NULL);
 
-	return pRuntime->GetIsolate();
+    return pRuntime->GetIsolate();
 }
 
 BEGIN_JS_STATIC_CONST(CJS_PrintParamsObj)
@@ -45,14 +45,14 @@
 PrintParamsObj::PrintParamsObj(CJS_Object* pJSObject)
 : CJS_EmbedObj(pJSObject)
 {
-	bUI = TRUE;
-	nStart = 0;
-	nEnd = 0;
-	bSilent = FALSE;
-	bShrinkToFit = FALSE;
-	bPrintAsImage = FALSE;
-	bReverse = FALSE;
-	bAnnotations = TRUE;
+    bUI = TRUE;
+    nStart = 0;
+    nEnd = 0;
+    bSilent = FALSE;
+    bShrinkToFit = FALSE;
+    bPrintAsImage = FALSE;
+    bReverse = FALSE;
+    bAnnotations = TRUE;
 }
 
 /* ---------------------- Document ---------------------- */
@@ -64,255 +64,255 @@
 END_JS_STATIC_CONST()
 
 BEGIN_JS_STATIC_PROP(CJS_Document)
-	JS_STATIC_PROP_ENTRY(ADBE)
-	JS_STATIC_PROP_ENTRY(author)
-	JS_STATIC_PROP_ENTRY(baseURL)
-	JS_STATIC_PROP_ENTRY(bookmarkRoot)
-	JS_STATIC_PROP_ENTRY(calculate)
-	JS_STATIC_PROP_ENTRY(Collab)
-	JS_STATIC_PROP_ENTRY(creationDate)
-	JS_STATIC_PROP_ENTRY(creator)
-	JS_STATIC_PROP_ENTRY(delay)
-	JS_STATIC_PROP_ENTRY(dirty)
-	JS_STATIC_PROP_ENTRY(documentFileName)
-	JS_STATIC_PROP_ENTRY(external)
-	JS_STATIC_PROP_ENTRY(filesize)
-	JS_STATIC_PROP_ENTRY(icons)
-	JS_STATIC_PROP_ENTRY(info)
-	JS_STATIC_PROP_ENTRY(keywords)
-	JS_STATIC_PROP_ENTRY(layout)
-	JS_STATIC_PROP_ENTRY(media)
-	JS_STATIC_PROP_ENTRY(modDate)
-	JS_STATIC_PROP_ENTRY(mouseX)
-	JS_STATIC_PROP_ENTRY(mouseY)
-	JS_STATIC_PROP_ENTRY(numFields)
-	JS_STATIC_PROP_ENTRY(numPages)
-	JS_STATIC_PROP_ENTRY(pageNum)
-	JS_STATIC_PROP_ENTRY(pageWindowRect)
-	JS_STATIC_PROP_ENTRY(path)
-	JS_STATIC_PROP_ENTRY(producer)
-	JS_STATIC_PROP_ENTRY(subject)
-	JS_STATIC_PROP_ENTRY(title)
-	JS_STATIC_PROP_ENTRY(zoom)
-	JS_STATIC_PROP_ENTRY(zoomType)
+    JS_STATIC_PROP_ENTRY(ADBE)
+    JS_STATIC_PROP_ENTRY(author)
+    JS_STATIC_PROP_ENTRY(baseURL)
+    JS_STATIC_PROP_ENTRY(bookmarkRoot)
+    JS_STATIC_PROP_ENTRY(calculate)
+    JS_STATIC_PROP_ENTRY(Collab)
+    JS_STATIC_PROP_ENTRY(creationDate)
+    JS_STATIC_PROP_ENTRY(creator)
+    JS_STATIC_PROP_ENTRY(delay)
+    JS_STATIC_PROP_ENTRY(dirty)
+    JS_STATIC_PROP_ENTRY(documentFileName)
+    JS_STATIC_PROP_ENTRY(external)
+    JS_STATIC_PROP_ENTRY(filesize)
+    JS_STATIC_PROP_ENTRY(icons)
+    JS_STATIC_PROP_ENTRY(info)
+    JS_STATIC_PROP_ENTRY(keywords)
+    JS_STATIC_PROP_ENTRY(layout)
+    JS_STATIC_PROP_ENTRY(media)
+    JS_STATIC_PROP_ENTRY(modDate)
+    JS_STATIC_PROP_ENTRY(mouseX)
+    JS_STATIC_PROP_ENTRY(mouseY)
+    JS_STATIC_PROP_ENTRY(numFields)
+    JS_STATIC_PROP_ENTRY(numPages)
+    JS_STATIC_PROP_ENTRY(pageNum)
+    JS_STATIC_PROP_ENTRY(pageWindowRect)
+    JS_STATIC_PROP_ENTRY(path)
+    JS_STATIC_PROP_ENTRY(producer)
+    JS_STATIC_PROP_ENTRY(subject)
+    JS_STATIC_PROP_ENTRY(title)
+    JS_STATIC_PROP_ENTRY(zoom)
+    JS_STATIC_PROP_ENTRY(zoomType)
 END_JS_STATIC_PROP()
 
 BEGIN_JS_STATIC_METHOD(CJS_Document)
-	JS_STATIC_METHOD_ENTRY(addAnnot)
-	JS_STATIC_METHOD_ENTRY(addField)
-	JS_STATIC_METHOD_ENTRY(addLink)
-	JS_STATIC_METHOD_ENTRY(addIcon)
-	JS_STATIC_METHOD_ENTRY(calculateNow)
-	JS_STATIC_METHOD_ENTRY(closeDoc)
-	JS_STATIC_METHOD_ENTRY(createDataObject)
-	JS_STATIC_METHOD_ENTRY(deletePages)
-	JS_STATIC_METHOD_ENTRY(exportAsText)
-	JS_STATIC_METHOD_ENTRY(exportAsFDF)
-	JS_STATIC_METHOD_ENTRY(exportAsXFDF)
-	JS_STATIC_METHOD_ENTRY(extractPages)
-	JS_STATIC_METHOD_ENTRY(getAnnot)
-	JS_STATIC_METHOD_ENTRY(getAnnots)
-	JS_STATIC_METHOD_ENTRY(getAnnot3D)
-	JS_STATIC_METHOD_ENTRY(getAnnots3D)
-	JS_STATIC_METHOD_ENTRY(getField)
-	JS_STATIC_METHOD_ENTRY(getIcon)
-	JS_STATIC_METHOD_ENTRY(getLinks)
-	JS_STATIC_METHOD_ENTRY(getNthFieldName)
-	JS_STATIC_METHOD_ENTRY(getOCGs)
-	JS_STATIC_METHOD_ENTRY(getPageBox)
-	JS_STATIC_METHOD_ENTRY(getPageNthWord)
-	JS_STATIC_METHOD_ENTRY(getPageNthWordQuads)
-	JS_STATIC_METHOD_ENTRY(getPageNumWords)
-	JS_STATIC_METHOD_ENTRY(getPrintParams)
-	JS_STATIC_METHOD_ENTRY(getURL)
-	JS_STATIC_METHOD_ENTRY(importAnFDF)
-	JS_STATIC_METHOD_ENTRY(importAnXFDF)
-	JS_STATIC_METHOD_ENTRY(importTextData)
-	JS_STATIC_METHOD_ENTRY(insertPages)
-	JS_STATIC_METHOD_ENTRY(mailForm)
-	JS_STATIC_METHOD_ENTRY(print)
-	JS_STATIC_METHOD_ENTRY(removeField)
-	JS_STATIC_METHOD_ENTRY(replacePages)
-	JS_STATIC_METHOD_ENTRY(resetForm)
-	JS_STATIC_METHOD_ENTRY(removeIcon)
-	JS_STATIC_METHOD_ENTRY(saveAs)
-	JS_STATIC_METHOD_ENTRY(submitForm)
-	JS_STATIC_METHOD_ENTRY(mailDoc)
+    JS_STATIC_METHOD_ENTRY(addAnnot)
+    JS_STATIC_METHOD_ENTRY(addField)
+    JS_STATIC_METHOD_ENTRY(addLink)
+    JS_STATIC_METHOD_ENTRY(addIcon)
+    JS_STATIC_METHOD_ENTRY(calculateNow)
+    JS_STATIC_METHOD_ENTRY(closeDoc)
+    JS_STATIC_METHOD_ENTRY(createDataObject)
+    JS_STATIC_METHOD_ENTRY(deletePages)
+    JS_STATIC_METHOD_ENTRY(exportAsText)
+    JS_STATIC_METHOD_ENTRY(exportAsFDF)
+    JS_STATIC_METHOD_ENTRY(exportAsXFDF)
+    JS_STATIC_METHOD_ENTRY(extractPages)
+    JS_STATIC_METHOD_ENTRY(getAnnot)
+    JS_STATIC_METHOD_ENTRY(getAnnots)
+    JS_STATIC_METHOD_ENTRY(getAnnot3D)
+    JS_STATIC_METHOD_ENTRY(getAnnots3D)
+    JS_STATIC_METHOD_ENTRY(getField)
+    JS_STATIC_METHOD_ENTRY(getIcon)
+    JS_STATIC_METHOD_ENTRY(getLinks)
+    JS_STATIC_METHOD_ENTRY(getNthFieldName)
+    JS_STATIC_METHOD_ENTRY(getOCGs)
+    JS_STATIC_METHOD_ENTRY(getPageBox)
+    JS_STATIC_METHOD_ENTRY(getPageNthWord)
+    JS_STATIC_METHOD_ENTRY(getPageNthWordQuads)
+    JS_STATIC_METHOD_ENTRY(getPageNumWords)
+    JS_STATIC_METHOD_ENTRY(getPrintParams)
+    JS_STATIC_METHOD_ENTRY(getURL)
+    JS_STATIC_METHOD_ENTRY(importAnFDF)
+    JS_STATIC_METHOD_ENTRY(importAnXFDF)
+    JS_STATIC_METHOD_ENTRY(importTextData)
+    JS_STATIC_METHOD_ENTRY(insertPages)
+    JS_STATIC_METHOD_ENTRY(mailForm)
+    JS_STATIC_METHOD_ENTRY(print)
+    JS_STATIC_METHOD_ENTRY(removeField)
+    JS_STATIC_METHOD_ENTRY(replacePages)
+    JS_STATIC_METHOD_ENTRY(resetForm)
+    JS_STATIC_METHOD_ENTRY(removeIcon)
+    JS_STATIC_METHOD_ENTRY(saveAs)
+    JS_STATIC_METHOD_ENTRY(submitForm)
+    JS_STATIC_METHOD_ENTRY(mailDoc)
 END_JS_STATIC_METHOD()
 
 IMPLEMENT_JS_CLASS(CJS_Document, Document)
 
-FX_BOOL	CJS_Document::InitInstance(IFXJS_Context* cc)
+FX_BOOL CJS_Document::InitInstance(IFXJS_Context* cc)
 {
-	CJS_Context* pContext = (CJS_Context*)cc;
-	ASSERT(pContext != NULL);
+    CJS_Context* pContext = (CJS_Context*)cc;
+    ASSERT(pContext != NULL);
 
-	Document* pDoc = (Document*)GetEmbedObject();
-	ASSERT(pDoc != NULL);
+    Document* pDoc = (Document*)GetEmbedObject();
+    ASSERT(pDoc != NULL);
 
-	pDoc->AttachDoc(pContext->GetReaderDocument());
-	pDoc->SetIsolate(pContext->GetJSRuntime()->GetIsolate());
-	return TRUE;
+    pDoc->AttachDoc(pContext->GetReaderDocument());
+    pDoc->SetIsolate(pContext->GetJSRuntime()->GetIsolate());
+    return TRUE;
 };
 
 /* --------------------------------- Document --------------------------------- */
 
 Document::Document(CJS_Object* pJSObject) : CJS_EmbedObj(pJSObject),
-	m_isolate(NULL),
-	m_pIconTree(NULL),
-	m_pDocument(NULL),
-	m_cwBaseURL(L""),
-	m_bDelay(FALSE)
+    m_isolate(NULL),
+    m_pIconTree(NULL),
+    m_pDocument(NULL),
+    m_cwBaseURL(L""),
+    m_bDelay(FALSE)
 {
 }
 
 Document::~Document()
 {
-	if (m_pIconTree)
-	{
-		m_pIconTree->DeleteIconTree();
-		delete m_pIconTree;
-		m_pIconTree = NULL;
-	}
-	for (int i=0; i<m_DelayData.GetSize(); i++)
-	{
-		if (CJS_DelayData* pData = m_DelayData.GetAt(i))
-		{
-			delete pData;
-			pData = NULL;
-			m_DelayData.SetAt(i, NULL);
+    if (m_pIconTree)
+    {
+        m_pIconTree->DeleteIconTree();
+        delete m_pIconTree;
+        m_pIconTree = NULL;
+    }
+    for (int i=0; i<m_DelayData.GetSize(); i++)
+    {
+        if (CJS_DelayData* pData = m_DelayData.GetAt(i))
+        {
+            delete pData;
+            pData = NULL;
+            m_DelayData.SetAt(i, NULL);
 
-		}
-	}
+        }
+    }
 
-	m_DelayData.RemoveAll();
-	m_DelayAnnotData.RemoveAll();
+    m_DelayData.RemoveAll();
+    m_DelayAnnotData.RemoveAll();
 }
 
 //the total number of fileds in document.
 FX_BOOL Document::numFields(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	if (vp.IsSetting()) {
-		CJS_Context* pContext = static_cast<CJS_Context*>(cc);
-		sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
-		return FALSE;
-	}
-	CPDFSDK_InterForm *pInterForm = m_pDocument->GetInterForm();
-	CPDF_InterForm *pPDFForm = pInterForm->GetInterForm();
-	vp << (int)pPDFForm->CountFields();
-	return TRUE;
+    if (vp.IsSetting()) {
+        CJS_Context* pContext = static_cast<CJS_Context*>(cc);
+        sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
+        return FALSE;
+    }
+    CPDFSDK_InterForm *pInterForm = m_pDocument->GetInterForm();
+    CPDF_InterForm *pPDFForm = pInterForm->GetInterForm();
+    vp << (int)pPDFForm->CountFields();
+    return TRUE;
 }
 
 FX_BOOL Document::dirty(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (vp.IsGetting())
-	{
-		if (m_pDocument->GetChangeMark())
-			vp << true;
-		else
-			vp << false;
-	}
-	else
-	{
-		bool bChanged = false;
+    if (vp.IsGetting())
+    {
+        if (m_pDocument->GetChangeMark())
+            vp << true;
+        else
+            vp << false;
+    }
+    else
+    {
+        bool bChanged = false;
 
-		vp >> bChanged;
+        vp >> bChanged;
 
-		if (bChanged)
-			m_pDocument->SetChangeMark();
-		else
-			m_pDocument->ClearChangeMark();
-	}
+        if (bChanged)
+            m_pDocument->SetChangeMark();
+        else
+            m_pDocument->ClearChangeMark();
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Document::ADBE(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (vp.IsGetting())
-	{
-		vp.SetNull();
-	}
-	else
-	{
-	}
+    if (vp.IsGetting())
+    {
+        vp.SetNull();
+    }
+    else
+    {
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Document::pageNum(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (vp.IsGetting())
-	{
-		if (CPDFSDK_PageView* pPageView = m_pDocument->GetCurrentView())
-		{
-			vp << pPageView->GetPageIndex();
-		}
-	}
-	else
-	{
-		int iPageCount = m_pDocument->GetPageCount();
-		int iPageNum = 0;
-		vp >> iPageNum;
+    if (vp.IsGetting())
+    {
+        if (CPDFSDK_PageView* pPageView = m_pDocument->GetCurrentView())
+        {
+            vp << pPageView->GetPageIndex();
+        }
+    }
+    else
+    {
+        int iPageCount = m_pDocument->GetPageCount();
+        int iPageNum = 0;
+        vp >> iPageNum;
 
-		CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
-		if (iPageNum >= 0 && iPageNum < iPageCount)
-		{
-			 pEnv->JS_docgotoPage(iPageNum);
-		}
-		else if (iPageNum >= iPageCount)
-		{
-			 pEnv->JS_docgotoPage(iPageCount-1);
-		}
-		else if (iPageNum < 0)
-		{
-			 pEnv->JS_docgotoPage(0);
-		}
-	}
+        CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
+        if (iPageNum >= 0 && iPageNum < iPageCount)
+        {
+             pEnv->JS_docgotoPage(iPageNum);
+        }
+        else if (iPageNum >= iPageCount)
+        {
+             pEnv->JS_docgotoPage(iPageCount-1);
+        }
+        else if (iPageNum < 0)
+        {
+             pEnv->JS_docgotoPage(0);
+        }
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Document::ParserParams(JSObject* pObj,CJS_AnnotObj& annotobj)
 {
-	// Not supported.
-	return TRUE;
+    // Not supported.
+    return TRUE;
 }
 
 FX_BOOL Document::addAnnot(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	// Not supported.
-	return TRUE;
+    // Not supported.
+    return TRUE;
 }
 
 FX_BOOL Document::addField(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	// Not supported.
-	return TRUE;
+    // Not supported.
+    return TRUE;
 }
 
 FX_BOOL Document::exportAsText(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	// Unsafe, not supported.
-	return TRUE;
+    // Unsafe, not supported.
+    return TRUE;
 }
 
 FX_BOOL Document::exportAsFDF(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	// Unsafe, not supported.
-	return TRUE;
+    // Unsafe, not supported.
+    return TRUE;
 }
 
 FX_BOOL Document::exportAsXFDF(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	// Unsafe, not supported.
-	return TRUE;
+    // Unsafe, not supported.
+    return TRUE;
 }
 
 //Maps a field object in PDF document to a JavaScript variable
@@ -321,75 +321,75 @@
 
 FX_BOOL Document::getField(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	CJS_Context* pContext = (CJS_Context*)cc;
-	if (params.size() < 1) {
-		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
-		return FALSE;
-	}
+    CJS_Context* pContext = (CJS_Context*)cc;
+    if (params.size() < 1) {
+        sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+        return FALSE;
+    }
 
-	CFX_WideString wideName = params[0].ToCFXWideString();
+    CFX_WideString wideName = params[0].ToCFXWideString();
 
-	CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm();
-	CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
-	if (pPDFForm->CountFields(wideName) <= 0)
-	{
-		vRet.SetNull();
-		return TRUE;
-	}
+    CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm();
+    CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
+    if (pPDFForm->CountFields(wideName) <= 0)
+    {
+        vRet.SetNull();
+        return TRUE;
+    }
 
-	CJS_Runtime* pRuntime = pContext->GetJSRuntime();
-	JSFXObject pFieldObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"Field"));
+    CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+    JSFXObject pFieldObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"Field"));
 
-	v8::Isolate* isolate = GetIsolate(cc);
-	CJS_Field* pJSField = (CJS_Field*)JS_GetPrivate(isolate,pFieldObj);
-	Field* pField = (Field *)pJSField->GetEmbedObject();
-	pField->AttachField(this, wideName);
+    v8::Isolate* isolate = GetIsolate(cc);
+    CJS_Field* pJSField = (CJS_Field*)JS_GetPrivate(isolate,pFieldObj);
+    Field* pField = (Field *)pJSField->GetEmbedObject();
+    pField->AttachField(this, wideName);
 
-	vRet = pJSField;
-	return TRUE;
+    vRet = pJSField;
+    return TRUE;
 }
 
 //Gets the name of the nth field in the document
 FX_BOOL Document::getNthFieldName(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	CJS_Context* pContext = (CJS_Context*)cc;
-	if (params.size() != 1) {
-		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
-		return FALSE;
-	}
+    CJS_Context* pContext = (CJS_Context*)cc;
+    if (params.size() != 1) {
+        sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+        return FALSE;
+    }
 
-	int nIndex = params[0].ToInt();
-	if (nIndex < 0) {
-		sError = JSGetStringFromID(pContext, IDS_STRING_JSVALUEERROR);
-		return FALSE;
-	}
+    int nIndex = params[0].ToInt();
+    if (nIndex < 0) {
+        sError = JSGetStringFromID(pContext, IDS_STRING_JSVALUEERROR);
+        return FALSE;
+    }
 
-	CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm();
-	CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
-	CPDF_FormField* pField = pPDFForm->GetField(nIndex);
-	if (!pField)
-		return FALSE;
+    CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm();
+    CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
+    CPDF_FormField* pField = pPDFForm->GetField(nIndex);
+    if (!pField)
+        return FALSE;
 
-	vRet = pField->GetFullName().c_str();
-	return TRUE;
+    vRet = pField->GetFullName().c_str();
+    return TRUE;
 }
 
 FX_BOOL Document::importAnFDF(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	// Unsafe, not supported.
-	return TRUE;
+    // Unsafe, not supported.
+    return TRUE;
 }
 
 FX_BOOL Document::importAnXFDF(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	// Unsafe, not supported.
-	return TRUE;
+    // Unsafe, not supported.
+    return TRUE;
 }
 
 FX_BOOL Document::importTextData(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	// Unsafe, not supported.
-	return TRUE;
+    // Unsafe, not supported.
+    return TRUE;
 }
 
 //exports the form data and mails the resulting fdf file as an attachment to all recipients.
@@ -399,110 +399,110 @@
 
 FX_BOOL Document::mailForm(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;
+    if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;
 
-	int iLength = params.size();
+    int iLength = params.size();
 
-	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"";
+    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);
+    CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+    ASSERT(pInterForm != NULL);
 
-	CFX_ByteTextBuf textBuf;
-	if (!pInterForm->ExportFormToFDFTextBuf(textBuf))
-		return FALSE;
+    CFX_ByteTextBuf textBuf;
+    if (!pInterForm->ExportFormToFDFTextBuf(textBuf))
+        return FALSE;
 
-	CJS_Context* pContext = (CJS_Context*)cc;
-	ASSERT(pContext != NULL);
-	CPDFDoc_Environment* pEnv = pContext->GetReaderApp();
-	ASSERT(pEnv != NULL);
-	CJS_Runtime* pRuntime = pContext->GetJSRuntime();
-	ASSERT(pRuntime != NULL);
+    CJS_Context* pContext = (CJS_Context*)cc;
+    ASSERT(pContext != NULL);
+    CPDFDoc_Environment* pEnv = pContext->GetReaderApp();
+    ASSERT(pEnv != NULL);
+    CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+    ASSERT(pRuntime != NULL);
 
-	pRuntime->BeginBlock();
-	pEnv->JS_docmailForm(textBuf.GetBuffer(), textBuf.GetLength(), bUI, cTo.c_str(), cSubject.c_str(), cCc.c_str(), cBcc.c_str(), cMsg.c_str());
-	pRuntime->EndBlock();
-	return TRUE;
+    pRuntime->BeginBlock();
+    pEnv->JS_docmailForm(textBuf.GetBuffer(), textBuf.GetLength(), bUI, cTo.c_str(), cSubject.c_str(), cCc.c_str(), cBcc.c_str(), cMsg.c_str());
+    pRuntime->EndBlock();
+    return TRUE;
 }
 
 FX_BOOL Document::print(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	CJS_Context* pContext = (CJS_Context*)cc;
-	ASSERT(pContext != NULL);
-	CJS_Runtime* pRuntime = pContext->GetJSRuntime();
-	ASSERT(pRuntime != NULL);
+    CJS_Context* pContext = (CJS_Context*)cc;
+    ASSERT(pContext != NULL);
+    CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+    ASSERT(pRuntime != NULL);
 
-	FX_BOOL bUI = TRUE;
-	int nStart = 0;
-	int nEnd = 0;
-	FX_BOOL bSilent = FALSE;
-	FX_BOOL bShrinkToFit = FALSE;
-	FX_BOOL bPrintAsImage = FALSE;
-	FX_BOOL bReverse = FALSE;
-	FX_BOOL bAnnotations = FALSE;
+    FX_BOOL bUI = TRUE;
+    int nStart = 0;
+    int nEnd = 0;
+    FX_BOOL bSilent = FALSE;
+    FX_BOOL bShrinkToFit = FALSE;
+    FX_BOOL bPrintAsImage = FALSE;
+    FX_BOOL bReverse = FALSE;
+    FX_BOOL bAnnotations = FALSE;
 
-	int nlength = params.size();
-	if(nlength ==9)
-	{
-		if (params[8].GetType() == VT_fxobject)
-		{
-			JSFXObject pObj = params[8].ToV8Object();
-			{
-				if (JS_GetObjDefnID(pObj) == JS_GetObjDefnID(*pRuntime, L"PrintParamsObj"))
-				{
-					if (CJS_Object* pJSObj = params[8].ToCJSObject())
-					{
-							if (PrintParamsObj* pprintparamsObj = (PrintParamsObj*)pJSObj->GetEmbedObject())
-							{
-								bUI = pprintparamsObj->bUI;
-								nStart = pprintparamsObj->nStart;
-								nEnd = pprintparamsObj->nEnd;
-								bSilent = pprintparamsObj->bSilent;
-								bShrinkToFit = pprintparamsObj->bShrinkToFit;
-								bPrintAsImage = pprintparamsObj->bPrintAsImage;
-								bReverse = pprintparamsObj->bReverse;
-								bAnnotations = pprintparamsObj->bAnnotations;
-							}
-					}
-				}
-			}
-		}
-	}
-	else
-	{
-		if(nlength >= 1)
-			bUI = params[0].ToBool();
-		if(nlength >= 2)
-			nStart = params[1].ToInt();
-		if(nlength >= 3)
-			nEnd = params[2].ToInt();
-		if(nlength >= 4)
-			bSilent = params[3].ToBool();
-		if(nlength >= 5)
-			bShrinkToFit = params[4].ToBool();
-		if(nlength >= 6)
-			bPrintAsImage = params[5].ToBool();
-		if(nlength >= 7)
-			bReverse = params[6].ToBool();
-		if(nlength >= 8)
-			bAnnotations = params[7].ToBool();
-	}
+    int nlength = params.size();
+    if(nlength ==9)
+    {
+        if (params[8].GetType() == VT_fxobject)
+        {
+            JSFXObject pObj = params[8].ToV8Object();
+            {
+                if (JS_GetObjDefnID(pObj) == JS_GetObjDefnID(*pRuntime, L"PrintParamsObj"))
+                {
+                    if (CJS_Object* pJSObj = params[8].ToCJSObject())
+                    {
+                            if (PrintParamsObj* pprintparamsObj = (PrintParamsObj*)pJSObj->GetEmbedObject())
+                            {
+                                bUI = pprintparamsObj->bUI;
+                                nStart = pprintparamsObj->nStart;
+                                nEnd = pprintparamsObj->nEnd;
+                                bSilent = pprintparamsObj->bSilent;
+                                bShrinkToFit = pprintparamsObj->bShrinkToFit;
+                                bPrintAsImage = pprintparamsObj->bPrintAsImage;
+                                bReverse = pprintparamsObj->bReverse;
+                                bAnnotations = pprintparamsObj->bAnnotations;
+                            }
+                    }
+                }
+            }
+        }
+    }
+    else
+    {
+        if(nlength >= 1)
+            bUI = params[0].ToBool();
+        if(nlength >= 2)
+            nStart = params[1].ToInt();
+        if(nlength >= 3)
+            nEnd = params[2].ToInt();
+        if(nlength >= 4)
+            bSilent = params[3].ToBool();
+        if(nlength >= 5)
+            bShrinkToFit = params[4].ToBool();
+        if(nlength >= 6)
+            bPrintAsImage = params[5].ToBool();
+        if(nlength >= 7)
+            bReverse = params[6].ToBool();
+        if(nlength >= 8)
+            bAnnotations = params[7].ToBool();
+    }
 
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (CPDFDoc_Environment* pEnv = m_pDocument->GetEnv())
-	{
-		pEnv->JS_docprint(bUI, nStart, nEnd, bSilent, bShrinkToFit, bPrintAsImage, bReverse, bAnnotations);
-		return TRUE;
-	}
-	return FALSE;
+    if (CPDFDoc_Environment* pEnv = m_pDocument->GetEnv())
+    {
+        pEnv->JS_docprint(bUI, nStart, nEnd, bSilent, bShrinkToFit, bPrintAsImage, bReverse, bAnnotations);
+        return TRUE;
+    }
+    return FALSE;
 }
 
 //removes the specified field from the document.
@@ -511,54 +511,54 @@
 
 FX_BOOL Document::removeField(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
-		m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM))) return FALSE;
+    if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
+        m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM))) return FALSE;
 
-	CJS_Context* pContext = (CJS_Context*)cc;
-	if (params.size() != 1) {
-		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
-		return FALSE;
-	}
+    CJS_Context* pContext = (CJS_Context*)cc;
+    if (params.size() != 1) {
+        sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+        return FALSE;
+    }
 
-	CFX_WideString sFieldName = params[0].ToCFXWideString();
-	CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
-	ASSERT(pInterForm != NULL);
+    CFX_WideString sFieldName = params[0].ToCFXWideString();
+    CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+    ASSERT(pInterForm != NULL);
 
-	CFX_PtrArray widgets;
-	pInterForm->GetWidgets(sFieldName, widgets);
+    CFX_PtrArray widgets;
+    pInterForm->GetWidgets(sFieldName, widgets);
 
-	int nSize = widgets.GetSize();
+    int nSize = widgets.GetSize();
 
-	if (nSize > 0)
-	{
-		for (int i=0; i<nSize; i++)
-		{
-			CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)widgets[i];
-			ASSERT(pWidget != NULL);
+    if (nSize > 0)
+    {
+        for (int i=0; i<nSize; i++)
+        {
+            CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)widgets[i];
+            ASSERT(pWidget != NULL);
 
-			CPDF_Rect rcAnnot = pWidget->GetRect();
-			rcAnnot.left -= 1;
-			rcAnnot.bottom -= 1;
-			rcAnnot.right += 1;
-			rcAnnot.top += 1;
+            CPDF_Rect rcAnnot = pWidget->GetRect();
+            rcAnnot.left -= 1;
+            rcAnnot.bottom -= 1;
+            rcAnnot.right += 1;
+            rcAnnot.top += 1;
 
-			CFX_RectArray aRefresh;
-			aRefresh.Add(rcAnnot);
+            CFX_RectArray aRefresh;
+            aRefresh.Add(rcAnnot);
 
 			CPDFXFA_Page* pPage = pWidget->GetPDFXFAPage();
 			ASSERT(pPage != NULL);
 
-			CPDFSDK_PageView* pPageView = m_pDocument->GetPageView(pPage);
-			pPageView->DeleteAnnot(pWidget);
+            CPDFSDK_PageView* pPageView = m_pDocument->GetPageView(pPage);
+            pPageView->DeleteAnnot(pWidget);
 
-			pPageView->UpdateRects(aRefresh);
-		}
-		m_pDocument->SetChangeMark();
-	}
+            pPageView->UpdateRects(aRefresh);
+        }
+        m_pDocument->SetChangeMark();
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 //reset filed values within a document.
@@ -567,62 +567,62 @@
 
 FX_BOOL Document::resetForm(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
-		m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) ||
-		m_pDocument->GetPermissions(FPDFPERM_FILL_FORM))) return FALSE;
+    if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
+        m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) ||
+        m_pDocument->GetPermissions(FPDFPERM_FILL_FORM))) return FALSE;
 
-	CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
-	ASSERT(pInterForm != NULL);
+    CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+    ASSERT(pInterForm != NULL);
 
-	CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
-	ASSERT(pPDFForm != NULL);
+    CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
+    ASSERT(pPDFForm != NULL);
 
-	v8::Isolate* isolate = GetIsolate(cc);
-	CJS_Array aName(isolate);
+    v8::Isolate* isolate = GetIsolate(cc);
+    CJS_Array aName(isolate);
 
-	if (params.size() > 0)
-	{
-		switch (params[0].GetType())
-		{
-		default:
-			aName.Attach(params[0].ToV8Array());
-			break;
-		case VT_string:
-			aName.SetElement(0,params[0]);
-			break;
-		}
+    if (params.size() > 0)
+    {
+        switch (params[0].GetType())
+        {
+        default:
+            aName.Attach(params[0].ToV8Array());
+            break;
+        case VT_string:
+            aName.SetElement(0,params[0]);
+            break;
+        }
 
-		CFX_PtrArray aFields;
+        CFX_PtrArray aFields;
 
-		for (int i=0,isz=aName.GetLength(); i<isz; i++)
-		{
-			CJS_Value valElement(isolate);
-			aName.GetElement(i,valElement);
-			CFX_WideString swVal = valElement.ToCFXWideString();
+        for (int i=0,isz=aName.GetLength(); i<isz; i++)
+        {
+            CJS_Value valElement(isolate);
+            aName.GetElement(i,valElement);
+            CFX_WideString swVal = valElement.ToCFXWideString();
 
-			for (int j=0,jsz=pPDFForm->CountFields(swVal); j<jsz; j++)
-			{
-				aFields.Add((void*)pPDFForm->GetField(j,swVal));
-			}
-		}
+            for (int j=0,jsz=pPDFForm->CountFields(swVal); j<jsz; j++)
+            {
+                aFields.Add((void*)pPDFForm->GetField(j,swVal));
+            }
+        }
 
-		if (aFields.GetSize() > 0)
-		{
-			pPDFForm->ResetForm(aFields, TRUE, TRUE);
-			m_pDocument->SetChangeMark();
+        if (aFields.GetSize() > 0)
+        {
+            pPDFForm->ResetForm(aFields, TRUE, TRUE);
+            m_pDocument->SetChangeMark();
 
-		}
-	}
-	else
-	{
-		pPDFForm->ResetForm(TRUE);
-		m_pDocument->SetChangeMark();
+        }
+    }
+    else
+    {
+        pPDFForm->ResetForm(TRUE);
+        m_pDocument->SetChangeMark();
 
-	}
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 
@@ -635,222 +635,199 @@
 
 FX_BOOL Document::submitForm(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
-	CJS_Context* pContext = (CJS_Context*)cc;
-	int nSize = params.size();
-	if (nSize < 1) {
-		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
-		return FALSE;
-	}
+    ASSERT(m_pDocument != NULL);
+    CJS_Context* pContext = (CJS_Context*)cc;
+    int nSize = params.size();
+    if (nSize < 1) {
+        sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+        return FALSE;
+    }
 
-	CFX_WideString strURL;
-	FX_BOOL bFDF = TRUE;
-	FX_BOOL bEmpty = FALSE;
-	v8::Isolate* isolate = GetIsolate(cc);
-	CJS_Array aFields(isolate);
+    CFX_WideString strURL;
+    FX_BOOL bFDF = TRUE;
+    FX_BOOL bEmpty = FALSE;
+    v8::Isolate* isolate = GetIsolate(cc);
+    CJS_Array aFields(isolate);
 
-	CJS_Value v = params[0];
-	if (v.GetType() == VT_string)
-	{
-		strURL = params[0].ToCFXWideString();
-		if (nSize > 1)
-			bFDF = params[1].ToBool();
-		if (nSize > 2)
-			bEmpty = params[2].ToBool();
-		if (nSize > 3)
-			aFields.Attach(params[3].ToV8Array());
-	}
-	else if (v.GetType() == VT_object)
-	{
-		JSObject pObj = params[0].ToV8Object();
-		v8::Local<v8::Value> pValue = JS_GetObjectElement(isolate, pObj, L"cURL");
-		if (!pValue.IsEmpty())
-			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());
-	}
+    CJS_Value v = params[0];
+    if (v.GetType() == VT_string)
+    {
+        strURL = params[0].ToCFXWideString();
+        if (nSize > 1)
+            bFDF = params[1].ToBool();
+        if (nSize > 2)
+            bEmpty = params[2].ToBool();
+        if (nSize > 3)
+            aFields.Attach(params[3].ToV8Array());
+    }
+    else if (v.GetType() == VT_object)
+    {
+        JSObject pObj = params[0].ToV8Object();
+        v8::Local<v8::Value> pValue = JS_GetObjectElement(isolate, pObj, L"cURL");
+        if (!pValue.IsEmpty())
+            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();
-	ASSERT(pInterForm != NULL);
-	CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm();
-	ASSERT(pPDFInterForm != NULL);
+    CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+    CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+    CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm();
+    FX_BOOL bAll = (aFields.GetLength() == 0);
+    if (bAll && bEmpty)
+    {
+        if (pPDFInterForm->CheckRequiredFields())
+        {
+            pRuntime->BeginBlock();
+            pInterForm->SubmitForm(strURL, FALSE);
+            pRuntime->EndBlock();
+        }
+        return TRUE;
+    }
 
-	FX_BOOL bAll = (aFields.GetLength() == 0);
+    CFX_PtrArray fieldObjects;
+    for (int i=0,sz=aFields.GetLength(); i<sz; i++)
+    {
+        CJS_Value valName(isolate);
+        aFields.GetElement(i, valName);
 
-	if (bAll && bEmpty)
-	{
-		CJS_Context* pContext = (CJS_Context*)cc;
-		ASSERT(pContext != NULL);
-		CJS_Runtime* pRuntime = pContext->GetJSRuntime();
-		ASSERT(pRuntime != NULL);
+        CFX_WideString sName = valName.ToCFXWideString();
+        CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
+        for (int j = 0, jsz = pPDFForm->CountFields(sName); j < jsz; ++j)
+        {
+            CPDF_FormField* pField = pPDFForm->GetField(j, sName);
+            if (!bEmpty && pField->GetValue().IsEmpty())
+                continue;
 
+            fieldObjects.Add(pField);
+        }
+    }
 
-		if (pPDFInterForm->CheckRequiredFields())
-		{
-			pRuntime->BeginBlock();
-			pInterForm->SubmitForm(strURL, FALSE);
-			pRuntime->EndBlock();
-		}
-
-		return TRUE;
-	}
-	else
-	{
-		CFX_PtrArray fieldObjects;
-
-		for (int i=0,sz=aFields.GetLength(); i<sz; i++)
-		{
-			CJS_Value valName(isolate);
-			aFields.GetElement(i, valName);
-			CFX_WideString sName = valName.ToCFXWideString();
-
-			CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
-			ASSERT(pPDFForm != NULL);
-
-			for (int j=0, jsz=pPDFForm->CountFields(sName); j<jsz; j++)
-			{
-				CPDF_FormField* pField = pPDFForm->GetField(j, sName);
-				if (!bEmpty && pField->GetValue().IsEmpty())
-					continue;
-
-				fieldObjects.Add(pField);
-			}
-		}
-
-		CJS_Context* pContext = (CJS_Context*)cc;
-		ASSERT(pContext != NULL);
-		CJS_Runtime* pRuntime = pContext->GetJSRuntime();
-		ASSERT(pRuntime != NULL);
-
-
-		if (pPDFInterForm->CheckRequiredFields(&fieldObjects, TRUE))
-		{
-			pRuntime->BeginBlock();
-			pInterForm->SubmitFields(strURL, fieldObjects, TRUE, !bFDF);
-			pRuntime->EndBlock();
-		}
-
-		return TRUE;
-	}
-
+    if (pPDFInterForm->CheckRequiredFields(&fieldObjects, TRUE))
+    {
+        pRuntime->BeginBlock();
+        pInterForm->SubmitFields(strURL, fieldObjects, TRUE, !bFDF);
+        pRuntime->EndBlock();
+    }
+    return TRUE;
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////////
 
 void Document::AttachDoc(CPDFSDK_Document *pDoc)
 {
-	m_pDocument = pDoc;
+    m_pDocument = pDoc;
 }
 
 CPDFSDK_Document * Document::GetReaderDoc()
 {
-	return m_pDocument;
+    return m_pDocument;
 }
 
 FX_BOOL Document::ExtractFileName(CPDFSDK_Document *pDoc,CFX_ByteString &strFileName)
 {
-	return FALSE;
+    return FALSE;
 }
 
 FX_BOOL Document::ExtractFolderName(CPDFSDK_Document *pDoc,CFX_ByteString &strFolderName)
 {
-	return FALSE;
+    return FALSE;
 }
 
 FX_BOOL Document::bookmarkRoot(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Document::mailDoc(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	FX_BOOL bUI = TRUE;
-	CFX_WideString cTo = L"";
-	CFX_WideString cCc = L"";
-	CFX_WideString cBcc = L"";
-	CFX_WideString cSubject = L"";
-	CFX_WideString cMsg = L"";
+    FX_BOOL bUI = TRUE;
+    CFX_WideString cTo = L"";
+    CFX_WideString cCc = L"";
+    CFX_WideString cBcc = L"";
+    CFX_WideString cSubject = L"";
+    CFX_WideString cMsg = 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();
+    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);
+    v8::Isolate* isolate = GetIsolate(cc);
 
-	if(params.size() >= 1 && params[0].GetType() == VT_object)
-	{
-		JSObject pObj = params[0].ToV8Object();
+    if(params.size() >= 1 && params[0].GetType() == VT_object)
+    {
+        JSObject pObj = params[0].ToV8Object();
 
-		v8::Local<v8::Value> pValue = JS_GetObjectElement(isolate,pObj, L"bUI");
-		bUI = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).ToInt();
+        v8::Local<v8::Value> pValue = JS_GetObjectElement(isolate,pObj, L"bUI");
+        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)).ToCFXWideString();
+        pValue = JS_GetObjectElement(isolate,pObj, L"cTo");
+        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)).ToCFXWideString();
+        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)).ToCFXWideString();
+        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)).ToCFXWideString();
+        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)).ToCFXWideString();
+        pValue = JS_GetObjectElement(isolate,pObj, L"cMsg");
+        cMsg = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).ToCFXWideString();
 
-	}
+    }
 
-	CJS_Context* pContext = (CJS_Context*)cc;
-	ASSERT(pContext != NULL);
-	CJS_Runtime* pRuntime = pContext->GetJSRuntime();
-	ASSERT(pRuntime != NULL);
+    CJS_Context* pContext = (CJS_Context*)cc;
+    ASSERT(pContext != NULL);
+    CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+    ASSERT(pRuntime != NULL);
 
-	pRuntime->BeginBlock();
-	CPDFDoc_Environment* pEnv = pRuntime->GetReaderApp();
-	pEnv->JS_docmailForm(NULL, 0, bUI, cTo.c_str(), cSubject.c_str(), cCc.c_str(), cBcc.c_str(), cMsg.c_str());
-	pRuntime->EndBlock();
+    pRuntime->BeginBlock();
+    CPDFDoc_Environment* pEnv = pRuntime->GetReaderApp();
+    pEnv->JS_docmailForm(NULL, 0, bUI, cTo.c_str(), cSubject.c_str(), cCc.c_str(), cBcc.c_str(), cMsg.c_str());
+    pRuntime->EndBlock();
 
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Document::author(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
 	CPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetPDFDoc()->GetInfo();
 	if (!pDictionary)return FALSE;
 
-	if (vp.IsGetting())
-	{
-		vp << pDictionary->GetUnicodeText("Author");
-		return TRUE;
-	}
-	else
-	{
-		if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;
+    if (vp.IsGetting())
+    {
+        vp << pDictionary->GetUnicodeText("Author");
+        return TRUE;
+    }
+    else
+    {
+        if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;
 
-		CFX_WideString csAuthor;
-		vp >> csAuthor;
-		pDictionary->SetAtString("Author", PDF_EncodeText(csAuthor));
-		m_pDocument->SetChangeMark();
-		return TRUE;
-	}
+        CFX_WideString csAuthor;
+        vp >> csAuthor;
+        pDictionary->SetAtString("Author", PDF_EncodeText(csAuthor));
+        m_pDocument->SetChangeMark();
+        return TRUE;
+    }
 }
 
 FX_BOOL Document::info(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
@@ -914,51 +891,48 @@
 
 FX_BOOL Document::creationDate(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
-
 	CPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetPDFDoc()->GetInfo();
-	if (!pDictionary)return FALSE;
+	if (!pDictionary)
+        return FALSE;
 
 	if (vp.IsGetting())
 	{
 		vp << pDictionary->GetUnicodeText("CreationDate");
-		return TRUE;
 	}
 	else
 	{
-		if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;
+        if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
+            return FALSE;
 
-		CFX_WideString csCreationDate;
-		vp >> csCreationDate;
-		pDictionary->SetAtString("CreationDate", PDF_EncodeText(csCreationDate));
-		m_pDocument->SetChangeMark();
-
-		return TRUE;
-	}
+        CFX_WideString csCreationDate;
+        vp >> csCreationDate;
+        pDictionary->SetAtString("CreationDate", PDF_EncodeText(csCreationDate));
+        m_pDocument->SetChangeMark();
+    }
+    return TRUE;
 }
 
 FX_BOOL Document::creator(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
-
 	CPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetPDFDoc()->GetInfo();
-	if (!pDictionary)return FALSE;
+	if (!pDictionary)
+        return FALSE;
 
-	if (vp.IsGetting())
-	{
-		vp << pDictionary->GetUnicodeText("Creator");
-		return TRUE;
-	}
-	else
-	{
-		if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;
+    if (vp.IsGetting())
+    {
+        vp << pDictionary->GetUnicodeText("Creator");
+    }
+    else
+    {
+        if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
+            return FALSE;
 
-		CFX_WideString csCreator;
-		vp >> csCreator;
-		pDictionary->SetAtString("Creator", PDF_EncodeText(csCreator));
-		m_pDocument->SetChangeMark();
-		return TRUE;
-	}
+        CFX_WideString csCreator;
+        vp >> csCreator;
+        pDictionary->SetAtString("Creator", PDF_EncodeText(csCreator));
+        m_pDocument->SetChangeMark();
+    }
+    return TRUE;
 }
 
 FX_BOOL Document::delay(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
@@ -966,7 +940,6 @@
 	if (vp.IsGetting())
 	{
 		vp << m_bDelay;
-		return TRUE;
 	}
 	else
 	{
@@ -999,415 +972,406 @@
 			m_DelayData.RemoveAll();
 		}
 
-		return TRUE;
 	}
+    return TRUE;
 }
 
 FX_BOOL Document::keywords(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
-
 	CPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetPDFDoc()->GetInfo();
-	if (!pDictionary)return FALSE;
+    if (!pDictionary)
+        return FALSE;
 
-	if (vp.IsGetting())
-	{
-		vp << pDictionary->GetUnicodeText("Keywords");
-		return TRUE;
-	}
-	else
-	{
-		if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;
+    if (vp.IsGetting())
+    {
+        vp << pDictionary->GetUnicodeText("Keywords");
+    }
+    else
+    {
+        if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
+            return FALSE;
 
-		CFX_WideString csKeywords;
-		vp >> csKeywords;
-		pDictionary->SetAtString("Keywords", PDF_EncodeText(csKeywords));
-		m_pDocument->SetChangeMark();
-		return TRUE;
-	}
+        CFX_WideString csKeywords;
+        vp >> csKeywords;
+        pDictionary->SetAtString("Keywords", PDF_EncodeText(csKeywords));
+        m_pDocument->SetChangeMark();
+    }
+    return TRUE;
 }
 
 FX_BOOL Document::modDate(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
-
 	CPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetPDFDoc()->GetInfo();
-	if (!pDictionary)return FALSE;
+    if (!pDictionary)
+        return FALSE;
 
-	if (vp.IsGetting())
-	{
-		vp << pDictionary->GetUnicodeText("ModDate");
-		return TRUE;
-	}
-	else
-	{
-		if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;
+    if (vp.IsGetting())
+    {
+        vp << pDictionary->GetUnicodeText("ModDate");
+    }
+    else
+    {
+        if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
+            return FALSE;
 
-		CFX_WideString csmodDate;
-		vp >> csmodDate;
-		pDictionary->SetAtString("ModDate", PDF_EncodeText(csmodDate));
-		m_pDocument->SetChangeMark();
-		return TRUE;
-	}
+        CFX_WideString csmodDate;
+        vp >> csmodDate;
+        pDictionary->SetAtString("ModDate", PDF_EncodeText(csmodDate));
+        m_pDocument->SetChangeMark();
+    }
+    return TRUE;
 }
 
 FX_BOOL Document::producer(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
-
 	CPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetPDFDoc()->GetInfo();
-	if (!pDictionary)return FALSE;
+    if (!pDictionary)
+        return FALSE;
 
-	if (vp.IsGetting())
-	{
-		vp << pDictionary->GetUnicodeText("Producer");
-		return TRUE;
-	}
-	else
-	{
-		if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;
+    if (vp.IsGetting())
+    {
+        vp << pDictionary->GetUnicodeText("Producer");
+    }
+    else
+    {
+        if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
+            return FALSE;
 
-		CFX_WideString csproducer;
-		vp >> csproducer;
-		pDictionary->SetAtString("Producer", PDF_EncodeText(csproducer));
-		m_pDocument->SetChangeMark();
-		return TRUE;
-	}
+        CFX_WideString csproducer;
+        vp >> csproducer;
+        pDictionary->SetAtString("Producer", PDF_EncodeText(csproducer));
+        m_pDocument->SetChangeMark();
+    }
+    return TRUE;
 }
 
 FX_BOOL Document::subject(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
-
 	CPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetPDFDoc()->GetInfo();
-	if (!pDictionary)return FALSE;
+    if (!pDictionary)
+        return FALSE;
 
-	if (vp.IsGetting())
-	{
-		vp << pDictionary->GetUnicodeText("Subject");
-		return TRUE;
-	}
-	else
-	{
-		if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;
+    if (vp.IsGetting())
+    {
+        vp << pDictionary->GetUnicodeText("Subject");
+    }
+    else
+    {
+        if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
+            return FALSE;
 
-		CFX_WideString cssubject;
-		vp >> cssubject;
-		pDictionary->SetAtString("Subject", PDF_EncodeText(cssubject));
-		m_pDocument->SetChangeMark();
-		return TRUE;
-	}
+        CFX_WideString cssubject;
+        vp >> cssubject;
+        pDictionary->SetAtString("Subject", PDF_EncodeText(cssubject));
+        m_pDocument->SetChangeMark();
+    }
+    return TRUE;
 }
 
 FX_BOOL Document::title(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
-
-	if (m_pDocument == NULL || m_pDocument->GetDocument() == NULL)
-		return FALSE;
+    if (m_pDocument == NULL || m_pDocument->GetDocument() == NULL)
+        return FALSE;
 
 	CPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetPDFDoc()->GetInfo();
-	if (!pDictionary)return FALSE;
+    if (!pDictionary)
+        return FALSE;
 
-	if (vp.IsGetting())
-	{
-		vp << pDictionary->GetUnicodeText("Title");
-		return TRUE;
-	}
-	else
-	{
-		if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;
+    if (vp.IsGetting())
+    {
+        vp << pDictionary->GetUnicodeText("Title");
+    }
+    else
+    {
+        if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
+            return FALSE;
 
-		CFX_WideString cstitle;
-		vp >> cstitle;
-		pDictionary->SetAtString("Title", PDF_EncodeText(cstitle));
-		m_pDocument->SetChangeMark();
-		return TRUE;
-	}
+        CFX_WideString cstitle;
+        vp >> cstitle;
+        pDictionary->SetAtString("Title", PDF_EncodeText(cstitle));
+        m_pDocument->SetChangeMark();
+    }
+    return TRUE;
 }
 
 FX_BOOL Document::numPages(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	if (vp.IsSetting()) {
-		CJS_Context* pContext = static_cast<CJS_Context*>(cc);
-		sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
-		return FALSE;
-	}
-	vp << m_pDocument->GetPageCount();
-	return TRUE;
+    if (vp.IsSetting()) {
+        CJS_Context* pContext = static_cast<CJS_Context*>(cc);
+        sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
+        return FALSE;
+    }
+    vp << m_pDocument->GetPageCount();
+    return TRUE;
 }
 
 FX_BOOL Document::external(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	//In Chrome case,should always return true.
-	if (vp.IsGetting()) {
-		vp << TRUE;
-	}
-	return TRUE;
+    //In Chrome case,should always return true.
+    if (vp.IsGetting()) {
+        vp << TRUE;
+    }
+    return TRUE;
 }
 
 FX_BOOL Document::filesize(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	if (vp.IsSetting()) {
-		CJS_Context* pContext = static_cast<CJS_Context*>(cc);
-		sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
-		return FALSE;
-	}
-	vp << 0;
-	return TRUE;
+    if (vp.IsSetting()) {
+        CJS_Context* pContext = static_cast<CJS_Context*>(cc);
+        sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
+        return FALSE;
+    }
+    vp << 0;
+    return TRUE;
 }
 
 FX_BOOL Document::mouseX(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Document::mouseY(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Document::baseURL(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	if (vp.IsGetting())
-	{
-		vp << m_cwBaseURL;
-	}
-	else
-	{
-		vp >> m_cwBaseURL;
-	}
-	return TRUE;
+    if (vp.IsGetting())
+    {
+        vp << m_cwBaseURL;
+    }
+    else
+    {
+        vp >> m_cwBaseURL;
+    }
+    return TRUE;
 }
 
 FX_BOOL Document::calculate(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
-	ASSERT(pInterForm != NULL);
+    CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+    ASSERT(pInterForm != NULL);
 
-	if (vp.IsGetting())
-	{
-		if (pInterForm->IsCalculateEnabled())
-			vp << true;
-		else
-			vp << false;
-	}
-	else
-	{
-		bool bCalculate;
-		vp >> bCalculate;
+    if (vp.IsGetting())
+    {
+        if (pInterForm->IsCalculateEnabled())
+            vp << true;
+        else
+            vp << false;
+    }
+    else
+    {
+        bool bCalculate;
+        vp >> bCalculate;
 
-		pInterForm->EnableCalculate(bCalculate);
-	}
+        pInterForm->EnableCalculate(bCalculate);
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Document::documentFileName(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	if (vp.IsSetting()) {
-		CJS_Context* pContext = static_cast<CJS_Context*>(cc);
-		sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
-		return FALSE;
-	}
-	CFX_WideString wsFilePath = m_pDocument->GetPath();
-	int32_t i = wsFilePath.GetLength() - 1;
-	for ( ; i >= 0; i-- )
-	{
-		if ( wsFilePath.GetAt( i ) == L'\\' || wsFilePath.GetAt( i ) == L'/' )
-			break;
-	}
-	if ( i >= 0 && i < wsFilePath.GetLength() - 1 )
-	{
-		vp << ( wsFilePath.GetBuffer( wsFilePath.GetLength() ) + i + 1 );
-	}else{
-		vp << L"";
-	}
-	return TRUE;
+    if (vp.IsSetting()) {
+        CJS_Context* pContext = static_cast<CJS_Context*>(cc);
+        sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
+        return FALSE;
+    }
+    CFX_WideString wsFilePath = m_pDocument->GetPath();
+    int32_t i = wsFilePath.GetLength() - 1;
+    for ( ; i >= 0; i-- )
+    {
+        if ( wsFilePath.GetAt( i ) == L'\\' || wsFilePath.GetAt( i ) == L'/' )
+            break;
+    }
+    if ( i >= 0 && i < wsFilePath.GetLength() - 1 )
+    {
+        vp << ( wsFilePath.GetBuffer( wsFilePath.GetLength() ) + i + 1 );
+    }else{
+        vp << L"";
+    }
+    return TRUE;
 }
 
 CFX_WideString Document::ReversalStr(CFX_WideString cbFrom)
 {
-	size_t iLength = cbFrom.GetLength();
+    size_t iLength = cbFrom.GetLength();
         pdfium::base::CheckedNumeric<size_t> iSize = sizeof(wchar_t);
-	iSize *= (iLength + 1);
-	wchar_t* pResult = (wchar_t*)malloc(iSize.ValueOrDie());
-	wchar_t* pFrom = (wchar_t*)cbFrom.GetBuffer(iLength);
+    iSize *= (iLength + 1);
+    wchar_t* pResult = (wchar_t*)malloc(iSize.ValueOrDie());
+    wchar_t* pFrom = (wchar_t*)cbFrom.GetBuffer(iLength);
 
-	for (size_t i = 0; i < iLength; i++)
-	{
-		pResult[i] = *(pFrom + iLength - i - 1);
-	}
-	pResult[iLength] = L'\0';
+    for (size_t i = 0; i < iLength; i++)
+    {
+        pResult[i] = *(pFrom + iLength - i - 1);
+    }
+    pResult[iLength] = L'\0';
 
-	cbFrom.ReleaseBuffer();
-	CFX_WideString cbRet = CFX_WideString(pResult);
-	free(pResult);
-	pResult = NULL;
-	return cbRet;
+    cbFrom.ReleaseBuffer();
+    CFX_WideString cbRet = CFX_WideString(pResult);
+    free(pResult);
+    pResult = NULL;
+    return cbRet;
 }
 
 CFX_WideString Document::CutString(CFX_WideString cbFrom)
 {
-	size_t iLength = cbFrom.GetLength();
-	pdfium::base::CheckedNumeric<size_t> iSize = sizeof(wchar_t);
-	iSize *= (iLength + 1);
-	wchar_t* pResult = (wchar_t*)malloc(iSize.ValueOrDie());
-	wchar_t* pFrom = (wchar_t*)cbFrom.GetBuffer(iLength);
+    size_t iLength = cbFrom.GetLength();
+    pdfium::base::CheckedNumeric<size_t> iSize = sizeof(wchar_t);
+    iSize *= (iLength + 1);
+    wchar_t* pResult = (wchar_t*)malloc(iSize.ValueOrDie());
+    wchar_t* pFrom = (wchar_t*)cbFrom.GetBuffer(iLength);
 
-	for (int i = 0; i < iLength; i++)
-	{
-		if (pFrom[i] == L'\\' || pFrom[i] == L'/')
-		{
-			pResult[i] = L'\0';
-			break;
-		}
-		pResult[i] = pFrom[i];
-	}
-	pResult[iLength] = L'\0';
+    for (int i = 0; i < iLength; i++)
+    {
+        if (pFrom[i] == L'\\' || pFrom[i] == L'/')
+        {
+            pResult[i] = L'\0';
+            break;
+        }
+        pResult[i] = pFrom[i];
+    }
+    pResult[iLength] = L'\0';
 
-	cbFrom.ReleaseBuffer();
-	CFX_WideString cbRet = CFX_WideString(pResult);
-	free(pResult);
-	pResult = NULL;
-	return cbRet;
+    cbFrom.ReleaseBuffer();
+    CFX_WideString cbRet = CFX_WideString(pResult);
+    free(pResult);
+    pResult = NULL;
+    return cbRet;
 }
 
 FX_BOOL Document::path(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	if (vp.IsSetting()) {
-		CJS_Context* pContext = static_cast<CJS_Context*>(cc);
-		sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
-		return FALSE;
-	}
-	vp << app::SysPathToPDFPath(m_pDocument->GetPath());
-	return TRUE;
+    if (vp.IsSetting()) {
+        CJS_Context* pContext = static_cast<CJS_Context*>(cc);
+        sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
+        return FALSE;
+    }
+    vp << app::SysPathToPDFPath(m_pDocument->GetPath());
+    return TRUE;
 }
 
 FX_BOOL Document::pageWindowRect(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Document::layout(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Document::addLink(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Document::closeDoc(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
-	return TRUE;
+    ASSERT(m_pDocument != NULL);
+    return TRUE;
 }
 
 FX_BOOL Document::getPageBox(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Document::getAnnot(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Document::getAnnots(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	vRet.SetNull();
-	return TRUE;
+    vRet.SetNull();
+    return TRUE;
 }
 
 FX_BOOL Document::getAnnot3D(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	vRet.SetNull();
-	return TRUE;
+    vRet.SetNull();
+    return TRUE;
 }
 
 FX_BOOL Document::getAnnots3D(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	vRet = VT_undefined;
-	return TRUE;
+    vRet = VT_undefined;
+    return TRUE;
 }
 
 FX_BOOL Document::getOCGs(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Document::getLinks(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	return TRUE;
+    return TRUE;
 }
 
 bool Document::IsEnclosedInRect(CFX_FloatRect rect, CFX_FloatRect LinkRect)
 {
-	if (rect.left <= LinkRect.left
-	  && rect.top <= LinkRect.top
-	  && rect.right >= LinkRect.right
-	  && rect.bottom >= LinkRect.bottom)
-		return true;
-	else
-		return false;
+    return (rect.left <= LinkRect.left &&
+            rect.top <= LinkRect.top &&
+            rect.right >= LinkRect.right &&
+            rect.bottom >= LinkRect.bottom);
 }
 
 void IconTree::InsertIconElement(IconElement* pNewIcon)
 {
-	if (!pNewIcon)return;
+    if (!pNewIcon)return;
 
-	if (m_pHead == NULL && m_pEnd == NULL)
-	{
-		m_pHead = m_pEnd = pNewIcon;
-		m_iLength++;
-	}
-	else
-	{
-		m_pEnd->NextIcon = pNewIcon;
-		m_pEnd = pNewIcon;
-		m_iLength++;
-	}
+    if (m_pHead == NULL && m_pEnd == NULL)
+    {
+        m_pHead = m_pEnd = pNewIcon;
+        m_iLength++;
+    }
+    else
+    {
+        m_pEnd->NextIcon = pNewIcon;
+        m_pEnd = pNewIcon;
+        m_iLength++;
+    }
 }
 
 void IconTree::DeleteIconTree()
 {
-	if (!m_pHead || !m_pEnd)return;
+    if (!m_pHead || !m_pEnd)return;
 
-	IconElement* pTemp = NULL;
-	while(m_pEnd != m_pHead)
-	{
-		pTemp = m_pHead;
-		m_pHead = m_pHead->NextIcon;
-		delete pTemp;
-	}
+    IconElement* pTemp = NULL;
+    while(m_pEnd != m_pHead)
+    {
+        pTemp = m_pHead;
+        m_pHead = m_pHead->NextIcon;
+        delete pTemp;
+    }
 
-	delete m_pEnd;
-	m_pHead = NULL;
-	m_pEnd = NULL;
+    delete m_pEnd;
+    m_pHead = NULL;
+    m_pEnd = NULL;
 }
 
 int IconTree::GetLength()
 {
-	return m_iLength;
+    return m_iLength;
 }
 
 IconElement* IconTree::operator [](int iIndex)
 {
-	if (iIndex >= 0 && iIndex <= m_iLength)
-	{
-		IconElement* pTemp = m_pHead;
-		for (int i = 0; i < iIndex; i++)
-		{
-			pTemp = pTemp->NextIcon;
-		}
-		return pTemp;
-	}
-	else
-		return NULL;
+    if (iIndex >= 0 && iIndex <= m_iLength)
+    {
+        IconElement* pTemp = m_pHead;
+        for (int i = 0; i < iIndex; i++)
+        {
+            pTemp = pTemp->NextIcon;
+        }
+        return pTemp;
+    }
+    return NULL;
 }
 
 void IconTree::DeleteIconElement(CFX_WideString swIconName)
@@ -1453,120 +1417,120 @@
 
 FX_BOOL Document::addIcon(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	CJS_Context* pContext = (CJS_Context*)cc;
-	if (params.size() != 2) {
-		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
-		return FALSE;
-	}
+    CJS_Context* pContext = (CJS_Context*)cc;
+    if (params.size() != 2) {
+        sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+        return FALSE;
+    }
 
-	CFX_WideString swIconName = params[0].ToCFXWideString();
-	JSFXObject pJSIcon = params[1].ToV8Object();
+    CFX_WideString swIconName = params[0].ToCFXWideString();
+    JSFXObject pJSIcon = params[1].ToV8Object();
 
-	CJS_Runtime* pRuntime = pContext->GetJSRuntime();
-	if (JS_GetObjDefnID(pJSIcon) != JS_GetObjDefnID(*pRuntime, L"Icon")) {
-		sError = JSGetStringFromID(pContext, IDS_STRING_JSTYPEERROR);
-		return FALSE;
-	}
+    CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+    if (JS_GetObjDefnID(pJSIcon) != JS_GetObjDefnID(*pRuntime, L"Icon")) {
+        sError = JSGetStringFromID(pContext, IDS_STRING_JSTYPEERROR);
+        return FALSE;
+    }
 
-	CJS_EmbedObj* pEmbedObj = params[1].ToCJSObject()->GetEmbedObject();
-	if (!pEmbedObj) {
-		sError = JSGetStringFromID(pContext, IDS_STRING_JSTYPEERROR);
-		return FALSE;
-	}
+    CJS_EmbedObj* pEmbedObj = params[1].ToCJSObject()->GetEmbedObject();
+    if (!pEmbedObj) {
+        sError = JSGetStringFromID(pContext, IDS_STRING_JSTYPEERROR);
+        return FALSE;
+    }
 
-	Icon* pIcon = (Icon*)pEmbedObj;
-	if (!m_pIconTree)
-		m_pIconTree = new IconTree();
+    Icon* pIcon = (Icon*)pEmbedObj;
+    if (!m_pIconTree)
+        m_pIconTree = new IconTree();
 
-	IconElement* pNewIcon = new IconElement();
-	pNewIcon->IconName = swIconName;
-	pNewIcon->NextIcon = NULL;
-	pNewIcon->IconStream = pIcon;
-	m_pIconTree->InsertIconElement(pNewIcon);
-	return TRUE;
+    IconElement* pNewIcon = new IconElement();
+    pNewIcon->IconName = swIconName;
+    pNewIcon->NextIcon = NULL;
+    pNewIcon->IconStream = pIcon;
+    m_pIconTree->InsertIconElement(pNewIcon);
+    return TRUE;
 }
 
 FX_BOOL Document::icons(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	if (vp.IsSetting()) {
-		CJS_Context* pContext = static_cast<CJS_Context*>(cc);
-		sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
-		return FALSE;
-	}
+    if (vp.IsSetting()) {
+        CJS_Context* pContext = static_cast<CJS_Context*>(cc);
+        sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
+        return FALSE;
+    }
 
-	if (!m_pIconTree)
-	{
-		vp.SetNull();
-		return TRUE;
-	}
+    if (!m_pIconTree)
+    {
+        vp.SetNull();
+        return TRUE;
+    }
 
-	CJS_Array Icons(m_isolate);
-	IconElement* pIconElement = NULL;
-	int iIconTreeLength = m_pIconTree->GetLength();
+    CJS_Array Icons(m_isolate);
+    IconElement* pIconElement = NULL;
+    int iIconTreeLength = m_pIconTree->GetLength();
 
-	CJS_Context* pContext = (CJS_Context *)cc;
-	CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+    CJS_Context* pContext = (CJS_Context *)cc;
+    CJS_Runtime* pRuntime = pContext->GetJSRuntime();
 
-	for (int i = 0; i < iIconTreeLength; i++)
-	{
-		pIconElement = (*m_pIconTree)[i];
+    for (int i = 0; i < iIconTreeLength; i++)
+    {
+        pIconElement = (*m_pIconTree)[i];
 
-		JSFXObject  pObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"Icon"));
-		if (pObj.IsEmpty()) return FALSE;
+        JSFXObject  pObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"Icon"));
+        if (pObj.IsEmpty()) return FALSE;
 
-		CJS_Icon * pJS_Icon = (CJS_Icon *)JS_GetPrivate(pObj);
-		if (!pJS_Icon) return FALSE;
+        CJS_Icon * pJS_Icon = (CJS_Icon *)JS_GetPrivate(pObj);
+        if (!pJS_Icon) return FALSE;
 
-		Icon* pIcon = (Icon*)pJS_Icon->GetEmbedObject();
-		if (!pIcon)return FALSE;
+        Icon* pIcon = (Icon*)pJS_Icon->GetEmbedObject();
+        if (!pIcon)return FALSE;
 
-		pIcon->SetStream(pIconElement->IconStream->GetStream());
-		pIcon->SetIconName(pIconElement->IconName);
-		Icons.SetElement(i, CJS_Value(m_isolate,pJS_Icon));
-	}
+        pIcon->SetStream(pIconElement->IconStream->GetStream());
+        pIcon->SetIconName(pIconElement->IconName);
+        Icons.SetElement(i, CJS_Value(m_isolate,pJS_Icon));
+    }
 
-	vp << Icons;
-	return TRUE;
+    vp << Icons;
+    return TRUE;
 }
 
 FX_BOOL Document::getIcon(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	CJS_Context* pContext = (CJS_Context *)cc;
-	if (params.size() != 1) {
-		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
-		return FALSE;
-	}
+    CJS_Context* pContext = (CJS_Context *)cc;
+    if (params.size() != 1) {
+        sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+        return FALSE;
+    }
 
-	if(!m_pIconTree)
-		return FALSE;
-	CFX_WideString swIconName = params[0].ToCFXWideString();
-	int iIconCounts = m_pIconTree->GetLength();
+    if(!m_pIconTree)
+        return FALSE;
+    CFX_WideString swIconName = params[0].ToCFXWideString();
+    int iIconCounts = m_pIconTree->GetLength();
 
-	CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+    CJS_Runtime* pRuntime = pContext->GetJSRuntime();
 
-	for (int i = 0; i < iIconCounts; i++)
-	{
-		if ((*m_pIconTree)[i]->IconName == swIconName)
-		{
-			Icon* pRetIcon = (*m_pIconTree)[i]->IconStream;
+    for (int i = 0; i < iIconCounts; i++)
+    {
+        if ((*m_pIconTree)[i]->IconName == swIconName)
+        {
+            Icon* pRetIcon = (*m_pIconTree)[i]->IconStream;
 
-			JSFXObject  pObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"Icon"));
-			if (pObj.IsEmpty()) return FALSE;
+            JSFXObject  pObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"Icon"));
+            if (pObj.IsEmpty()) return FALSE;
 
-			CJS_Icon * pJS_Icon = (CJS_Icon *)JS_GetPrivate(pObj);
-			if (!pJS_Icon) return FALSE;
+            CJS_Icon * pJS_Icon = (CJS_Icon *)JS_GetPrivate(pObj);
+            if (!pJS_Icon) return FALSE;
 
-			Icon* pIcon = (Icon*)pJS_Icon->GetEmbedObject();
-			if (!pIcon)return FALSE;
+            Icon* pIcon = (Icon*)pJS_Icon->GetEmbedObject();
+            if (!pIcon)return FALSE;
 
-			pIcon->SetIconName(swIconName);
-			pIcon->SetStream(pRetIcon->GetStream());
-			vRet = pJS_Icon;
-			return TRUE;
-		}
-	}
+            pIcon->SetIconName(swIconName);
+            pIcon->SetStream(pRetIcon->GetStream());
+            vRet = pJS_Icon;
+            return TRUE;
+        }
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
 FX_BOOL Document::removeIcon(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
@@ -1591,255 +1555,253 @@
 
 FX_BOOL Document::media(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Document::calculateNow(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
-		m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) ||
-		m_pDocument->GetPermissions(FPDFPERM_FILL_FORM))) return FALSE;
+    if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
+        m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) ||
+        m_pDocument->GetPermissions(FPDFPERM_FILL_FORM))) return FALSE;
 
-	CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
-	ASSERT(pInterForm != NULL);
-	pInterForm->OnCalculate();
-	return TRUE;
+    CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+    ASSERT(pInterForm != NULL);
+    pInterForm->OnCalculate();
+    return TRUE;
 }
 
 FX_BOOL Document::Collab(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Document::getPageNthWord(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;
+    if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;
 
-	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;
+    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;
+	if (!pDocument)
+        return FALSE;
 
-	CJS_Context* pContext = static_cast<CJS_Context*>(cc);
-	if (nPageNo < 0 || nPageNo >= pDocument->GetPageCount())
-	{
-		sError = JSGetStringFromID(pContext, IDS_STRING_JSVALUEERROR);
-		return FALSE;
-	}
+    CJS_Context* pContext = static_cast<CJS_Context*>(cc);
+    if (nPageNo < 0 || nPageNo >= pDocument->GetPageCount())
+    {
+        sError = JSGetStringFromID(pContext, IDS_STRING_JSVALUEERROR);
+        return FALSE;
+    }
 
-	CPDF_Dictionary* pPageDict = pDocument->GetPage(nPageNo);
-	if (!pPageDict) return FALSE;
+    CPDF_Dictionary* pPageDict = pDocument->GetPage(nPageNo);
+    if (!pPageDict) return FALSE;
 
-	CPDF_Page page;
-	page.Load(pDocument, pPageDict);
-	page.StartParse();
-	page.ParseContent();
+    CPDF_Page page;
+    page.Load(pDocument, pPageDict);
+    page.StartParse();
+    page.ParseContent();
 
-	FX_POSITION pos = page.GetFirstObjectPosition();
+    FX_POSITION pos = page.GetFirstObjectPosition();
 
-	int nWords = 0;
+    int nWords = 0;
 
-	CFX_WideString swRet;
+    CFX_WideString swRet;
 
-	while (pos)
-	{
-		if (CPDF_PageObject* pPageObj = page.GetNextObject(pos))
-		{
-			if (pPageObj->m_Type == PDFPAGE_TEXT)
-			{
-				int nObjWords = CountWords((CPDF_TextObject*)pPageObj);
+    while (pos)
+    {
+        if (CPDF_PageObject* pPageObj = page.GetNextObject(pos))
+        {
+            if (pPageObj->m_Type == PDFPAGE_TEXT)
+            {
+                int nObjWords = CountWords((CPDF_TextObject*)pPageObj);
 
-				if (nWords + nObjWords >= nWordNo)
-				{
-					swRet = GetObjWordStr((CPDF_TextObject*)pPageObj, nWordNo - nWords);
-					break;
-				}
+                if (nWords + nObjWords >= nWordNo)
+                {
+                    swRet = GetObjWordStr((CPDF_TextObject*)pPageObj, nWordNo - nWords);
+                    break;
+                }
 
-				nWords += nObjWords;
-			}
-		}
-	}
+                nWords += nObjWords;
+            }
+        }
+    }
 
-	if (bStrip)
-	{
-		swRet.TrimLeft();
-		swRet.TrimRight();
-	}
+    if (bStrip)
+    {
+        swRet.TrimLeft();
+        swRet.TrimRight();
+    }
 
-	vRet = swRet.c_str();
-	return TRUE;
+    vRet = swRet.c_str();
+    return TRUE;
 }
 
 FX_BOOL Document::getPageNthWordQuads(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;
+    if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;
 
-	return FALSE;
+    return FALSE;
 }
 
 FX_BOOL Document::getPageNumWords(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;
+    if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;
 
-	int nPageNo = params.GetSize() > 0 ? params[0].ToInt() : 0;
-
+    int nPageNo = params.GetSize() > 0 ? params[0].ToInt() : 0;
 	CPDF_Document* pDocument = m_pDocument->GetDocument()->GetPDFDoc();
-	ASSERT(pDocument != NULL);
+    CJS_Context* pContext = static_cast<CJS_Context*>(cc);
+    if (nPageNo < 0 || nPageNo >= pDocument->GetPageCount())
+    {
+        sError = JSGetStringFromID(pContext, IDS_STRING_JSVALUEERROR);
+        return FALSE;
+    }
 
-	CJS_Context* pContext = static_cast<CJS_Context*>(cc);
-	if (nPageNo < 0 || nPageNo >= pDocument->GetPageCount())
-	{
-		sError = JSGetStringFromID(pContext, IDS_STRING_JSVALUEERROR);
-		return FALSE;
-	}
+    CPDF_Dictionary* pPageDict = pDocument->GetPage(nPageNo);
+    if (!pPageDict) return FALSE;
 
-	CPDF_Dictionary* pPageDict = pDocument->GetPage(nPageNo);
-	if (!pPageDict) return FALSE;
+    CPDF_Page page;
+    page.Load(pDocument, pPageDict);
+    page.StartParse();
+    page.ParseContent();
 
-	CPDF_Page page;
-	page.Load(pDocument, pPageDict);
-	page.StartParse();
-	page.ParseContent();
+    FX_POSITION pos = page.GetFirstObjectPosition();
 
-	FX_POSITION pos = page.GetFirstObjectPosition();
+    int nWords = 0;
 
-	int nWords = 0;
+    while (pos)
+    {
+        if (CPDF_PageObject* pPageObj = page.GetNextObject(pos))
+        {
+            if (pPageObj->m_Type == PDFPAGE_TEXT)
+            {
+                CPDF_TextObject* pTextObj = (CPDF_TextObject*)pPageObj;
+                nWords += CountWords(pTextObj);
+            }
+        }
+    }
 
-	while (pos)
-	{
-		if (CPDF_PageObject* pPageObj = page.GetNextObject(pos))
-		{
-			if (pPageObj->m_Type == PDFPAGE_TEXT)
-			{
-				CPDF_TextObject* pTextObj = (CPDF_TextObject*)pPageObj;
-				nWords += CountWords(pTextObj);
-			}
-		}
-	}
+    vRet = nWords;
 
-	vRet = nWords;
-
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Document::getPrintParams(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	CJS_Context* pContext = (CJS_Context*)cc;
-	CJS_Runtime* pRuntime = pContext->GetJSRuntime();
-	JSFXObject pRetObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"PrintParamsObj"));
+    CJS_Context* pContext = (CJS_Context*)cc;
+    CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+    JSFXObject pRetObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"PrintParamsObj"));
 
-	// Not implemented yet.
+    // Not implemented yet.
 
-	vRet = pRetObj;
-	return TRUE;
+    vRet = pRetObj;
+    return TRUE;
 }
 
-#define ISLATINWORD(u)	(u != 0x20 && u <= 0x28FF)
+#define ISLATINWORD(u)  (u != 0x20 && u <= 0x28FF)
 
-int	Document::CountWords(CPDF_TextObject* pTextObj)
+int Document::CountWords(CPDF_TextObject* pTextObj)
 {
-	if (!pTextObj) return 0;
+    if (!pTextObj) return 0;
 
-	int nWords = 0;
+    int nWords = 0;
 
-	CPDF_Font* pFont = pTextObj->GetFont();
-	if (!pFont) return 0;
+    CPDF_Font* pFont = pTextObj->GetFont();
+    if (!pFont) return 0;
 
-	FX_BOOL bIsLatin = FALSE;
+    FX_BOOL bIsLatin = FALSE;
 
-	for (int i=0, sz=pTextObj->CountChars(); i<sz; i++)
-	{
-		FX_DWORD charcode = -1;
-		FX_FLOAT kerning;
+    for (int i=0, sz=pTextObj->CountChars(); i<sz; i++)
+    {
+        FX_DWORD charcode = -1;
+        FX_FLOAT kerning;
 
-		pTextObj->GetCharInfo(i, charcode, kerning);
-		CFX_WideString swUnicode = pFont->UnicodeFromCharCode(charcode);
+        pTextObj->GetCharInfo(i, charcode, kerning);
+        CFX_WideString swUnicode = pFont->UnicodeFromCharCode(charcode);
 
-		FX_WORD unicode = 0;
-		if (swUnicode.GetLength() > 0)
-			unicode = swUnicode[0];
+        FX_WORD unicode = 0;
+        if (swUnicode.GetLength() > 0)
+            unicode = swUnicode[0];
 
-		if (ISLATINWORD(unicode) && bIsLatin)
-			continue;
+        if (ISLATINWORD(unicode) && bIsLatin)
+            continue;
 
-		bIsLatin = ISLATINWORD(unicode);
-		if (unicode != 0x20)
-			nWords++;
-	}
+        bIsLatin = ISLATINWORD(unicode);
+        if (unicode != 0x20)
+            nWords++;
+    }
 
-	return nWords;
+    return nWords;
 }
 
 CFX_WideString Document::GetObjWordStr(CPDF_TextObject* pTextObj, int nWordIndex)
 {
-	ASSERT(pTextObj != NULL);
+    ASSERT(pTextObj != NULL);
 
-	CFX_WideString swRet;
+    CFX_WideString swRet;
 
-	CPDF_Font* pFont = pTextObj->GetFont();
-	if (!pFont) return L"";
+    CPDF_Font* pFont = pTextObj->GetFont();
+    if (!pFont) return L"";
 
-	int nWords = 0;
-	FX_BOOL bIsLatin = FALSE;
+    int nWords = 0;
+    FX_BOOL bIsLatin = FALSE;
 
-	for (int i=0, sz=pTextObj->CountChars(); i<sz; i++)
-	{
-		FX_DWORD charcode = -1;
-		FX_FLOAT kerning;
+    for (int i=0, sz=pTextObj->CountChars(); i<sz; i++)
+    {
+        FX_DWORD charcode = -1;
+        FX_FLOAT kerning;
 
-		pTextObj->GetCharInfo(i, charcode, kerning);
-		CFX_WideString swUnicode = pFont->UnicodeFromCharCode(charcode);
+        pTextObj->GetCharInfo(i, charcode, kerning);
+        CFX_WideString swUnicode = pFont->UnicodeFromCharCode(charcode);
 
-		FX_WORD unicode = 0;
-		if (swUnicode.GetLength() > 0)
-			unicode = swUnicode[0];
+        FX_WORD unicode = 0;
+        if (swUnicode.GetLength() > 0)
+            unicode = swUnicode[0];
 
-		if (ISLATINWORD(unicode) && bIsLatin)
-		{
-		}
-		else
-		{
-			bIsLatin = ISLATINWORD(unicode);
-			if (unicode != 0x20)
-				nWords++;
-		}
+        if (ISLATINWORD(unicode) && bIsLatin)
+        {
+        }
+        else
+        {
+            bIsLatin = ISLATINWORD(unicode);
+            if (unicode != 0x20)
+                nWords++;
+        }
 
-		if (nWords-1 == nWordIndex)
-			swRet += unicode;
-	}
+        if (nWords-1 == nWordIndex)
+            swRet += unicode;
+    }
 
-	return swRet;
+    return swRet;
 }
 
 FX_BOOL Document::zoom(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
 
-	return TRUE;
+    return TRUE;
 }
 
 /**
-(none,	NoVary)
-(fitP,	FitPage)
-(fitW,	FitWidth)
-(fitH,	FitHeight)
-(fitV,	FitVisibleWidth)
-(pref,	Preferred)
-(refW,	ReflowWidth)
+(none,  NoVary)
+(fitP,  FitPage)
+(fitW,  FitWidth)
+(fitH,  FitHeight)
+(fitV,  FitVisibleWidth)
+(pref,  Preferred)
+(refW,  ReflowWidth)
 */
 
 FX_BOOL Document::zoomType(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Document::deletePages(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
@@ -1921,7 +1883,7 @@
 
 void Document::AddDelayData(CJS_DelayData* pData)
 {
-	m_DelayData.Add(pData);
+    m_DelayData.Add(pData);
 }
 
 void Document::DoFieldDelay(const CFX_WideString& sFieldName, int nControlIndex)
@@ -1950,21 +1912,20 @@
 
 void Document::AddDelayAnnotData(CJS_AnnotObj *pData)
 {
-	m_DelayAnnotData.Add(pData);
+    m_DelayAnnotData.Add(pData);
 }
 
 void Document::DoAnnotDelay()
 {
-	CFX_DWordArray DelArray;
+    CFX_DWordArray DelArray;
 
-	for (int j=DelArray.GetSize()-1; j>=0; j--)
-	{
-		m_DelayData.RemoveAt(DelArray[j]);
-	}
+    for (int j=DelArray.GetSize()-1; j>=0; j--)
+    {
+        m_DelayData.RemoveAt(DelArray[j]);
+    }
 }
 
 CJS_Document* Document::GetCJSDoc() const
 {
-	return static_cast<CJS_Document*>(m_pJSObject);
+    return static_cast<CJS_Document*>(m_pJSObject);
 }
-
diff --git a/fpdfsdk/src/javascript/Field.cpp b/fpdfsdk/src/javascript/Field.cpp
index c98e469..3857e80 100644
--- a/fpdfsdk/src/javascript/Field.cpp
+++ b/fpdfsdk/src/javascript/Field.cpp
@@ -25,111 +25,111 @@
 END_JS_STATIC_CONST()
 
 BEGIN_JS_STATIC_PROP(CJS_Field)
-	JS_STATIC_PROP_ENTRY(alignment)
-	JS_STATIC_PROP_ENTRY(borderStyle)
-	JS_STATIC_PROP_ENTRY(buttonAlignX)
-	JS_STATIC_PROP_ENTRY(buttonAlignY)
-	JS_STATIC_PROP_ENTRY(buttonFitBounds)
-	JS_STATIC_PROP_ENTRY(buttonPosition)
-	JS_STATIC_PROP_ENTRY(buttonScaleHow)
-	JS_STATIC_PROP_ENTRY(buttonScaleWhen)
-	JS_STATIC_PROP_ENTRY(calcOrderIndex)
-	JS_STATIC_PROP_ENTRY(charLimit)
-	JS_STATIC_PROP_ENTRY(comb)
-	JS_STATIC_PROP_ENTRY(commitOnSelChange)
-	JS_STATIC_PROP_ENTRY(currentValueIndices)
-	JS_STATIC_PROP_ENTRY(defaultStyle)
-	JS_STATIC_PROP_ENTRY(defaultValue)
-	JS_STATIC_PROP_ENTRY(doNotScroll)
-	JS_STATIC_PROP_ENTRY(doNotSpellCheck)
-	JS_STATIC_PROP_ENTRY(delay)
-	JS_STATIC_PROP_ENTRY(display)
-	JS_STATIC_PROP_ENTRY(doc)
-	JS_STATIC_PROP_ENTRY(editable)
-	JS_STATIC_PROP_ENTRY(exportValues)
-	JS_STATIC_PROP_ENTRY(hidden)
-	JS_STATIC_PROP_ENTRY(fileSelect)
-	JS_STATIC_PROP_ENTRY(fillColor)
-	JS_STATIC_PROP_ENTRY(lineWidth)
-	JS_STATIC_PROP_ENTRY(highlight)
-	JS_STATIC_PROP_ENTRY(multiline)
-	JS_STATIC_PROP_ENTRY(multipleSelection)
-	JS_STATIC_PROP_ENTRY(name)
-	JS_STATIC_PROP_ENTRY(numItems)
-	JS_STATIC_PROP_ENTRY(page)
-	JS_STATIC_PROP_ENTRY(password)
-	JS_STATIC_PROP_ENTRY(print)
-	JS_STATIC_PROP_ENTRY(radiosInUnison)
-	JS_STATIC_PROP_ENTRY(readonly)
-	JS_STATIC_PROP_ENTRY(rect)
-	JS_STATIC_PROP_ENTRY(required)
-	JS_STATIC_PROP_ENTRY(richText)
-	JS_STATIC_PROP_ENTRY(richValue)
-	JS_STATIC_PROP_ENTRY(rotation)
-	JS_STATIC_PROP_ENTRY(strokeColor)
-	JS_STATIC_PROP_ENTRY(style)
-	JS_STATIC_PROP_ENTRY(submitName)
-	JS_STATIC_PROP_ENTRY(textColor)
-	JS_STATIC_PROP_ENTRY(textFont)
-	JS_STATIC_PROP_ENTRY(textSize)
-	JS_STATIC_PROP_ENTRY(type)
-	JS_STATIC_PROP_ENTRY(userName)
-	JS_STATIC_PROP_ENTRY(value)
-	JS_STATIC_PROP_ENTRY(valueAsString)
-	JS_STATIC_PROP_ENTRY(source)
+    JS_STATIC_PROP_ENTRY(alignment)
+    JS_STATIC_PROP_ENTRY(borderStyle)
+    JS_STATIC_PROP_ENTRY(buttonAlignX)
+    JS_STATIC_PROP_ENTRY(buttonAlignY)
+    JS_STATIC_PROP_ENTRY(buttonFitBounds)
+    JS_STATIC_PROP_ENTRY(buttonPosition)
+    JS_STATIC_PROP_ENTRY(buttonScaleHow)
+    JS_STATIC_PROP_ENTRY(buttonScaleWhen)
+    JS_STATIC_PROP_ENTRY(calcOrderIndex)
+    JS_STATIC_PROP_ENTRY(charLimit)
+    JS_STATIC_PROP_ENTRY(comb)
+    JS_STATIC_PROP_ENTRY(commitOnSelChange)
+    JS_STATIC_PROP_ENTRY(currentValueIndices)
+    JS_STATIC_PROP_ENTRY(defaultStyle)
+    JS_STATIC_PROP_ENTRY(defaultValue)
+    JS_STATIC_PROP_ENTRY(doNotScroll)
+    JS_STATIC_PROP_ENTRY(doNotSpellCheck)
+    JS_STATIC_PROP_ENTRY(delay)
+    JS_STATIC_PROP_ENTRY(display)
+    JS_STATIC_PROP_ENTRY(doc)
+    JS_STATIC_PROP_ENTRY(editable)
+    JS_STATIC_PROP_ENTRY(exportValues)
+    JS_STATIC_PROP_ENTRY(hidden)
+    JS_STATIC_PROP_ENTRY(fileSelect)
+    JS_STATIC_PROP_ENTRY(fillColor)
+    JS_STATIC_PROP_ENTRY(lineWidth)
+    JS_STATIC_PROP_ENTRY(highlight)
+    JS_STATIC_PROP_ENTRY(multiline)
+    JS_STATIC_PROP_ENTRY(multipleSelection)
+    JS_STATIC_PROP_ENTRY(name)
+    JS_STATIC_PROP_ENTRY(numItems)
+    JS_STATIC_PROP_ENTRY(page)
+    JS_STATIC_PROP_ENTRY(password)
+    JS_STATIC_PROP_ENTRY(print)
+    JS_STATIC_PROP_ENTRY(radiosInUnison)
+    JS_STATIC_PROP_ENTRY(readonly)
+    JS_STATIC_PROP_ENTRY(rect)
+    JS_STATIC_PROP_ENTRY(required)
+    JS_STATIC_PROP_ENTRY(richText)
+    JS_STATIC_PROP_ENTRY(richValue)
+    JS_STATIC_PROP_ENTRY(rotation)
+    JS_STATIC_PROP_ENTRY(strokeColor)
+    JS_STATIC_PROP_ENTRY(style)
+    JS_STATIC_PROP_ENTRY(submitName)
+    JS_STATIC_PROP_ENTRY(textColor)
+    JS_STATIC_PROP_ENTRY(textFont)
+    JS_STATIC_PROP_ENTRY(textSize)
+    JS_STATIC_PROP_ENTRY(type)
+    JS_STATIC_PROP_ENTRY(userName)
+    JS_STATIC_PROP_ENTRY(value)
+    JS_STATIC_PROP_ENTRY(valueAsString)
+    JS_STATIC_PROP_ENTRY(source)
 END_JS_STATIC_PROP()
 
 BEGIN_JS_STATIC_METHOD(CJS_Field)
-	JS_STATIC_METHOD_ENTRY(browseForFileToSubmit)
-	JS_STATIC_METHOD_ENTRY(buttonGetCaption)
-	JS_STATIC_METHOD_ENTRY(buttonGetIcon)
-	JS_STATIC_METHOD_ENTRY(buttonImportIcon)
-	JS_STATIC_METHOD_ENTRY(buttonSetCaption)
-	JS_STATIC_METHOD_ENTRY(buttonSetIcon)
-	JS_STATIC_METHOD_ENTRY(checkThisBox)
-	JS_STATIC_METHOD_ENTRY(clearItems)
-	JS_STATIC_METHOD_ENTRY(defaultIsChecked)
-	JS_STATIC_METHOD_ENTRY(deleteItemAt)
-	JS_STATIC_METHOD_ENTRY(getArray )
-	JS_STATIC_METHOD_ENTRY(getItemAt)
-	JS_STATIC_METHOD_ENTRY(getLock)
-	JS_STATIC_METHOD_ENTRY(insertItemAt)
-	JS_STATIC_METHOD_ENTRY(isBoxChecked)
-	JS_STATIC_METHOD_ENTRY(isDefaultChecked)
-	JS_STATIC_METHOD_ENTRY(setAction)
-	JS_STATIC_METHOD_ENTRY(setFocus)
-	JS_STATIC_METHOD_ENTRY(setItems)
-	JS_STATIC_METHOD_ENTRY(setLock)
-	JS_STATIC_METHOD_ENTRY(signatureGetModifications)
-	JS_STATIC_METHOD_ENTRY(signatureGetSeedValue)
-	JS_STATIC_METHOD_ENTRY(signatureInfo)
-	JS_STATIC_METHOD_ENTRY(signatureSetSeedValue)
-	JS_STATIC_METHOD_ENTRY(signatureSign)
-	JS_STATIC_METHOD_ENTRY(signatureValidate)
+    JS_STATIC_METHOD_ENTRY(browseForFileToSubmit)
+    JS_STATIC_METHOD_ENTRY(buttonGetCaption)
+    JS_STATIC_METHOD_ENTRY(buttonGetIcon)
+    JS_STATIC_METHOD_ENTRY(buttonImportIcon)
+    JS_STATIC_METHOD_ENTRY(buttonSetCaption)
+    JS_STATIC_METHOD_ENTRY(buttonSetIcon)
+    JS_STATIC_METHOD_ENTRY(checkThisBox)
+    JS_STATIC_METHOD_ENTRY(clearItems)
+    JS_STATIC_METHOD_ENTRY(defaultIsChecked)
+    JS_STATIC_METHOD_ENTRY(deleteItemAt)
+    JS_STATIC_METHOD_ENTRY(getArray )
+    JS_STATIC_METHOD_ENTRY(getItemAt)
+    JS_STATIC_METHOD_ENTRY(getLock)
+    JS_STATIC_METHOD_ENTRY(insertItemAt)
+    JS_STATIC_METHOD_ENTRY(isBoxChecked)
+    JS_STATIC_METHOD_ENTRY(isDefaultChecked)
+    JS_STATIC_METHOD_ENTRY(setAction)
+    JS_STATIC_METHOD_ENTRY(setFocus)
+    JS_STATIC_METHOD_ENTRY(setItems)
+    JS_STATIC_METHOD_ENTRY(setLock)
+    JS_STATIC_METHOD_ENTRY(signatureGetModifications)
+    JS_STATIC_METHOD_ENTRY(signatureGetSeedValue)
+    JS_STATIC_METHOD_ENTRY(signatureInfo)
+    JS_STATIC_METHOD_ENTRY(signatureSetSeedValue)
+    JS_STATIC_METHOD_ENTRY(signatureSign)
+    JS_STATIC_METHOD_ENTRY(signatureValidate)
 END_JS_STATIC_METHOD()
 
 IMPLEMENT_JS_CLASS(CJS_Field, Field)
 
-FX_BOOL	CJS_Field::InitInstance(IFXJS_Context* cc)
+FX_BOOL CJS_Field::InitInstance(IFXJS_Context* cc)
 {
-	CJS_Context* pContext = (CJS_Context*)cc;
-	ASSERT(pContext != NULL);
+    CJS_Context* pContext = (CJS_Context*)cc;
+    ASSERT(pContext != NULL);
 
-	Field* pField = (Field*)GetEmbedObject();
-	ASSERT(pField != NULL);
+    Field* pField = (Field*)GetEmbedObject();
+    ASSERT(pField != NULL);
 
-	pField->SetIsolate(pContext->GetJSRuntime()->GetIsolate());
+    pField->SetIsolate(pContext->GetJSRuntime()->GetIsolate());
 
-	return TRUE;
+    return TRUE;
 };
 
 Field::Field(CJS_Object* pJSObject): CJS_EmbedObj(pJSObject),
-	m_pJSDoc(NULL),
-	m_pDocument(NULL),
-	m_nFormControlIndex(-1),
-	m_bCanSet(FALSE),
-	m_bDelay(FALSE),
-	m_isolate(NULL)
+    m_pJSDoc(NULL),
+    m_pDocument(NULL),
+    m_nFormControlIndex(-1),
+    m_bCanSet(FALSE),
+    m_bDelay(FALSE),
+    m_isolate(NULL)
 {
 }
 
@@ -140,3319 +140,3320 @@
 //note: iControlNo = -1, means not a widget.
 void Field::ParseFieldName(const std::wstring &strFieldNameParsed,std::wstring &strFieldName,int & iControlNo)
 {
-	int iStart = strFieldNameParsed.find_last_of(L'.');
-	if (iStart == -1)
-	{
-		strFieldName = strFieldNameParsed;
-		iControlNo = -1;
-		return;
-	}
-	std::wstring suffixal = strFieldNameParsed.substr(iStart+1);
-	iControlNo = FXSYS_wtoi(suffixal.c_str());
-	if (iControlNo == 0)
-	{
-		int iStart;
-		while((iStart = suffixal.find_last_of(L" ")) != -1)
-		{
-			suffixal.erase(iStart,1);
-		}
+    int iStart = strFieldNameParsed.find_last_of(L'.');
+    if (iStart == -1)
+    {
+        strFieldName = strFieldNameParsed;
+        iControlNo = -1;
+        return;
+    }
+    std::wstring suffixal = strFieldNameParsed.substr(iStart+1);
+    iControlNo = FXSYS_wtoi(suffixal.c_str());
+    if (iControlNo == 0)
+    {
+        int iStart;
+        while((iStart = suffixal.find_last_of(L" ")) != -1)
+        {
+            suffixal.erase(iStart,1);
+        }
 
-		if (suffixal.compare(L"0") != 0)
-		{
-			strFieldName = strFieldNameParsed;
-			iControlNo = -1;
-			return;
-		}
+        if (suffixal.compare(L"0") != 0)
+        {
+            strFieldName = strFieldNameParsed;
+            iControlNo = -1;
+            return;
+        }
 
-	}
-	strFieldName = strFieldNameParsed.substr(0,iStart);
+    }
+    strFieldName = strFieldNameParsed.substr(0,iStart);
 }
 
 FX_BOOL Field::AttachField(Document* pDocument, const CFX_WideString& csFieldName)
 {
-	ASSERT(pDocument != NULL);
-	m_pJSDoc = pDocument;
+    ASSERT(pDocument != NULL);
+    m_pJSDoc = pDocument;
 
-	m_pDocument = pDocument->GetReaderDoc();
-	ASSERT(m_pDocument != NULL);
+    m_pDocument = pDocument->GetReaderDoc();
+    ASSERT(m_pDocument != NULL);
 
-	m_bCanSet = m_pDocument->GetPermissions(FPDFPERM_FILL_FORM) ||
-		m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) ||
-		m_pDocument->GetPermissions(FPDFPERM_MODIFY);
+    m_bCanSet = m_pDocument->GetPermissions(FPDFPERM_FILL_FORM) ||
+        m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) ||
+        m_pDocument->GetPermissions(FPDFPERM_MODIFY);
 
-	CPDFSDK_InterForm* pRDInterForm = m_pDocument->GetInterForm();
-	ASSERT(pRDInterForm != NULL);
+    CPDFSDK_InterForm* pRDInterForm = m_pDocument->GetInterForm();
+    ASSERT(pRDInterForm != NULL);
 
-	CPDF_InterForm* pInterForm = pRDInterForm->GetInterForm();
-	ASSERT(pInterForm != NULL);
+    CPDF_InterForm* pInterForm = pRDInterForm->GetInterForm();
+    ASSERT(pInterForm != NULL);
 
-	CFX_WideString swFieldNameTemp = csFieldName;
-	swFieldNameTemp.Replace(L"..", L".");
+    CFX_WideString swFieldNameTemp = csFieldName;
+    swFieldNameTemp.Replace(L"..", L".");
 
-	if (pInterForm->CountFields(swFieldNameTemp) <= 0)
-	{
-		std::wstring strFieldName;
-		int iControlNo = -1;
-		ParseFieldName(swFieldNameTemp.c_str(), strFieldName, iControlNo);
-		if (iControlNo == -1) return FALSE;
+    if (pInterForm->CountFields(swFieldNameTemp) <= 0)
+    {
+        std::wstring strFieldName;
+        int iControlNo = -1;
+        ParseFieldName(swFieldNameTemp.c_str(), strFieldName, iControlNo);
+        if (iControlNo == -1) return FALSE;
 
-		m_FieldName = strFieldName.c_str();
-		m_nFormControlIndex = iControlNo;
-		return TRUE;
-	}
+        m_FieldName = strFieldName.c_str();
+        m_nFormControlIndex = iControlNo;
+        return TRUE;
+    }
 
-	m_FieldName = swFieldNameTemp;
-	m_nFormControlIndex = -1;
+    m_FieldName = swFieldNameTemp;
+    m_nFormControlIndex = -1;
 
-	return TRUE;
+    return TRUE;
 }
 
 void Field::GetFormFields(CPDFSDK_Document* pDocument, const CFX_WideString& csFieldName, CFX_PtrArray& FieldArray)
 {
-	ASSERT(pDocument != NULL);
+    ASSERT(pDocument != NULL);
 
-	CPDFSDK_InterForm* pReaderInterForm = pDocument->GetInterForm();
-	ASSERT(pReaderInterForm != NULL);
+    CPDFSDK_InterForm* pReaderInterForm = pDocument->GetInterForm();
+    ASSERT(pReaderInterForm != NULL);
 
-	CPDF_InterForm* pInterForm = pReaderInterForm->GetInterForm();
-	ASSERT(pInterForm != NULL);
+    CPDF_InterForm* pInterForm = pReaderInterForm->GetInterForm();
+    ASSERT(pInterForm != NULL);
 
-	ASSERT(FieldArray.GetSize() == 0);
+    ASSERT(FieldArray.GetSize() == 0);
 
-	for (int i=0,sz=pInterForm->CountFields(csFieldName); i<sz; i++)
-	{
-		if (CPDF_FormField* pFormField = pInterForm->GetField(i, csFieldName))
-			FieldArray.Add((void*)pFormField);
-	}
+    for (int i=0,sz=pInterForm->CountFields(csFieldName); i<sz; i++)
+    {
+        if (CPDF_FormField* pFormField = pInterForm->GetField(i, csFieldName))
+            FieldArray.Add((void*)pFormField);
+    }
 }
 
 void Field::GetFormFields(const CFX_WideString& csFieldName, CFX_PtrArray& FieldArray)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	Field::GetFormFields(m_pDocument, csFieldName, FieldArray);
+    Field::GetFormFields(m_pDocument, csFieldName, FieldArray);
 }
 
 void Field::UpdateFormField(CPDFSDK_Document* pDocument, CPDF_FormField* pFormField,
-							FX_BOOL bChangeMark, FX_BOOL bResetAP, FX_BOOL bRefresh)
+                            FX_BOOL bChangeMark, FX_BOOL bResetAP, FX_BOOL bRefresh)
 {
-	ASSERT(pDocument != NULL);
-	ASSERT(pFormField != NULL);
+    ASSERT(pDocument != NULL);
+    ASSERT(pFormField != NULL);
 
-	CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
-	ASSERT(pInterForm != NULL);
+    CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
+    ASSERT(pInterForm != NULL);
 
-	CFX_PtrArray widgets;
-	pInterForm->GetWidgets(pFormField, widgets);
+    CFX_PtrArray widgets;
+    pInterForm->GetWidgets(pFormField, widgets);
 
-	if (bResetAP)
-	{
-		int nFieldType = pFormField->GetFieldType();
-		if (nFieldType == FIELDTYPE_COMBOBOX || nFieldType == FIELDTYPE_TEXTFIELD)
-		{
-			for (int i=0,sz=widgets.GetSize(); i<sz; i++)
-			{
-				CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)widgets.GetAt(i);
-				ASSERT(pWidget != NULL);
+    if (bResetAP)
+    {
+        int nFieldType = pFormField->GetFieldType();
+        if (nFieldType == FIELDTYPE_COMBOBOX || nFieldType == FIELDTYPE_TEXTFIELD)
+        {
+            for (int i=0,sz=widgets.GetSize(); i<sz; i++)
+            {
+                CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)widgets.GetAt(i);
+                ASSERT(pWidget != NULL);
 
-				FX_BOOL bFormated = FALSE;
-				CFX_WideString sValue = pWidget->OnFormat(bFormated);
-				if (bFormated)
-					pWidget->ResetAppearance(sValue.c_str(), FALSE);
-				else
-					pWidget->ResetAppearance(NULL, FALSE);
-			}
-		}
-		else
-		{
-			for (int i=0,sz=widgets.GetSize(); i<sz; i++)
-			{
-				CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)widgets.GetAt(i);
-				ASSERT(pWidget != NULL);
+                FX_BOOL bFormated = FALSE;
+                CFX_WideString sValue = pWidget->OnFormat(bFormated);
+                if (bFormated)
+                    pWidget->ResetAppearance(sValue.c_str(), FALSE);
+                else
+                    pWidget->ResetAppearance(NULL, FALSE);
+            }
+        }
+        else
+        {
+            for (int i=0,sz=widgets.GetSize(); i<sz; i++)
+            {
+                CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)widgets.GetAt(i);
+                ASSERT(pWidget != NULL);
 
-				pWidget->ResetAppearance(NULL, FALSE);
-			}
-		}
-	}
+                pWidget->ResetAppearance(NULL, FALSE);
+            }
+        }
+    }
 
-	if (bRefresh)
-	{
-		for (int i=0,sz=widgets.GetSize(); i<sz; i++)
-		{
-			CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)widgets.GetAt(i);
-			ASSERT(pWidget != NULL);
+    if (bRefresh)
+    {
+        for (int i=0,sz=widgets.GetSize(); i<sz; i++)
+        {
+            CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)widgets.GetAt(i);
+            ASSERT(pWidget != NULL);
 
-			CPDFSDK_InterForm * pInterForm = pWidget->GetInterForm();
-			CPDFSDK_Document* pDoc = pInterForm->GetDocument();
-// 			CReader_Page* pPage = pWidget->GetPage();
- 			ASSERT(pDoc != NULL);
-			pDoc->UpdateAllViews(NULL, pWidget);
-		}
-	}
+            CPDFSDK_InterForm * pInterForm = pWidget->GetInterForm();
+            CPDFSDK_Document* pDoc = pInterForm->GetDocument();
+//          CReader_Page* pPage = pWidget->GetPage();
+            ASSERT(pDoc != NULL);
+            pDoc->UpdateAllViews(NULL, pWidget);
+        }
+    }
 
-	if (bChangeMark)
-		pDocument->SetChangeMark();
+    if (bChangeMark)
+        pDocument->SetChangeMark();
 }
 
 void Field::UpdateFormControl(CPDFSDK_Document* pDocument, CPDF_FormControl* pFormControl,
-							FX_BOOL bChangeMark, FX_BOOL bResetAP, FX_BOOL bRefresh)
+                            FX_BOOL bChangeMark, FX_BOOL bResetAP, FX_BOOL bRefresh)
 {
-	ASSERT(pDocument != NULL);
-	ASSERT(pFormControl != NULL);
+    ASSERT(pDocument != NULL);
+    ASSERT(pFormControl != NULL);
 
-	CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
-	ASSERT(pInterForm != NULL);
+    CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
+    ASSERT(pInterForm != NULL);
 
-	CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl);
+    CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl);
 
-	if (pWidget)
-	{
-		if (bResetAP)
-		{
-			int nFieldType = pWidget->GetFieldType();
-			if (nFieldType == FIELDTYPE_COMBOBOX || nFieldType == FIELDTYPE_TEXTFIELD)
-			{
-				FX_BOOL bFormated = FALSE;
-				CFX_WideString sValue = pWidget->OnFormat(bFormated);
-				if (bFormated)
-					pWidget->ResetAppearance(sValue.c_str(), FALSE);
-				else
-					pWidget->ResetAppearance(NULL, FALSE);
-			}
-			else
-			{
-				pWidget->ResetAppearance(NULL, FALSE);
-			}
-		}
+    if (pWidget)
+    {
+        if (bResetAP)
+        {
+            int nFieldType = pWidget->GetFieldType();
+            if (nFieldType == FIELDTYPE_COMBOBOX || nFieldType == FIELDTYPE_TEXTFIELD)
+            {
+                FX_BOOL bFormated = FALSE;
+                CFX_WideString sValue = pWidget->OnFormat(bFormated);
+                if (bFormated)
+                    pWidget->ResetAppearance(sValue.c_str(), FALSE);
+                else
+                    pWidget->ResetAppearance(NULL, FALSE);
+            }
+            else
+            {
+                pWidget->ResetAppearance(NULL, FALSE);
+            }
+        }
 
-		if (bRefresh)
-		{
-			CPDFSDK_InterForm * pInterForm = pWidget->GetInterForm();
-			CPDFSDK_Document* pDoc = pInterForm->GetDocument();
-			ASSERT(pDoc != NULL);
-			pDoc->UpdateAllViews(NULL, pWidget);
-		}
+        if (bRefresh)
+        {
+            CPDFSDK_InterForm * pInterForm = pWidget->GetInterForm();
+            CPDFSDK_Document* pDoc = pInterForm->GetDocument();
+            ASSERT(pDoc != NULL);
+            pDoc->UpdateAllViews(NULL, pWidget);
+        }
 
-	}
+    }
 
-	if (bChangeMark)
-		pDocument->SetChangeMark();
+    if (bChangeMark)
+        pDocument->SetChangeMark();
 }
 
 CPDFSDK_Widget* Field::GetWidget(CPDFSDK_Document* pDocument, CPDF_FormControl* pFormControl)
 {
-	ASSERT(pDocument != NULL);
-	ASSERT(pFormControl != NULL);
+    ASSERT(pDocument != NULL);
+    ASSERT(pFormControl != NULL);
 
-	CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
-	ASSERT(pInterForm != NULL);
+    CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
+    ASSERT(pInterForm != NULL);
 
-	return pInterForm->GetWidget(pFormControl);
+    return pInterForm->GetWidget(pFormControl);
 }
 
 FX_BOOL Field::ValueIsOccur(CPDF_FormField* pFormField, CFX_WideString csOptLabel)
 {
-	ASSERT(pFormField != NULL);
+    ASSERT(pFormField != NULL);
 
-	for (int i=0,sz = pFormField->CountOptions(); i < sz; i++)
-	{
-		if (csOptLabel.Compare(pFormField->GetOptionLabel(i)) == 0)
-			return TRUE;
-	}
+    for (int i=0,sz = pFormField->CountOptions(); i < sz; i++)
+    {
+        if (csOptLabel.Compare(pFormField->GetOptionLabel(i)) == 0)
+            return TRUE;
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
 CPDF_FormControl* Field::GetSmartFieldControl(CPDF_FormField* pFormField)
 {
-	ASSERT(pFormField != NULL);
-	if(!pFormField->CountControls() || m_nFormControlIndex>=pFormField->CountControls()) return NULL;
+    if (!pFormField->CountControls() || m_nFormControlIndex >= pFormField->CountControls())
+        return NULL;
 
-	if (m_nFormControlIndex<0)
-		return pFormField->GetControl(0);
-	else
-		return pFormField->GetControl(m_nFormControlIndex);
+    if (m_nFormControlIndex < 0)
+        return pFormField->GetControl(0);
+
+    return pFormField->GetControl(m_nFormControlIndex);
 }
 
 /* ---------------------------------------- property ---------------------------------------- */
 
 FX_BOOL Field::alignment(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		CFX_ByteString alignStr;
-		vp >> alignStr;
+        CFX_ByteString alignStr;
+        vp >> alignStr;
 
-		if (m_bDelay)
-		{
-			AddDelay_String(FP_ALIGNMENT, alignStr);
-		}
-		else
-		{
-			Field::SetAlignment(m_pDocument, m_FieldName, m_nFormControlIndex, alignStr);
-		}
-	}
-	else
-	{
-		CFX_PtrArray FieldArray;
-		GetFormFields(m_FieldName, FieldArray);
-		if (FieldArray.GetSize() <= 0) return FALSE;
+        if (m_bDelay)
+        {
+            AddDelay_String(FP_ALIGNMENT, alignStr);
+        }
+        else
+        {
+            Field::SetAlignment(m_pDocument, m_FieldName, m_nFormControlIndex, alignStr);
+        }
+    }
+    else
+    {
+        CFX_PtrArray FieldArray;
+        GetFormFields(m_FieldName, FieldArray);
+        if (FieldArray.GetSize() <= 0) return FALSE;
 
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
-			return FALSE;
+        if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
+            return FALSE;
 
-		CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
-		if (!pFormControl)return FALSE;
+        CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+        if (!pFormControl)return FALSE;
 
-		switch (pFormControl->GetControlAlignment())
-		{
-			case 1:
-				vp << L"center";
-				break;
-			case 0:
-				vp << L"left";
-				break;
-			case 2:
-				vp << L"right";
-				break;
-			default:
-				vp << L"";
-		}
-	}
+        switch (pFormControl->GetControlAlignment())
+        {
+            case 1:
+                vp << L"center";
+                break;
+            case 0:
+                vp << L"left";
+                break;
+            case 2:
+                vp << L"right";
+                break;
+            default:
+                vp << L"";
+        }
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 void Field::SetAlignment(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex,
-						 const CFX_ByteString& string)
+                         const CFX_ByteString& string)
 {
-	//Not supported.
+    //Not supported.
 }
 
 FX_BOOL Field::borderStyle(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		CFX_ByteString strType = "";
-		vp >> strType;
+        CFX_ByteString strType = "";
+        vp >> strType;
 
-		if (m_bDelay)
-		{
-			AddDelay_String(FP_BORDERSTYLE, strType);
-		}
-		else
-		{
-			Field::SetBorderStyle(m_pDocument, m_FieldName, m_nFormControlIndex, strType);
-		}
-	}
-	else
-	{
-		CFX_PtrArray FieldArray;
-		GetFormFields(m_FieldName, FieldArray);
-		if (FieldArray.GetSize() <= 0) return FALSE;
+        if (m_bDelay)
+        {
+            AddDelay_String(FP_BORDERSTYLE, strType);
+        }
+        else
+        {
+            Field::SetBorderStyle(m_pDocument, m_FieldName, m_nFormControlIndex, strType);
+        }
+    }
+    else
+    {
+        CFX_PtrArray FieldArray;
+        GetFormFields(m_FieldName, FieldArray);
+        if (FieldArray.GetSize() <= 0) return FALSE;
 
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		if (!pFormField) return FALSE;
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        if (!pFormField) return FALSE;
 
-		CPDFSDK_Widget* pWidget = GetWidget(m_pDocument, GetSmartFieldControl(pFormField));
-		if (!pWidget) return FALSE;
+        CPDFSDK_Widget* pWidget = GetWidget(m_pDocument, GetSmartFieldControl(pFormField));
+        if (!pWidget) return FALSE;
 
-		int nBorderstyle = pWidget->GetBorderStyle();
+        int nBorderstyle = pWidget->GetBorderStyle();
 
-		switch (nBorderstyle)
-		{
-			case BBS_SOLID:
-				vp << L"solid";
-				break;
-			case BBS_DASH:
-				vp << L"dashed";
-				break;
-			case BBS_BEVELED:
-				vp << L"beveled";
-				break;
-			case BBS_INSET:
-				vp << L"inset";
-				break;
-			case BBS_UNDERLINE:
-				vp << L"underline";
-				break;
-			default:
-				vp << L"";
-				break;
-		}
-	}
+        switch (nBorderstyle)
+        {
+            case BBS_SOLID:
+                vp << L"solid";
+                break;
+            case BBS_DASH:
+                vp << L"dashed";
+                break;
+            case BBS_BEVELED:
+                vp << L"beveled";
+                break;
+            case BBS_INSET:
+                vp << L"inset";
+                break;
+            case BBS_UNDERLINE:
+                vp << L"underline";
+                break;
+            default:
+                vp << L"";
+                break;
+        }
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 void Field::SetBorderStyle(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex,
-						   const CFX_ByteString& string)
+                           const CFX_ByteString& string)
 {
-	ASSERT(pDocument != NULL);
+    ASSERT(pDocument != NULL);
 
-	int nBorderStyle = 0;
+    int nBorderStyle = 0;
 
-	if (string == "solid")
-		nBorderStyle = BBS_SOLID;
-	else if (string == "beveled")
-		nBorderStyle = BBS_BEVELED;
-	else if (string == "dashed")
-		nBorderStyle = BBS_DASH;
-	else if (string == "inset")
-		nBorderStyle = BBS_INSET;
-	else if (string == "underline")
-		nBorderStyle = BBS_UNDERLINE;
-	else return;
+    if (string == "solid")
+        nBorderStyle = BBS_SOLID;
+    else if (string == "beveled")
+        nBorderStyle = BBS_BEVELED;
+    else if (string == "dashed")
+        nBorderStyle = BBS_DASH;
+    else if (string == "inset")
+        nBorderStyle = BBS_INSET;
+    else if (string == "underline")
+        nBorderStyle = BBS_UNDERLINE;
+    else return;
 
-	CFX_PtrArray FieldArray;
-	GetFormFields(pDocument, swFieldName, FieldArray);
+    CFX_PtrArray FieldArray;
+    GetFormFields(pDocument, swFieldName, FieldArray);
 
-	for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
-	{
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
-		ASSERT(pFormField != NULL);
+    for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
+    {
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
+        ASSERT(pFormField != NULL);
 
-		if (nControlIndex < 0)
-		{
-			FX_BOOL bSet = FALSE;
-			for (int j=0,jsz = pFormField->CountControls(); j<jsz; j++)
-			{
-				if (CPDFSDK_Widget* pWidget = GetWidget(pDocument, pFormField->GetControl(j)))
-				{
-					if (pWidget->GetBorderStyle() != nBorderStyle)
-					{
-						pWidget->SetBorderStyle(nBorderStyle);
-						bSet = TRUE;
-					}
-				}
-			}
-			if (bSet) UpdateFormField(pDocument, pFormField, TRUE, TRUE, TRUE);
-		}
-		else
-		{
-			if(nControlIndex >= pFormField->CountControls()) return;
-			if (CPDF_FormControl* pFormControl = pFormField->GetControl(nControlIndex))
-			{
-				if (CPDFSDK_Widget* pWidget = GetWidget(pDocument, pFormControl))
-				{
-					if (pWidget->GetBorderStyle() != nBorderStyle)
-					{
-						pWidget->SetBorderStyle(nBorderStyle);
-						UpdateFormControl(pDocument, pFormControl, TRUE, TRUE, TRUE);
-					}
-				}
-			}
-		}
-	}
+        if (nControlIndex < 0)
+        {
+            FX_BOOL bSet = FALSE;
+            for (int j=0,jsz = pFormField->CountControls(); j<jsz; j++)
+            {
+                if (CPDFSDK_Widget* pWidget = GetWidget(pDocument, pFormField->GetControl(j)))
+                {
+                    if (pWidget->GetBorderStyle() != nBorderStyle)
+                    {
+                        pWidget->SetBorderStyle(nBorderStyle);
+                        bSet = TRUE;
+                    }
+                }
+            }
+            if (bSet) UpdateFormField(pDocument, pFormField, TRUE, TRUE, TRUE);
+        }
+        else
+        {
+            if(nControlIndex >= pFormField->CountControls()) return;
+            if (CPDF_FormControl* pFormControl = pFormField->GetControl(nControlIndex))
+            {
+                if (CPDFSDK_Widget* pWidget = GetWidget(pDocument, pFormControl))
+                {
+                    if (pWidget->GetBorderStyle() != nBorderStyle)
+                    {
+                        pWidget->SetBorderStyle(nBorderStyle);
+                        UpdateFormControl(pDocument, pFormControl, TRUE, TRUE, TRUE);
+                    }
+                }
+            }
+        }
+    }
 }
 
 FX_BOOL Field::buttonAlignX(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		int nVP;
-		vp >> nVP;
+        int nVP;
+        vp >> nVP;
 
-		if (m_bDelay)
-		{
-			AddDelay_Int(FP_BUTTONALIGNX, nVP);
-		}
-		else
-		{
-			Field::SetButtonAlignX(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
-		}
-	}
-	else
-	{
-		CFX_PtrArray FieldArray;
-		GetFormFields(m_FieldName,FieldArray);
-		if (FieldArray.GetSize() <= 0) return FALSE;
+        if (m_bDelay)
+        {
+            AddDelay_Int(FP_BUTTONALIGNX, nVP);
+        }
+        else
+        {
+            Field::SetButtonAlignX(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
+        }
+    }
+    else
+    {
+        CFX_PtrArray FieldArray;
+        GetFormFields(m_FieldName,FieldArray);
+        if (FieldArray.GetSize() <= 0) return FALSE;
 
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
-			return FALSE;
+        if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
+            return FALSE;
 
-		CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
-		if (!pFormControl)return FALSE;
+        CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+        if (!pFormControl)return FALSE;
 
-		CPDF_IconFit IconFit = pFormControl->GetIconFit();
+        CPDF_IconFit IconFit = pFormControl->GetIconFit();
 
-		FX_FLOAT fLeft,fBottom;
-		IconFit.GetIconPosition(fLeft,fBottom);
+        FX_FLOAT fLeft,fBottom;
+        IconFit.GetIconPosition(fLeft,fBottom);
 
-		vp << (int32_t)fLeft;
-	}
+        vp << (int32_t)fLeft;
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 void Field::SetButtonAlignX(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
 {
-	//Not supported.
+    //Not supported.
 }
 
 FX_BOOL Field::buttonAlignY(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		int nVP;
-		vp >> nVP;
+        int nVP;
+        vp >> nVP;
 
-		if (m_bDelay)
-		{
-			AddDelay_Int(FP_BUTTONALIGNY, nVP);
-		}
-		else
-		{
-			Field::SetButtonAlignY(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
-		}
-	}
-	else
-	{
-		CFX_PtrArray FieldArray;
-		GetFormFields(m_FieldName,FieldArray);
-		if (FieldArray.GetSize() <= 0) return FALSE;
+        if (m_bDelay)
+        {
+            AddDelay_Int(FP_BUTTONALIGNY, nVP);
+        }
+        else
+        {
+            Field::SetButtonAlignY(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
+        }
+    }
+    else
+    {
+        CFX_PtrArray FieldArray;
+        GetFormFields(m_FieldName,FieldArray);
+        if (FieldArray.GetSize() <= 0) return FALSE;
 
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
-			return FALSE;
+        if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
+            return FALSE;
 
-		CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
-		if (!pFormControl)return FALSE;
+        CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+        if (!pFormControl)return FALSE;
 
-		CPDF_IconFit IconFit = pFormControl->GetIconFit();
+        CPDF_IconFit IconFit = pFormControl->GetIconFit();
 
-		FX_FLOAT fLeft,fBottom;
-		IconFit.GetIconPosition(fLeft,fBottom);
+        FX_FLOAT fLeft,fBottom;
+        IconFit.GetIconPosition(fLeft,fBottom);
 
-		vp <<  (int32_t)fBottom;
-	}
+        vp <<  (int32_t)fBottom;
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 void Field::SetButtonAlignY(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
 {
-	//Not supported.
+    //Not supported.
 }
 
 FX_BOOL Field::buttonFitBounds(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		bool bVP;
-		vp >> bVP;
+        bool bVP;
+        vp >> bVP;
 
-		if (m_bDelay)
-		{
-			AddDelay_Bool(FP_BUTTONFITBOUNDS, bVP);
-		}
-		else
-		{
-			Field::SetButtonFitBounds(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
-		}
-	}
-	else
-	{
-		CFX_PtrArray FieldArray;
-		GetFormFields(m_FieldName,FieldArray);
-		if (FieldArray.GetSize() <= 0) return FALSE;
+        if (m_bDelay)
+        {
+            AddDelay_Bool(FP_BUTTONFITBOUNDS, bVP);
+        }
+        else
+        {
+            Field::SetButtonFitBounds(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
+        }
+    }
+    else
+    {
+        CFX_PtrArray FieldArray;
+        GetFormFields(m_FieldName,FieldArray);
+        if (FieldArray.GetSize() <= 0) return FALSE;
 
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
-			return FALSE;
+        if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
+            return FALSE;
 
-		CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
-		if (!pFormControl)return FALSE;
+        CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+        if (!pFormControl)return FALSE;
 
-		CPDF_IconFit IconFit = pFormControl->GetIconFit();
-		vp << IconFit.GetFittingBounds();
-	}
+        CPDF_IconFit IconFit = pFormControl->GetIconFit();
+        vp << IconFit.GetFittingBounds();
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 void Field::SetButtonFitBounds(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)
 {
-	//Not supported.
+    //Not supported.
 }
 
 FX_BOOL Field::buttonPosition(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		int nVP;
-		vp >> nVP;
+        int nVP;
+        vp >> nVP;
 
-		if (m_bDelay)
-		{
-			AddDelay_Int(FP_BUTTONPOSITION, nVP);
-		}
-		else
-		{
-			Field::SetButtonPosition(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
-		}
-	}
-	else
-	{
-		CFX_PtrArray FieldArray;
-		GetFormFields(m_FieldName,FieldArray);
-		if (FieldArray.GetSize() <= 0) return FALSE;
+        if (m_bDelay)
+        {
+            AddDelay_Int(FP_BUTTONPOSITION, nVP);
+        }
+        else
+        {
+            Field::SetButtonPosition(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
+        }
+    }
+    else
+    {
+        CFX_PtrArray FieldArray;
+        GetFormFields(m_FieldName,FieldArray);
+        if (FieldArray.GetSize() <= 0) return FALSE;
 
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
-			return FALSE;
+        if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
+            return FALSE;
 
-		CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
-		if (!pFormControl)return FALSE;
+        CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+        if (!pFormControl)return FALSE;
 
-		vp <<  pFormControl->GetTextPosition();
-	}
-	return TRUE;
+        vp <<  pFormControl->GetTextPosition();
+    }
+    return TRUE;
 }
 
 void Field::SetButtonPosition(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
 {
-	//Not supported.
+    //Not supported.
 }
 
 FX_BOOL Field::buttonScaleHow(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		int nVP;
-		vp >> nVP;
+        int nVP;
+        vp >> nVP;
 
-		if (m_bDelay)
-		{
-			AddDelay_Int(FP_BUTTONSCALEHOW, nVP);
-		}
-		else
-		{
-			Field::SetButtonScaleHow(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
-		}
-	}
-	else
-	{
-		CFX_PtrArray FieldArray;
-		GetFormFields(m_FieldName, FieldArray);
-		if (FieldArray.GetSize() <= 0) return FALSE;
+        if (m_bDelay)
+        {
+            AddDelay_Int(FP_BUTTONSCALEHOW, nVP);
+        }
+        else
+        {
+            Field::SetButtonScaleHow(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
+        }
+    }
+    else
+    {
+        CFX_PtrArray FieldArray;
+        GetFormFields(m_FieldName, FieldArray);
+        if (FieldArray.GetSize() <= 0) return FALSE;
 
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
-			return FALSE;
+        if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
+            return FALSE;
 
-		CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
-		if (!pFormControl)return FALSE;
+        CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+        if (!pFormControl)return FALSE;
 
-		CPDF_IconFit IconFit = pFormControl->GetIconFit();
-		if (IconFit.IsProportionalScale())
-			vp << (int32_t)0;
-		else
-			vp << (int32_t)1;
-	}
+        CPDF_IconFit IconFit = pFormControl->GetIconFit();
+        if (IconFit.IsProportionalScale())
+            vp << (int32_t)0;
+        else
+            vp << (int32_t)1;
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 void Field::SetButtonScaleHow(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
 {
-	//Not supported.
+    //Not supported.
 }
 
 FX_BOOL Field::buttonScaleWhen(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		int nVP;
-		vp >> nVP;
+        int nVP;
+        vp >> nVP;
 
-		if (m_bDelay)
-		{
-			AddDelay_Int(FP_BUTTONSCALEWHEN, nVP);
-		}
-		else
-		{
-			Field::SetButtonScaleWhen(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
-		}
-	}
-	else
-	{
-		CFX_PtrArray FieldArray;
-		GetFormFields(m_FieldName,FieldArray);
-		if (FieldArray.GetSize() <= 0) return FALSE;
+        if (m_bDelay)
+        {
+            AddDelay_Int(FP_BUTTONSCALEWHEN, nVP);
+        }
+        else
+        {
+            Field::SetButtonScaleWhen(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
+        }
+    }
+    else
+    {
+        CFX_PtrArray FieldArray;
+        GetFormFields(m_FieldName,FieldArray);
+        if (FieldArray.GetSize() <= 0) return FALSE;
 
-		CPDF_FormField* pFormField = (CPDF_FormField*) FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+        CPDF_FormField* pFormField = (CPDF_FormField*) FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
-			return FALSE;
+        if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
+            return FALSE;
 
-		CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
-		if (!pFormControl) return FALSE;
+        CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+        if (!pFormControl) return FALSE;
 
-		CPDF_IconFit IconFit = pFormControl->GetIconFit();
-		int ScaleM = IconFit.GetScaleMethod();
-		switch (ScaleM)
-		{
-			case CPDF_IconFit::Always :
-				vp <<  (int32_t) CPDF_IconFit::Always;
-				break;
-			case CPDF_IconFit::Bigger :
-				vp <<  (int32_t) CPDF_IconFit::Bigger;
-				break;
-			case CPDF_IconFit::Never :
-				vp <<  (int32_t) CPDF_IconFit::Never;
-				break;
-			case CPDF_IconFit::Smaller :
-				vp <<  (int32_t) CPDF_IconFit::Smaller;
-				break;
-		}
-	}
+        CPDF_IconFit IconFit = pFormControl->GetIconFit();
+        int ScaleM = IconFit.GetScaleMethod();
+        switch (ScaleM)
+        {
+            case CPDF_IconFit::Always :
+                vp <<  (int32_t) CPDF_IconFit::Always;
+                break;
+            case CPDF_IconFit::Bigger :
+                vp <<  (int32_t) CPDF_IconFit::Bigger;
+                break;
+            case CPDF_IconFit::Never :
+                vp <<  (int32_t) CPDF_IconFit::Never;
+                break;
+            case CPDF_IconFit::Smaller :
+                vp <<  (int32_t) CPDF_IconFit::Smaller;
+                break;
+        }
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 void Field::SetButtonScaleWhen(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
 {
-	//Not supported.
+    //Not supported.
 }
 
 FX_BOOL Field::calcOrderIndex(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		int nVP;
-		vp >> nVP;
+        int nVP;
+        vp >> nVP;
 
-		if (m_bDelay)
-		{
-			AddDelay_Int(FP_CALCORDERINDEX, nVP);
-		}
-		else
-		{
-			Field::SetCalcOrderIndex(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
-		}
-	}
-	else
-	{
-		CFX_PtrArray FieldArray;
-		GetFormFields(m_FieldName, FieldArray);
-		if (FieldArray.GetSize() <= 0) return FALSE;
+        if (m_bDelay)
+        {
+            AddDelay_Int(FP_CALCORDERINDEX, nVP);
+        }
+        else
+        {
+            Field::SetCalcOrderIndex(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
+        }
+    }
+    else
+    {
+        CFX_PtrArray FieldArray;
+        GetFormFields(m_FieldName, FieldArray);
+        if (FieldArray.GetSize() <= 0) return FALSE;
 
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX && pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
-			return FALSE;
+        if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX && pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
+            return FALSE;
 
-		CPDFSDK_InterForm* pRDInterForm = m_pDocument->GetInterForm();
-		ASSERT(pRDInterForm != NULL);
+        CPDFSDK_InterForm* pRDInterForm = m_pDocument->GetInterForm();
+        ASSERT(pRDInterForm != NULL);
 
-		CPDF_InterForm* pInterForm = pRDInterForm->GetInterForm();
-		ASSERT(pInterForm != NULL);
+        CPDF_InterForm* pInterForm = pRDInterForm->GetInterForm();
+        ASSERT(pInterForm != NULL);
 
-		vp << (int32_t)pInterForm->FindFieldInCalculationOrder(pFormField);
-	}
+        vp << (int32_t)pInterForm->FindFieldInCalculationOrder(pFormField);
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 void Field::SetCalcOrderIndex(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
 {
-	//Not supported.
+    //Not supported.
 }
 
 FX_BOOL Field::charLimit(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		int nVP;
-		vp >> nVP;
+        int nVP;
+        vp >> nVP;
 
-		if (m_bDelay)
-		{
-			AddDelay_Int(FP_CHARLIMIT, nVP);
-		}
-		else
-		{
-			Field::SetCharLimit(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
-		}
-	}
-	else
-	{
-		CFX_PtrArray FieldArray;
-		GetFormFields(m_FieldName, FieldArray);
-		if (FieldArray.GetSize() <= 0) return FALSE;
+        if (m_bDelay)
+        {
+            AddDelay_Int(FP_CHARLIMIT, nVP);
+        }
+        else
+        {
+            Field::SetCharLimit(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
+        }
+    }
+    else
+    {
+        CFX_PtrArray FieldArray;
+        GetFormFields(m_FieldName, FieldArray);
+        if (FieldArray.GetSize() <= 0) return FALSE;
 
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
-			return FALSE;
+        if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
+            return FALSE;
 
-		vp << (int32_t)pFormField->GetMaxLen();
-	}
-	return TRUE;
+        vp << (int32_t)pFormField->GetMaxLen();
+    }
+    return TRUE;
 }
 
 void Field::SetCharLimit(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
 {
-	//Not supported.
+    //Not supported.
 }
 
 FX_BOOL Field::comb(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		bool bVP;
-		vp >> bVP;
+        bool bVP;
+        vp >> bVP;
 
-		if (m_bDelay)
-		{
-			AddDelay_Bool(FP_COMB, bVP);
-		}
-		else
-		{
-			Field::SetComb(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
-		}
-	}
-	else
-	{
-		CFX_PtrArray FieldArray;
-		GetFormFields(m_FieldName,FieldArray);
-		if (FieldArray.GetSize() <= 0) return FALSE;
+        if (m_bDelay)
+        {
+            AddDelay_Bool(FP_COMB, bVP);
+        }
+        else
+        {
+            Field::SetComb(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
+        }
+    }
+    else
+    {
+        CFX_PtrArray FieldArray;
+        GetFormFields(m_FieldName,FieldArray);
+        if (FieldArray.GetSize() <= 0) return FALSE;
 
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
-			return FALSE;
+        if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
+            return FALSE;
 
-		if (pFormField->GetFieldFlags() & FIELDFLAG_COMB)
-			vp << true;
-		else
-			vp << false;
-	}
+        if (pFormField->GetFieldFlags() & FIELDFLAG_COMB)
+            vp << true;
+        else
+            vp << false;
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 void Field::SetComb(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)
 {
-	//Not supported.
+    //Not supported.
 }
 
 FX_BOOL Field::commitOnSelChange(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		bool bVP;
-		vp >> bVP;
+        bool bVP;
+        vp >> bVP;
 
-		if (m_bDelay)
-		{
-			AddDelay_Bool(FP_COMMITONSELCHANGE, bVP);
-		}
-		else
-		{
-			Field::SetCommitOnSelChange(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
-		}
-	}
-	else
-	{
-		CFX_PtrArray FieldArray;
-		GetFormFields(m_FieldName,FieldArray);
-		if (FieldArray.GetSize() <= 0) return FALSE;
+        if (m_bDelay)
+        {
+            AddDelay_Bool(FP_COMMITONSELCHANGE, bVP);
+        }
+        else
+        {
+            Field::SetCommitOnSelChange(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
+        }
+    }
+    else
+    {
+        CFX_PtrArray FieldArray;
+        GetFormFields(m_FieldName,FieldArray);
+        if (FieldArray.GetSize() <= 0) return FALSE;
 
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX && pFormField->GetFieldType() != FIELDTYPE_LISTBOX)
-			return FALSE;
+        if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX && pFormField->GetFieldType() != FIELDTYPE_LISTBOX)
+            return FALSE;
 
-		if (pFormField->GetFieldFlags() & FIELDFLAG_COMMITONSELCHANGE)
-			vp << true;
-		else
-			vp << false;
-	}
+        if (pFormField->GetFieldFlags() & FIELDFLAG_COMMITONSELCHANGE)
+            vp << true;
+        else
+            vp << false;
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 void Field::SetCommitOnSelChange(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)
 {
-	//Not supported.
+    //Not supported.
 }
 
 FX_BOOL Field::currentValueIndices(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		CFX_DWordArray array;
+        CFX_DWordArray array;
 
-		if (vp.GetType() == VT_number)
-		{
-			int iSelecting = 0;
-			vp >> iSelecting;
-			array.Add(iSelecting);
-		}
-		else if (vp.IsArrayObject())
-		{
-			CJS_Array SelArray(m_isolate);
-			CJS_Value SelValue(m_isolate);
-			int iSelecting;
-			vp >> SelArray;
-			for (int i=0,sz=SelArray.GetLength(); i<sz; i++)
-			{
-				SelArray.GetElement(i,SelValue);
-				iSelecting = SelValue.ToInt();
-				array.Add(iSelecting);
-			}
-		}
+        if (vp.GetType() == VT_number)
+        {
+            int iSelecting = 0;
+            vp >> iSelecting;
+            array.Add(iSelecting);
+        }
+        else if (vp.IsArrayObject())
+        {
+            CJS_Array SelArray(m_isolate);
+            CJS_Value SelValue(m_isolate);
+            int iSelecting;
+            vp >> SelArray;
+            for (int i=0,sz=SelArray.GetLength(); i<sz; i++)
+            {
+                SelArray.GetElement(i,SelValue);
+                iSelecting = SelValue.ToInt();
+                array.Add(iSelecting);
+            }
+        }
 
-		if (m_bDelay)
-		{
-			AddDelay_WordArray(FP_CURRENTVALUEINDICES, array);
-		}
-		else
-		{
-			Field::SetCurrentValueIndices(m_pDocument, m_FieldName, m_nFormControlIndex, array);
-		}
-	}
-	else
-	{
-		CFX_PtrArray FieldArray;
-		GetFormFields(m_FieldName,FieldArray);
-		if (FieldArray.GetSize() <= 0) return FALSE;
+        if (m_bDelay)
+        {
+            AddDelay_WordArray(FP_CURRENTVALUEINDICES, array);
+        }
+        else
+        {
+            Field::SetCurrentValueIndices(m_pDocument, m_FieldName, m_nFormControlIndex, array);
+        }
+    }
+    else
+    {
+        CFX_PtrArray FieldArray;
+        GetFormFields(m_FieldName,FieldArray);
+        if (FieldArray.GetSize() <= 0) return FALSE;
 
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX && pFormField->GetFieldType() != FIELDTYPE_LISTBOX)
-			return FALSE;
+        if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX && pFormField->GetFieldType() != FIELDTYPE_LISTBOX)
+            return FALSE;
 
-		if (pFormField->CountSelectedItems() == 1)
-			vp << pFormField->GetSelectedIndex(0);
-		else if (pFormField->CountSelectedItems() > 1)
-		{
-			CJS_Array SelArray(m_isolate);
-			for (int i=0,sz=pFormField->CountSelectedItems(); i<sz; i++)
-			{
-				SelArray.SetElement(i, CJS_Value(m_isolate,pFormField->GetSelectedIndex(i)));
-			}
-			vp << SelArray;
-		}
-		else
-			vp << -1;
-	}
+        if (pFormField->CountSelectedItems() == 1)
+            vp << pFormField->GetSelectedIndex(0);
+        else if (pFormField->CountSelectedItems() > 1)
+        {
+            CJS_Array SelArray(m_isolate);
+            for (int i=0,sz=pFormField->CountSelectedItems(); i<sz; i++)
+            {
+                SelArray.SetElement(i, CJS_Value(m_isolate,pFormField->GetSelectedIndex(i)));
+            }
+            vp << SelArray;
+        }
+        else
+            vp << -1;
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 void Field::SetCurrentValueIndices(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex,
-								   const CFX_DWordArray& array)
+                                   const CFX_DWordArray& array)
 {
-	ASSERT(pDocument != NULL);
+    ASSERT(pDocument != NULL);
 
-	CFX_PtrArray FieldArray;
-	GetFormFields(pDocument, swFieldName, FieldArray);
+    CFX_PtrArray FieldArray;
+    GetFormFields(pDocument, swFieldName, FieldArray);
 
-	for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
-	{
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
-		ASSERT(pFormField != NULL);
+    for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
+    {
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
+        ASSERT(pFormField != NULL);
 
-		int nFieldType = pFormField->GetFieldType();
-		if (nFieldType == FIELDTYPE_COMBOBOX || nFieldType == FIELDTYPE_LISTBOX)
-		{
-			FX_DWORD dwFieldFlags = pFormField->GetFieldFlags();
-			pFormField->ClearSelection(TRUE);
+        int nFieldType = pFormField->GetFieldType();
+        if (nFieldType == FIELDTYPE_COMBOBOX || nFieldType == FIELDTYPE_LISTBOX)
+        {
+            FX_DWORD dwFieldFlags = pFormField->GetFieldFlags();
+            pFormField->ClearSelection(TRUE);
 
-			for (int i=0,sz=array.GetSize(); i<sz; i++)
-			{
-				if (i>0 && !(dwFieldFlags & (1<<21)))
-				{
-					break;
-				}
+            for (int i=0,sz=array.GetSize(); i<sz; i++)
+            {
+                if (i>0 && !(dwFieldFlags & (1<<21)))
+                {
+                    break;
+                }
 
-				int iSelecting = (int32_t)array.GetAt(i);
-				if (iSelecting < pFormField->CountOptions() && !pFormField->IsItemSelected(iSelecting))
-					pFormField->SetItemSelection(iSelecting, TRUE);
+                int iSelecting = (int32_t)array.GetAt(i);
+                if (iSelecting < pFormField->CountOptions() && !pFormField->IsItemSelected(iSelecting))
+                    pFormField->SetItemSelection(iSelecting, TRUE);
 
-			}
-			UpdateFormField(pDocument, pFormField, TRUE, TRUE, TRUE);
-		}
-	}
+            }
+            UpdateFormField(pDocument, pFormField, TRUE, TRUE, TRUE);
+        }
+    }
 }
 
 FX_BOOL Field::defaultStyle(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	// MQG sError = JSGetStringFromID(IDS_STRING_NOTSUPPORT);
-	return FALSE;
+    // MQG sError = JSGetStringFromID(IDS_STRING_NOTSUPPORT);
+    return FALSE;
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		;
-	}
-	else
-	{
-		;
-	}
-	return TRUE;
+        ;
+    }
+    else
+    {
+        ;
+    }
+    return TRUE;
 }
 
 void Field::SetDefaultStyle(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex)
 {
-	//Not supported.
+    //Not supported.
 }
 
 FX_BOOL Field::defaultValue(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		CFX_WideString WideStr;
-		vp >> WideStr;
+        CFX_WideString WideStr;
+        vp >> WideStr;
 
-		if (m_bDelay)
-		{
-			AddDelay_WideString(FP_DEFAULTVALUE, WideStr);
-		}
-		else
-		{
-			Field::SetDefaultValue(m_pDocument, m_FieldName, m_nFormControlIndex, WideStr);
-		}
-	}
-	else
-	{
-		CFX_PtrArray FieldArray;
-		GetFormFields(m_FieldName,FieldArray);
-		if (FieldArray.GetSize() <= 0) return FALSE;
+        if (m_bDelay)
+        {
+            AddDelay_WideString(FP_DEFAULTVALUE, WideStr);
+        }
+        else
+        {
+            Field::SetDefaultValue(m_pDocument, m_FieldName, m_nFormControlIndex, WideStr);
+        }
+    }
+    else
+    {
+        CFX_PtrArray FieldArray;
+        GetFormFields(m_FieldName,FieldArray);
+        if (FieldArray.GetSize() <= 0) return FALSE;
 
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		if (pFormField->GetFieldType() == FIELDTYPE_PUSHBUTTON ||
-			pFormField->GetFieldType() == FIELDTYPE_SIGNATURE)
-			return FALSE;
+        if (pFormField->GetFieldType() == FIELDTYPE_PUSHBUTTON ||
+            pFormField->GetFieldType() == FIELDTYPE_SIGNATURE)
+            return FALSE;
 
-		vp << pFormField->GetDefaultValue();
-	}
-	return TRUE;
+        vp << pFormField->GetDefaultValue();
+    }
+    return TRUE;
 }
 
 void Field::SetDefaultValue(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex,
-							const CFX_WideString& string)
+                            const CFX_WideString& string)
 {
-	//Not supported.
+    //Not supported.
 }
 
 FX_BOOL Field::doNotScroll(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		bool bVP;
-		vp >> bVP;
+        bool bVP;
+        vp >> bVP;
 
-		if (m_bDelay)
-		{
-			AddDelay_Bool(FP_DONOTSCROLL, bVP);
-		}
-		else
-		{
-			Field::SetDoNotScroll(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
-		}
-	}
-	else
-	{
-		CFX_PtrArray FieldArray;
-		GetFormFields(m_FieldName,FieldArray);
-		if (FieldArray.GetSize() <= 0) return FALSE;
+        if (m_bDelay)
+        {
+            AddDelay_Bool(FP_DONOTSCROLL, bVP);
+        }
+        else
+        {
+            Field::SetDoNotScroll(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
+        }
+    }
+    else
+    {
+        CFX_PtrArray FieldArray;
+        GetFormFields(m_FieldName,FieldArray);
+        if (FieldArray.GetSize() <= 0) return FALSE;
 
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
-			return FALSE;
+        if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
+            return FALSE;
 
-		if (pFormField->GetFieldFlags() & FIELDFLAG_DONOTSCROLL)
-			vp << true;
-		else
-			vp << false;
-	}
+        if (pFormField->GetFieldFlags() & FIELDFLAG_DONOTSCROLL)
+            vp << true;
+        else
+            vp << false;
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 void Field::SetDoNotScroll(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)
 {
-	//Not supported.
+    //Not supported.
 }
 
 FX_BOOL Field::doNotSpellCheck(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		bool bVP;
-		vp >> bVP;
-	}
-	else
-	{
-		CFX_PtrArray FieldArray;
-		GetFormFields(m_FieldName,FieldArray);
-		if (FieldArray.GetSize() <= 0) return FALSE;
+        bool bVP;
+        vp >> bVP;
+    }
+    else
+    {
+        CFX_PtrArray FieldArray;
+        GetFormFields(m_FieldName,FieldArray);
+        if (FieldArray.GetSize() <= 0) return FALSE;
 
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD &&
-			pFormField->GetFieldType() != FIELDTYPE_COMBOBOX)
-			return FALSE;
+        if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD &&
+            pFormField->GetFieldType() != FIELDTYPE_COMBOBOX)
+            return FALSE;
 
-		if (pFormField->GetFieldFlags() & FIELDFLAG_DONOTSPELLCHECK)
-			vp << true;
-		else
-			vp << false;
-	}
+        if (pFormField->GetFieldFlags() & FIELDFLAG_DONOTSPELLCHECK)
+            vp << true;
+        else
+            vp << false;
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 void Field::SetDelay(FX_BOOL bDelay)
 {
-	m_bDelay = bDelay;
+    m_bDelay = bDelay;
 
-	if (!m_bDelay)
-	{
-		if (m_pJSDoc)
-			m_pJSDoc->DoFieldDelay(m_FieldName, m_nFormControlIndex);
-	}
+    if (!m_bDelay)
+    {
+        if (m_pJSDoc)
+            m_pJSDoc->DoFieldDelay(m_FieldName, m_nFormControlIndex);
+    }
 }
 
 FX_BOOL Field::delay(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		bool bVP;
-		vp >> bVP;
+        bool bVP;
+        vp >> bVP;
 
-		SetDelay(bVP);
-	}
-	else
-	{
-		vp << m_bDelay;
-	}
-	return TRUE;
+        SetDelay(bVP);
+    }
+    else
+    {
+        vp << m_bDelay;
+    }
+    return TRUE;
 }
 
 FX_BOOL Field::display(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		int nVP;
-		vp >> nVP;
+        int nVP;
+        vp >> nVP;
 
-		if (m_bDelay)
-		{
-			AddDelay_Int(FP_DISPLAY, nVP);
-		}
-		else
-		{
-			Field::SetDisplay(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
-		}
-	}
-	else
-	{
-		CFX_PtrArray FieldArray;
-		GetFormFields(m_FieldName,FieldArray);
-		if (FieldArray.GetSize() <= 0) return FALSE;
+        if (m_bDelay)
+        {
+            AddDelay_Int(FP_DISPLAY, nVP);
+        }
+        else
+        {
+            Field::SetDisplay(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
+        }
+    }
+    else
+    {
+        CFX_PtrArray FieldArray;
+        GetFormFields(m_FieldName,FieldArray);
+        if (FieldArray.GetSize() <= 0) return FALSE;
 
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
-		ASSERT(pInterForm != NULL);
+        CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+        ASSERT(pInterForm != NULL);
 
-		CPDFSDK_Widget* pWidget = pInterForm->GetWidget(GetSmartFieldControl(pFormField));
-		if (!pWidget)return FALSE;
+        CPDFSDK_Widget* pWidget = pInterForm->GetWidget(GetSmartFieldControl(pFormField));
+        if (!pWidget)return FALSE;
 
-		FX_DWORD dwFlag = pWidget->GetFlags();
+        FX_DWORD dwFlag = pWidget->GetFlags();
 
-		if (ANNOTFLAG_INVISIBLE & dwFlag || ANNOTFLAG_HIDDEN & dwFlag)
-		{
-			vp << (int32_t)1;
-		}
-		else
-		{
-			if (ANNOTFLAG_PRINT & dwFlag)
-			{
-				if (ANNOTFLAG_NOVIEW & dwFlag)
-				{
-					vp << (int32_t)3;
-				}
-				else
-				{
-					vp << (int32_t)0;
-				}
-			}
-			else
-			{
-				vp << (int32_t)2;
-			}
-		}
-	}
+        if (ANNOTFLAG_INVISIBLE & dwFlag || ANNOTFLAG_HIDDEN & dwFlag)
+        {
+            vp << (int32_t)1;
+        }
+        else
+        {
+            if (ANNOTFLAG_PRINT & dwFlag)
+            {
+                if (ANNOTFLAG_NOVIEW & dwFlag)
+                {
+                    vp << (int32_t)3;
+                }
+                else
+                {
+                    vp << (int32_t)0;
+                }
+            }
+            else
+            {
+                vp << (int32_t)2;
+            }
+        }
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 void Field::SetDisplay(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
 {
-	ASSERT(pDocument != NULL);
+    ASSERT(pDocument != NULL);
 
-	CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
-	ASSERT(pInterForm != NULL);
+    CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
+    ASSERT(pInterForm != NULL);
 
-	CFX_PtrArray FieldArray;
-	GetFormFields(pDocument, swFieldName, FieldArray);
+    CFX_PtrArray FieldArray;
+    GetFormFields(pDocument, swFieldName, FieldArray);
 
-	for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
-	{
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
-		ASSERT(pFormField != NULL);
+    for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
+    {
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
+        ASSERT(pFormField != NULL);
 
-		if (nControlIndex < 0)
-		{
-			FX_BOOL bSet = FALSE;
-			for (int j=0,jsz = pFormField->CountControls(); j<jsz; j++)
-			{
-				CPDF_FormControl* pFormControl = pFormField->GetControl(j);
-				ASSERT(pFormControl != NULL);
+        if (nControlIndex < 0)
+        {
+            FX_BOOL bSet = FALSE;
+            for (int j=0,jsz = pFormField->CountControls(); j<jsz; j++)
+            {
+                CPDF_FormControl* pFormControl = pFormField->GetControl(j);
+                ASSERT(pFormControl != NULL);
 
-				if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))
-				{
-					FX_DWORD dwFlag = pWidget->GetFlags();
-					switch (number)
-					{
-					case 0:
-						dwFlag &= (~ANNOTFLAG_INVISIBLE);
-						dwFlag &= (~ANNOTFLAG_HIDDEN);
-						dwFlag &= (~ANNOTFLAG_NOVIEW);
-						dwFlag |= ANNOTFLAG_PRINT;
-						break;
-					case 1:
-						dwFlag &= (~ANNOTFLAG_INVISIBLE);
-						dwFlag &= (~ANNOTFLAG_NOVIEW);
-						dwFlag |= (ANNOTFLAG_HIDDEN | ANNOTFLAG_PRINT);
-						break;
-					case 2:
-						dwFlag &= (~ANNOTFLAG_INVISIBLE);
-						dwFlag &= (~ANNOTFLAG_PRINT);
-						dwFlag &= (~ANNOTFLAG_HIDDEN);
-						dwFlag &= (~ANNOTFLAG_NOVIEW);
-						break;
-					case 3:
-						dwFlag |= ANNOTFLAG_NOVIEW;
-						dwFlag |= ANNOTFLAG_PRINT;
-						dwFlag &= (~ANNOTFLAG_HIDDEN);
-						break;
-					}
+                if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))
+                {
+                    FX_DWORD dwFlag = pWidget->GetFlags();
+                    switch (number)
+                    {
+                    case 0:
+                        dwFlag &= (~ANNOTFLAG_INVISIBLE);
+                        dwFlag &= (~ANNOTFLAG_HIDDEN);
+                        dwFlag &= (~ANNOTFLAG_NOVIEW);
+                        dwFlag |= ANNOTFLAG_PRINT;
+                        break;
+                    case 1:
+                        dwFlag &= (~ANNOTFLAG_INVISIBLE);
+                        dwFlag &= (~ANNOTFLAG_NOVIEW);
+                        dwFlag |= (ANNOTFLAG_HIDDEN | ANNOTFLAG_PRINT);
+                        break;
+                    case 2:
+                        dwFlag &= (~ANNOTFLAG_INVISIBLE);
+                        dwFlag &= (~ANNOTFLAG_PRINT);
+                        dwFlag &= (~ANNOTFLAG_HIDDEN);
+                        dwFlag &= (~ANNOTFLAG_NOVIEW);
+                        break;
+                    case 3:
+                        dwFlag |= ANNOTFLAG_NOVIEW;
+                        dwFlag |= ANNOTFLAG_PRINT;
+                        dwFlag &= (~ANNOTFLAG_HIDDEN);
+                        break;
+                    }
 
-					if (dwFlag != pWidget->GetFlags())
-					{
-						pWidget->SetFlags(dwFlag);
-						bSet = TRUE;
-					}
-				}
-			}
+                    if (dwFlag != pWidget->GetFlags())
+                    {
+                        pWidget->SetFlags(dwFlag);
+                        bSet = TRUE;
+                    }
+                }
+            }
 
-			if (bSet) UpdateFormField(pDocument, pFormField, TRUE, FALSE, TRUE);
-		}
-		else
-		{
-			if(nControlIndex >= pFormField->CountControls()) return;
-			if (CPDF_FormControl* pFormControl = pFormField->GetControl(nControlIndex))
-			{
-				if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))
-				{
+            if (bSet) UpdateFormField(pDocument, pFormField, TRUE, FALSE, TRUE);
+        }
+        else
+        {
+            if(nControlIndex >= pFormField->CountControls()) return;
+            if (CPDF_FormControl* pFormControl = pFormField->GetControl(nControlIndex))
+            {
+                if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))
+                {
 
-					FX_DWORD dwFlag = pWidget->GetFlags();
-					switch (number)
-					{
-					case 0:
-						dwFlag &= (~ANNOTFLAG_INVISIBLE);
-						dwFlag &= (~ANNOTFLAG_HIDDEN);
-						dwFlag &= (~ANNOTFLAG_NOVIEW);
-						dwFlag |= ANNOTFLAG_PRINT;
-						break;
-					case 1:
-						dwFlag &= (~ANNOTFLAG_INVISIBLE);
-						dwFlag &= (~ANNOTFLAG_NOVIEW);
-						dwFlag |= (ANNOTFLAG_HIDDEN | ANNOTFLAG_PRINT);
-						break;
-					case 2:
-						dwFlag &= (~ANNOTFLAG_INVISIBLE);
-						dwFlag &= (~ANNOTFLAG_PRINT);
-						dwFlag &= (~ANNOTFLAG_HIDDEN);
-						dwFlag &= (~ANNOTFLAG_NOVIEW);
-						break;
-					case 3:
-						dwFlag |= ANNOTFLAG_NOVIEW;
-						dwFlag |= ANNOTFLAG_PRINT;
-						dwFlag &= (~ANNOTFLAG_HIDDEN);
-						break;
-					}
-					if (dwFlag != pWidget->GetFlags())
-					{
-						pWidget->SetFlags(dwFlag);
-						UpdateFormControl(pDocument, pFormControl, TRUE, FALSE, TRUE);
-					}
-				}
-			}
-		}
-	}
+                    FX_DWORD dwFlag = pWidget->GetFlags();
+                    switch (number)
+                    {
+                    case 0:
+                        dwFlag &= (~ANNOTFLAG_INVISIBLE);
+                        dwFlag &= (~ANNOTFLAG_HIDDEN);
+                        dwFlag &= (~ANNOTFLAG_NOVIEW);
+                        dwFlag |= ANNOTFLAG_PRINT;
+                        break;
+                    case 1:
+                        dwFlag &= (~ANNOTFLAG_INVISIBLE);
+                        dwFlag &= (~ANNOTFLAG_NOVIEW);
+                        dwFlag |= (ANNOTFLAG_HIDDEN | ANNOTFLAG_PRINT);
+                        break;
+                    case 2:
+                        dwFlag &= (~ANNOTFLAG_INVISIBLE);
+                        dwFlag &= (~ANNOTFLAG_PRINT);
+                        dwFlag &= (~ANNOTFLAG_HIDDEN);
+                        dwFlag &= (~ANNOTFLAG_NOVIEW);
+                        break;
+                    case 3:
+                        dwFlag |= ANNOTFLAG_NOVIEW;
+                        dwFlag |= ANNOTFLAG_PRINT;
+                        dwFlag &= (~ANNOTFLAG_HIDDEN);
+                        break;
+                    }
+                    if (dwFlag != pWidget->GetFlags())
+                    {
+                        pWidget->SetFlags(dwFlag);
+                        UpdateFormControl(pDocument, pFormControl, TRUE, FALSE, TRUE);
+                    }
+                }
+            }
+        }
+    }
 }
 
 FX_BOOL Field::doc(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	if (!vp.IsGetting()) {
-		return FALSE;
-	}
-	vp << m_pJSDoc->GetCJSDoc();
-	return TRUE;
+    if (!vp.IsGetting()) {
+        return FALSE;
+    }
+    vp << m_pJSDoc->GetCJSDoc();
+    return TRUE;
 }
 
 FX_BOOL Field::editable(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    ASSERT(m_pDocument != NULL);
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		bool bVP;
-		vp >> bVP;
-	}
-	else
-	{
-		CFX_PtrArray FieldArray;
-		GetFormFields(m_FieldName, FieldArray);
-		if (FieldArray.GetSize() <= 0) return FALSE;
+        bool bVP;
+        vp >> bVP;
+    }
+    else
+    {
+        CFX_PtrArray FieldArray;
+        GetFormFields(m_FieldName, FieldArray);
+        if (FieldArray.GetSize() <= 0) return FALSE;
 
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX)
-			return FALSE;
+        if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX)
+            return FALSE;
 
-		if (pFormField->GetFieldFlags() & FIELDFLAG_EDIT)
-			vp << true;
-		else
-			vp << false;
-	}
+        if (pFormField->GetFieldFlags() & FIELDFLAG_EDIT)
+            vp << true;
+        else
+            vp << false;
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Field::exportValues(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	CFX_PtrArray FieldArray;
-	GetFormFields(m_FieldName,FieldArray);
-	if (FieldArray.GetSize() <= 0) return FALSE;
+    CFX_PtrArray FieldArray;
+    GetFormFields(m_FieldName,FieldArray);
+    if (FieldArray.GetSize() <= 0)
+        return FALSE;
 
-	CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-	ASSERT(pFormField != NULL);
+    CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+    if (pFormField->GetFieldType() != FIELDTYPE_CHECKBOX &&
+        pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON)
+        return FALSE;
 
-	if (pFormField->GetFieldType() != FIELDTYPE_CHECKBOX &&
-		pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON)
-		return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet)
+            return FALSE;
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
-		if (!vp.IsArrayObject())return FALSE;
-	}
-	else
-	{
-		CJS_Array ExportValusArray(m_isolate);
+        if (!vp.IsArrayObject())
+            return FALSE;
+    }
+    else
+    {
+        CJS_Array ExportValusArray(m_isolate);
+        if (m_nFormControlIndex < 0)
+        {
+            for (int i=0,sz=pFormField->CountControls(); i<sz; i++)
+            {
+                CPDF_FormControl* pFormControl = pFormField->GetControl(i);
+                ExportValusArray.SetElement(i, CJS_Value(m_isolate,pFormControl->GetExportValue().c_str()));
+            }
+        }
+        else
+        {
+            if (m_nFormControlIndex >= pFormField->CountControls())
+                return FALSE;
 
-		if (m_nFormControlIndex < 0)
-		{
-			for (int i=0,sz=pFormField->CountControls(); i<sz; i++)
-			{
-				CPDF_FormControl* pFormControl = pFormField->GetControl(i);
-				ASSERT(pFormControl != NULL);
+            CPDF_FormControl* pFormControl = pFormField->GetControl(m_nFormControlIndex);
+            if (!pFormControl)
+                return FALSE;
 
-				ExportValusArray.SetElement(i, CJS_Value(m_isolate,pFormControl->GetExportValue().c_str()));
-			}
-		}
-		else
-		{
-			if(m_nFormControlIndex >= pFormField->CountControls()) return FALSE;
-			CPDF_FormControl* pFormControl = pFormField->GetControl(m_nFormControlIndex);
-			if (!pFormControl) return FALSE;
-
-			ExportValusArray.SetElement(0, CJS_Value(m_isolate,pFormControl->GetExportValue().c_str()));
-		}
-
-		vp << ExportValusArray;
-	}
-
-	return TRUE;
+            ExportValusArray.SetElement(0, CJS_Value(m_isolate,pFormControl->GetExportValue().c_str()));
+        }
+        vp << ExportValusArray;
+    }
+    return TRUE;
 }
 
 FX_BOOL Field::fileSelect(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	CFX_PtrArray FieldArray;
-	GetFormFields(m_FieldName, FieldArray);
-	if (FieldArray.GetSize() <= 0) return FALSE;
+    CFX_PtrArray FieldArray;
+    GetFormFields(m_FieldName, FieldArray);
+    if (FieldArray.GetSize() <= 0)
+        return FALSE;
 
-	CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-	ASSERT(pFormField != NULL);
+    CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+    if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
+        return FALSE;
 
-	if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
-		return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet)
+            return FALSE;
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
-
-		bool bVP;
-		vp >> bVP;
-
-	}
-	else
-	{
-		if (pFormField->GetFieldFlags() & FIELDFLAG_FILESELECT)
-			vp << true;
-		else
-			vp << false;
-	}
-
-	return TRUE;
+        bool bVP;
+        vp >> bVP;
+    }
+    else
+    {
+        if (pFormField->GetFieldFlags() & FIELDFLAG_FILESELECT)
+            vp << true;
+        else
+            vp << false;
+    }
+    return TRUE;
 }
 
 FX_BOOL Field::fillColor(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	CJS_Array crArray(m_isolate);
+    CJS_Array crArray(m_isolate);
 
-	CFX_PtrArray FieldArray;
-	GetFormFields(m_FieldName,FieldArray);
-	if (FieldArray.GetSize() <= 0) return FALSE;
+    CFX_PtrArray FieldArray;
+    GetFormFields(m_FieldName, FieldArray);
+    if (FieldArray.GetSize() <= 0)
+        return FALSE;
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
-		if (!vp.IsArrayObject()) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet)
+            return FALSE;
 
-		vp >> crArray;
+        if (!vp.IsArrayObject())
+            return FALSE;
 
-		CPWL_Color color;
-		color::ConvertArrayToPWLColor(crArray, color);
+        vp >> crArray;
 
-		if (m_bDelay)
-		{
-			AddDelay_Color(FP_FILLCOLOR, color);
-		}
-		else
-		{
-			Field::SetFillColor(m_pDocument, m_FieldName, m_nFormControlIndex, color);
-		}
-	}
-	else
-	{
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+        CPWL_Color color;
+        color::ConvertArrayToPWLColor(crArray, color);
+        if (m_bDelay)
+        {
+            AddDelay_Color(FP_FILLCOLOR, color);
+        }
+        else
+        {
+            Field::SetFillColor(m_pDocument, m_FieldName, m_nFormControlIndex, color);
+        }
+    }
+    else
+    {
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
-		if (!pFormControl)return FALSE;
+        CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+        if (!pFormControl)
+            return FALSE;
 
-		int iColorType;
-		pFormControl->GetBackgroundColor(iColorType);
+        int iColorType;
+        pFormControl->GetBackgroundColor(iColorType);
 
-		CPWL_Color color;
+        CPWL_Color color;
+        if (iColorType == COLORTYPE_TRANSPARENT)
+        {
+            color = CPWL_Color(COLORTYPE_TRANSPARENT);
+        }
+        else if (iColorType == COLORTYPE_GRAY)
+        {
+            color = CPWL_Color(COLORTYPE_GRAY, pFormControl->GetOriginalBackgroundColor(0));
+        }
+        else if (iColorType == COLORTYPE_RGB)
+        {
+            color = CPWL_Color(COLORTYPE_RGB, pFormControl->GetOriginalBackgroundColor(0),
+                pFormControl->GetOriginalBackgroundColor(1),
+                pFormControl->GetOriginalBackgroundColor(2));
+        }
+        else if (iColorType == COLORTYPE_CMYK)
+        {
+            color = CPWL_Color(COLORTYPE_CMYK, pFormControl->GetOriginalBackgroundColor(0),
+                pFormControl->GetOriginalBackgroundColor(1),
+                pFormControl->GetOriginalBackgroundColor(2),
+                pFormControl->GetOriginalBackgroundColor(3));
+        }
+        else
+            return FALSE;
 
-		if (iColorType == COLORTYPE_TRANSPARENT)
-		{
-			color = CPWL_Color(COLORTYPE_TRANSPARENT);
-		}
-		else if (iColorType == COLORTYPE_GRAY)
-		{
-			color = CPWL_Color(COLORTYPE_GRAY, pFormControl->GetOriginalBackgroundColor(0));
-		}
-		else if (iColorType == COLORTYPE_RGB)
-		{
-			color = CPWL_Color(COLORTYPE_RGB, pFormControl->GetOriginalBackgroundColor(0),
-				pFormControl->GetOriginalBackgroundColor(1),
-				pFormControl->GetOriginalBackgroundColor(2));
-		}
-		else if (iColorType == COLORTYPE_CMYK)
-		{
-			color = CPWL_Color(COLORTYPE_CMYK, pFormControl->GetOriginalBackgroundColor(0),
-				pFormControl->GetOriginalBackgroundColor(1),
-				pFormControl->GetOriginalBackgroundColor(2),
-				pFormControl->GetOriginalBackgroundColor(3));
-		}
-		else
-			return FALSE;
-
-		color::ConvertPWLColorToArray(color, crArray);
+        color::ConvertPWLColorToArray(color, crArray);
         vp  <<  crArray;
-	}
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 void Field::SetFillColor(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CPWL_Color& color)
 {
-	//Not supported.
+    //Not supported.
 }
 
 FX_BOOL Field::hidden(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		bool bVP;
-		vp >> bVP;
+        bool bVP;
+        vp >> bVP;
 
-		if (m_bDelay)
-		{
-			AddDelay_Bool(FP_HIDDEN, bVP);
-		}
-		else
-		{
-			Field::SetHidden(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
-		}
-	}
-	else
-	{
-		CFX_PtrArray FieldArray;
-		GetFormFields(m_FieldName,FieldArray);
-		if (FieldArray.GetSize() <= 0) return FALSE;
+        if (m_bDelay)
+        {
+            AddDelay_Bool(FP_HIDDEN, bVP);
+        }
+        else
+        {
+            Field::SetHidden(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
+        }
+    }
+    else
+    {
+        CFX_PtrArray FieldArray;
+        GetFormFields(m_FieldName,FieldArray);
+        if (FieldArray.GetSize() <= 0) return FALSE;
 
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
-		ASSERT(pInterForm != NULL);
+        CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+        ASSERT(pInterForm != NULL);
 
-		CPDFSDK_Widget* pWidget = pInterForm->GetWidget(GetSmartFieldControl(pFormField));
-		if (!pWidget) return FALSE;
+        CPDFSDK_Widget* pWidget = pInterForm->GetWidget(GetSmartFieldControl(pFormField));
+        if (!pWidget) return FALSE;
 
-		FX_DWORD dwFlags = pWidget->GetFlags();
+        FX_DWORD dwFlags = pWidget->GetFlags();
 
-		if (ANNOTFLAG_INVISIBLE & dwFlags || ANNOTFLAG_HIDDEN & dwFlags)
-		{
-			vp << true;
-		}
-		else
-			vp << false;
-	}
+        if (ANNOTFLAG_INVISIBLE & dwFlags || ANNOTFLAG_HIDDEN & dwFlags)
+        {
+            vp << true;
+        }
+        else
+            vp << false;
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 void Field::SetHidden(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)
 {
-	ASSERT(pDocument != NULL);
+    ASSERT(pDocument != NULL);
 
-	CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
-	ASSERT(pInterForm != NULL);
+    CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
+    ASSERT(pInterForm != NULL);
 
-	CFX_PtrArray FieldArray;
-	GetFormFields(pDocument, swFieldName, FieldArray);
+    CFX_PtrArray FieldArray;
+    GetFormFields(pDocument, swFieldName, FieldArray);
 
-	for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
-	{
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
-		ASSERT(pFormField != NULL);
+    for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
+    {
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
+        ASSERT(pFormField != NULL);
 
-		if (nControlIndex < 0)
-		{
-			FX_BOOL bSet = FALSE;
-			for (int j=0,jsz = pFormField->CountControls(); j<jsz; j++)
-			{
-				if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormField->GetControl(j)))
-				{
-					FX_DWORD dwFlags = pWidget->GetFlags();
+        if (nControlIndex < 0)
+        {
+            FX_BOOL bSet = FALSE;
+            for (int j=0,jsz = pFormField->CountControls(); j<jsz; j++)
+            {
+                if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormField->GetControl(j)))
+                {
+                    FX_DWORD dwFlags = pWidget->GetFlags();
 
-					if (b)
-					{
-						dwFlags &= (~ANNOTFLAG_INVISIBLE);
-						dwFlags &= (~ANNOTFLAG_NOVIEW);
-						dwFlags |= (ANNOTFLAG_HIDDEN | ANNOTFLAG_PRINT);
-					}
-					else
-					{
-						dwFlags &= (~ANNOTFLAG_INVISIBLE);
-						dwFlags &= (~ANNOTFLAG_HIDDEN);
-						dwFlags &= (~ANNOTFLAG_NOVIEW);
-						dwFlags |= ANNOTFLAG_PRINT;
-					}
+                    if (b)
+                    {
+                        dwFlags &= (~ANNOTFLAG_INVISIBLE);
+                        dwFlags &= (~ANNOTFLAG_NOVIEW);
+                        dwFlags |= (ANNOTFLAG_HIDDEN | ANNOTFLAG_PRINT);
+                    }
+                    else
+                    {
+                        dwFlags &= (~ANNOTFLAG_INVISIBLE);
+                        dwFlags &= (~ANNOTFLAG_HIDDEN);
+                        dwFlags &= (~ANNOTFLAG_NOVIEW);
+                        dwFlags |= ANNOTFLAG_PRINT;
+                    }
 
-					if (dwFlags != pWidget->GetFlags())
-					{
-						pWidget->SetFlags(dwFlags);
-						bSet = TRUE;
-					}
-				}
-			}
+                    if (dwFlags != pWidget->GetFlags())
+                    {
+                        pWidget->SetFlags(dwFlags);
+                        bSet = TRUE;
+                    }
+                }
+            }
 
-			if (bSet)
-				UpdateFormField(pDocument, pFormField, TRUE, FALSE, TRUE);
-		}
-		else
-		{
-			if(nControlIndex >= pFormField->CountControls()) return;
-			if (CPDF_FormControl* pFormControl = pFormField->GetControl(nControlIndex))
-			{
-				if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))
-				{
-					FX_DWORD dwFlags = pWidget->GetFlags();
+            if (bSet)
+                UpdateFormField(pDocument, pFormField, TRUE, FALSE, TRUE);
+        }
+        else
+        {
+            if(nControlIndex >= pFormField->CountControls()) return;
+            if (CPDF_FormControl* pFormControl = pFormField->GetControl(nControlIndex))
+            {
+                if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))
+                {
+                    FX_DWORD dwFlags = pWidget->GetFlags();
 
-					if (b)
-					{
-						dwFlags &= (~ANNOTFLAG_INVISIBLE);
-						dwFlags &= (~ANNOTFLAG_NOVIEW);
-						dwFlags |= (ANNOTFLAG_HIDDEN | ANNOTFLAG_PRINT);
-					}
-					else
-					{
-						dwFlags &= (~ANNOTFLAG_INVISIBLE);
-						dwFlags &= (~ANNOTFLAG_HIDDEN);
-						dwFlags &= (~ANNOTFLAG_NOVIEW);
-						dwFlags |= ANNOTFLAG_PRINT;
-					}
+                    if (b)
+                    {
+                        dwFlags &= (~ANNOTFLAG_INVISIBLE);
+                        dwFlags &= (~ANNOTFLAG_NOVIEW);
+                        dwFlags |= (ANNOTFLAG_HIDDEN | ANNOTFLAG_PRINT);
+                    }
+                    else
+                    {
+                        dwFlags &= (~ANNOTFLAG_INVISIBLE);
+                        dwFlags &= (~ANNOTFLAG_HIDDEN);
+                        dwFlags &= (~ANNOTFLAG_NOVIEW);
+                        dwFlags |= ANNOTFLAG_PRINT;
+                    }
 
-					if (dwFlags != pWidget->GetFlags())
-					{
-						pWidget->SetFlags(dwFlags);
-						UpdateFormControl(pDocument, pFormControl, TRUE, FALSE, TRUE);
-					}
-				}
-			}
-		}
-	}
+                    if (dwFlags != pWidget->GetFlags())
+                    {
+                        pWidget->SetFlags(dwFlags);
+                        UpdateFormControl(pDocument, pFormControl, TRUE, FALSE, TRUE);
+                    }
+                }
+            }
+        }
+    }
 }
 
 FX_BOOL Field::highlight(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		CFX_ByteString strMode;
-		vp >> strMode;
+        CFX_ByteString strMode;
+        vp >> strMode;
 
-		if (m_bDelay)
-		{
-			AddDelay_String(FP_HIGHLIGHT, strMode);
-		}
-		else
-		{
-			Field::SetHighlight(m_pDocument, m_FieldName, m_nFormControlIndex, strMode);
-		}
-	}
-	else
-	{
-		CFX_PtrArray FieldArray;
-		GetFormFields(m_FieldName,FieldArray);
-		if (FieldArray.GetSize() <= 0) return FALSE;
+        if (m_bDelay)
+        {
+            AddDelay_String(FP_HIGHLIGHT, strMode);
+        }
+        else
+        {
+            Field::SetHighlight(m_pDocument, m_FieldName, m_nFormControlIndex, strMode);
+        }
+    }
+    else
+    {
+        CFX_PtrArray FieldArray;
+        GetFormFields(m_FieldName,FieldArray);
+        if (FieldArray.GetSize() <= 0) return FALSE;
 
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
-			return FALSE;
+        if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
+            return FALSE;
 
-		CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
-		if (!pFormControl) return FALSE;
+        CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+        if (!pFormControl) return FALSE;
 
-		int eHM = pFormControl->GetHighlightingMode();
-		switch (eHM)
-		{
-		case CPDF_FormControl::None:
-			vp  <<  L"none";
-			break;
-		case CPDF_FormControl::Push:
-			vp  <<  L"push";
-			break;
-		case CPDF_FormControl::Invert:
-			vp  <<  L"invert";
-			break;
-		case CPDF_FormControl::Outline:
-			vp  <<  L"outline";
-			break;
-		case CPDF_FormControl::Toggle:
-			 vp  <<  L"toggle";
-			 break;
-		}
-	}
+        int eHM = pFormControl->GetHighlightingMode();
+        switch (eHM)
+        {
+        case CPDF_FormControl::None:
+            vp  <<  L"none";
+            break;
+        case CPDF_FormControl::Push:
+            vp  <<  L"push";
+            break;
+        case CPDF_FormControl::Invert:
+            vp  <<  L"invert";
+            break;
+        case CPDF_FormControl::Outline:
+            vp  <<  L"outline";
+            break;
+        case CPDF_FormControl::Toggle:
+             vp  <<  L"toggle";
+             break;
+        }
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 void Field::SetHighlight(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CFX_ByteString& string)
 {
-	//Not supported.
+    //Not supported.
 }
 
 FX_BOOL Field::lineWidth(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		int iWidth;
-		vp >> iWidth;
+        int iWidth;
+        vp >> iWidth;
 
-		if (m_bDelay)
-		{
-			AddDelay_Int(FP_LINEWIDTH, iWidth);
-		}
-		else
-		{
-			Field::SetLineWidth(m_pDocument, m_FieldName, m_nFormControlIndex, iWidth);
-		}
-	}
-	else
-	{
-		CFX_PtrArray FieldArray;
-		GetFormFields(m_FieldName,FieldArray);
-		if (FieldArray.GetSize() <= 0) return FALSE;
+        if (m_bDelay)
+        {
+            AddDelay_Int(FP_LINEWIDTH, iWidth);
+        }
+        else
+        {
+            Field::SetLineWidth(m_pDocument, m_FieldName, m_nFormControlIndex, iWidth);
+        }
+    }
+    else
+    {
+        CFX_PtrArray FieldArray;
+        GetFormFields(m_FieldName,FieldArray);
+        if (FieldArray.GetSize() <= 0) return FALSE;
 
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
-		if (!pFormControl) return FALSE;
+        CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+        if (!pFormControl) return FALSE;
 
-		CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
-		ASSERT(pInterForm != NULL);
+        CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+        ASSERT(pInterForm != NULL);
 
-		if(!pFormField->CountControls()) return FALSE;
+        if(!pFormField->CountControls()) return FALSE;
 
-		CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormField->GetControl(0));
-		if (!pWidget) return FALSE;
+        CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormField->GetControl(0));
+        if (!pWidget) return FALSE;
 
-		vp << (int32_t)pWidget->GetBorderWidth();
-	}
+        vp << (int32_t)pWidget->GetBorderWidth();
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 void Field::SetLineWidth(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
 {
-	ASSERT(pDocument != NULL);
+    ASSERT(pDocument != NULL);
 
-	CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
-	ASSERT(pInterForm != NULL);
+    CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
+    ASSERT(pInterForm != NULL);
 
-	CFX_PtrArray FieldArray;
-	GetFormFields(pDocument, swFieldName, FieldArray);
+    CFX_PtrArray FieldArray;
+    GetFormFields(pDocument, swFieldName, FieldArray);
 
-	for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
-	{
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
-		ASSERT(pFormField != NULL);
+    for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
+    {
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
+        ASSERT(pFormField != NULL);
 
-		if (nControlIndex < 0)
-		{
-			FX_BOOL bSet = FALSE;
-			for (int j=0,jsz=pFormField->CountControls(); j<jsz; j++)
-			{
-				CPDF_FormControl* pFormControl = pFormField->GetControl(j);
-				ASSERT(pFormControl != NULL);
+        if (nControlIndex < 0)
+        {
+            FX_BOOL bSet = FALSE;
+            for (int j=0,jsz=pFormField->CountControls(); j<jsz; j++)
+            {
+                CPDF_FormControl* pFormControl = pFormField->GetControl(j);
+                ASSERT(pFormControl != NULL);
 
-				if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))
-				{
-					if (number != pWidget->GetBorderWidth())
-					{
-						pWidget->SetBorderWidth(number);
-						bSet = TRUE;
-					}
-				}
-			}
-			if (bSet) UpdateFormField(pDocument, pFormField, TRUE, TRUE, TRUE);
-		}
-		else
-		{
-			if(nControlIndex >= pFormField->CountControls()) return;
-			if (CPDF_FormControl* pFormControl = pFormField->GetControl(nControlIndex))
-			{
-				if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))
-				{
-					if (number != pWidget->GetBorderWidth())
-					{
-						pWidget->SetBorderWidth(number);
-						UpdateFormControl(pDocument, pFormControl, TRUE, TRUE, TRUE);
-					}
-				}
-			}
-		}
-	}
+                if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))
+                {
+                    if (number != pWidget->GetBorderWidth())
+                    {
+                        pWidget->SetBorderWidth(number);
+                        bSet = TRUE;
+                    }
+                }
+            }
+            if (bSet) UpdateFormField(pDocument, pFormField, TRUE, TRUE, TRUE);
+        }
+        else
+        {
+            if(nControlIndex >= pFormField->CountControls()) return;
+            if (CPDF_FormControl* pFormControl = pFormField->GetControl(nControlIndex))
+            {
+                if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))
+                {
+                    if (number != pWidget->GetBorderWidth())
+                    {
+                        pWidget->SetBorderWidth(number);
+                        UpdateFormControl(pDocument, pFormControl, TRUE, TRUE, TRUE);
+                    }
+                }
+            }
+        }
+    }
 }
 
 FX_BOOL Field::multiline(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		bool bVP;
-		vp >> bVP;
+        bool bVP;
+        vp >> bVP;
 
-		if (m_bDelay)
-		{
-			AddDelay_Bool(FP_MULTILINE, bVP);
-		}
-		else
-		{
-			Field::SetMultiline(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
-		}
-	}
-	else
-	{
-		CFX_PtrArray FieldArray;
-		GetFormFields(m_FieldName, FieldArray);
-		if (FieldArray.GetSize() <= 0) return FALSE;
+        if (m_bDelay)
+        {
+            AddDelay_Bool(FP_MULTILINE, bVP);
+        }
+        else
+        {
+            Field::SetMultiline(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
+        }
+    }
+    else
+    {
+        CFX_PtrArray FieldArray;
+        GetFormFields(m_FieldName, FieldArray);
+        if (FieldArray.GetSize() <= 0) return FALSE;
 
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
-			return FALSE;
+        if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
+            return FALSE;
 
-		if (pFormField->GetFieldFlags() & FIELDFLAG_MULTILINE)
-			vp << true;
-		else
-			vp << false;
-	}
+        if (pFormField->GetFieldFlags() & FIELDFLAG_MULTILINE)
+            vp << true;
+        else
+            vp << false;
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 void Field::SetMultiline(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)
 {
-	//Not supported.
+    //Not supported.
 }
 
 FX_BOOL Field::multipleSelection(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		bool bVP;
-		vp >> bVP;
+        bool bVP;
+        vp >> bVP;
 
-		if (m_bDelay)
-		{
-			AddDelay_Bool(FP_MULTIPLESELECTION, bVP);
-		}
-		else
-		{
-			Field::SetMultipleSelection(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
-		}
-	}
-	else
-	{
-		CFX_PtrArray FieldArray;
-		GetFormFields(m_FieldName,FieldArray);
-		if (FieldArray.GetSize() <= 0) return FALSE;
+        if (m_bDelay)
+        {
+            AddDelay_Bool(FP_MULTIPLESELECTION, bVP);
+        }
+        else
+        {
+            Field::SetMultipleSelection(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
+        }
+    }
+    else
+    {
+        CFX_PtrArray FieldArray;
+        GetFormFields(m_FieldName,FieldArray);
+        if (FieldArray.GetSize() <= 0) return FALSE;
 
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		if (pFormField->GetFieldType() != FIELDTYPE_LISTBOX)
-			return FALSE;
+        if (pFormField->GetFieldType() != FIELDTYPE_LISTBOX)
+            return FALSE;
 
-		if (pFormField->GetFieldFlags() & FIELDFLAG_MULTISELECT)
-			vp << true;
-		else
-			vp << false;
-	}
+        if (pFormField->GetFieldFlags() & FIELDFLAG_MULTISELECT)
+            vp << true;
+        else
+            vp << false;
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 void Field::SetMultipleSelection(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)
 {
-	//Not supported.
+    //Not supported.
 }
 
 FX_BOOL Field::name(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	if (!vp.IsGetting()) return FALSE;
+    if (!vp.IsGetting()) return FALSE;
 
-	CFX_PtrArray FieldArray;
-	GetFormFields(m_FieldName, FieldArray);
-	if (FieldArray.GetSize() <= 0) return FALSE;
+    CFX_PtrArray FieldArray;
+    GetFormFields(m_FieldName, FieldArray);
+    if (FieldArray.GetSize() <= 0) return FALSE;
 
-   	vp << m_FieldName;
+    vp << m_FieldName;
 
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Field::numItems(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	CFX_PtrArray FieldArray;
-	GetFormFields(m_FieldName, FieldArray);
-	if (FieldArray.GetSize() <= 0) return FALSE;
+    CFX_PtrArray FieldArray;
+    GetFormFields(m_FieldName, FieldArray);
+    if (FieldArray.GetSize() <= 0) return FALSE;
 
-	CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-	ASSERT(pFormField != NULL);
+    CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+    ASSERT(pFormField != NULL);
 
-	if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX &&
-		pFormField->GetFieldType() != FIELDTYPE_LISTBOX)
-		return FALSE;
+    if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX &&
+        pFormField->GetFieldType() != FIELDTYPE_LISTBOX)
+        return FALSE;
 
-	if (!vp.IsGetting()) return FALSE;
+    if (!vp.IsGetting()) return FALSE;
 
-	vp << (int32_t)pFormField->CountOptions();
+    vp << (int32_t)pFormField->CountOptions();
 
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Field::page(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	if (!vp.IsGetting()) return FALSE;
+    if (!vp.IsGetting()) return FALSE;
 
-	CFX_PtrArray FieldArray;
-	GetFormFields(m_FieldName, FieldArray);
-	if (FieldArray.GetSize() <= 0) return FALSE;
+    CFX_PtrArray FieldArray;
+    GetFormFields(m_FieldName, FieldArray);
+    if (FieldArray.GetSize() <= 0) return FALSE;
 
-	CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-	if (!pFormField) return FALSE;
+    CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+    if (!pFormField) return FALSE;
 
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
-	ASSERT(pInterForm != NULL);
+    CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+    ASSERT(pInterForm != NULL);
 
-	CFX_PtrArray widgetArray;
-	pInterForm->GetWidgets(pFormField, widgetArray);
+    CFX_PtrArray widgetArray;
+    pInterForm->GetWidgets(pFormField, widgetArray);
 
-	if (widgetArray.GetSize() > 0)
-	{
-		CJS_Array PageArray(m_isolate);
+    if (widgetArray.GetSize() > 0)
+    {
+        CJS_Array PageArray(m_isolate);
 
-		for (int i=0,sz=widgetArray.GetSize(); i<sz; i++)
-		{
-			CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)widgetArray.GetAt(i);
-			ASSERT(pWidget != NULL);
+        for (int i=0,sz=widgetArray.GetSize(); i<sz; i++)
+        {
+            CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)widgetArray.GetAt(i);
+            ASSERT(pWidget != NULL);
 
-			CPDFSDK_PageView* pPageView = pWidget->GetPageView();
-			if(!pPageView)
-				return FALSE;
+            CPDFSDK_PageView* pPageView = pWidget->GetPageView();
+            if(!pPageView)
+                return FALSE;
 
-			PageArray.SetElement(i, CJS_Value(m_isolate,(int32_t)pPageView->GetPageIndex()));
-		}
+            PageArray.SetElement(i, CJS_Value(m_isolate,(int32_t)pPageView->GetPageIndex()));
+        }
 
-		vp << PageArray;
-	}
-	else
-	{
-		vp << (int32_t) -1;
-	}
+        vp << PageArray;
+    }
+    else
+    {
+        vp << (int32_t) -1;
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Field::password(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		bool bVP;
-		vp >> bVP;
+        bool bVP;
+        vp >> bVP;
 
-		if (m_bDelay)
-		{
-			AddDelay_Bool(FP_PASSWORD, bVP);
-		}
-		else
-		{
-			Field::SetPassword(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
-		}
-	}
-	else
-	{
-		CFX_PtrArray FieldArray;
-		GetFormFields(m_FieldName,FieldArray);
-		if (FieldArray.GetSize() <= 0) return FALSE;
+        if (m_bDelay)
+        {
+            AddDelay_Bool(FP_PASSWORD, bVP);
+        }
+        else
+        {
+            Field::SetPassword(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
+        }
+    }
+    else
+    {
+        CFX_PtrArray FieldArray;
+        GetFormFields(m_FieldName,FieldArray);
+        if (FieldArray.GetSize() <= 0) return FALSE;
 
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
-			return FALSE;
+        if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
+            return FALSE;
 
-		if (pFormField->GetFieldFlags() & FIELDFLAG_PASSWORD)
-			vp << true;
-		else
-			vp << false;
-	}
+        if (pFormField->GetFieldFlags() & FIELDFLAG_PASSWORD)
+            vp << true;
+        else
+            vp << false;
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 void Field::SetPassword(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)
 {
-	//Not supported.
+    //Not supported.
 }
 
 FX_BOOL Field::print(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
-	ASSERT(pInterForm != NULL);
+    CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+    ASSERT(pInterForm != NULL);
 
-	CFX_PtrArray FieldArray;
-	GetFormFields(m_FieldName, FieldArray);
-	if (FieldArray.GetSize() <= 0) return FALSE;
+    CFX_PtrArray FieldArray;
+    GetFormFields(m_FieldName, FieldArray);
+    if (FieldArray.GetSize() <= 0) return FALSE;
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		bool bVP;
-		vp >> bVP;
+        bool bVP;
+        vp >> bVP;
 
-		for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
-		{
-			CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
-			ASSERT(pFormField != NULL);
+        for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
+        {
+            CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
+            ASSERT(pFormField != NULL);
 
-			if (m_nFormControlIndex < 0)
-			{
-				FX_BOOL bSet = FALSE;
-				for (int j=0,jsz = pFormField->CountControls(); j<jsz; j++)
-				{
-					if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormField->GetControl(j)))
-					{
-						FX_DWORD dwFlags = pWidget->GetFlags();
-						if (bVP)
-							dwFlags |= ANNOTFLAG_PRINT;
-						else
-							dwFlags &= ~ANNOTFLAG_PRINT;
+            if (m_nFormControlIndex < 0)
+            {
+                FX_BOOL bSet = FALSE;
+                for (int j=0,jsz = pFormField->CountControls(); j<jsz; j++)
+                {
+                    if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormField->GetControl(j)))
+                    {
+                        FX_DWORD dwFlags = pWidget->GetFlags();
+                        if (bVP)
+                            dwFlags |= ANNOTFLAG_PRINT;
+                        else
+                            dwFlags &= ~ANNOTFLAG_PRINT;
 
-						if (dwFlags != pWidget->GetFlags())
-						{
-							pWidget->SetFlags(dwFlags);
-							bSet = TRUE;
-						}
-					}
-				}
+                        if (dwFlags != pWidget->GetFlags())
+                        {
+                            pWidget->SetFlags(dwFlags);
+                            bSet = TRUE;
+                        }
+                    }
+                }
 
-				if (bSet)
-					UpdateFormField(m_pDocument, pFormField, TRUE, FALSE, TRUE);
-			}
-			else
-			{
-				if(m_nFormControlIndex >= pFormField->CountControls()) return FALSE;
-				if (CPDF_FormControl* pFormControl = pFormField->GetControl(m_nFormControlIndex))
-				{
-					if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))
-					{
-						FX_DWORD dwFlags = pWidget->GetFlags();
-						if (bVP)
-							dwFlags |= ANNOTFLAG_PRINT;
-						else
-							dwFlags &= ~ANNOTFLAG_PRINT;
+                if (bSet)
+                    UpdateFormField(m_pDocument, pFormField, TRUE, FALSE, TRUE);
+            }
+            else
+            {
+                if(m_nFormControlIndex >= pFormField->CountControls()) return FALSE;
+                if (CPDF_FormControl* pFormControl = pFormField->GetControl(m_nFormControlIndex))
+                {
+                    if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))
+                    {
+                        FX_DWORD dwFlags = pWidget->GetFlags();
+                        if (bVP)
+                            dwFlags |= ANNOTFLAG_PRINT;
+                        else
+                            dwFlags &= ~ANNOTFLAG_PRINT;
 
-						if (dwFlags != pWidget->GetFlags())
-						{
-							pWidget->SetFlags(dwFlags);
-							UpdateFormControl(m_pDocument, pFormField->GetControl(m_nFormControlIndex), TRUE, FALSE, TRUE);
-						}
-					}
-				}
-			}
-		}
-	}
-	else
-	{
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+                        if (dwFlags != pWidget->GetFlags())
+                        {
+                            pWidget->SetFlags(dwFlags);
+                            UpdateFormControl(m_pDocument, pFormField->GetControl(m_nFormControlIndex), TRUE, FALSE, TRUE);
+                        }
+                    }
+                }
+            }
+        }
+    }
+    else
+    {
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		CPDFSDK_Widget* pWidget = pInterForm->GetWidget(GetSmartFieldControl(pFormField));
-		if (!pWidget) return FALSE;
+        CPDFSDK_Widget* pWidget = pInterForm->GetWidget(GetSmartFieldControl(pFormField));
+        if (!pWidget) return FALSE;
 
-		if (pWidget->GetFlags() & ANNOTFLAG_PRINT)
-			vp << true;
-		else
-			vp << false;
-	}
+        if (pWidget->GetFlags() & ANNOTFLAG_PRINT)
+            vp << true;
+        else
+            vp << false;
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Field::radiosInUnison(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	CFX_PtrArray FieldArray;
-	GetFormFields(m_FieldName,FieldArray);
-	if (FieldArray.GetSize() <= 0) return FALSE;
+    CFX_PtrArray FieldArray;
+    GetFormFields(m_FieldName,FieldArray);
+    if (FieldArray.GetSize() <= 0) return FALSE;
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		bool bVP;
-		vp >> bVP;
+        bool bVP;
+        vp >> bVP;
 
-	}
-	else
-	{
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+    }
+    else
+    {
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		if (pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON)
-			return FALSE;
+        if (pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON)
+            return FALSE;
 
-		if (pFormField->GetFieldFlags() & FIELDFLAG_RADIOSINUNISON)
-			vp << true;
-		else
-			vp << false;
-	}
+        if (pFormField->GetFieldFlags() & FIELDFLAG_RADIOSINUNISON)
+            vp << true;
+        else
+            vp << false;
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Field::readonly(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	CFX_PtrArray FieldArray;
-	GetFormFields(m_FieldName,FieldArray);
-	if (FieldArray.GetSize() <= 0) return FALSE;
+    CFX_PtrArray FieldArray;
+    GetFormFields(m_FieldName,FieldArray);
+    if (FieldArray.GetSize() <= 0) return FALSE;
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		bool bVP;
-		vp >> bVP;
+        bool bVP;
+        vp >> bVP;
 
-	}
-	else
-	{
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+    }
+    else
+    {
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		if (pFormField->GetFieldFlags() & FIELDFLAG_READONLY)
-			vp << true;
-		else
-			vp << false;
-	}
+        if (pFormField->GetFieldFlags() & FIELDFLAG_READONLY)
+            vp << true;
+        else
+            vp << false;
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Field::rect(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
-		if (!vp.IsArrayObject())return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
+        if (!vp.IsArrayObject())return FALSE;
 
-		CJS_Array rcArray(m_isolate);
-		vp >> rcArray;
-		CJS_Value Upper_Leftx(m_isolate), Upper_Lefty(m_isolate), Lower_Rightx(m_isolate), Lower_Righty(m_isolate);
-		rcArray.GetElement(0, Upper_Leftx);
-		rcArray.GetElement(1, Upper_Lefty);
-		rcArray.GetElement(2, Lower_Rightx);
-		rcArray.GetElement(3, Lower_Righty);
+        CJS_Array rcArray(m_isolate);
+        vp >> rcArray;
+        CJS_Value Upper_Leftx(m_isolate), Upper_Lefty(m_isolate), Lower_Rightx(m_isolate), Lower_Righty(m_isolate);
+        rcArray.GetElement(0, Upper_Leftx);
+        rcArray.GetElement(1, Upper_Lefty);
+        rcArray.GetElement(2, Lower_Rightx);
+        rcArray.GetElement(3, Lower_Righty);
 
-		FX_FLOAT pArray[4] = {0.0f,0.0f,0.0f,0.0f};
-		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();
+        FX_FLOAT pArray[4] = {0.0f,0.0f,0.0f,0.0f};
+        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);
+        CPDF_Rect crRect(pArray);
 
-		if (m_bDelay)
-		{
-			AddDelay_Rect(FP_RECT, crRect);
-		}
-		else
-		{
-			Field::SetRect(m_pDocument, m_FieldName, m_nFormControlIndex, crRect);
-		}
-	}
-	else
-	{
-		CFX_PtrArray FieldArray;
-		GetFormFields(m_FieldName,FieldArray);
-		if (FieldArray.GetSize() <= 0) return FALSE;
+        if (m_bDelay)
+        {
+            AddDelay_Rect(FP_RECT, crRect);
+        }
+        else
+        {
+            Field::SetRect(m_pDocument, m_FieldName, m_nFormControlIndex, crRect);
+        }
+    }
+    else
+    {
+        CFX_PtrArray FieldArray;
+        GetFormFields(m_FieldName,FieldArray);
+        if (FieldArray.GetSize() <= 0) return FALSE;
 
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
-		ASSERT(pInterForm != NULL);
+        CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+        ASSERT(pInterForm != NULL);
 
-		CPDFSDK_Widget* pWidget = pInterForm->GetWidget(GetSmartFieldControl(pFormField));
-		if (!pWidget) return FALSE;
+        CPDFSDK_Widget* pWidget = pInterForm->GetWidget(GetSmartFieldControl(pFormField));
+        if (!pWidget) return FALSE;
 
-		CFX_FloatRect crRect = pWidget->GetRect();
-		CJS_Value Upper_Leftx(m_isolate),Upper_Lefty(m_isolate),Lower_Rightx(m_isolate),Lower_Righty(m_isolate);
-		Upper_Leftx = (int32_t)crRect.left;
-		Upper_Lefty = (int32_t)crRect.top;
-		Lower_Rightx = (int32_t)crRect.right;
-		Lower_Righty = (int32_t)crRect.bottom;
+        CFX_FloatRect crRect = pWidget->GetRect();
+        CJS_Value Upper_Leftx(m_isolate),Upper_Lefty(m_isolate),Lower_Rightx(m_isolate),Lower_Righty(m_isolate);
+        Upper_Leftx = (int32_t)crRect.left;
+        Upper_Lefty = (int32_t)crRect.top;
+        Lower_Rightx = (int32_t)crRect.right;
+        Lower_Righty = (int32_t)crRect.bottom;
 
-		CJS_Array rcArray(m_isolate);
-		rcArray.SetElement(0,Upper_Leftx);
-		rcArray.SetElement(1,Upper_Lefty);
-		rcArray.SetElement(2,Lower_Rightx);
-		rcArray.SetElement(3,Lower_Righty);
+        CJS_Array rcArray(m_isolate);
+        rcArray.SetElement(0,Upper_Leftx);
+        rcArray.SetElement(1,Upper_Lefty);
+        rcArray.SetElement(2,Lower_Rightx);
+        rcArray.SetElement(3,Lower_Righty);
 
-		vp  <<  rcArray;
-	}
+        vp  <<  rcArray;
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 void Field::SetRect(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CPDF_Rect& rect)
 {
-	ASSERT(pDocument != NULL);
+    ASSERT(pDocument != NULL);
 
-	CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
-	ASSERT(pInterForm != NULL);
+    CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
+    ASSERT(pInterForm != NULL);
 
-	CFX_PtrArray FieldArray;
-	GetFormFields(pDocument, swFieldName, FieldArray);
+    CFX_PtrArray FieldArray;
+    GetFormFields(pDocument, swFieldName, FieldArray);
 
-	for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
-	{
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
-		ASSERT(pFormField != NULL);
+    for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
+    {
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
+        ASSERT(pFormField != NULL);
 
-		if (nControlIndex < 0)
-		{
-			FX_BOOL bSet = FALSE;
-			for (int i=0, sz=pFormField->CountControls(); i<sz; i++)
-			{
-				CPDF_FormControl* pFormControl = pFormField->GetControl(i);
-				ASSERT(pFormControl != NULL);
+        if (nControlIndex < 0)
+        {
+            FX_BOOL bSet = FALSE;
+            for (int i=0, sz=pFormField->CountControls(); i<sz; i++)
+            {
+                CPDF_FormControl* pFormControl = pFormField->GetControl(i);
+                ASSERT(pFormControl != NULL);
 
-				if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))
-				{
-					CPDF_Rect crRect = rect;
+                if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))
+                {
+                    CPDF_Rect crRect = rect;
 
-					CPDF_Page* pPDFPage = pWidget->GetPDFPage();
-					ASSERT(pPDFPage != NULL);
+                    CPDF_Page* pPDFPage = pWidget->GetPDFPage();
+                    ASSERT(pPDFPage != NULL);
 
-// 					CPDF_Page* pPDFPage = pPage->GetPage();
-// 					ASSERT(pPDFPage != NULL);
+//                  CPDF_Page* pPDFPage = pPage->GetPage();
+//                  ASSERT(pPDFPage != NULL);
 
-					crRect.Intersect(pPDFPage->GetPageBBox());
+                    crRect.Intersect(pPDFPage->GetPageBBox());
 
-					if (!crRect.IsEmpty())
-					{
-						CPDF_Rect rcOld = pWidget->GetRect();
-						if (crRect.left != rcOld.left ||
-							crRect.right != rcOld.right ||
-							crRect.top != rcOld.top ||
-							crRect.bottom != rcOld.bottom)
-						{
-							pWidget->SetRect(crRect);
-							bSet = TRUE;
-						}
-					}
-				}
-			}
+                    if (!crRect.IsEmpty())
+                    {
+                        CPDF_Rect rcOld = pWidget->GetRect();
+                        if (crRect.left != rcOld.left ||
+                            crRect.right != rcOld.right ||
+                            crRect.top != rcOld.top ||
+                            crRect.bottom != rcOld.bottom)
+                        {
+                            pWidget->SetRect(crRect);
+                            bSet = TRUE;
+                        }
+                    }
+                }
+            }
 
-			if (bSet) UpdateFormField(pDocument, pFormField, TRUE, TRUE, TRUE);
-		}
-		else
-		{
-			if(nControlIndex >= pFormField->CountControls()) return;
-			if (CPDF_FormControl* pFormControl = pFormField->GetControl(nControlIndex))
-			{
-				if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))
-				{
-					CPDF_Rect crRect = rect;
+            if (bSet) UpdateFormField(pDocument, pFormField, TRUE, TRUE, TRUE);
+        }
+        else
+        {
+            if(nControlIndex >= pFormField->CountControls()) return;
+            if (CPDF_FormControl* pFormControl = pFormField->GetControl(nControlIndex))
+            {
+                if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))
+                {
+                    CPDF_Rect crRect = rect;
 
-					CPDF_Page* pPDFPage = pWidget->GetPDFPage();
-					ASSERT(pPDFPage != NULL);
+                    CPDF_Page* pPDFPage = pWidget->GetPDFPage();
+                    ASSERT(pPDFPage != NULL);
 
-// 					CPDF_Page* pPDFPage = pPage->GetPage();
-// 					ASSERT(pPDFPage != NULL);
+//                  CPDF_Page* pPDFPage = pPage->GetPage();
+//                  ASSERT(pPDFPage != NULL);
 
-					crRect.Intersect(pPDFPage->GetPageBBox());
+                    crRect.Intersect(pPDFPage->GetPageBBox());
 
-					if (!crRect.IsEmpty())
-					{
-						CPDF_Rect rcOld = pWidget->GetRect();
-						if (crRect.left != rcOld.left ||
-							crRect.right != rcOld.right ||
-							crRect.top != rcOld.top ||
-							crRect.bottom != rcOld.bottom)
-						{
-							pWidget->SetRect(crRect);
-							UpdateFormControl(pDocument, pFormControl, TRUE, TRUE, TRUE);
-						}
-					}
-				}
-			}
-		}
-	}
+                    if (!crRect.IsEmpty())
+                    {
+                        CPDF_Rect rcOld = pWidget->GetRect();
+                        if (crRect.left != rcOld.left ||
+                            crRect.right != rcOld.right ||
+                            crRect.top != rcOld.top ||
+                            crRect.bottom != rcOld.bottom)
+                        {
+                            pWidget->SetRect(crRect);
+                            UpdateFormControl(pDocument, pFormControl, TRUE, TRUE, TRUE);
+                        }
+                    }
+                }
+            }
+        }
+    }
 }
 
 FX_BOOL Field::required(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	CFX_PtrArray FieldArray;
-	GetFormFields(m_FieldName,FieldArray);
-	if (FieldArray.GetSize() <= 0) return FALSE;
+    CFX_PtrArray FieldArray;
+    GetFormFields(m_FieldName,FieldArray);
+    if (FieldArray.GetSize() <= 0) return FALSE;
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
 
-		bool bVP;
-		vp >> bVP;
+        bool bVP;
+        vp >> bVP;
 
-	}
-	else
-	{
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+    }
+    else
+    {
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		if (pFormField->GetFieldType() == FIELDTYPE_PUSHBUTTON)
-			return FALSE;
+        if (pFormField->GetFieldType() == FIELDTYPE_PUSHBUTTON)
+            return FALSE;
 
-		if (pFormField->GetFieldFlags() & FIELDFLAG_REQUIRED)
-			vp << true;
-		else
-			vp << false;
-	}
+        if (pFormField->GetFieldFlags() & FIELDFLAG_REQUIRED)
+            vp << true;
+        else
+            vp << false;
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Field::richText(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		bool bVP;
-		vp >> bVP;
+        bool bVP;
+        vp >> bVP;
 
-		if (m_bDelay)
-		{
-			AddDelay_Bool(FP_RICHTEXT, bVP);
-		}
-		else
-		{
-			Field::SetRichText(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
-		}
-	}
-	else
-	{
-		CFX_PtrArray FieldArray;
-		GetFormFields(m_FieldName,FieldArray);
-		if (FieldArray.GetSize() <= 0) return FALSE;
+        if (m_bDelay)
+        {
+            AddDelay_Bool(FP_RICHTEXT, bVP);
+        }
+        else
+        {
+            Field::SetRichText(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
+        }
+    }
+    else
+    {
+        CFX_PtrArray FieldArray;
+        GetFormFields(m_FieldName,FieldArray);
+        if (FieldArray.GetSize() <= 0) return FALSE;
 
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
-			return FALSE;
+        if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
+            return FALSE;
 
-		if (pFormField->GetFieldFlags() & FIELDFLAG_RICHTEXT)
-			vp << true;
-		else
-			vp << false;
-	}
+        if (pFormField->GetFieldFlags() & FIELDFLAG_RICHTEXT)
+            vp << true;
+        else
+            vp << false;
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 void Field::SetRichText(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)
 {
-	//Not supported.
+    //Not supported.
 }
 
 FX_BOOL Field::richValue(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	return TRUE;
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
-		;
-	}
-	else
-	{
-		;
-	}
-	return TRUE;
+    return TRUE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
+        ;
+    }
+    else
+    {
+        ;
+    }
+    return TRUE;
 }
 
 void Field::SetRichValue(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex)
 {
-	//Not supported.
+    //Not supported.
 }
 
 FX_BOOL Field::rotation(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		int nVP;
-		vp >> nVP;
+        int nVP;
+        vp >> nVP;
 
-		if (m_bDelay)
-		{
-			AddDelay_Int(FP_ROTATION, nVP);
-		}
-		else
-		{
-			Field::SetRotation(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
-		}
-	}
-	else
-	{
-		CFX_PtrArray FieldArray;
-		GetFormFields(m_FieldName,FieldArray);
-		if (FieldArray.GetSize() <= 0) return FALSE;
+        if (m_bDelay)
+        {
+            AddDelay_Int(FP_ROTATION, nVP);
+        }
+        else
+        {
+            Field::SetRotation(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
+        }
+    }
+    else
+    {
+        CFX_PtrArray FieldArray;
+        GetFormFields(m_FieldName,FieldArray);
+        if (FieldArray.GetSize() <= 0) return FALSE;
 
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
-		if (!pFormControl)return FALSE;
+        CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+        if (!pFormControl)return FALSE;
 
-		vp << (int32_t)pFormControl->GetRotation();
-	}
+        vp << (int32_t)pFormControl->GetRotation();
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 void Field::SetRotation(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
 {
-	//Not supported.
+    //Not supported.
 }
 
 FX_BOOL Field::strokeColor(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		if (!vp.IsArrayObject())return FALSE;
+        if (!vp.IsArrayObject())return FALSE;
 
-		CJS_Array crArray(m_isolate);
-		vp >> crArray;
+        CJS_Array crArray(m_isolate);
+        vp >> crArray;
 
-		CPWL_Color color;
-		color::ConvertArrayToPWLColor(crArray, color);
+        CPWL_Color color;
+        color::ConvertArrayToPWLColor(crArray, color);
 
-		if (m_bDelay)
-		{
-			AddDelay_Color(FP_STROKECOLOR, color);
-		}
-		else
-		{
-			Field::SetStrokeColor(m_pDocument, m_FieldName, m_nFormControlIndex, color);
-		}
-	}
-	else
-	{
-		CFX_PtrArray FieldArray;
-		GetFormFields(m_FieldName,FieldArray);
-		if (FieldArray.GetSize() <= 0) return FALSE;
+        if (m_bDelay)
+        {
+            AddDelay_Color(FP_STROKECOLOR, color);
+        }
+        else
+        {
+            Field::SetStrokeColor(m_pDocument, m_FieldName, m_nFormControlIndex, color);
+        }
+    }
+    else
+    {
+        CFX_PtrArray FieldArray;
+        GetFormFields(m_FieldName,FieldArray);
+        if (FieldArray.GetSize() <= 0) return FALSE;
 
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
-		if (!pFormControl)return FALSE;
+        CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+        if (!pFormControl)return FALSE;
 
-		int iColorType;
-		pFormControl->GetBorderColor(iColorType);
+        int iColorType;
+        pFormControl->GetBorderColor(iColorType);
 
-		CPWL_Color color;
+        CPWL_Color color;
 
-		if (iColorType == COLORTYPE_TRANSPARENT)
-		{
-			color = CPWL_Color(COLORTYPE_TRANSPARENT);
-		}
-		else if (iColorType == COLORTYPE_GRAY)
-		{
-			color = CPWL_Color(COLORTYPE_GRAY, pFormControl->GetOriginalBorderColor(0));
-		}
-		else if (iColorType == COLORTYPE_RGB)
-		{
-			color = CPWL_Color(COLORTYPE_RGB, pFormControl->GetOriginalBorderColor(0),
-				pFormControl->GetOriginalBorderColor(1),
-				pFormControl->GetOriginalBorderColor(2));
-		}
-		else if (iColorType == COLORTYPE_CMYK)
-		{
-			color = CPWL_Color(COLORTYPE_CMYK, pFormControl->GetOriginalBorderColor(0),
-				pFormControl->GetOriginalBorderColor(1),
-				pFormControl->GetOriginalBorderColor(2),
-				pFormControl->GetOriginalBorderColor(3));
-		}
-		else
-			return FALSE;
+        if (iColorType == COLORTYPE_TRANSPARENT)
+        {
+            color = CPWL_Color(COLORTYPE_TRANSPARENT);
+        }
+        else if (iColorType == COLORTYPE_GRAY)
+        {
+            color = CPWL_Color(COLORTYPE_GRAY, pFormControl->GetOriginalBorderColor(0));
+        }
+        else if (iColorType == COLORTYPE_RGB)
+        {
+            color = CPWL_Color(COLORTYPE_RGB, pFormControl->GetOriginalBorderColor(0),
+                pFormControl->GetOriginalBorderColor(1),
+                pFormControl->GetOriginalBorderColor(2));
+        }
+        else if (iColorType == COLORTYPE_CMYK)
+        {
+            color = CPWL_Color(COLORTYPE_CMYK, pFormControl->GetOriginalBorderColor(0),
+                pFormControl->GetOriginalBorderColor(1),
+                pFormControl->GetOriginalBorderColor(2),
+                pFormControl->GetOriginalBorderColor(3));
+        }
+        else
+            return FALSE;
 
-		CJS_Array crArray(m_isolate);
-		color::ConvertPWLColorToArray(color, crArray);
+        CJS_Array crArray(m_isolate);
+        color::ConvertPWLColorToArray(color, crArray);
         vp  <<  crArray;
-	}
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 void Field::SetStrokeColor(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CPWL_Color& color)
 {
-	//Not supported.
+    //Not supported.
 }
 
 FX_BOOL Field::style(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		CFX_ByteString csBCaption;
-		vp >> csBCaption;
+        CFX_ByteString csBCaption;
+        vp >> csBCaption;
 
-		if (m_bDelay)
-		{
-			AddDelay_String(FP_STYLE, csBCaption);
-		}
-		else
-		{
-			Field::SetStyle(m_pDocument, m_FieldName, m_nFormControlIndex, csBCaption);
-		}
-	}
-	else
-	{
-		CFX_PtrArray FieldArray;
-		GetFormFields(m_FieldName,FieldArray);
-		if (FieldArray.GetSize() <= 0) return FALSE;
+        if (m_bDelay)
+        {
+            AddDelay_String(FP_STYLE, csBCaption);
+        }
+        else
+        {
+            Field::SetStyle(m_pDocument, m_FieldName, m_nFormControlIndex, csBCaption);
+        }
+    }
+    else
+    {
+        CFX_PtrArray FieldArray;
+        GetFormFields(m_FieldName,FieldArray);
+        if (FieldArray.GetSize() <= 0) return FALSE;
 
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		if (pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON &&
-			pFormField->GetFieldType() != FIELDTYPE_CHECKBOX)
-			return FALSE;
+        if (pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON &&
+            pFormField->GetFieldType() != FIELDTYPE_CHECKBOX)
+            return FALSE;
 
-		CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
-		if (!pFormControl) return FALSE;
+        CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+        if (!pFormControl) return FALSE;
 
-		CFX_WideString csWCaption = pFormControl->GetNormalCaption();
-		CFX_ByteString csBCaption;
+        CFX_WideString csWCaption = pFormControl->GetNormalCaption();
+        CFX_ByteString csBCaption;
 
-		switch (csWCaption[0])
-		{
-			case L'l':
-				csBCaption = "circle";
-				break;
-			case L'8':
-				csBCaption = "cross";
-				break;
-			case L'u':
-				csBCaption = "diamond";
-				break;
-			case L'n':
-				csBCaption = "square";
-				break;
-			case L'H':
-				csBCaption = "star";
-				break;
-			default: //L'4'
-				csBCaption = "check";
-				break;
-		}
-		vp << csBCaption;
-	}
+        switch (csWCaption[0])
+        {
+            case L'l':
+                csBCaption = "circle";
+                break;
+            case L'8':
+                csBCaption = "cross";
+                break;
+            case L'u':
+                csBCaption = "diamond";
+                break;
+            case L'n':
+                csBCaption = "square";
+                break;
+            case L'H':
+                csBCaption = "star";
+                break;
+            default: //L'4'
+                csBCaption = "check";
+                break;
+        }
+        vp << csBCaption;
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 void Field::SetStyle(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex,
-					 const CFX_ByteString& string)
+                     const CFX_ByteString& string)
 {
-	//Not supported.
+    //Not supported.
 }
 
 FX_BOOL Field::submitName(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Field::textColor(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		CJS_Array crArray(m_isolate);
-		if (!vp.IsArrayObject())return FALSE;
-		vp >> crArray;
+        CJS_Array crArray(m_isolate);
+        if (!vp.IsArrayObject())return FALSE;
+        vp >> crArray;
 
-		CPWL_Color color;
-		color::ConvertArrayToPWLColor(crArray, color);
+        CPWL_Color color;
+        color::ConvertArrayToPWLColor(crArray, color);
 
-		if (m_bDelay)
-		{
-			AddDelay_Color(FP_TEXTCOLOR, color);
-		}
-		else
-		{
-			Field::SetTextColor(m_pDocument, m_FieldName, m_nFormControlIndex, color);
-		}
-	}
-	else
-	{
-		CFX_PtrArray FieldArray;
-		GetFormFields(m_FieldName,FieldArray);
-		if (FieldArray.GetSize() <= 0) return FALSE;
+        if (m_bDelay)
+        {
+            AddDelay_Color(FP_TEXTCOLOR, color);
+        }
+        else
+        {
+            Field::SetTextColor(m_pDocument, m_FieldName, m_nFormControlIndex, color);
+        }
+    }
+    else
+    {
+        CFX_PtrArray FieldArray;
+        GetFormFields(m_FieldName,FieldArray);
+        if (FieldArray.GetSize() <= 0) return FALSE;
 
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
-		if (!pFormControl)return FALSE;
+        CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+        if (!pFormControl)return FALSE;
 
-		int iColorType;
-		FX_ARGB color;
-		CPDF_DefaultAppearance FieldAppearance = pFormControl->GetDefaultAppearance();
-		FieldAppearance.GetColor(color, iColorType);
-		int32_t a,r,g,b;
-		ArgbDecode(color, a, r, g, b);
+        int iColorType;
+        FX_ARGB color;
+        CPDF_DefaultAppearance FieldAppearance = pFormControl->GetDefaultAppearance();
+        FieldAppearance.GetColor(color, iColorType);
+        int32_t a,r,g,b;
+        ArgbDecode(color, a, r, g, b);
 
-		CPWL_Color crRet = CPWL_Color(COLORTYPE_RGB, r / 255.0f,
-				g / 255.0f,
-				b / 255.0f);
+        CPWL_Color crRet = CPWL_Color(COLORTYPE_RGB, r / 255.0f,
+                g / 255.0f,
+                b / 255.0f);
 
-		if (iColorType == COLORTYPE_TRANSPARENT)
-			crRet = CPWL_Color(COLORTYPE_TRANSPARENT);
+        if (iColorType == COLORTYPE_TRANSPARENT)
+            crRet = CPWL_Color(COLORTYPE_TRANSPARENT);
 
-		CJS_Array crArray(m_isolate);
-		color::ConvertPWLColorToArray(crRet, crArray);
+        CJS_Array crArray(m_isolate);
+        color::ConvertPWLColorToArray(crRet, crArray);
         vp  <<  crArray;
-	}
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 void Field::SetTextColor(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CPWL_Color& color)
 {
-	//Not supported.
+    //Not supported.
 }
 
 FX_BOOL Field::textFont(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		CFX_ByteString csFontName;
-		vp >> csFontName;
-		if (csFontName.IsEmpty()) return FALSE;
+        CFX_ByteString csFontName;
+        vp >> csFontName;
+        if (csFontName.IsEmpty()) return FALSE;
 
-		if (m_bDelay)
-		{
-			AddDelay_String(FP_TEXTFONT, csFontName);
-		}
-		else
-		{
-			Field::SetTextFont(m_pDocument, m_FieldName, m_nFormControlIndex, csFontName);
-		}
-	}
-	else
-	{
-		CFX_PtrArray FieldArray;
-		GetFormFields(m_FieldName,FieldArray);
-		if (FieldArray.GetSize() <= 0) return FALSE;
+        if (m_bDelay)
+        {
+            AddDelay_String(FP_TEXTFONT, csFontName);
+        }
+        else
+        {
+            Field::SetTextFont(m_pDocument, m_FieldName, m_nFormControlIndex, csFontName);
+        }
+    }
+    else
+    {
+        CFX_PtrArray FieldArray;
+        GetFormFields(m_FieldName,FieldArray);
+        if (FieldArray.GetSize() <= 0) return FALSE;
 
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
-		if (!pFormControl)return FALSE;
+        CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+        if (!pFormControl)return FALSE;
 
-		int nFieldType = pFormField->GetFieldType();
+        int nFieldType = pFormField->GetFieldType();
 
-		if (nFieldType == FIELDTYPE_PUSHBUTTON ||
-			nFieldType == FIELDTYPE_COMBOBOX ||
-			nFieldType == FIELDTYPE_LISTBOX ||
-			nFieldType == FIELDTYPE_TEXTFIELD)
-		{
-			CPDF_Font * pFont = pFormControl->GetDefaultControlFont();
-			if (!pFont) return FALSE;
+        if (nFieldType == FIELDTYPE_PUSHBUTTON ||
+            nFieldType == FIELDTYPE_COMBOBOX ||
+            nFieldType == FIELDTYPE_LISTBOX ||
+            nFieldType == FIELDTYPE_TEXTFIELD)
+        {
+            CPDF_Font * pFont = pFormControl->GetDefaultControlFont();
+            if (!pFont) return FALSE;
 
-			vp << pFont->GetBaseFont();
-		}
-		else
-			return FALSE;
-	}
+            vp << pFont->GetBaseFont();
+        }
+        else
+            return FALSE;
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 void Field::SetTextFont(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CFX_ByteString& string)
 {
-	//Not supported.
+    //Not supported.
 }
 
 FX_BOOL Field::textSize(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		int nVP;
-		vp >> nVP;
+        int nVP;
+        vp >> nVP;
 
-		if (m_bDelay)
-		{
-			AddDelay_Int(FP_TEXTSIZE, nVP);
-		}
-		else
-		{
-			Field::SetTextSize(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
-		}
-	}
-	else
-	{
-		CFX_PtrArray FieldArray;
-		GetFormFields(m_FieldName,FieldArray);
-		if (FieldArray.GetSize() <= 0) return FALSE;
+        if (m_bDelay)
+        {
+            AddDelay_Int(FP_TEXTSIZE, nVP);
+        }
+        else
+        {
+            Field::SetTextSize(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
+        }
+    }
+    else
+    {
+        CFX_PtrArray FieldArray;
+        GetFormFields(m_FieldName,FieldArray);
+        if (FieldArray.GetSize() <= 0) return FALSE;
 
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
-		if (!pFormControl)return FALSE;
+        CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+        if (!pFormControl)return FALSE;
 
-		CPDF_DefaultAppearance FieldAppearance = pFormControl->GetDefaultAppearance();
+        CPDF_DefaultAppearance FieldAppearance = pFormControl->GetDefaultAppearance();
 
-		CFX_ByteString csFontNameTag;
-		FX_FLOAT fFontSize;
-		FieldAppearance.GetFont(csFontNameTag,fFontSize);
+        CFX_ByteString csFontNameTag;
+        FX_FLOAT fFontSize;
+        FieldAppearance.GetFont(csFontNameTag,fFontSize);
 
-		vp << (int)fFontSize;
-	}
+        vp << (int)fFontSize;
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 void Field::SetTextSize(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
 {
-	//Not supported.
+    //Not supported.
 }
 
 FX_BOOL Field::type(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (!vp.IsGetting()) return FALSE;
+    if (!vp.IsGetting()) return FALSE;
 
-	CFX_PtrArray FieldArray;
-	GetFormFields(m_FieldName,FieldArray);
-	if (FieldArray.GetSize() <= 0) return FALSE;
+    CFX_PtrArray FieldArray;
+    GetFormFields(m_FieldName,FieldArray);
+    if (FieldArray.GetSize() <= 0) return FALSE;
 
- 	CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-	ASSERT(pFormField != NULL);
+    CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+    ASSERT(pFormField != NULL);
 
-	switch (pFormField->GetFieldType())
-	{
-		case FIELDTYPE_UNKNOWN:
-			vp << L"unknown";
-			break;
-		case FIELDTYPE_PUSHBUTTON:
-			vp << L"button";
-			break;
-		case FIELDTYPE_CHECKBOX:
-			vp << L"checkbox";
-			break;
-		case FIELDTYPE_RADIOBUTTON:
-			vp << L"radiobutton";
-			break;
-		case FIELDTYPE_COMBOBOX:
-			vp << L"combobox";
-			break;
-		case FIELDTYPE_LISTBOX:
-			vp << L"listbox";
-			break;
-		case FIELDTYPE_TEXTFIELD:
-			vp << L"text";
-			break;
-		case FIELDTYPE_SIGNATURE:
-			vp << L"signature";
-			break;
-		default :
-			vp << L"unknown";
-			break;
-	}
+    switch (pFormField->GetFieldType())
+    {
+        case FIELDTYPE_UNKNOWN:
+            vp << L"unknown";
+            break;
+        case FIELDTYPE_PUSHBUTTON:
+            vp << L"button";
+            break;
+        case FIELDTYPE_CHECKBOX:
+            vp << L"checkbox";
+            break;
+        case FIELDTYPE_RADIOBUTTON:
+            vp << L"radiobutton";
+            break;
+        case FIELDTYPE_COMBOBOX:
+            vp << L"combobox";
+            break;
+        case FIELDTYPE_LISTBOX:
+            vp << L"listbox";
+            break;
+        case FIELDTYPE_TEXTFIELD:
+            vp << L"text";
+            break;
+        case FIELDTYPE_SIGNATURE:
+            vp << L"signature";
+            break;
+        default :
+            vp << L"unknown";
+            break;
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Field::userName(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-  	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		CFX_WideString swName;
-		vp >> swName;
+        CFX_WideString swName;
+        vp >> swName;
 
-		if (m_bDelay)
-		{
-			AddDelay_WideString(FP_USERNAME, swName);
-		}
-		else
-		{
-			Field::SetUserName(m_pDocument, m_FieldName, m_nFormControlIndex, swName);
-		}
-	}
-	else
-	{
-		CFX_PtrArray FieldArray;
-		GetFormFields(m_FieldName,FieldArray);
-		if (FieldArray.GetSize() <= 0) return FALSE;
+        if (m_bDelay)
+        {
+            AddDelay_WideString(FP_USERNAME, swName);
+        }
+        else
+        {
+            Field::SetUserName(m_pDocument, m_FieldName, m_nFormControlIndex, swName);
+        }
+    }
+    else
+    {
+        CFX_PtrArray FieldArray;
+        GetFormFields(m_FieldName,FieldArray);
+        if (FieldArray.GetSize() <= 0) return FALSE;
 
- 		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
-		vp << (CFX_WideString)pFormField->GetAlternateName();
-	}
+        vp << (CFX_WideString)pFormField->GetAlternateName();
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 void Field::SetUserName(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CFX_WideString& string)
 {
-	//Not supported.
+    //Not supported.
 }
 
 FX_BOOL Field::value(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (vp.IsSetting())
-	{
-		if (!m_bCanSet) return FALSE;
+    if (vp.IsSetting())
+    {
+        if (!m_bCanSet) return FALSE;
 
-		CJS_WideStringArray strArray;
+        CJS_WideStringArray strArray;
 
-		if (vp.IsArrayObject())
-		{
-			CJS_Array ValueArray(m_isolate);
-			vp.ConvertToArray(ValueArray);
-			for (int i = 0,sz = ValueArray.GetLength(); i < sz; i++)
-			{
-				CJS_Value ElementValue(m_isolate);
-				ValueArray.GetElement(i, ElementValue);
-				strArray.Add(ElementValue.ToCFXWideString());
-			}
-		}
-		else
-		{
-			CFX_WideString swValue;
-			vp >> swValue;
+        if (vp.IsArrayObject())
+        {
+            CJS_Array ValueArray(m_isolate);
+            vp.ConvertToArray(ValueArray);
+            for (int i = 0,sz = ValueArray.GetLength(); i < sz; i++)
+            {
+                CJS_Value ElementValue(m_isolate);
+                ValueArray.GetElement(i, ElementValue);
+                strArray.Add(ElementValue.ToCFXWideString());
+            }
+        }
+        else
+        {
+            CFX_WideString swValue;
+            vp >> swValue;
 
-			strArray.Add(swValue);
-		}
+            strArray.Add(swValue);
+        }
 
-		if (m_bDelay)
-		{
-			AddDelay_WideStringArray(FP_VALUE, strArray);
-		}
-		else
-		{
-			Field::SetValue(m_pDocument, m_FieldName, m_nFormControlIndex, strArray);
-		}
-	}
-	else
-	{
-		CFX_PtrArray FieldArray;
-		GetFormFields(m_FieldName,FieldArray);
-		if (FieldArray.GetSize() <= 0) return FALSE;
+        if (m_bDelay)
+        {
+            AddDelay_WideStringArray(FP_VALUE, strArray);
+        }
+        else
+        {
+            Field::SetValue(m_pDocument, m_FieldName, m_nFormControlIndex, strArray);
+        }
+    }
+    else
+    {
+        CFX_PtrArray FieldArray;
+        GetFormFields(m_FieldName,FieldArray);
+        if (FieldArray.GetSize() <= 0) return FALSE;
 
- 		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-		ASSERT(pFormField != NULL);
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+        ASSERT(pFormField != NULL);
 
 
 
-		switch (pFormField->GetFieldType())
-		{
-		case FIELDTYPE_PUSHBUTTON:
-			return FALSE;
-		case FIELDTYPE_COMBOBOX:
-		case FIELDTYPE_TEXTFIELD:
-			{
-				CFX_WideString swValue = pFormField->GetValue();
+        switch (pFormField->GetFieldType())
+        {
+        case FIELDTYPE_PUSHBUTTON:
+            return FALSE;
+        case FIELDTYPE_COMBOBOX:
+        case FIELDTYPE_TEXTFIELD:
+            {
+                CFX_WideString swValue = pFormField->GetValue();
 
-				double dRet;
-				FX_BOOL bDot;
-				if (CJS_PublicMethods::ConvertStringToNumber(swValue.c_str(), dRet, bDot))
-				{
-					if (bDot)
-						vp << dRet;
-					else
-						vp << dRet;
-				}
-				else
-					vp << swValue;
-			}
-			break;
-		case FIELDTYPE_LISTBOX:
-			{
-				if (pFormField->CountSelectedItems() > 1)
-				{
-					CJS_Array ValueArray(m_isolate);
-					CJS_Value ElementValue(m_isolate);
-					int iIndex;
-					for (int i = 0, sz = pFormField->CountSelectedItems(); i < sz; i++)
-					{
-						iIndex = pFormField->GetSelectedIndex(i);
-						ElementValue = pFormField->GetOptionValue(iIndex).c_str();
-						if (FXSYS_wcslen(ElementValue.ToCFXWideString().c_str()) == 0)
-							ElementValue = pFormField->GetOptionLabel(iIndex).c_str();
-						ValueArray.SetElement(i, ElementValue);
-					}
-					vp << ValueArray;
-				}
-				else
-				{
-					CFX_WideString swValue = pFormField->GetValue();
+                double dRet;
+                FX_BOOL bDot;
+                if (CJS_PublicMethods::ConvertStringToNumber(swValue.c_str(), dRet, bDot))
+                {
+                    if (bDot)
+                        vp << dRet;
+                    else
+                        vp << dRet;
+                }
+                else
+                    vp << swValue;
+            }
+            break;
+        case FIELDTYPE_LISTBOX:
+            {
+                if (pFormField->CountSelectedItems() > 1)
+                {
+                    CJS_Array ValueArray(m_isolate);
+                    CJS_Value ElementValue(m_isolate);
+                    int iIndex;
+                    for (int i = 0, sz = pFormField->CountSelectedItems(); i < sz; i++)
+                    {
+                        iIndex = pFormField->GetSelectedIndex(i);
+                        ElementValue = pFormField->GetOptionValue(iIndex).c_str();
+                        if (FXSYS_wcslen(ElementValue.ToCFXWideString().c_str()) == 0)
+                            ElementValue = pFormField->GetOptionLabel(iIndex).c_str();
+                        ValueArray.SetElement(i, ElementValue);
+                    }
+                    vp << ValueArray;
+                }
+                else
+                {
+                    CFX_WideString swValue = pFormField->GetValue();
 
-					double dRet;
-					FX_BOOL bDot;
-					if (CJS_PublicMethods::ConvertStringToNumber(swValue.c_str(), dRet, bDot))
-					{
-						if (bDot)
-							vp << dRet;
-						else
-							vp << dRet;
-					}
-					else
-						vp << swValue;
-				}
-			}
-			break;
-		case FIELDTYPE_CHECKBOX:
-		case FIELDTYPE_RADIOBUTTON:
-			{
-				FX_BOOL bFind = FALSE;
-				for (int i = 0 , sz = pFormField->CountControls(); i < sz; i++)
-				{
-					if (pFormField->GetControl(i)->IsChecked())
-					{
-						CFX_WideString swValue = pFormField->GetControl(i)->GetExportValue();
-						double dRet;
-						FX_BOOL bDot;
-						if (CJS_PublicMethods::ConvertStringToNumber(swValue.c_str(), dRet, bDot))
-						{
-							if (bDot)
-								vp << dRet;
-							else
-								vp << dRet;
-						}
-						else
-							vp << swValue;
+                    double dRet;
+                    FX_BOOL bDot;
+                    if (CJS_PublicMethods::ConvertStringToNumber(swValue.c_str(), dRet, bDot))
+                    {
+                        if (bDot)
+                            vp << dRet;
+                        else
+                            vp << dRet;
+                    }
+                    else
+                        vp << swValue;
+                }
+            }
+            break;
+        case FIELDTYPE_CHECKBOX:
+        case FIELDTYPE_RADIOBUTTON:
+            {
+                FX_BOOL bFind = FALSE;
+                for (int i = 0 , sz = pFormField->CountControls(); i < sz; i++)
+                {
+                    if (pFormField->GetControl(i)->IsChecked())
+                    {
+                        CFX_WideString swValue = pFormField->GetControl(i)->GetExportValue();
+                        double dRet;
+                        FX_BOOL bDot;
+                        if (CJS_PublicMethods::ConvertStringToNumber(swValue.c_str(), dRet, bDot))
+                        {
+                            if (bDot)
+                                vp << dRet;
+                            else
+                                vp << dRet;
+                        }
+                        else
+                            vp << swValue;
 
-						bFind = TRUE;
-						break;
-					}
-					else
-						continue;
-				}
-				if (!bFind)
-					vp << L"Off";
-			}
-			break;
-		default:
-			vp << pFormField->GetValue();
-			break;
-		}
-	}
+                        bFind = TRUE;
+                        break;
+                    }
+                    else
+                        continue;
+                }
+                if (!bFind)
+                    vp << L"Off";
+            }
+            break;
+        default:
+            vp << pFormField->GetValue();
+            break;
+        }
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 void Field::SetValue(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName,
-					 int nControlIndex, const CJS_WideStringArray& strArray)
+                     int nControlIndex, const CJS_WideStringArray& strArray)
 {
-	ASSERT(pDocument != NULL);
+    ASSERT(pDocument != NULL);
 
-	if (strArray.GetSize() < 1) return;
+    if (strArray.GetSize() < 1) return;
 
-	CFX_PtrArray FieldArray;
-	GetFormFields(pDocument, swFieldName, FieldArray);
+    CFX_PtrArray FieldArray;
+    GetFormFields(pDocument, swFieldName, FieldArray);
 
-	for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
-	{
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
-		ASSERT(pFormField != NULL);
+    for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
+    {
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
+        ASSERT(pFormField != NULL);
 
-		if (pFormField->GetFullName().Compare(swFieldName) != 0)
-			continue;
+        if (pFormField->GetFullName().Compare(swFieldName) != 0)
+            continue;
 
-		switch (pFormField->GetFieldType())
-		{
-		case FIELDTYPE_TEXTFIELD:
-		case FIELDTYPE_COMBOBOX:
-			if (pFormField->GetValue() != strArray.GetAt(0))
-			{
-				CFX_WideString WideString = strArray.GetAt(0);
-				pFormField->SetValue(strArray.GetAt(0), TRUE);
-				UpdateFormField(pDocument, pFormField, TRUE, FALSE, TRUE);
-			}
-			break;
-		case FIELDTYPE_CHECKBOX: //mantis: 0004493
-		case FIELDTYPE_RADIOBUTTON:
-			{
-				if (pFormField->GetValue() != strArray.GetAt(0))
-				{
-					pFormField->SetValue(strArray.GetAt(0), TRUE);
-					UpdateFormField(pDocument, pFormField, TRUE, FALSE, TRUE);
-				}
-			}
-			break;
-		case FIELDTYPE_LISTBOX:
-			{
-				FX_BOOL bModified = FALSE;
+        switch (pFormField->GetFieldType())
+        {
+        case FIELDTYPE_TEXTFIELD:
+        case FIELDTYPE_COMBOBOX:
+            if (pFormField->GetValue() != strArray.GetAt(0))
+            {
+                CFX_WideString WideString = strArray.GetAt(0);
+                pFormField->SetValue(strArray.GetAt(0), TRUE);
+                UpdateFormField(pDocument, pFormField, TRUE, FALSE, TRUE);
+            }
+            break;
+        case FIELDTYPE_CHECKBOX: //mantis: 0004493
+        case FIELDTYPE_RADIOBUTTON:
+            {
+                if (pFormField->GetValue() != strArray.GetAt(0))
+                {
+                    pFormField->SetValue(strArray.GetAt(0), TRUE);
+                    UpdateFormField(pDocument, pFormField, TRUE, FALSE, TRUE);
+                }
+            }
+            break;
+        case FIELDTYPE_LISTBOX:
+            {
+                FX_BOOL bModified = FALSE;
 
-				for (int i=0,sz=strArray.GetSize(); i<sz; i++)
-				{
-					int iIndex = pFormField->FindOption(strArray.GetAt(i));
+                for (int i=0,sz=strArray.GetSize(); i<sz; i++)
+                {
+                    int iIndex = pFormField->FindOption(strArray.GetAt(i));
 
-					if (!pFormField->IsItemSelected(iIndex))
-					{
-						bModified = TRUE;
-						break;
-					}
-				}
+                    if (!pFormField->IsItemSelected(iIndex))
+                    {
+                        bModified = TRUE;
+                        break;
+                    }
+                }
 
-				if (bModified)
-				{
-					pFormField->ClearSelection(TRUE);
-					for (int i=0,sz=strArray.GetSize(); i<sz; i++)
-					{
-						int iIndex = pFormField->FindOption(strArray.GetAt(i));
-						pFormField->SetItemSelection(iIndex, TRUE, TRUE);
-					}
+                if (bModified)
+                {
+                    pFormField->ClearSelection(TRUE);
+                    for (int i=0,sz=strArray.GetSize(); i<sz; i++)
+                    {
+                        int iIndex = pFormField->FindOption(strArray.GetAt(i));
+                        pFormField->SetItemSelection(iIndex, TRUE, TRUE);
+                    }
 
-					UpdateFormField(pDocument, pFormField, TRUE, FALSE, TRUE);
-				}
-			}
-			break;
-		default:
-			break;
-		}
-	}
+                    UpdateFormField(pDocument, pFormField, TRUE, FALSE, TRUE);
+                }
+            }
+            break;
+        default:
+            break;
+        }
+    }
 }
 
 FX_BOOL Field::valueAsString(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (!vp.IsGetting()) return FALSE;
+    if (!vp.IsGetting()) return FALSE;
 
-	CFX_PtrArray FieldArray;
-	GetFormFields(m_FieldName,FieldArray);
-	if (FieldArray.GetSize() <= 0) return FALSE;
+    CFX_PtrArray FieldArray;
+    GetFormFields(m_FieldName,FieldArray);
+    if (FieldArray.GetSize() <= 0) return FALSE;
 
-   	CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-	ASSERT(pFormField != NULL);
+    CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+    ASSERT(pFormField != NULL);
 
-	if (pFormField->GetFieldType() == FIELDTYPE_PUSHBUTTON)
-		return FALSE;
+    if (pFormField->GetFieldType() == FIELDTYPE_PUSHBUTTON)
+        return FALSE;
 
-	if (pFormField->GetFieldType() == FIELDTYPE_CHECKBOX)
-	{
-		if(!pFormField->CountControls()) return FALSE;
+    if (pFormField->GetFieldType() == FIELDTYPE_CHECKBOX)
+    {
+        if(!pFormField->CountControls()) return FALSE;
 
-		if (pFormField->GetControl(0)->IsChecked())
-			vp << L"Yes";
-		else
-			vp << L"Off";
-	}
-	else if (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON && !(pFormField->GetFieldFlags() & FIELDFLAG_RADIOSINUNISON))
-	{
-		for (int i=0, sz=pFormField->CountControls(); i<sz; i++)
-		{
-			if (pFormField->GetControl(i)->IsChecked())
-			{
-				vp << pFormField->GetControl(i)->GetExportValue().c_str();
-				break;
-			}
-			else
-				vp << L"Off";
-		}
-	}
-	else if (pFormField->GetFieldType() == FIELDTYPE_LISTBOX && (pFormField->CountSelectedItems() > 1))
-	{
-		vp << L"";
-	}
-	else
-		vp << pFormField->GetValue().c_str();
+        if (pFormField->GetControl(0)->IsChecked())
+            vp << L"Yes";
+        else
+            vp << L"Off";
+    }
+    else if (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON && !(pFormField->GetFieldFlags() & FIELDFLAG_RADIOSINUNISON))
+    {
+        for (int i=0, sz=pFormField->CountControls(); i<sz; i++)
+        {
+            if (pFormField->GetControl(i)->IsChecked())
+            {
+                vp << pFormField->GetControl(i)->GetExportValue().c_str();
+                break;
+            }
+            else
+                vp << L"Off";
+        }
+    }
+    else if (pFormField->GetFieldType() == FIELDTYPE_LISTBOX && (pFormField->CountSelectedItems() > 1))
+    {
+        vp << L"";
+    }
+    else
+        vp << pFormField->GetValue().c_str();
 
-	return TRUE;
+    return TRUE;
 }
 
 /* --------------------------------- methods --------------------------------- */
 
 FX_BOOL Field::browseForFileToSubmit(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	CFX_PtrArray FieldArray;
-	GetFormFields(m_FieldName, FieldArray);
-	if (FieldArray.GetSize() <= 0) return FALSE;
+    CFX_PtrArray FieldArray;
+    GetFormFields(m_FieldName, FieldArray);
+    if (FieldArray.GetSize() <= 0) return FALSE;
 
-	CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-	ASSERT(pFormField != NULL);
+    CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+    ASSERT(pFormField != NULL);
 
- 	CPDFDoc_Environment* pApp = m_pDocument->GetEnv();
- 	ASSERT(pApp != NULL);
+    CPDFDoc_Environment* pApp = m_pDocument->GetEnv();
+    ASSERT(pApp != NULL);
 
-	if ((pFormField->GetFieldFlags() & FIELDFLAG_FILESELECT) &&
-		(pFormField->GetFieldType() == FIELDTYPE_TEXTFIELD))
-	{
-		CFX_WideString wsFileName = pApp->JS_fieldBrowse();
-		if(!wsFileName.IsEmpty())
-		{
- 			pFormField->SetValue(wsFileName);
- 			UpdateFormField(m_pDocument, pFormField, TRUE, TRUE, TRUE);
+    if ((pFormField->GetFieldFlags() & FIELDFLAG_FILESELECT) &&
+        (pFormField->GetFieldType() == FIELDTYPE_TEXTFIELD))
+    {
+        CFX_WideString wsFileName = pApp->JS_fieldBrowse();
+        if(!wsFileName.IsEmpty())
+        {
+            pFormField->SetValue(wsFileName);
+            UpdateFormField(m_pDocument, pFormField, TRUE, TRUE, TRUE);
          }
-	}
-	else
-		return FALSE;
+    }
+    else
+        return FALSE;
 
-	return TRUE;
+    return TRUE;
 }
 
 
 FX_BOOL Field::buttonGetCaption(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	int nface = 0;
-	int iSize = params.size();
-	if (iSize >= 1)
-		nface = params[0].ToInt();
+    int nface = 0;
+    int iSize = params.size();
+    if (iSize >= 1)
+        nface = params[0].ToInt();
 
-	CFX_PtrArray FieldArray;
-	GetFormFields(m_FieldName,FieldArray);
-	if (FieldArray.GetSize() <= 0) return FALSE;
+    CFX_PtrArray FieldArray;
+    GetFormFields(m_FieldName,FieldArray);
+    if (FieldArray.GetSize() <= 0) return FALSE;
 
-	CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-	ASSERT(pFormField != NULL);
+    CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+    ASSERT(pFormField != NULL);
 
-	if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
-		return FALSE;
+    if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
+        return FALSE;
 
-	CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
-	if (!pFormControl)return FALSE;
+    CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+    if (!pFormControl)return FALSE;
 
-	if (nface == 0)
-		vRet = pFormControl->GetNormalCaption().c_str();
-	else if (nface == 1)
-		vRet = pFormControl->GetDownCaption().c_str();
-	else if (nface == 2)
-		vRet = pFormControl->GetRolloverCaption().c_str();
-	else
-		return FALSE;
+    if (nface == 0)
+        vRet = pFormControl->GetNormalCaption().c_str();
+    else if (nface == 1)
+        vRet = pFormControl->GetDownCaption().c_str();
+    else if (nface == 2)
+        vRet = pFormControl->GetRolloverCaption().c_str();
+    else
+        return FALSE;
 
-	return TRUE;
+    return TRUE;
 }
 
 //#pragma warning(disable: 4800)
 
 FX_BOOL Field::buttonGetIcon(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	int nface = 0;
-	int iSize = params.size();
-	if (iSize >= 1)
-		nface = params[0].ToInt();
+    int nface = 0;
+    int iSize = params.size();
+    if (iSize >= 1)
+        nface = params[0].ToInt();
 
-	CFX_PtrArray FieldArray;
-	GetFormFields(m_FieldName,FieldArray);
-	if (FieldArray.GetSize() <= 0) return FALSE;
+    CFX_PtrArray FieldArray;
+    GetFormFields(m_FieldName,FieldArray);
+    if (FieldArray.GetSize() <= 0) return FALSE;
 
-	CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-	ASSERT(pFormField != NULL);
+    CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+    ASSERT(pFormField != NULL);
 
-	if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
-		return FALSE;
+    if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
+        return FALSE;
 
-	CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
-	if (!pFormControl)return FALSE;
+    CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+    if (!pFormControl)return FALSE;
 
-	CJS_Context* pContext = (CJS_Context*)cc;
-	ASSERT(pContext != NULL);
+    CJS_Context* pContext = (CJS_Context*)cc;
+    ASSERT(pContext != NULL);
 
-	CJS_Runtime* pRuntime = pContext->GetJSRuntime();
-	ASSERT(pRuntime != NULL);
+    CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+    ASSERT(pRuntime != NULL);
 
-	JSFXObject pObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"Icon"));
-	ASSERT(pObj.IsEmpty() == FALSE);
+    JSFXObject pObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"Icon"));
+    ASSERT(pObj.IsEmpty() == FALSE);
 
-	CJS_Icon* pJS_Icon = (CJS_Icon*)JS_GetPrivate(pObj);
-	ASSERT(pJS_Icon != NULL);
+    CJS_Icon* pJS_Icon = (CJS_Icon*)JS_GetPrivate(pObj);
+    ASSERT(pJS_Icon != NULL);
 
-	Icon* pIcon = (Icon*)pJS_Icon->GetEmbedObject();
-	ASSERT(pIcon != NULL);
+    Icon* pIcon = (Icon*)pJS_Icon->GetEmbedObject();
+    ASSERT(pIcon != NULL);
 
-	CPDF_Stream* pIconStream = NULL;
-	if (nface == 0)
-		pIconStream = pFormControl->GetNormalIcon();
-	else if (nface == 1)
-		pIconStream = pFormControl->GetDownIcon();
-	else if (nface == 2)
-		pIconStream = pFormControl->GetRolloverIcon();
-	else
-		return FALSE;
+    CPDF_Stream* pIconStream = NULL;
+    if (nface == 0)
+        pIconStream = pFormControl->GetNormalIcon();
+    else if (nface == 1)
+        pIconStream = pFormControl->GetDownIcon();
+    else if (nface == 2)
+        pIconStream = pFormControl->GetRolloverIcon();
+    else
+        return FALSE;
 
-	pIcon->SetStream(pIconStream);
-	vRet = pJS_Icon;
+    pIcon->SetStream(pIconStream);
+    vRet = pJS_Icon;
 
-	return TRUE;
+    return TRUE;
 }
 
 //#pragma warning(default: 4800)
@@ -3460,324 +3461,324 @@
 FX_BOOL Field::buttonImportIcon(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
 #if 0
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	CFX_PtrArray FieldArray;
-	GetFormFields(m_FieldName,FieldArray);
-	if (FieldArray.GetSize() <= 0) return FALSE;
+    CFX_PtrArray FieldArray;
+    GetFormFields(m_FieldName,FieldArray);
+    if (FieldArray.GetSize() <= 0) return FALSE;
 
-	CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-	if (!pFormField)return FALSE;
+    CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+    if (!pFormField)return FALSE;
 
-	CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
-	ASSERT(pEnv);
+    CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
+    ASSERT(pEnv);
 
-	CFX_WideString sIconFileName = pEnv->JS_fieldBrowse();
-	if (sIconFileName.IsEmpty())
-	{
-		vRet = 1;
-		return TRUE;
-	}
+    CFX_WideString sIconFileName = pEnv->JS_fieldBrowse();
+    if (sIconFileName.IsEmpty())
+    {
+        vRet = 1;
+        return TRUE;
+    }
 
-	CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
-	ASSERT(pInterForm != NULL);
+    CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+    ASSERT(pInterForm != NULL);
 
-	CPDF_Stream* pStream = pInterForm->LoadImageFromFile(sIconFileName);
-	if (!pStream)
-	{
-		vRet = -1;
-		return TRUE;
-	}
+    CPDF_Stream* pStream = pInterForm->LoadImageFromFile(sIconFileName);
+    if (!pStream)
+    {
+        vRet = -1;
+        return TRUE;
+    }
 
-	CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
-	if (!pFormControl)return FALSE;
+    CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+    if (!pFormControl)return FALSE;
 
-	pFormControl->SetNormalIcon(pStream);
-	UpdateFormControl(m_pDocument, pFormControl, TRUE, TRUE, TRUE);
+    pFormControl->SetNormalIcon(pStream);
+    UpdateFormControl(m_pDocument, pFormControl, TRUE, TRUE, TRUE);
 
-	vRet = 0;
+    vRet = 0;
 #endif // 0
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Field::buttonSetCaption(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	return FALSE;
+    return FALSE;
 }
 
 FX_BOOL Field::buttonSetIcon(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	return FALSE;
+    return FALSE;
 }
 
 FX_BOOL Field::checkThisBox(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (!m_bCanSet) return FALSE;
+    if (!m_bCanSet) return FALSE;
 
-	int iSize = params.size();
-	if (iSize < 1)
-		return FALSE;
+    int iSize = params.size();
+    if (iSize < 1)
+        return FALSE;
 
-	int nWidget = params[0].ToInt();
+    int nWidget = params[0].ToInt();
 
-	FX_BOOL bCheckit = TRUE;
-	if (iSize >= 2)
-		bCheckit = params[1].ToBool();
+    FX_BOOL bCheckit = TRUE;
+    if (iSize >= 2)
+        bCheckit = params[1].ToBool();
 
-	CFX_PtrArray FieldArray;
-	GetFormFields(m_FieldName,FieldArray);
-	if (FieldArray.GetSize() <= 0) return FALSE;
+    CFX_PtrArray FieldArray;
+    GetFormFields(m_FieldName,FieldArray);
+    if (FieldArray.GetSize() <= 0) return FALSE;
 
-	CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-	ASSERT(pFormField != NULL);
+    CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+    ASSERT(pFormField != NULL);
 
-	if (pFormField->GetFieldType() != FIELDTYPE_CHECKBOX && pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON)
-		return FALSE;
-	if(nWidget <0 || nWidget >= pFormField->CountControls())
-		return FALSE;
-	if (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON)
-		pFormField->CheckControl(nWidget, bCheckit, TRUE);
-	else
-		pFormField->CheckControl(nWidget, bCheckit, TRUE);
+    if (pFormField->GetFieldType() != FIELDTYPE_CHECKBOX && pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON)
+        return FALSE;
+    if(nWidget <0 || nWidget >= pFormField->CountControls())
+        return FALSE;
+    if (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON)
+        pFormField->CheckControl(nWidget, bCheckit, TRUE);
+    else
+        pFormField->CheckControl(nWidget, bCheckit, TRUE);
 
-	UpdateFormField(m_pDocument, pFormField, TRUE, TRUE, TRUE);
-	return TRUE;
+    UpdateFormField(m_pDocument, pFormField, TRUE, TRUE, TRUE);
+    return TRUE;
 }
 
 FX_BOOL Field::clearItems(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Field::defaultIsChecked(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	if (!m_bCanSet) return FALSE;
+    if (!m_bCanSet) return FALSE;
 
-	int iSize = params.size();
-	if (iSize < 1)
-		return FALSE;
+    int iSize = params.size();
+    if (iSize < 1)
+        return FALSE;
 
-	int nWidget = params[0].ToInt();
+    int nWidget = params[0].ToInt();
 
-	CFX_PtrArray FieldArray;
-	GetFormFields(m_FieldName,FieldArray);
-	if (FieldArray.GetSize() <= 0) return FALSE;
+    CFX_PtrArray FieldArray;
+    GetFormFields(m_FieldName,FieldArray);
+    if (FieldArray.GetSize() <= 0) return FALSE;
 
-	CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-	ASSERT(pFormField != NULL);
+    CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+    ASSERT(pFormField != NULL);
 
-	if(nWidget <0 || nWidget >= pFormField->CountControls())
-	{
-		vRet = FALSE;
-		return FALSE;
-	}
-	if ((pFormField->GetFieldType() == FIELDTYPE_CHECKBOX)
-		|| (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON))
-	{
+    if(nWidget <0 || nWidget >= pFormField->CountControls())
+    {
+        vRet = FALSE;
+        return FALSE;
+    }
+    if ((pFormField->GetFieldType() == FIELDTYPE_CHECKBOX)
+        || (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON))
+    {
 
-		vRet = TRUE;
-	}
-	else
-		vRet = FALSE;
+        vRet = TRUE;
+    }
+    else
+        vRet = FALSE;
 
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Field::deleteItemAt(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	return TRUE;
+    return TRUE;
 }
 
 int JS_COMPARESTRING(CFX_WideString* ps1, CFX_WideString* ps2)
 {
-	ASSERT(ps1 != NULL);
-	ASSERT(ps2 != NULL);
+    ASSERT(ps1 != NULL);
+    ASSERT(ps2 != NULL);
 
-	return ps1->Compare(*ps2);
+    return ps1->Compare(*ps2);
 }
 
 
 FX_BOOL Field::getArray(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	CFX_PtrArray FieldArray;
-	GetFormFields(m_FieldName,FieldArray);
-	if (FieldArray.GetSize() <= 0) return FALSE;
+    CFX_PtrArray FieldArray;
+    GetFormFields(m_FieldName,FieldArray);
+    if (FieldArray.GetSize() <= 0) return FALSE;
 
-	CGW_ArrayTemplate<CFX_WideString*> swSort;
+    CGW_ArrayTemplate<CFX_WideString*> swSort;
 
-	for (int i=0,sz=FieldArray.GetSize(); i<sz; i++)
-	{
-		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
-		ASSERT(pFormField != NULL);
+    for (int i=0,sz=FieldArray.GetSize(); i<sz; i++)
+    {
+        CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
+        ASSERT(pFormField != NULL);
 
-		swSort.Add(new CFX_WideString(pFormField->GetFullName()));
+        swSort.Add(new CFX_WideString(pFormField->GetFullName()));
 
-	}
-	swSort.Sort(JS_COMPARESTRING);
+    }
+    swSort.Sort(JS_COMPARESTRING);
 
-	CJS_Context* pContext = (CJS_Context*)cc;
-	ASSERT(pContext != NULL);
-	CJS_Runtime* pRuntime = pContext->GetJSRuntime();
-	ASSERT(pRuntime != NULL);
+    CJS_Context* pContext = (CJS_Context*)cc;
+    ASSERT(pContext != NULL);
+    CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+    ASSERT(pRuntime != NULL);
 
-	CJS_Array FormFieldArray(m_isolate);
-	for (int j=0,jsz = swSort.GetSize(); j<jsz; j++)
-	{
-		CFX_WideString* pStr = swSort.GetAt(j);
+    CJS_Array FormFieldArray(m_isolate);
+    for (int j=0,jsz = swSort.GetSize(); j<jsz; j++)
+    {
+        CFX_WideString* pStr = swSort.GetAt(j);
 
-		JSFXObject pObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"Field"));
-		ASSERT(pObj.IsEmpty() == FALSE);
+        JSFXObject pObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"Field"));
+        ASSERT(pObj.IsEmpty() == FALSE);
 
-		CJS_Field* pJSField = (CJS_Field*)JS_GetPrivate(pObj);
-		ASSERT(pJSField != NULL);
+        CJS_Field* pJSField = (CJS_Field*)JS_GetPrivate(pObj);
+        ASSERT(pJSField != NULL);
 
-		Field* pField = (Field*)pJSField->GetEmbedObject();
-		ASSERT(pField != NULL);
+        Field* pField = (Field*)pJSField->GetEmbedObject();
+        ASSERT(pField != NULL);
 
-		pField->AttachField(m_pJSDoc, *pStr);
+        pField->AttachField(m_pJSDoc, *pStr);
 
-		CJS_Value FormFieldValue(m_isolate);
-		FormFieldValue = pJSField;
-		FormFieldArray.SetElement(j, FormFieldValue);
+        CJS_Value FormFieldValue(m_isolate);
+        FormFieldValue = pJSField;
+        FormFieldArray.SetElement(j, FormFieldValue);
 
-		delete pStr;
-	}
+        delete pStr;
+    }
 
-	vRet = FormFieldArray;
-	swSort.RemoveAll();
-	return TRUE;
+    vRet = FormFieldArray;
+    swSort.RemoveAll();
+    return TRUE;
 }
 
 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();
+    ASSERT(m_pDocument != NULL);
+    int iSize = params.size();
 
-	int nIdx = -1;
-	if (iSize >= 1)
-		nIdx = params[0].ToInt();
+    int nIdx = -1;
+    if (iSize >= 1)
+        nIdx = params[0].ToInt();
 
-	FX_BOOL bExport = TRUE;
-	if (iSize >= 2)
-		bExport = params[1].ToBool();
+    FX_BOOL bExport = TRUE;
+    if (iSize >= 2)
+        bExport = params[1].ToBool();
 
-	CFX_PtrArray FieldArray;
-	GetFormFields(m_FieldName,FieldArray);
-	if (FieldArray.GetSize() <= 0) return FALSE;
+    CFX_PtrArray FieldArray;
+    GetFormFields(m_FieldName,FieldArray);
+    if (FieldArray.GetSize() <= 0) return FALSE;
 
-	CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-	ASSERT(pFormField != NULL);
+    CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+    ASSERT(pFormField != NULL);
 
-	if ((pFormField->GetFieldType() == FIELDTYPE_LISTBOX)
-		|| (pFormField->GetFieldType() == FIELDTYPE_COMBOBOX))
-	{
-		if (nIdx == -1 || nIdx > pFormField->CountOptions())
-			nIdx = pFormField->CountOptions() -1;
-		if (bExport)
-		{
-			CFX_WideString strval = pFormField->GetOptionValue(nIdx);
-			if (strval.IsEmpty())
-				vRet = pFormField->GetOptionLabel(nIdx).c_str();
-			else
-				vRet = strval.c_str();
-		}
-		else
-			vRet = pFormField->GetOptionLabel(nIdx).c_str();
-	}
-	else
-		return FALSE;
+    if ((pFormField->GetFieldType() == FIELDTYPE_LISTBOX)
+        || (pFormField->GetFieldType() == FIELDTYPE_COMBOBOX))
+    {
+        if (nIdx == -1 || nIdx > pFormField->CountOptions())
+            nIdx = pFormField->CountOptions() -1;
+        if (bExport)
+        {
+            CFX_WideString strval = pFormField->GetOptionValue(nIdx);
+            if (strval.IsEmpty())
+                vRet = pFormField->GetOptionLabel(nIdx).c_str();
+            else
+                vRet = strval.c_str();
+        }
+        else
+            vRet = pFormField->GetOptionLabel(nIdx).c_str();
+    }
+    else
+        return FALSE;
 
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Field::getLock(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	return FALSE;
+    return FALSE;
 }
 
 FX_BOOL Field::insertItemAt(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Field::isBoxChecked(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	int nIndex = -1;
-	if (params.size() >= 1)
-		nIndex = params[0].ToInt();
+    int nIndex = -1;
+    if (params.size() >= 1)
+        nIndex = params[0].ToInt();
 
-	CFX_PtrArray FieldArray;
-	GetFormFields(m_FieldName,FieldArray);
-	if (FieldArray.GetSize() <= 0) return FALSE;
+    CFX_PtrArray FieldArray;
+    GetFormFields(m_FieldName,FieldArray);
+    if (FieldArray.GetSize() <= 0) return FALSE;
 
-	CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-	ASSERT(pFormField != NULL);
+    CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+    ASSERT(pFormField != NULL);
 
-	if(nIndex <0 || nIndex >= pFormField->CountControls())
-	{
-		vRet = FALSE;
-		return FALSE;
-	}
+    if(nIndex <0 || nIndex >= pFormField->CountControls())
+    {
+        vRet = FALSE;
+        return FALSE;
+    }
 
-	if ((pFormField->GetFieldType() == FIELDTYPE_CHECKBOX)
-		|| (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON))
-	{
-		if (pFormField->GetControl(nIndex)->IsChecked() !=0 )
-			vRet = TRUE;
-		else
-			vRet = FALSE;
-	}
-	else
-		vRet = FALSE;
+    if ((pFormField->GetFieldType() == FIELDTYPE_CHECKBOX)
+        || (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON))
+    {
+        if (pFormField->GetControl(nIndex)->IsChecked() !=0 )
+            vRet = TRUE;
+        else
+            vRet = FALSE;
+    }
+    else
+        vRet = FALSE;
 
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Field::isDefaultChecked(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	ASSERT(m_pDocument != NULL);
+    ASSERT(m_pDocument != NULL);
 
-	int nIndex = -1;
-	if (params.size() >= 1)
-		nIndex = params[0].ToInt();
+    int nIndex = -1;
+    if (params.size() >= 1)
+        nIndex = params[0].ToInt();
 
-	CFX_PtrArray FieldArray;
-	GetFormFields(m_FieldName,FieldArray);
-	if (FieldArray.GetSize() <= 0) return FALSE;
+    CFX_PtrArray FieldArray;
+    GetFormFields(m_FieldName,FieldArray);
+    if (FieldArray.GetSize() <= 0) return FALSE;
 
-	CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
-	ASSERT(pFormField != NULL);
+    CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+    ASSERT(pFormField != NULL);
 
-	if(nIndex <0 || nIndex >= pFormField->CountControls())
-	{
-		vRet = FALSE;
-		return FALSE;
-	}
-	if ((pFormField->GetFieldType() == FIELDTYPE_CHECKBOX)
-		|| (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON))
-	{
-		if (pFormField->GetControl(nIndex)->IsDefaultChecked() != 0)
-			vRet = TRUE;
-		else
-			vRet = FALSE;
-	}
-	else
-		vRet = FALSE;
+    if(nIndex <0 || nIndex >= pFormField->CountControls())
+    {
+        vRet = FALSE;
+        return FALSE;
+    }
+    if ((pFormField->GetFieldType() == FIELDTYPE_CHECKBOX)
+        || (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON))
+    {
+        if (pFormField->GetControl(nIndex)->IsDefaultChecked() != 0)
+            vRet = TRUE;
+        else
+            vRet = FALSE;
+    }
+    else
+        vRet = FALSE;
 
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Field::setAction(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Field::setFocus(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
@@ -3836,280 +3837,280 @@
 
 FX_BOOL Field::setItems(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL Field::setLock(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	return FALSE;
+    return FALSE;
 }
 
 FX_BOOL Field::signatureGetModifications(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	return FALSE;
+    return FALSE;
 }
 
 FX_BOOL Field::signatureGetSeedValue(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	return FALSE;
+    return FALSE;
 }
 
 FX_BOOL Field::signatureInfo(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	return FALSE;
+    return FALSE;
 }
 
 FX_BOOL Field::signatureSetSeedValue(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	return FALSE;
+    return FALSE;
 }
 
 FX_BOOL Field::signatureSign(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	return FALSE;
+    return FALSE;
 }
 
 FX_BOOL Field::signatureValidate(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	return FALSE;
+    return FALSE;
 }
 
 FX_BOOL Field::source(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	if (vp.IsGetting())
-	{
-		vp << (CJS_Object*)NULL;
-	}
+    if (vp.IsGetting())
+    {
+        vp << (CJS_Object*)NULL;
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 /////////////////////////////////////////// delay /////////////////////////////////////////////
 
 void Field::AddDelay_Int(enum FIELD_PROP prop, int32_t n)
 {
-	ASSERT(m_pJSDoc != NULL);
+    ASSERT(m_pJSDoc != NULL);
 
-	CJS_DelayData* pNewData = new CJS_DelayData;
-	pNewData->sFieldName = m_FieldName;
-	pNewData->nControlIndex = m_nFormControlIndex;
-	pNewData->eProp = prop;
-	pNewData->num = n;
+    CJS_DelayData* pNewData = new CJS_DelayData;
+    pNewData->sFieldName = m_FieldName;
+    pNewData->nControlIndex = m_nFormControlIndex;
+    pNewData->eProp = prop;
+    pNewData->num = n;
 
-	m_pJSDoc->AddDelayData(pNewData);
+    m_pJSDoc->AddDelayData(pNewData);
 }
 
 void Field::AddDelay_Bool(enum FIELD_PROP prop,bool b)
 {
-	ASSERT(m_pJSDoc != NULL);
+    ASSERT(m_pJSDoc != NULL);
 
-	CJS_DelayData* pNewData = new CJS_DelayData;
-	pNewData->sFieldName = m_FieldName;
-	pNewData->nControlIndex = m_nFormControlIndex;
-	pNewData->eProp = prop;
-	pNewData->b = b;
+    CJS_DelayData* pNewData = new CJS_DelayData;
+    pNewData->sFieldName = m_FieldName;
+    pNewData->nControlIndex = m_nFormControlIndex;
+    pNewData->eProp = prop;
+    pNewData->b = b;
 
-	m_pJSDoc->AddDelayData(pNewData);
+    m_pJSDoc->AddDelayData(pNewData);
 }
 
 void Field::AddDelay_String(enum FIELD_PROP prop, const CFX_ByteString& string)
 {
-	ASSERT(m_pJSDoc != NULL);
+    ASSERT(m_pJSDoc != NULL);
 
-	CJS_DelayData* pNewData = new CJS_DelayData;
-	pNewData->sFieldName = m_FieldName;
-	pNewData->nControlIndex = m_nFormControlIndex;
-	pNewData->eProp = prop;
-	pNewData->string = string;
+    CJS_DelayData* pNewData = new CJS_DelayData;
+    pNewData->sFieldName = m_FieldName;
+    pNewData->nControlIndex = m_nFormControlIndex;
+    pNewData->eProp = prop;
+    pNewData->string = string;
 
-	m_pJSDoc->AddDelayData(pNewData);
+    m_pJSDoc->AddDelayData(pNewData);
 }
 
 void Field::AddDelay_WideString(enum FIELD_PROP prop, const CFX_WideString& string)
 {
-	ASSERT(m_pJSDoc != NULL);
+    ASSERT(m_pJSDoc != NULL);
 
-	CJS_DelayData* pNewData = new CJS_DelayData;
-	pNewData->sFieldName = m_FieldName;
-	pNewData->nControlIndex = m_nFormControlIndex;
-	pNewData->eProp = prop;
-	pNewData->widestring = string;
+    CJS_DelayData* pNewData = new CJS_DelayData;
+    pNewData->sFieldName = m_FieldName;
+    pNewData->nControlIndex = m_nFormControlIndex;
+    pNewData->eProp = prop;
+    pNewData->widestring = string;
 
-	m_pJSDoc->AddDelayData(pNewData);
+    m_pJSDoc->AddDelayData(pNewData);
 }
 
 void Field::AddDelay_Rect(enum FIELD_PROP prop, const CPDF_Rect& rect)
 {
-	ASSERT(m_pJSDoc != NULL);
+    ASSERT(m_pJSDoc != NULL);
 
-	CJS_DelayData* pNewData = new CJS_DelayData;
-	pNewData->sFieldName = m_FieldName;
-	pNewData->nControlIndex = m_nFormControlIndex;
-	pNewData->eProp = prop;
-	pNewData->rect = rect;
+    CJS_DelayData* pNewData = new CJS_DelayData;
+    pNewData->sFieldName = m_FieldName;
+    pNewData->nControlIndex = m_nFormControlIndex;
+    pNewData->eProp = prop;
+    pNewData->rect = rect;
 
-	m_pJSDoc->AddDelayData(pNewData);
+    m_pJSDoc->AddDelayData(pNewData);
 }
 
 void Field::AddDelay_Color(enum FIELD_PROP prop, const CPWL_Color& color)
 {
-	ASSERT(m_pJSDoc != NULL);
+    ASSERT(m_pJSDoc != NULL);
 
-	CJS_DelayData* pNewData = new CJS_DelayData;
-	pNewData->sFieldName = m_FieldName;
-	pNewData->nControlIndex = m_nFormControlIndex;
-	pNewData->eProp = prop;
-	pNewData->color = color;
+    CJS_DelayData* pNewData = new CJS_DelayData;
+    pNewData->sFieldName = m_FieldName;
+    pNewData->nControlIndex = m_nFormControlIndex;
+    pNewData->eProp = prop;
+    pNewData->color = color;
 
-	m_pJSDoc->AddDelayData(pNewData);
+    m_pJSDoc->AddDelayData(pNewData);
 }
 
 void Field::AddDelay_WordArray(enum FIELD_PROP prop, const CFX_DWordArray& array)
 {
-	ASSERT(m_pJSDoc != NULL);
+    ASSERT(m_pJSDoc != NULL);
 
-	CJS_DelayData* pNewData = new CJS_DelayData;
-	pNewData->sFieldName = m_FieldName;
-	pNewData->nControlIndex = m_nFormControlIndex;
-	pNewData->eProp = prop;
+    CJS_DelayData* pNewData = new CJS_DelayData;
+    pNewData->sFieldName = m_FieldName;
+    pNewData->nControlIndex = m_nFormControlIndex;
+    pNewData->eProp = prop;
 
-	for (int i=0,sz=array.GetSize(); i<sz; i++)
-		pNewData->wordarray.Add(array.GetAt(i));
+    for (int i=0,sz=array.GetSize(); i<sz; i++)
+        pNewData->wordarray.Add(array.GetAt(i));
 
-	m_pJSDoc->AddDelayData(pNewData);
+    m_pJSDoc->AddDelayData(pNewData);
 }
 
 void Field::AddDelay_WideStringArray(enum FIELD_PROP prop, const CJS_WideStringArray& array)
 {
-	ASSERT(m_pJSDoc != NULL);
+    ASSERT(m_pJSDoc != NULL);
 
-	CJS_DelayData* pNewData = new CJS_DelayData;
-	pNewData->sFieldName = m_FieldName;
-	pNewData->nControlIndex = m_nFormControlIndex;
-	pNewData->eProp = prop;
-	for (int i=0,sz=array.GetSize(); i<sz; i++)
-		pNewData->widestringarray.Add(array.GetAt(i));
+    CJS_DelayData* pNewData = new CJS_DelayData;
+    pNewData->sFieldName = m_FieldName;
+    pNewData->nControlIndex = m_nFormControlIndex;
+    pNewData->eProp = prop;
+    for (int i=0,sz=array.GetSize(); i<sz; i++)
+        pNewData->widestringarray.Add(array.GetAt(i));
 
-	m_pJSDoc->AddDelayData(pNewData);
+    m_pJSDoc->AddDelayData(pNewData);
 }
 
 void Field::DoDelay(CPDFSDK_Document* pDocument, CJS_DelayData* pData)
 {
-	ASSERT(pDocument != NULL);
-	ASSERT(pData != NULL);
+    ASSERT(pDocument != NULL);
+    ASSERT(pData != NULL);
 
-	switch (pData->eProp)
-	{
-	case FP_ALIGNMENT:
-		Field::SetAlignment(pDocument, pData->sFieldName, pData->nControlIndex, pData->string);
-		break;
-	case FP_BORDERSTYLE:
-		Field::SetBorderStyle(pDocument, pData->sFieldName, pData->nControlIndex, pData->string);
-		break;
-	case FP_BUTTONALIGNX:
-		Field::SetButtonAlignX(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
-		break;
-	case FP_BUTTONALIGNY:
-		Field::SetButtonAlignY(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
-		break;
-	case FP_BUTTONFITBOUNDS:
-		Field::SetButtonFitBounds(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
-		break;
-	case FP_BUTTONPOSITION:
-		Field::SetButtonPosition(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
-		break;
-	case FP_BUTTONSCALEHOW:
-		Field::SetButtonScaleHow(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
-		break;
-	case FP_BUTTONSCALEWHEN:
-		Field::SetButtonScaleWhen(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
-		break;
-	case FP_CALCORDERINDEX:
-		Field::SetCalcOrderIndex(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
-		break;
-	case FP_CHARLIMIT:
-		Field::SetCharLimit(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
-		break;
-	case FP_COMB:
-		Field::SetComb(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
-		break;
-	case FP_COMMITONSELCHANGE:
-		Field::SetCommitOnSelChange(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
-		break;
-	case FP_CURRENTVALUEINDICES:
-		Field::SetCurrentValueIndices(pDocument, pData->sFieldName, pData->nControlIndex, pData->wordarray);
-		break;
-	case FP_DEFAULTVALUE:
-		Field::SetDefaultValue(pDocument, pData->sFieldName, pData->nControlIndex, pData->widestring);
-		break;
-	case FP_DONOTSCROLL:
-		Field::SetDoNotScroll(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
-		break;
-	case FP_DISPLAY:
-		Field::SetDisplay(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
-		break;
-	case FP_FILLCOLOR:
-		Field::SetFillColor(pDocument, pData->sFieldName, pData->nControlIndex, pData->color);
-		break;
-	case FP_HIDDEN:
-		Field::SetHidden(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
-		break;
-	case FP_HIGHLIGHT:
-		Field::SetHighlight(pDocument, pData->sFieldName, pData->nControlIndex, pData->string);
-		break;
-	case FP_LINEWIDTH:
-		Field::SetLineWidth(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
-		break;
-	case FP_MULTILINE:
-		Field::SetMultiline(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
-		break;
-	case FP_MULTIPLESELECTION:
-		Field::SetMultipleSelection(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
-		break;
-	case FP_PASSWORD:
-		Field::SetPassword(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
-		break;
-	case FP_RECT:
-		Field::SetRect(pDocument, pData->sFieldName, pData->nControlIndex, pData->rect);
-		break;
-	case FP_RICHTEXT:
-		Field::SetRichText(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
-		break;
-	case FP_RICHVALUE:
-		break;
-	case FP_ROTATION:
-		Field::SetRotation(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
-		break;
-	case FP_STROKECOLOR:
-		Field::SetStrokeColor(pDocument, pData->sFieldName, pData->nControlIndex, pData->color);
-		break;
-	case FP_STYLE:
-		Field::SetStyle(pDocument, pData->sFieldName, pData->nControlIndex, pData->string);
-		break;
-	case FP_TEXTCOLOR:
-		Field::SetTextColor(pDocument, pData->sFieldName, pData->nControlIndex, pData->color);
-		break;
-	case FP_TEXTFONT:
-		Field::SetTextFont(pDocument, pData->sFieldName, pData->nControlIndex, pData->string);
-		break;
-	case FP_TEXTSIZE:
-		Field::SetTextSize(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
-		break;
-	case FP_USERNAME:
-		Field::SetUserName(pDocument, pData->sFieldName, pData->nControlIndex, pData->widestring);
-		break;
-	case FP_VALUE:
-		Field::SetValue(pDocument, pData->sFieldName, pData->nControlIndex, pData->widestringarray);
-		break;
-	}
+    switch (pData->eProp)
+    {
+    case FP_ALIGNMENT:
+        Field::SetAlignment(pDocument, pData->sFieldName, pData->nControlIndex, pData->string);
+        break;
+    case FP_BORDERSTYLE:
+        Field::SetBorderStyle(pDocument, pData->sFieldName, pData->nControlIndex, pData->string);
+        break;
+    case FP_BUTTONALIGNX:
+        Field::SetButtonAlignX(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
+        break;
+    case FP_BUTTONALIGNY:
+        Field::SetButtonAlignY(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
+        break;
+    case FP_BUTTONFITBOUNDS:
+        Field::SetButtonFitBounds(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
+        break;
+    case FP_BUTTONPOSITION:
+        Field::SetButtonPosition(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
+        break;
+    case FP_BUTTONSCALEHOW:
+        Field::SetButtonScaleHow(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
+        break;
+    case FP_BUTTONSCALEWHEN:
+        Field::SetButtonScaleWhen(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
+        break;
+    case FP_CALCORDERINDEX:
+        Field::SetCalcOrderIndex(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
+        break;
+    case FP_CHARLIMIT:
+        Field::SetCharLimit(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
+        break;
+    case FP_COMB:
+        Field::SetComb(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
+        break;
+    case FP_COMMITONSELCHANGE:
+        Field::SetCommitOnSelChange(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
+        break;
+    case FP_CURRENTVALUEINDICES:
+        Field::SetCurrentValueIndices(pDocument, pData->sFieldName, pData->nControlIndex, pData->wordarray);
+        break;
+    case FP_DEFAULTVALUE:
+        Field::SetDefaultValue(pDocument, pData->sFieldName, pData->nControlIndex, pData->widestring);
+        break;
+    case FP_DONOTSCROLL:
+        Field::SetDoNotScroll(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
+        break;
+    case FP_DISPLAY:
+        Field::SetDisplay(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
+        break;
+    case FP_FILLCOLOR:
+        Field::SetFillColor(pDocument, pData->sFieldName, pData->nControlIndex, pData->color);
+        break;
+    case FP_HIDDEN:
+        Field::SetHidden(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
+        break;
+    case FP_HIGHLIGHT:
+        Field::SetHighlight(pDocument, pData->sFieldName, pData->nControlIndex, pData->string);
+        break;
+    case FP_LINEWIDTH:
+        Field::SetLineWidth(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
+        break;
+    case FP_MULTILINE:
+        Field::SetMultiline(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
+        break;
+    case FP_MULTIPLESELECTION:
+        Field::SetMultipleSelection(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
+        break;
+    case FP_PASSWORD:
+        Field::SetPassword(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
+        break;
+    case FP_RECT:
+        Field::SetRect(pDocument, pData->sFieldName, pData->nControlIndex, pData->rect);
+        break;
+    case FP_RICHTEXT:
+        Field::SetRichText(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
+        break;
+    case FP_RICHVALUE:
+        break;
+    case FP_ROTATION:
+        Field::SetRotation(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
+        break;
+    case FP_STROKECOLOR:
+        Field::SetStrokeColor(pDocument, pData->sFieldName, pData->nControlIndex, pData->color);
+        break;
+    case FP_STYLE:
+        Field::SetStyle(pDocument, pData->sFieldName, pData->nControlIndex, pData->string);
+        break;
+    case FP_TEXTCOLOR:
+        Field::SetTextColor(pDocument, pData->sFieldName, pData->nControlIndex, pData->color);
+        break;
+    case FP_TEXTFONT:
+        Field::SetTextFont(pDocument, pData->sFieldName, pData->nControlIndex, pData->string);
+        break;
+    case FP_TEXTSIZE:
+        Field::SetTextSize(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
+        break;
+    case FP_USERNAME:
+        Field::SetUserName(pDocument, pData->sFieldName, pData->nControlIndex, pData->widestring);
+        break;
+    case FP_VALUE:
+        Field::SetValue(pDocument, pData->sFieldName, pData->nControlIndex, pData->widestringarray);
+        break;
+    }
 }
 
-#define JS_FIELD_MINWIDTH	1
-#define JS_FIELD_MINHEIGHT	1
+#define JS_FIELD_MINWIDTH   1
+#define JS_FIELD_MINHEIGHT  1
 
 void Field::AddField(CPDFSDK_Document* pDocument, int nPageIndex, int nFieldType,
-							const CFX_WideString& sName, const CPDF_Rect& rcCoords)
+                     const CFX_WideString& sName, const CPDF_Rect& rcCoords)
 {
-	//Not supported.
+    //Not supported.
 }
 
diff --git a/fpdfsdk/src/javascript/JS_EventHandler.cpp b/fpdfsdk/src/javascript/JS_EventHandler.cpp
index 7d27c66..1769e30 100644
--- a/fpdfsdk/src/javascript/JS_EventHandler.cpp
+++ b/fpdfsdk/src/javascript/JS_EventHandler.cpp
@@ -7,7 +7,6 @@
 #include "../../include/javascript/JavaScript.h"
 #include "../../include/javascript/IJavaScript.h"
 #include "../../include/javascript/JS_EventHandler.h"
-//#include "../../include/javascript/JS_ResMgr.h"
 #include "../../include/javascript/JS_Context.h"
 #include "../../include/javascript/JS_Runtime.h"
 #include "../../include/javascript/JS_Define.h"
@@ -18,28 +17,28 @@
 
 /* ---------------------------- CJS_EventHandler ---------------------------- */
 
-CJS_EventHandler::CJS_EventHandler(CJS_Context * pContext)	 :
-	m_pJSContext(pContext),
-	m_eEventType(JET_UNKNOWN),
-	m_bValid(FALSE),
-	m_pWideStrChange(NULL),
-	m_nCommitKey(-1),
-	m_bKeyDown(FALSE),
-	m_bModifier(FALSE),
-	m_bShift(FALSE),
-	m_pISelEnd(NULL),
-	m_nSelEndDu(0),
-	m_pISelStart(NULL),
-	m_nSelStartDu(0),
-	m_bWillCommit(FALSE),
-	m_pValue(NULL),
-	m_bFieldFull(FALSE),
-	m_pbRc(NULL),
-	m_bRcDu(FALSE),
-	m_pSourceDoc(NULL),
-	m_pTargetBookMark(NULL),
-	m_pTargetDoc(NULL),
-	m_pTargetAnnot(NULL)
+CJS_EventHandler::CJS_EventHandler(CJS_Context * pContext)   :
+    m_pJSContext(pContext),
+    m_eEventType(JET_UNKNOWN),
+    m_bValid(FALSE),
+    m_pWideStrChange(NULL),
+    m_nCommitKey(-1),
+    m_bKeyDown(FALSE),
+    m_bModifier(FALSE),
+    m_bShift(FALSE),
+    m_pISelEnd(NULL),
+    m_nSelEndDu(0),
+    m_pISelStart(NULL),
+    m_nSelStartDu(0),
+    m_bWillCommit(FALSE),
+    m_pValue(NULL),
+    m_bFieldFull(FALSE),
+    m_pbRc(NULL),
+    m_bRcDu(FALSE),
+    m_pSourceDoc(NULL),
+    m_pTargetBookMark(NULL),
+    m_pTargetDoc(NULL),
+    m_pTargetAnnot(NULL)
 {
 }
 
@@ -49,629 +48,617 @@
 
 void CJS_EventHandler::OnApp_Init()
 {
-	Initial(JET_APP_INIT);
+    Initial(JET_APP_INIT);
 }
 
 void CJS_EventHandler::OnDoc_Open(CPDFSDK_Document* pDoc, const CFX_WideString& strTargetName)
 {
-	Initial(JET_DOC_OPEN);
+    Initial(JET_DOC_OPEN);
 
-	m_pTargetDoc = pDoc;
-	m_strTargetName = strTargetName;
+    m_pTargetDoc = pDoc;
+    m_strTargetName = strTargetName;
 }
 
 void CJS_EventHandler::OnDoc_WillPrint(CPDFSDK_Document* pDoc)
 {
-	Initial(JET_DOC_WILLPRINT);
+    Initial(JET_DOC_WILLPRINT);
 
-	m_pTargetDoc = pDoc;
+    m_pTargetDoc = pDoc;
 }
 
 void CJS_EventHandler::OnDoc_DidPrint(CPDFSDK_Document* pDoc)
 {
-	Initial(JET_DOC_DIDPRINT);
+    Initial(JET_DOC_DIDPRINT);
 
-	m_pTargetDoc = pDoc;
+    m_pTargetDoc = pDoc;
 }
 
 void CJS_EventHandler::OnDoc_WillSave(CPDFSDK_Document* pDoc)
 {
-	Initial(JET_DOC_WILLSAVE);
-	m_pTargetDoc = pDoc;
+    Initial(JET_DOC_WILLSAVE);
+    m_pTargetDoc = pDoc;
 }
 
 void CJS_EventHandler::OnDoc_DidSave(CPDFSDK_Document* pDoc)
 {
-	Initial(JET_DOC_DIDSAVE);
+    Initial(JET_DOC_DIDSAVE);
 
-	m_pTargetDoc = pDoc;
+    m_pTargetDoc = pDoc;
 }
 
 void CJS_EventHandler::OnDoc_WillClose(CPDFSDK_Document* pDoc)
 {
-	Initial(JET_DOC_WILLCLOSE);
+    Initial(JET_DOC_WILLCLOSE);
 
-	m_pTargetDoc = pDoc;
+    m_pTargetDoc = pDoc;
 }
 
 void CJS_EventHandler::OnPage_Open(CPDFSDK_Document* pDoc)
 {
-	Initial(JET_PAGE_OPEN);
+    Initial(JET_PAGE_OPEN);
 
-	m_pTargetDoc = pDoc;
+    m_pTargetDoc = pDoc;
 }
 
 void CJS_EventHandler::OnPage_Close(CPDFSDK_Document* pDoc)
 {
-	Initial(JET_PAGE_CLOSE);
+    Initial(JET_PAGE_CLOSE);
 
-	m_pTargetDoc = pDoc;
+    m_pTargetDoc = pDoc;
 }
 
 void CJS_EventHandler::OnPage_InView(CPDFSDK_Document* pDoc)
 {
-	Initial(JET_PAGE_INVIEW);
+    Initial(JET_PAGE_INVIEW);
 
-	m_pTargetDoc = pDoc;
+    m_pTargetDoc = pDoc;
 }
 
 void CJS_EventHandler::OnPage_OutView(CPDFSDK_Document* pDoc)
 {
-	Initial(JET_PAGE_OUTVIEW);
+    Initial(JET_PAGE_OUTVIEW);
 
-	m_pTargetDoc = pDoc;
+    m_pTargetDoc = pDoc;
 }
 
 void CJS_EventHandler::OnField_MouseEnter(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget)
 {
-	Initial(JET_FIELD_MOUSEENTER);
+    Initial(JET_FIELD_MOUSEENTER);
 
-	m_bModifier = bModifier;
-	m_bShift = bShift;
+    m_bModifier = bModifier;
+    m_bShift = bShift;
 
-	ASSERT(pTarget != NULL);
-	m_strTargetName = pTarget->GetFullName();
+    ASSERT(pTarget != NULL);
+    m_strTargetName = pTarget->GetFullName();
 }
 
 void CJS_EventHandler::OnField_MouseExit(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget)
 {
-	Initial(JET_FIELD_MOUSEEXIT);
+    Initial(JET_FIELD_MOUSEEXIT);
 
-	m_bModifier = bModifier;
-	m_bShift = bShift;
-	ASSERT(pTarget != NULL);
-	m_strTargetName = pTarget->GetFullName();
+    m_bModifier = bModifier;
+    m_bShift = bShift;
+    ASSERT(pTarget != NULL);
+    m_strTargetName = pTarget->GetFullName();
 }
 
 void CJS_EventHandler::OnField_MouseDown(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget)
 {
-	Initial(JET_FIELD_MOUSEDOWN);
-	m_eEventType = JET_FIELD_MOUSEDOWN;
+    Initial(JET_FIELD_MOUSEDOWN);
+    m_eEventType = JET_FIELD_MOUSEDOWN;
 
-	m_bModifier = bModifier;
-	m_bShift = bShift;
-	ASSERT(pTarget != NULL);
-	m_strTargetName = pTarget->GetFullName();
+    m_bModifier = bModifier;
+    m_bShift = bShift;
+    ASSERT(pTarget != NULL);
+    m_strTargetName = pTarget->GetFullName();
 }
 
 void CJS_EventHandler::OnField_MouseUp(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget)
 {
-	Initial(JET_FIELD_MOUSEUP);
+    Initial(JET_FIELD_MOUSEUP);
 
-	m_bModifier = bModifier;
-	m_bShift = bShift;
-	ASSERT(pTarget != NULL);
-	m_strTargetName = pTarget->GetFullName();
+    m_bModifier = bModifier;
+    m_bShift = bShift;
+    ASSERT(pTarget != NULL);
+    m_strTargetName = pTarget->GetFullName();
 }
 
 void CJS_EventHandler::OnField_Focus(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget,
-									 const CFX_WideString& Value)
+                                     const CFX_WideString& Value)
 {
-	Initial(JET_FIELD_FOCUS);
+    Initial(JET_FIELD_FOCUS);
 
-	m_bModifier = bModifier;
-	m_bShift = bShift;
-	ASSERT(pTarget != NULL);
-	m_strTargetName = pTarget->GetFullName();
-	m_pValue = (CFX_WideString*)&Value;
+    m_bModifier = bModifier;
+    m_bShift = bShift;
+    ASSERT(pTarget != NULL);
+    m_strTargetName = pTarget->GetFullName();
+    m_pValue = (CFX_WideString*)&Value;
 }
 
 void CJS_EventHandler::OnField_Blur(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget,
-									const CFX_WideString& Value)
+                                    const CFX_WideString& Value)
 {
-	Initial(JET_FIELD_BLUR);
+    Initial(JET_FIELD_BLUR);
 
-	m_bModifier = bModifier;
-	m_bShift = bShift;
-	ASSERT(pTarget != NULL);
-	m_strTargetName = pTarget->GetFullName();
-	m_pValue = (CFX_WideString*)&Value;
+    m_bModifier = bModifier;
+    m_bShift = bShift;
+    ASSERT(pTarget != NULL);
+    m_strTargetName = pTarget->GetFullName();
+    m_pValue = (CFX_WideString*)&Value;
 }
 
 void CJS_EventHandler::OnField_Keystroke(CFX_WideString &strChange,
-										 const CFX_WideString& strChangeEx, FX_BOOL KeyDown,
-										 FX_BOOL bModifier, int& nSelEnd, int& nSelStart,
-										 FX_BOOL bShift, CPDF_FormField* pTarget,
-										 CFX_WideString& Value, FX_BOOL bWillCommit,
-										  FX_BOOL bFieldFull, FX_BOOL& bRc)
+                                         const CFX_WideString& strChangeEx, FX_BOOL KeyDown,
+                                         FX_BOOL bModifier, int& nSelEnd, int& nSelStart,
+                                         FX_BOOL bShift, CPDF_FormField* pTarget,
+                                         CFX_WideString& Value, FX_BOOL bWillCommit,
+                                          FX_BOOL bFieldFull, FX_BOOL& bRc)
 {
-	Initial(JET_FIELD_KEYSTROKE);
+    Initial(JET_FIELD_KEYSTROKE);
 
-	m_nCommitKey = 0;
-	m_pWideStrChange = &strChange;
-	m_WideStrChangeEx = strChangeEx;
-	m_bKeyDown = KeyDown;
-	m_bModifier = bModifier;
-	m_pISelEnd = &nSelEnd;
-	m_pISelStart = &nSelStart;
-	m_bShift = bShift;
-	ASSERT(pTarget != NULL);
-	m_strTargetName = pTarget->GetFullName();
-	m_pValue = &Value;
-	m_bWillCommit = bWillCommit;
-	m_pbRc = &bRc;
-	m_bFieldFull = bFieldFull;
+    m_nCommitKey = 0;
+    m_pWideStrChange = &strChange;
+    m_WideStrChangeEx = strChangeEx;
+    m_bKeyDown = KeyDown;
+    m_bModifier = bModifier;
+    m_pISelEnd = &nSelEnd;
+    m_pISelStart = &nSelStart;
+    m_bShift = bShift;
+    ASSERT(pTarget != NULL);
+    m_strTargetName = pTarget->GetFullName();
+    m_pValue = &Value;
+    m_bWillCommit = bWillCommit;
+    m_pbRc = &bRc;
+    m_bFieldFull = bFieldFull;
 }
 
 void CJS_EventHandler::OnField_Validate(CFX_WideString& strChange, const CFX_WideString& strChangeEx,
-										FX_BOOL bKeyDown, FX_BOOL bModifier, FX_BOOL bShift,
-										CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL& bRc)
+                                        FX_BOOL bKeyDown, FX_BOOL bModifier, FX_BOOL bShift,
+                                        CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL& bRc)
 {
-	Initial(JET_FIELD_VALIDATE);
+    Initial(JET_FIELD_VALIDATE);
 
-	m_pWideStrChange = &strChange;
-	m_WideStrChangeEx = strChangeEx;
-	m_bKeyDown = bKeyDown;
-	m_bModifier = bModifier;
-	m_bShift = bShift;
-	ASSERT(pTarget != NULL);
-	m_strTargetName = pTarget->GetFullName();
-	m_pValue = &Value;
-	m_pbRc = &bRc;
+    m_pWideStrChange = &strChange;
+    m_WideStrChangeEx = strChangeEx;
+    m_bKeyDown = bKeyDown;
+    m_bModifier = bModifier;
+    m_bShift = bShift;
+    ASSERT(pTarget != NULL);
+    m_strTargetName = pTarget->GetFullName();
+    m_pValue = &Value;
+    m_pbRc = &bRc;
 }
 
 void CJS_EventHandler::OnField_Calculate(CPDF_FormField* pSource, CPDF_FormField* pTarget,
-										 CFX_WideString& Value, FX_BOOL& bRc)
+                                         CFX_WideString& Value, FX_BOOL& bRc)
 {
-	Initial(JET_FIELD_CALCULATE);
+    Initial(JET_FIELD_CALCULATE);
 
-	if (pSource)
-		m_strSourceName = pSource->GetFullName();
-	ASSERT(pTarget != NULL);
-	m_strTargetName = pTarget->GetFullName();
+    if (pSource)
+        m_strSourceName = pSource->GetFullName();
+    ASSERT(pTarget != NULL);
+    m_strTargetName = pTarget->GetFullName();
     m_pValue = &Value;
-	m_pbRc = &bRc;
+    m_pbRc = &bRc;
 }
 
 void CJS_EventHandler::OnField_Format(CPDF_FormField* pTarget,
                                       CFX_WideString& Value,
                                       FX_BOOL bWillCommit)
 {
-	Initial(JET_FIELD_FORMAT);
+    Initial(JET_FIELD_FORMAT);
 
-	m_nCommitKey = 0;
-	ASSERT(pTarget != NULL);
-	m_strTargetName = pTarget->GetFullName();
-	m_pValue = &Value;
-	m_bWillCommit = bWillCommit;
+    m_nCommitKey = 0;
+    ASSERT(pTarget != NULL);
+    m_strTargetName = pTarget->GetFullName();
+    m_pValue = &Value;
+    m_bWillCommit = bWillCommit;
 }
 
 void CJS_EventHandler::OnScreen_Focus(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
 {
-	Initial(JET_SCREEN_FOCUS);
+    Initial(JET_SCREEN_FOCUS);
 
-	m_bModifier = bModifier;
-	m_bShift = bShift;
-	m_pTargetAnnot = pScreen;
+    m_bModifier = bModifier;
+    m_bShift = bShift;
+    m_pTargetAnnot = pScreen;
 }
 
 void CJS_EventHandler::OnScreen_Blur(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
 {
-	Initial(JET_SCREEN_BLUR);
+    Initial(JET_SCREEN_BLUR);
 
-	m_bModifier = bModifier;
-	m_bShift = bShift;
-	m_pTargetAnnot = pScreen;
+    m_bModifier = bModifier;
+    m_bShift = bShift;
+    m_pTargetAnnot = pScreen;
 }
 
 void CJS_EventHandler::OnScreen_Open(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
 {
-	Initial(JET_SCREEN_OPEN);
+    Initial(JET_SCREEN_OPEN);
 
-	m_bModifier = bModifier;
-	m_bShift = bShift;
-	m_pTargetAnnot = pScreen;
+    m_bModifier = bModifier;
+    m_bShift = bShift;
+    m_pTargetAnnot = pScreen;
 }
 
 void CJS_EventHandler::OnScreen_Close(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
 {
-	Initial(JET_SCREEN_CLOSE);
+    Initial(JET_SCREEN_CLOSE);
 
-	m_bModifier = bModifier;
-	m_bShift = bShift;
-	m_pTargetAnnot = pScreen;
+    m_bModifier = bModifier;
+    m_bShift = bShift;
+    m_pTargetAnnot = pScreen;
 }
 
 void CJS_EventHandler::OnScreen_MouseDown(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
 {
-	Initial(JET_SCREEN_MOUSEDOWN);
+    Initial(JET_SCREEN_MOUSEDOWN);
 
-	m_bModifier = bModifier;
-	m_bShift = bShift;
-	m_pTargetAnnot = pScreen;
+    m_bModifier = bModifier;
+    m_bShift = bShift;
+    m_pTargetAnnot = pScreen;
 }
 
 void CJS_EventHandler::OnScreen_MouseUp(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
 {
-	Initial(JET_SCREEN_MOUSEUP);
+    Initial(JET_SCREEN_MOUSEUP);
 
-	m_bModifier = bModifier;
-	m_bShift = bShift;
-	m_pTargetAnnot = pScreen;
+    m_bModifier = bModifier;
+    m_bShift = bShift;
+    m_pTargetAnnot = pScreen;
 }
 
 void CJS_EventHandler::OnScreen_MouseEnter(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
 {
-	Initial(JET_SCREEN_MOUSEENTER);
+    Initial(JET_SCREEN_MOUSEENTER);
 
-	m_bModifier = bModifier;
-	m_bShift = bShift;
-	m_pTargetAnnot = pScreen;
+    m_bModifier = bModifier;
+    m_bShift = bShift;
+    m_pTargetAnnot = pScreen;
 }
 
 void CJS_EventHandler::OnScreen_MouseExit(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
 {
-	Initial(JET_SCREEN_MOUSEEXIT);
+    Initial(JET_SCREEN_MOUSEEXIT);
 
-	m_bModifier = bModifier;
-	m_bShift = bShift;
-	m_pTargetAnnot = pScreen;
+    m_bModifier = bModifier;
+    m_bShift = bShift;
+    m_pTargetAnnot = pScreen;
 }
 
 void CJS_EventHandler::OnScreen_InView(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
 {
-	Initial(JET_SCREEN_INVIEW);
+    Initial(JET_SCREEN_INVIEW);
 
-	m_bModifier = bModifier;
-	m_bShift = bShift;
-	m_pTargetAnnot = pScreen;
+    m_bModifier = bModifier;
+    m_bShift = bShift;
+    m_pTargetAnnot = pScreen;
 }
 
 void CJS_EventHandler::OnScreen_OutView(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
 {
-	Initial(JET_SCREEN_OUTVIEW);
+    Initial(JET_SCREEN_OUTVIEW);
 
-	m_bModifier = bModifier;
-	m_bShift = bShift;
-	m_pTargetAnnot = pScreen;
+    m_bModifier = bModifier;
+    m_bShift = bShift;
+    m_pTargetAnnot = pScreen;
 }
 
 void CJS_EventHandler::OnLink_MouseUp(CPDFSDK_Document* pTarget)
 {
-	Initial(JET_LINK_MOUSEUP);
+    Initial(JET_LINK_MOUSEUP);
 
-	m_pTargetDoc = pTarget;
+    m_pTargetDoc = pTarget;
 }
 
 void CJS_EventHandler::OnBookmark_MouseUp(CPDF_Bookmark* pBookMark)
 {
-	Initial(JET_BOOKMARK_MOUSEUP);
+    Initial(JET_BOOKMARK_MOUSEUP);
 
-	m_pTargetBookMark = pBookMark;
+    m_pTargetBookMark = pBookMark;
 }
 
 void CJS_EventHandler::OnMenu_Exec(CPDFSDK_Document* pTarget, const CFX_WideString& strTargetName)
 {
-	Initial(JET_MENU_EXEC);
+    Initial(JET_MENU_EXEC);
 
-	m_pTargetDoc = pTarget;
-	m_strTargetName = strTargetName;
+    m_pTargetDoc = pTarget;
+    m_strTargetName = strTargetName;
 }
 
 void CJS_EventHandler::OnExternal_Exec()
 {
-	Initial(JET_EXTERNAL_EXEC);
+    Initial(JET_EXTERNAL_EXEC);
 }
 
 void CJS_EventHandler::OnBatchExec(CPDFSDK_Document* pTarget)
 {
-	Initial(JET_BATCH_EXEC);
+    Initial(JET_BATCH_EXEC);
 
-	m_pTargetDoc = pTarget;
+    m_pTargetDoc = pTarget;
 }
 
 void CJS_EventHandler::OnConsole_Exec()
 {
-	Initial(JET_CONSOLE_EXEC);
+    Initial(JET_CONSOLE_EXEC);
 }
 
 
 void CJS_EventHandler::Initial(JS_EVENT_T type)
 {
-	m_eEventType = type;
+    m_eEventType = type;
 
-	m_strTargetName = L"";
-	m_strSourceName = L"";
-	m_pWideStrChange = NULL;
-	m_WideStrChangeDu = L"";
-	m_WideStrChangeEx = L"";
-	m_nCommitKey = -1;
-	m_bKeyDown = FALSE;
-	m_bModifier = FALSE;
-	m_bShift = FALSE;
-	m_pISelEnd = NULL;
-	m_nSelEndDu = 0;
-	m_pISelStart = NULL;
-	m_nSelStartDu = 0;
-	m_bWillCommit = FALSE;
-	m_pValue = NULL;
-	m_bFieldFull = FALSE;
-	m_pbRc = NULL;
-	m_bRcDu = FALSE;
+    m_strTargetName = L"";
+    m_strSourceName = L"";
+    m_pWideStrChange = NULL;
+    m_WideStrChangeDu = L"";
+    m_WideStrChangeEx = L"";
+    m_nCommitKey = -1;
+    m_bKeyDown = FALSE;
+    m_bModifier = FALSE;
+    m_bShift = FALSE;
+    m_pISelEnd = NULL;
+    m_nSelEndDu = 0;
+    m_pISelStart = NULL;
+    m_nSelStartDu = 0;
+    m_bWillCommit = FALSE;
+    m_pValue = NULL;
+    m_bFieldFull = FALSE;
+    m_pbRc = NULL;
+    m_bRcDu = FALSE;
 
-	m_pSourceDoc = NULL;
-	m_pTargetBookMark = NULL;
-	m_pTargetDoc = NULL;
-	m_pTargetAnnot = NULL;
+    m_pSourceDoc = NULL;
+    m_pTargetBookMark = NULL;
+    m_pTargetDoc = NULL;
+    m_pTargetAnnot = NULL;
 
-	m_bValid = TRUE;
+    m_bValid = TRUE;
 }
 
 void CJS_EventHandler::Destroy()
 {
-	m_bValid = FALSE;
+    m_bValid = FALSE;
 }
 
 FX_BOOL CJS_EventHandler::IsValid()
 {
-	return m_bValid;
+    return m_bValid;
 }
 
 CFX_WideString & CJS_EventHandler::Change()
 {
-	if (m_pWideStrChange != NULL)
-		return *m_pWideStrChange;
-	else
-	{
-		return m_WideStrChangeDu;
-	}
+    if (m_pWideStrChange) {
+        return *m_pWideStrChange;
+    }
+    return m_WideStrChangeDu;
 }
 
 CFX_WideString CJS_EventHandler::ChangeEx()
 {
-	return m_WideStrChangeEx;
+    return m_WideStrChangeEx;
 }
 
 int CJS_EventHandler::CommitKey()
 {
-	return m_nCommitKey;
+    return m_nCommitKey;
 }
 
 FX_BOOL CJS_EventHandler::FieldFull()
 {
-	return m_bFieldFull;
+    return m_bFieldFull;
 }
 
 FX_BOOL CJS_EventHandler::KeyDown()
 {
-	return m_bKeyDown;
+    return m_bKeyDown;
 }
 
 FX_BOOL CJS_EventHandler::Modifier()
 {
-	return m_bModifier;
+    return m_bModifier;
 }
 
 const FX_WCHAR* CJS_EventHandler::Name()
 {
-	switch (m_eEventType)
-	{
-	case JET_APP_INIT:			return L"Init";
-	case JET_BATCH_EXEC:		return L"Exec";
-	case JET_BOOKMARK_MOUSEUP:	return L"Mouse Up";
-	case JET_CONSOLE_EXEC:		return L"Exec";
-	case JET_DOC_DIDPRINT:		return L"DidPrint";
-	case JET_DOC_DIDSAVE:		return L"DidSave";
-	case JET_DOC_OPEN:			return L"Open";
-	case JET_DOC_WILLCLOSE:		return L"WillClose";
-	case JET_DOC_WILLPRINT:		return L"WillPrint";
-	case JET_DOC_WILLSAVE:		return L"WillSave";
-	case JET_EXTERNAL_EXEC:		return L"Exec";
-	case JET_FIELD_FOCUS:
-	case JET_SCREEN_FOCUS:		return L"Focus";
-	case JET_FIELD_BLUR:
-	case JET_SCREEN_BLUR:		return L"Blur";
-	case JET_FIELD_MOUSEDOWN:
-	case JET_SCREEN_MOUSEDOWN:	return L"Mouse Down";
-	case JET_FIELD_MOUSEUP:
-	case JET_SCREEN_MOUSEUP:	return L"Mouse Up";
-	case JET_FIELD_MOUSEENTER:
-	case JET_SCREEN_MOUSEENTER:	return L"Mouse Enter";
-	case JET_FIELD_MOUSEEXIT:
-	case JET_SCREEN_MOUSEEXIT:	return L"Mouse Exit";
-	case JET_FIELD_CALCULATE:	return L"Calculate";
-	case JET_FIELD_FORMAT:		return L"Format";
-	case JET_FIELD_KEYSTROKE:	return L"Keystroke";
-	case JET_FIELD_VALIDATE:	return L"Validate";
-	case JET_LINK_MOUSEUP:		return L"Mouse Up";
-	case JET_MENU_EXEC:			return L"Exec";
-	case JET_PAGE_OPEN:
-	case JET_SCREEN_OPEN:		return L"Open";
-	case JET_PAGE_CLOSE:
-	case JET_SCREEN_CLOSE:		return L"Close";
-	case JET_SCREEN_INVIEW:
-	case JET_PAGE_INVIEW:		return L"InView";
-	case JET_PAGE_OUTVIEW:
-	case JET_SCREEN_OUTVIEW:	return L"OutView";
-	default:
-		return L"";
-	}
+    switch (m_eEventType)
+    {
+    case JET_APP_INIT:          return L"Init";
+    case JET_BATCH_EXEC:        return L"Exec";
+    case JET_BOOKMARK_MOUSEUP:  return L"Mouse Up";
+    case JET_CONSOLE_EXEC:      return L"Exec";
+    case JET_DOC_DIDPRINT:      return L"DidPrint";
+    case JET_DOC_DIDSAVE:       return L"DidSave";
+    case JET_DOC_OPEN:          return L"Open";
+    case JET_DOC_WILLCLOSE:     return L"WillClose";
+    case JET_DOC_WILLPRINT:     return L"WillPrint";
+    case JET_DOC_WILLSAVE:      return L"WillSave";
+    case JET_EXTERNAL_EXEC:     return L"Exec";
+    case JET_FIELD_FOCUS:
+    case JET_SCREEN_FOCUS:      return L"Focus";
+    case JET_FIELD_BLUR:
+    case JET_SCREEN_BLUR:       return L"Blur";
+    case JET_FIELD_MOUSEDOWN:
+    case JET_SCREEN_MOUSEDOWN:  return L"Mouse Down";
+    case JET_FIELD_MOUSEUP:
+    case JET_SCREEN_MOUSEUP:    return L"Mouse Up";
+    case JET_FIELD_MOUSEENTER:
+    case JET_SCREEN_MOUSEENTER: return L"Mouse Enter";
+    case JET_FIELD_MOUSEEXIT:
+    case JET_SCREEN_MOUSEEXIT:  return L"Mouse Exit";
+    case JET_FIELD_CALCULATE:   return L"Calculate";
+    case JET_FIELD_FORMAT:      return L"Format";
+    case JET_FIELD_KEYSTROKE:   return L"Keystroke";
+    case JET_FIELD_VALIDATE:    return L"Validate";
+    case JET_LINK_MOUSEUP:      return L"Mouse Up";
+    case JET_MENU_EXEC:         return L"Exec";
+    case JET_PAGE_OPEN:
+    case JET_SCREEN_OPEN:       return L"Open";
+    case JET_PAGE_CLOSE:
+    case JET_SCREEN_CLOSE:      return L"Close";
+    case JET_SCREEN_INVIEW:
+    case JET_PAGE_INVIEW:       return L"InView";
+    case JET_PAGE_OUTVIEW:
+    case JET_SCREEN_OUTVIEW:    return L"OutView";
+    default:
+        return L"";
+    }
 
-	return L"";
+    return L"";
 }
 
 const FX_WCHAR* CJS_EventHandler::Type()
 {
-	switch (m_eEventType)
-	{
-	case JET_APP_INIT:			return L"App";
-	case JET_BATCH_EXEC:		return L"Batch";
-	case JET_BOOKMARK_MOUSEUP:	return L"BookMark";
-	case JET_CONSOLE_EXEC:		return L"Console";
-	case JET_DOC_DIDPRINT:
-	case JET_DOC_DIDSAVE:
-	case JET_DOC_OPEN:
-	case JET_DOC_WILLCLOSE:
-	case JET_DOC_WILLPRINT:
-	case JET_DOC_WILLSAVE:		return L"Doc";
-	case JET_EXTERNAL_EXEC:		return L"External";
-	case JET_FIELD_BLUR:
-	case JET_FIELD_FOCUS:
-	case JET_FIELD_MOUSEDOWN:
-	case JET_FIELD_MOUSEENTER:
-	case JET_FIELD_MOUSEEXIT:
-	case JET_FIELD_MOUSEUP:
-	case JET_FIELD_CALCULATE:
-	case JET_FIELD_FORMAT:
-	case JET_FIELD_KEYSTROKE:
-	case JET_FIELD_VALIDATE:	return L"Field";
-	case JET_SCREEN_FOCUS:
-	case JET_SCREEN_BLUR:
-	case JET_SCREEN_OPEN:
-	case JET_SCREEN_CLOSE:
-	case JET_SCREEN_MOUSEDOWN:
-	case JET_SCREEN_MOUSEUP:
-	case JET_SCREEN_MOUSEENTER:
-	case JET_SCREEN_MOUSEEXIT:
-	case JET_SCREEN_INVIEW:
-	case JET_SCREEN_OUTVIEW:	return L"Screen";
-	case JET_LINK_MOUSEUP:		return L"Link";
-	case JET_MENU_EXEC:			return L"Menu";
-	case JET_PAGE_OPEN:
-	case JET_PAGE_CLOSE:
-	case JET_PAGE_INVIEW:
-	case JET_PAGE_OUTVIEW:return L"Page";
-	default:
-		return L"";
-	}
+    switch (m_eEventType)
+    {
+    case JET_APP_INIT:          return L"App";
+    case JET_BATCH_EXEC:        return L"Batch";
+    case JET_BOOKMARK_MOUSEUP:  return L"BookMark";
+    case JET_CONSOLE_EXEC:      return L"Console";
+    case JET_DOC_DIDPRINT:
+    case JET_DOC_DIDSAVE:
+    case JET_DOC_OPEN:
+    case JET_DOC_WILLCLOSE:
+    case JET_DOC_WILLPRINT:
+    case JET_DOC_WILLSAVE:      return L"Doc";
+    case JET_EXTERNAL_EXEC:     return L"External";
+    case JET_FIELD_BLUR:
+    case JET_FIELD_FOCUS:
+    case JET_FIELD_MOUSEDOWN:
+    case JET_FIELD_MOUSEENTER:
+    case JET_FIELD_MOUSEEXIT:
+    case JET_FIELD_MOUSEUP:
+    case JET_FIELD_CALCULATE:
+    case JET_FIELD_FORMAT:
+    case JET_FIELD_KEYSTROKE:
+    case JET_FIELD_VALIDATE:    return L"Field";
+    case JET_SCREEN_FOCUS:
+    case JET_SCREEN_BLUR:
+    case JET_SCREEN_OPEN:
+    case JET_SCREEN_CLOSE:
+    case JET_SCREEN_MOUSEDOWN:
+    case JET_SCREEN_MOUSEUP:
+    case JET_SCREEN_MOUSEENTER:
+    case JET_SCREEN_MOUSEEXIT:
+    case JET_SCREEN_INVIEW:
+    case JET_SCREEN_OUTVIEW:    return L"Screen";
+    case JET_LINK_MOUSEUP:      return L"Link";
+    case JET_MENU_EXEC:         return L"Menu";
+    case JET_PAGE_OPEN:
+    case JET_PAGE_CLOSE:
+    case JET_PAGE_INVIEW:
+    case JET_PAGE_OUTVIEW:return L"Page";
+    default:
+        return L"";
+    }
 
-	return L"";
+    return L"";
 }
 
 FX_BOOL& CJS_EventHandler::Rc()
 {
-	if (m_pbRc != NULL)
-		return *m_pbRc;
-	else
-	{
-		return m_bRcDu;
-	}
+    if (m_pbRc) {
+        return *m_pbRc;
+    }
+    return m_bRcDu;
 }
 
 int & CJS_EventHandler::SelEnd()
 {
-	if (m_pISelEnd != NULL)
-	{
-		return *m_pISelEnd;
-	}
-	else
-	{
-		return m_nSelEndDu;
-	}
+    if (m_pISelEnd) {
+        return *m_pISelEnd;
+    }
+    return m_nSelEndDu;
 }
 
 int & CJS_EventHandler::SelStart()
 {
-	if (m_pISelStart != NULL)
-		return * m_pISelStart;
-	else
-	{
-		return m_nSelStartDu;
-	}
+    if (m_pISelStart) {
+        return *m_pISelStart;
+    }
+    return m_nSelStartDu;
 }
 
 FX_BOOL CJS_EventHandler::Shift()
 {
-	return m_bShift;
+    return m_bShift;
 }
 
 Field* CJS_EventHandler::Source()
 {
-	ASSERT(m_pJSContext != NULL);
+    ASSERT(m_pJSContext != NULL);
 
-	CJS_Runtime* pRuntime = m_pJSContext->GetJSRuntime();
+    CJS_Runtime* pRuntime = m_pJSContext->GetJSRuntime();
 
-	JSFXObject  pDocObj = JS_NewFxDynamicObj(*pRuntime, m_pJSContext, JS_GetObjDefnID(*pRuntime, L"Document"));
-	ASSERT(pDocObj.IsEmpty() == FALSE);
-	JSFXObject  pFieldObj = JS_NewFxDynamicObj(*pRuntime, m_pJSContext, JS_GetObjDefnID(*pRuntime, L"Field"));
-	ASSERT(pFieldObj.IsEmpty() == FALSE);
+    JSFXObject  pDocObj = JS_NewFxDynamicObj(*pRuntime, m_pJSContext, JS_GetObjDefnID(*pRuntime, L"Document"));
+    ASSERT(pDocObj.IsEmpty() == FALSE);
+    JSFXObject  pFieldObj = JS_NewFxDynamicObj(*pRuntime, m_pJSContext, JS_GetObjDefnID(*pRuntime, L"Field"));
+    ASSERT(pFieldObj.IsEmpty() == FALSE);
 
-	CJS_Document* pJSDocument = (CJS_Document*)JS_GetPrivate(pDocObj);
-	ASSERT(pJSDocument != NULL);
-	Document* pDocument = (Document*)pJSDocument->GetEmbedObject();
-	ASSERT(pDocument != NULL);
- 	if (m_pTargetDoc != NULL)
- 		pDocument->AttachDoc(m_pTargetDoc);
- 	else
- 		pDocument->AttachDoc(m_pJSContext->GetReaderDocument());
+    CJS_Document* pJSDocument = (CJS_Document*)JS_GetPrivate(pDocObj);
+    ASSERT(pJSDocument != NULL);
+    Document* pDocument = (Document*)pJSDocument->GetEmbedObject();
+    ASSERT(pDocument != NULL);
+    if (m_pTargetDoc != NULL)
+        pDocument->AttachDoc(m_pTargetDoc);
+    else
+        pDocument->AttachDoc(m_pJSContext->GetReaderDocument());
 
-	//if (m_pSourceField == NULL)
-	//	return NULL;
-	//CRAO_Widget *pWidget = IBCL_Widget::GetWidget(m_pSourceField);
-	//CPDF_FormField* pFormField = pWidget->GetFormField();
-	//ASSERT(pFormField);
-	//CFX_WideString csFieldName = pFormField->GetFullName();
-	CJS_Field * pJSField = (CJS_Field*)JS_GetPrivate(pFieldObj);
-	ASSERT(pJSField != NULL);
-	Field * pField = (Field *)pJSField->GetEmbedObject();
-	ASSERT(pField != NULL);
-	pField->AttachField(pDocument, m_strSourceName);
-	return pField;
+    //if (m_pSourceField == NULL)
+    //  return NULL;
+    //CRAO_Widget *pWidget = IBCL_Widget::GetWidget(m_pSourceField);
+    //CPDF_FormField* pFormField = pWidget->GetFormField();
+    //ASSERT(pFormField);
+    //CFX_WideString csFieldName = pFormField->GetFullName();
+    CJS_Field * pJSField = (CJS_Field*)JS_GetPrivate(pFieldObj);
+    ASSERT(pJSField != NULL);
+    Field * pField = (Field *)pJSField->GetEmbedObject();
+    ASSERT(pField != NULL);
+    pField->AttachField(pDocument, m_strSourceName);
+    return pField;
 }
 
 Field* CJS_EventHandler::Target_Field()
 {
-	ASSERT(m_pJSContext != NULL);
+    ASSERT(m_pJSContext != NULL);
 
-	CJS_Runtime* pRuntime = m_pJSContext->GetJSRuntime();
+    CJS_Runtime* pRuntime = m_pJSContext->GetJSRuntime();
 
-	JSFXObject pDocObj = JS_NewFxDynamicObj(*pRuntime, m_pJSContext, JS_GetObjDefnID(*pRuntime, L"Document"));
-	ASSERT(pDocObj.IsEmpty() == FALSE);
-	JSFXObject pFieldObj = JS_NewFxDynamicObj(*pRuntime, m_pJSContext, JS_GetObjDefnID(*pRuntime, L"Field"));
-	ASSERT(pFieldObj.IsEmpty() == FALSE);
+    JSFXObject pDocObj = JS_NewFxDynamicObj(*pRuntime, m_pJSContext, JS_GetObjDefnID(*pRuntime, L"Document"));
+    ASSERT(pDocObj.IsEmpty() == FALSE);
+    JSFXObject pFieldObj = JS_NewFxDynamicObj(*pRuntime, m_pJSContext, JS_GetObjDefnID(*pRuntime, L"Field"));
+    ASSERT(pFieldObj.IsEmpty() == FALSE);
 
-	CJS_Document* pJSDocument = (CJS_Document*)JS_GetPrivate(pDocObj);
-	ASSERT(pJSDocument != NULL);
-	Document* pDocument = (Document*)pJSDocument->GetEmbedObject();
- 	ASSERT(pDocument != NULL);
- 	if (m_pTargetDoc != NULL)
- 		pDocument->AttachDoc(m_pTargetDoc);
- 	else
- 		pDocument->AttachDoc(m_pJSContext->GetReaderDocument());
+    CJS_Document* pJSDocument = (CJS_Document*)JS_GetPrivate(pDocObj);
+    ASSERT(pJSDocument != NULL);
+    Document* pDocument = (Document*)pJSDocument->GetEmbedObject();
+    ASSERT(pDocument != NULL);
+    if (m_pTargetDoc != NULL)
+        pDocument->AttachDoc(m_pTargetDoc);
+    else
+        pDocument->AttachDoc(m_pJSContext->GetReaderDocument());
 
-	CJS_Field* pJSField = (CJS_Field*)JS_GetPrivate(pFieldObj);
-	ASSERT(pJSField != NULL);
+    CJS_Field* pJSField = (CJS_Field*)JS_GetPrivate(pFieldObj);
+    ASSERT(pJSField != NULL);
 
-	Field* pField = (Field *)pJSField->GetEmbedObject();
-	ASSERT(pField != NULL);
+    Field* pField = (Field *)pJSField->GetEmbedObject();
+    ASSERT(pField != NULL);
 
-	pField->AttachField(pDocument, m_strTargetName);
-	return pField;
+    pField->AttachField(pDocument, m_strTargetName);
+    return pField;
 }
 
 CFX_WideString& CJS_EventHandler::Value()
 {
-	return *m_pValue;
+    return *m_pValue;
 }
 
 FX_BOOL CJS_EventHandler::WillCommit()
 {
-	return m_bWillCommit;
+    return m_bWillCommit;
 }
 
 CFX_WideString CJS_EventHandler::TargetName()
 {
-	return m_strTargetName;
+    return m_strTargetName;
 }
-
-
diff --git a/fpdfsdk/src/javascript/JS_GlobalData.cpp b/fpdfsdk/src/javascript/JS_GlobalData.cpp
index 2b925a1..2b4248c 100644
--- a/fpdfsdk/src/javascript/JS_GlobalData.cpp
+++ b/fpdfsdk/src/javascript/JS_GlobalData.cpp
@@ -9,7 +9,7 @@
 #include "../../include/javascript/IJavaScript.h"
 #include "../../include/javascript/JS_GlobalData.h"
 
-#define JS_MAXGLOBALDATA			(1024 * 4 - 8)
+#define JS_MAXGLOBALDATA            (1024 * 4 - 8)
 
 /* --------------------- CJS_GlobalVariableArray --------------------- */
 
@@ -19,497 +19,495 @@
 
 CJS_GlobalVariableArray::~CJS_GlobalVariableArray()
 {
-	Empty();
+    Empty();
 }
 
 void CJS_GlobalVariableArray::Copy(const CJS_GlobalVariableArray& array)
 {
-	Empty();
-	for (int i=0,sz=array.Count(); i<sz; i++)
-	{
-		CJS_KeyValue* pOldObjData = array.GetAt(i);
-		ASSERT(pOldObjData != NULL);
+    Empty();
+    for (int i=0,sz=array.Count(); i<sz; i++)
+    {
+        CJS_KeyValue* pOldObjData = array.GetAt(i);
+        ASSERT(pOldObjData != NULL);
 
-		switch (pOldObjData->nType)
-		{
-		case JS_GLOBALDATA_TYPE_NUMBER:
-			{
-				CJS_KeyValue* pNewObjData = new CJS_KeyValue;
-				pNewObjData->sKey = pOldObjData->sKey;
-				pNewObjData->nType = pOldObjData->nType;
-				pNewObjData->dData = pOldObjData->dData;
-				Add(pNewObjData);
-			}
-			break;
-		case JS_GLOBALDATA_TYPE_BOOLEAN:
-			{
-				CJS_KeyValue* pNewObjData = new CJS_KeyValue;
-				pNewObjData->sKey = pOldObjData->sKey;
-				pNewObjData->nType = pOldObjData->nType;
-				pNewObjData->bData = pOldObjData->bData;
-				Add(pNewObjData);
-			}
-			break;
-		case JS_GLOBALDATA_TYPE_STRING:
-			{
-				CJS_KeyValue* pNewObjData = new CJS_KeyValue;
-				pNewObjData->sKey = pOldObjData->sKey;
-				pNewObjData->nType = pOldObjData->nType;
-				pNewObjData->sData = pOldObjData->sData;
-				Add(pNewObjData);
-			}
-			break;
-		case JS_GLOBALDATA_TYPE_OBJECT:
-			{
-				CJS_KeyValue* pNewObjData = new CJS_KeyValue;
-				pNewObjData->sKey = pOldObjData->sKey;
-				pNewObjData->nType = pOldObjData->nType;
-				pNewObjData->objData.Copy(pOldObjData->objData);
-				Add(pNewObjData);
-			}
-		case JS_GLOBALDATA_TYPE_NULL:
-			{
-				CJS_KeyValue* pNewObjData = new CJS_KeyValue;
-				pNewObjData->sKey = pOldObjData->sKey;
-				pNewObjData->nType = pOldObjData->nType;
-				Add(pNewObjData);
-			}
-		}
-	}
+        switch (pOldObjData->nType)
+        {
+        case JS_GLOBALDATA_TYPE_NUMBER:
+            {
+                CJS_KeyValue* pNewObjData = new CJS_KeyValue;
+                pNewObjData->sKey = pOldObjData->sKey;
+                pNewObjData->nType = pOldObjData->nType;
+                pNewObjData->dData = pOldObjData->dData;
+                Add(pNewObjData);
+            }
+            break;
+        case JS_GLOBALDATA_TYPE_BOOLEAN:
+            {
+                CJS_KeyValue* pNewObjData = new CJS_KeyValue;
+                pNewObjData->sKey = pOldObjData->sKey;
+                pNewObjData->nType = pOldObjData->nType;
+                pNewObjData->bData = pOldObjData->bData;
+                Add(pNewObjData);
+            }
+            break;
+        case JS_GLOBALDATA_TYPE_STRING:
+            {
+                CJS_KeyValue* pNewObjData = new CJS_KeyValue;
+                pNewObjData->sKey = pOldObjData->sKey;
+                pNewObjData->nType = pOldObjData->nType;
+                pNewObjData->sData = pOldObjData->sData;
+                Add(pNewObjData);
+            }
+            break;
+        case JS_GLOBALDATA_TYPE_OBJECT:
+            {
+                CJS_KeyValue* pNewObjData = new CJS_KeyValue;
+                pNewObjData->sKey = pOldObjData->sKey;
+                pNewObjData->nType = pOldObjData->nType;
+                pNewObjData->objData.Copy(pOldObjData->objData);
+                Add(pNewObjData);
+            }
+        case JS_GLOBALDATA_TYPE_NULL:
+            {
+                CJS_KeyValue* pNewObjData = new CJS_KeyValue;
+                pNewObjData->sKey = pOldObjData->sKey;
+                pNewObjData->nType = pOldObjData->nType;
+                Add(pNewObjData);
+            }
+        }
+    }
 }
 
 void CJS_GlobalVariableArray::Add(CJS_KeyValue* p)
 {
-	array.Add(p);
+    array.Add(p);
 }
 
 int CJS_GlobalVariableArray::Count() const
 {
-	return array.GetSize();
+    return array.GetSize();
 }
 
 CJS_KeyValue* CJS_GlobalVariableArray::GetAt(int index) const
 {
-	return array.GetAt(index);
+    return array.GetAt(index);
 }
 
 void CJS_GlobalVariableArray::Empty()
 {
-	for (int i=0,sz=array.GetSize(); i<sz; i++)
-		delete array.GetAt(i);
-	array.RemoveAll();
+    for (int i=0,sz=array.GetSize(); i<sz; i++)
+        delete array.GetAt(i);
+    array.RemoveAll();
 }
 
 /* -------------------------- CJS_GlobalData -------------------------- */
 
-#define READER_JS_GLOBALDATA_FILENAME				L"Reader_JsGlobal.Data"
-#define PHANTOM_JS_GLOBALDATA_FILENAME				L"Phantom_JsGlobal.Data"
-#define SDK_JS_GLOBALDATA_FILENAME					L"SDK_JsGlobal.Data"
+#define READER_JS_GLOBALDATA_FILENAME               L"Reader_JsGlobal.Data"
+#define PHANTOM_JS_GLOBALDATA_FILENAME              L"Phantom_JsGlobal.Data"
+#define SDK_JS_GLOBALDATA_FILENAME                  L"SDK_JsGlobal.Data"
 
 static const uint8_t JS_RC4KEY[] = {0x19,0xa8,0xe8,0x01,0xf6,0xa8,0xb6,0x4d,0x82,0x04,
-							0x45,0x6d,0xb4,0xcf,0xd7,0x77,0x67,0xf9,0x75,0x9f,
-							0xf0,0xe0,0x1e,0x51,0xee,0x46,0xfd,0x0b,0xc9,0x93,
-							0x25,0x55,0x4a,0xee,0xe0,0x16,0xd0,0xdf,0x8c,0xfa,
-							0x2a,0xa9,0x49,0xfd,0x97,0x1c,0x0e,0x22,0x13,0x28,
-							0x7c,0xaf,0xc4,0xfc,0x9c,0x12,0x65,0x8c,0x4e,0x5b,
-							0x04,0x75,0x89,0xc9,0xb1,0xed,0x50,0xca,0x96,0x6f,
-							0x1a,0x7a,0xfe,0x58,0x5d,0xec,0x19,0x4a,0xf6,0x35,
-							0x6a,0x97,0x14,0x00,0x0e,0xd0,0x6b,0xbb,0xd5,0x75,
-							0x55,0x8b,0x6e,0x6b,0x19,0xa0,0xf8,0x77,0xd5,0xa3
-							};
+                            0x45,0x6d,0xb4,0xcf,0xd7,0x77,0x67,0xf9,0x75,0x9f,
+                            0xf0,0xe0,0x1e,0x51,0xee,0x46,0xfd,0x0b,0xc9,0x93,
+                            0x25,0x55,0x4a,0xee,0xe0,0x16,0xd0,0xdf,0x8c,0xfa,
+                            0x2a,0xa9,0x49,0xfd,0x97,0x1c,0x0e,0x22,0x13,0x28,
+                            0x7c,0xaf,0xc4,0xfc,0x9c,0x12,0x65,0x8c,0x4e,0x5b,
+                            0x04,0x75,0x89,0xc9,0xb1,0xed,0x50,0xca,0x96,0x6f,
+                            0x1a,0x7a,0xfe,0x58,0x5d,0xec,0x19,0x4a,0xf6,0x35,
+                            0x6a,0x97,0x14,0x00,0x0e,0xd0,0x6b,0xbb,0xd5,0x75,
+                            0x55,0x8b,0x6e,0x6b,0x19,0xa0,0xf8,0x77,0xd5,0xa3
+                            };
 
 CJS_GlobalData::CJS_GlobalData(CPDFDoc_Environment* pApp) : m_pApp(pApp)
 {
-// 	IBaseAnnot* pBaseAnnot = IBaseAnnot::GetBaseAnnot(m_pApp);
-// 	ASSERT(pBaseAnnot != NULL);
+//  IBaseAnnot* pBaseAnnot = IBaseAnnot::GetBaseAnnot(m_pApp);
+//  ASSERT(pBaseAnnot != NULL);
 //
-// 	m_sFilePath = pBaseAnnot->GetUserPath();
-	m_sFilePath += SDK_JS_GLOBALDATA_FILENAME;
+//  m_sFilePath = pBaseAnnot->GetUserPath();
+    m_sFilePath += SDK_JS_GLOBALDATA_FILENAME;
 
-	LoadGlobalPersistentVariables();
+    LoadGlobalPersistentVariables();
 }
 
 CJS_GlobalData::~CJS_GlobalData()
 {
-	SaveGlobalPersisitentVariables();
+    SaveGlobalPersisitentVariables();
 
-	for (int i=0,sz=m_arrayGlobalData.GetSize(); i<sz; i++)
-		delete m_arrayGlobalData.GetAt(i);
+    for (int i=0,sz=m_arrayGlobalData.GetSize(); i<sz; i++)
+        delete m_arrayGlobalData.GetAt(i);
 
-	m_arrayGlobalData.RemoveAll();
+    m_arrayGlobalData.RemoveAll();
 }
 
-int	CJS_GlobalData::FindGlobalVariable(const FX_CHAR* propname)
+int CJS_GlobalData::FindGlobalVariable(const FX_CHAR* propname)
 {
-	ASSERT(propname != NULL);
+    ASSERT(propname != NULL);
 
-	int nRet = -1;
+    int nRet = -1;
 
-	for (int i=0,sz=m_arrayGlobalData.GetSize(); i<sz; i++)
-	{
-		CJS_GlobalData_Element* pTemp = m_arrayGlobalData.GetAt(i);
-		if (pTemp->data.sKey[0] == *propname && pTemp->data.sKey == propname)
-		{
-			nRet = i;
-			break;
-		}
-	}
+    for (int i=0,sz=m_arrayGlobalData.GetSize(); i<sz; i++)
+    {
+        CJS_GlobalData_Element* pTemp = m_arrayGlobalData.GetAt(i);
+        if (pTemp->data.sKey[0] == *propname && pTemp->data.sKey == propname)
+        {
+            nRet = i;
+            break;
+        }
+    }
 
-	return nRet;
+    return nRet;
 }
 
 CJS_GlobalData_Element* CJS_GlobalData::GetGlobalVariable(const FX_CHAR* propname)
 {
-	ASSERT(propname != NULL);
+    ASSERT(propname != NULL);
 
-	int	nFind = FindGlobalVariable(propname);
+    int nFind = FindGlobalVariable(propname);
+    if (nFind >= 0)
+        return m_arrayGlobalData.GetAt(nFind);
 
-	if (nFind >= 0)
-		return m_arrayGlobalData.GetAt(nFind);
-	else
-		return NULL;
+    return NULL;
 }
 
 void CJS_GlobalData::SetGlobalVariableNumber(const FX_CHAR* propname, double dData)
 {
-	ASSERT(propname != NULL);
-	CFX_ByteString sPropName = propname;
+    ASSERT(propname != NULL);
 
-	sPropName.TrimLeft();
-	sPropName.TrimRight();
+    CFX_ByteString sPropName = propname;
+    sPropName.TrimLeft();
+    sPropName.TrimRight();
+    if (sPropName.GetLength() == 0)
+        return;
 
-	if (sPropName.GetLength() == 0) return;
-
-	if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName))
-	{
-		pData->data.nType = JS_GLOBALDATA_TYPE_NUMBER;
-		pData->data.dData = dData;
-	}
-	else
-	{
-		CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;
-		pNewData->data.sKey = sPropName;
-		pNewData->data.nType = JS_GLOBALDATA_TYPE_NUMBER;
-		pNewData->data.dData = dData;
-
-		m_arrayGlobalData.Add(pNewData);
-	}
+    if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName))
+    {
+        pData->data.nType = JS_GLOBALDATA_TYPE_NUMBER;
+        pData->data.dData = dData;
+    }
+    else
+    {
+        CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;
+        pNewData->data.sKey = sPropName;
+        pNewData->data.nType = JS_GLOBALDATA_TYPE_NUMBER;
+        pNewData->data.dData = dData;
+        m_arrayGlobalData.Add(pNewData);
+    }
 }
 
 void CJS_GlobalData::SetGlobalVariableBoolean(const FX_CHAR* propname, bool bData)
 {
-	ASSERT(propname != NULL);
-	CFX_ByteString sPropName = propname;
+    ASSERT(propname != NULL);
+    CFX_ByteString sPropName = propname;
 
-	sPropName.TrimLeft();
-	sPropName.TrimRight();
+    sPropName.TrimLeft();
+    sPropName.TrimRight();
 
-	if (sPropName.GetLength() == 0) return;
+    if (sPropName.GetLength() == 0) return;
 
-	if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName))
-	{
-		pData->data.nType = JS_GLOBALDATA_TYPE_BOOLEAN;
-		pData->data.bData = bData;
-	}
-	else
-	{
-		CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;
-		pNewData->data.sKey = sPropName;
-		pNewData->data.nType = JS_GLOBALDATA_TYPE_BOOLEAN;
-		pNewData->data.bData = bData;
+    if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName))
+    {
+        pData->data.nType = JS_GLOBALDATA_TYPE_BOOLEAN;
+        pData->data.bData = bData;
+    }
+    else
+    {
+        CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;
+        pNewData->data.sKey = sPropName;
+        pNewData->data.nType = JS_GLOBALDATA_TYPE_BOOLEAN;
+        pNewData->data.bData = bData;
 
-		m_arrayGlobalData.Add(pNewData);
-	}
+        m_arrayGlobalData.Add(pNewData);
+    }
 }
 
 void CJS_GlobalData::SetGlobalVariableString(const FX_CHAR* propname, const CFX_ByteString& sData)
 {
-	ASSERT(propname != NULL);
-	CFX_ByteString sPropName = propname;
+    ASSERT(propname != NULL);
+    CFX_ByteString sPropName = propname;
 
-	sPropName.TrimLeft();
-	sPropName.TrimRight();
+    sPropName.TrimLeft();
+    sPropName.TrimRight();
 
-	if (sPropName.GetLength() == 0) return;
+    if (sPropName.GetLength() == 0) return;
 
-	if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName))
-	{
-		pData->data.nType = JS_GLOBALDATA_TYPE_STRING;
-		pData->data.sData = sData;
-	}
-	else
-	{
-		CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;
-		pNewData->data.sKey = sPropName;
-		pNewData->data.nType = JS_GLOBALDATA_TYPE_STRING;
-		pNewData->data.sData = sData;
+    if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName))
+    {
+        pData->data.nType = JS_GLOBALDATA_TYPE_STRING;
+        pData->data.sData = sData;
+    }
+    else
+    {
+        CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;
+        pNewData->data.sKey = sPropName;
+        pNewData->data.nType = JS_GLOBALDATA_TYPE_STRING;
+        pNewData->data.sData = sData;
 
-		m_arrayGlobalData.Add(pNewData);
-	}
+        m_arrayGlobalData.Add(pNewData);
+    }
 }
 
 void CJS_GlobalData::SetGlobalVariableObject(const FX_CHAR* propname, const CJS_GlobalVariableArray& array)
 {
-	ASSERT(propname != NULL);
-	CFX_ByteString sPropName = propname;
+    ASSERT(propname != NULL);
+    CFX_ByteString sPropName = propname;
 
-	sPropName.TrimLeft();
-	sPropName.TrimRight();
+    sPropName.TrimLeft();
+    sPropName.TrimRight();
 
-	if (sPropName.GetLength() == 0) return;
+    if (sPropName.GetLength() == 0) return;
 
-	if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName))
-	{
-		pData->data.nType = JS_GLOBALDATA_TYPE_OBJECT;
-		pData->data.objData.Copy(array);
-	}
-	else
-	{
-		CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;
-		pNewData->data.sKey = sPropName;
-		pNewData->data.nType = JS_GLOBALDATA_TYPE_OBJECT;
-		pNewData->data.objData.Copy(array);
+    if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName))
+    {
+        pData->data.nType = JS_GLOBALDATA_TYPE_OBJECT;
+        pData->data.objData.Copy(array);
+    }
+    else
+    {
+        CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;
+        pNewData->data.sKey = sPropName;
+        pNewData->data.nType = JS_GLOBALDATA_TYPE_OBJECT;
+        pNewData->data.objData.Copy(array);
 
-		m_arrayGlobalData.Add(pNewData);
-	}
+        m_arrayGlobalData.Add(pNewData);
+    }
 }
 
 void CJS_GlobalData::SetGlobalVariableNull(const FX_CHAR* propname)
 {
-	ASSERT(propname != NULL);
-	CFX_ByteString sPropName = propname;
+    ASSERT(propname != NULL);
+    CFX_ByteString sPropName = propname;
 
-	sPropName.TrimLeft();
-	sPropName.TrimRight();
+    sPropName.TrimLeft();
+    sPropName.TrimRight();
 
-	if (sPropName.GetLength() == 0) return;
+    if (sPropName.GetLength() == 0) return;
 
-	if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName))
-	{
-		pData->data.nType = JS_GLOBALDATA_TYPE_NULL;
-	}
-	else
-	{
-		CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;
-		pNewData->data.sKey = sPropName;
-		pNewData->data.nType = JS_GLOBALDATA_TYPE_NULL;
+    if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName))
+    {
+        pData->data.nType = JS_GLOBALDATA_TYPE_NULL;
+    }
+    else
+    {
+        CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;
+        pNewData->data.sKey = sPropName;
+        pNewData->data.nType = JS_GLOBALDATA_TYPE_NULL;
 
-		m_arrayGlobalData.Add(pNewData);
-	}
+        m_arrayGlobalData.Add(pNewData);
+    }
 }
 
 FX_BOOL CJS_GlobalData::SetGlobalVariablePersistent(const FX_CHAR* propname, FX_BOOL bPersistent)
 {
-	ASSERT(propname != NULL);
-	CFX_ByteString sPropName = propname;
+    ASSERT(propname != NULL);
+    CFX_ByteString sPropName = propname;
 
-	sPropName.TrimLeft();
-	sPropName.TrimRight();
+    sPropName.TrimLeft();
+    sPropName.TrimRight();
 
-	if (sPropName.GetLength() == 0) return FALSE;
+    if (sPropName.GetLength() == 0) return FALSE;
 
-	if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName))
-	{
-		pData->bPersistent = bPersistent;
-		return TRUE;
-	}
+    if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName))
+    {
+        pData->bPersistent = bPersistent;
+        return TRUE;
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
 FX_BOOL CJS_GlobalData::DeleteGlobalVariable(const FX_CHAR* propname)
 {
-	ASSERT(propname != NULL);
-	CFX_ByteString sPropName = propname;
+    ASSERT(propname != NULL);
+    CFX_ByteString sPropName = propname;
 
-	sPropName.TrimLeft();
-	sPropName.TrimRight();
+    sPropName.TrimLeft();
+    sPropName.TrimRight();
 
-	if (sPropName.GetLength() == 0) return FALSE;
+    if (sPropName.GetLength() == 0) return FALSE;
 
-	int	nFind = FindGlobalVariable(sPropName);
+    int nFind = FindGlobalVariable(sPropName);
 
-	if (nFind >= 0)
-	{
-		delete m_arrayGlobalData.GetAt(nFind);
-		m_arrayGlobalData.RemoveAt(nFind);
-		return TRUE;
-	}
+    if (nFind >= 0)
+    {
+        delete m_arrayGlobalData.GetAt(nFind);
+        m_arrayGlobalData.RemoveAt(nFind);
+        return TRUE;
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
 int32_t CJS_GlobalData::GetSize() const
 {
-	return m_arrayGlobalData.GetSize();
+    return m_arrayGlobalData.GetSize();
 }
 
 CJS_GlobalData_Element* CJS_GlobalData::GetAt(int index) const
 {
-	return m_arrayGlobalData.GetAt(index);
+    return m_arrayGlobalData.GetAt(index);
 }
 
 void CJS_GlobalData::LoadGlobalPersistentVariables()
 {
-	uint8_t* pBuffer = NULL;
-	int32_t nLength = 0;
+    uint8_t* pBuffer = NULL;
+    int32_t nLength = 0;
 
-	LoadFileBuffer(m_sFilePath.c_str(), pBuffer, nLength);
-	CRYPT_ArcFourCryptBlock(pBuffer, nLength, JS_RC4KEY, sizeof(JS_RC4KEY));
+    LoadFileBuffer(m_sFilePath.c_str(), pBuffer, nLength);
+    CRYPT_ArcFourCryptBlock(pBuffer, nLength, JS_RC4KEY, sizeof(JS_RC4KEY));
 
-	if (pBuffer)
-	{
-		uint8_t* p = pBuffer;
-		FX_WORD wType = *((FX_WORD*)p);
-		p += sizeof(FX_WORD);
+    if (pBuffer)
+    {
+        uint8_t* p = pBuffer;
+        FX_WORD wType = *((FX_WORD*)p);
+        p += sizeof(FX_WORD);
 
-		//FX_WORD wTemp = (FX_WORD)(('X' << 8) | 'F');
+        //FX_WORD wTemp = (FX_WORD)(('X' << 8) | 'F');
 
-		if (wType == (FX_WORD)(('X' << 8) | 'F'))
-		{
-			FX_WORD wVersion = *((FX_WORD*)p);
-			p += sizeof(FX_WORD);
+        if (wType == (FX_WORD)(('X' << 8) | 'F'))
+        {
+            FX_WORD wVersion = *((FX_WORD*)p);
+            p += sizeof(FX_WORD);
 
-			ASSERT(wVersion <= 2);
+            ASSERT(wVersion <= 2);
 
-			FX_DWORD dwCount = *((FX_DWORD*)p);
-			p += sizeof(FX_DWORD);
+            FX_DWORD dwCount = *((FX_DWORD*)p);
+            p += sizeof(FX_DWORD);
 
-			FX_DWORD dwSize = *((FX_DWORD*)p);
-			p += sizeof(FX_DWORD);
+            FX_DWORD dwSize = *((FX_DWORD*)p);
+            p += sizeof(FX_DWORD);
 
-			if (dwSize == nLength - sizeof(FX_WORD) * 2 - sizeof(FX_DWORD)* 2)
-			{
-				for (int32_t i=0,sz=dwCount; i<sz; i++)
-				{
-					if (p > pBuffer + nLength)
-						break;
+            if (dwSize == nLength - sizeof(FX_WORD) * 2 - sizeof(FX_DWORD)* 2)
+            {
+                for (int32_t i=0,sz=dwCount; i<sz; i++)
+                {
+                    if (p > pBuffer + nLength)
+                        break;
 
-					FX_DWORD dwNameLen = *((FX_DWORD*)p);
-					p += sizeof(FX_DWORD);
+                    FX_DWORD dwNameLen = *((FX_DWORD*)p);
+                    p += sizeof(FX_DWORD);
 
-					if (p + dwNameLen > pBuffer + nLength)
-						break;
+                    if (p + dwNameLen > pBuffer + nLength)
+                        break;
 
-					CFX_ByteString sEntry = CFX_ByteString(p, dwNameLen);
-					p += sizeof(char) * dwNameLen;
+                    CFX_ByteString sEntry = CFX_ByteString(p, dwNameLen);
+                    p += sizeof(char) * dwNameLen;
 
-					FX_WORD wDataType = *((FX_WORD*)p);
-					p += sizeof(FX_WORD);
+                    FX_WORD wDataType = *((FX_WORD*)p);
+                    p += sizeof(FX_WORD);
 
-					switch (wDataType)
-					{
-					case JS_GLOBALDATA_TYPE_NUMBER:
-						{
-							double dData = 0;
-							switch (wVersion)
-							{
-							case 1:
-								{
-									FX_DWORD dwData = *((FX_DWORD*)p);
-									p += sizeof(FX_DWORD);
-									dData = dwData;
-								}
-								break;
-							case 2:
-								{
-									dData = *((double*)p);
-									p += sizeof(double);
-								}
-								break;
-							}
-							SetGlobalVariableNumber(sEntry, dData);
-							SetGlobalVariablePersistent(sEntry, TRUE);
-						}
-						break;
-					case JS_GLOBALDATA_TYPE_BOOLEAN:
-						{
-							FX_WORD wData = *((FX_WORD*)p);
-							p += sizeof(FX_WORD);
-							SetGlobalVariableBoolean(sEntry, (bool)(wData == 1));
-							SetGlobalVariablePersistent(sEntry, TRUE);
-						}
-						break;
-					case JS_GLOBALDATA_TYPE_STRING:
-						{
-							FX_DWORD dwLength = *((FX_DWORD*)p);
-							p += sizeof(FX_DWORD);
+                    switch (wDataType)
+                    {
+                    case JS_GLOBALDATA_TYPE_NUMBER:
+                        {
+                            double dData = 0;
+                            switch (wVersion)
+                            {
+                            case 1:
+                                {
+                                    FX_DWORD dwData = *((FX_DWORD*)p);
+                                    p += sizeof(FX_DWORD);
+                                    dData = dwData;
+                                }
+                                break;
+                            case 2:
+                                {
+                                    dData = *((double*)p);
+                                    p += sizeof(double);
+                                }
+                                break;
+                            }
+                            SetGlobalVariableNumber(sEntry, dData);
+                            SetGlobalVariablePersistent(sEntry, TRUE);
+                        }
+                        break;
+                    case JS_GLOBALDATA_TYPE_BOOLEAN:
+                        {
+                            FX_WORD wData = *((FX_WORD*)p);
+                            p += sizeof(FX_WORD);
+                            SetGlobalVariableBoolean(sEntry, (bool)(wData == 1));
+                            SetGlobalVariablePersistent(sEntry, TRUE);
+                        }
+                        break;
+                    case JS_GLOBALDATA_TYPE_STRING:
+                        {
+                            FX_DWORD dwLength = *((FX_DWORD*)p);
+                            p += sizeof(FX_DWORD);
 
-							if (p + dwLength > pBuffer + nLength)
-								break;
+                            if (p + dwLength > pBuffer + nLength)
+                                break;
 
-							SetGlobalVariableString(sEntry, CFX_ByteString(p, dwLength));
-							SetGlobalVariablePersistent(sEntry, TRUE);
-							p += sizeof(char) * dwLength;
-						}
-						break;
-					case JS_GLOBALDATA_TYPE_NULL:
-						{
-							SetGlobalVariableNull(sEntry);
-							SetGlobalVariablePersistent(sEntry, TRUE);
-						}
-					}
-				}
-			}
-		}
-		FX_Free(pBuffer);
-	}
+                            SetGlobalVariableString(sEntry, CFX_ByteString(p, dwLength));
+                            SetGlobalVariablePersistent(sEntry, TRUE);
+                            p += sizeof(char) * dwLength;
+                        }
+                        break;
+                    case JS_GLOBALDATA_TYPE_NULL:
+                        {
+                            SetGlobalVariableNull(sEntry);
+                            SetGlobalVariablePersistent(sEntry, TRUE);
+                        }
+                    }
+                }
+            }
+        }
+        FX_Free(pBuffer);
+    }
 }
 
 /*
 struct js_global_datafile_header
 {
-	FX_WORD type; //FX ('X' << 8) | 'F'
-	FX_WORD version; //1.0
-	FX_DWORD datacount;
+    FX_WORD type; //FX ('X' << 8) | 'F'
+    FX_WORD version; //1.0
+    FX_DWORD datacount;
 };
 struct js_global_datafile_data
 {
-	FX_WORD type;
-	FX_DWORD nData;
-	FX_WORD bData;
-	FX_DWORD nStrLen;
-	char* pStr;
+    FX_WORD type;
+    FX_DWORD nData;
+    FX_WORD bData;
+    FX_DWORD nStrLen;
+    char* pStr;
 };
 */
 
 void CJS_GlobalData::SaveGlobalPersisitentVariables()
 {
-	FX_DWORD nCount = 0;
-	CFX_BinaryBuf sData;
+    FX_DWORD nCount = 0;
+    CFX_BinaryBuf sData;
 
-	for (int i=0,sz=m_arrayGlobalData.GetSize(); i<sz; i++)
-	{
-		CJS_GlobalData_Element* pElement = m_arrayGlobalData.GetAt(i);
-		ASSERT(pElement != NULL);
+    for (int i=0,sz=m_arrayGlobalData.GetSize(); i<sz; i++)
+    {
+        CJS_GlobalData_Element* pElement = m_arrayGlobalData.GetAt(i);
+        ASSERT(pElement != NULL);
 
-		if (pElement->bPersistent)
-		{
-			CFX_BinaryBuf sElement;
-			MakeByteString(pElement->data.sKey, &pElement->data, sElement);
+        if (pElement->bPersistent)
+        {
+            CFX_BinaryBuf sElement;
+            MakeByteString(pElement->data.sKey, &pElement->data, sElement);
 
-			if (sData.GetSize() + sElement.GetSize() > JS_MAXGLOBALDATA)
-				break;
+            if (sData.GetSize() + sElement.GetSize() > JS_MAXGLOBALDATA)
+                break;
 
-			sData.AppendBlock(sElement.GetBuffer(), sElement.GetSize());
-			nCount++;
-		}
-	}
+            sData.AppendBlock(sElement.GetBuffer(), sElement.GetSize());
+            nCount++;
+        }
+    }
 
-	CFX_BinaryBuf sFile;
+    CFX_BinaryBuf sFile;
 
-	FX_WORD wType = (FX_WORD)(('X' << 8) | 'F');
-	sFile.AppendBlock(&wType, sizeof(FX_WORD));
-	FX_WORD wVersion = 2;
-	sFile.AppendBlock(&wVersion, sizeof(FX_WORD));
-	sFile.AppendBlock(&nCount, sizeof(FX_DWORD));
-	FX_DWORD dwSize = sData.GetSize();
-	sFile.AppendBlock(&dwSize, sizeof(FX_DWORD));
+    FX_WORD wType = (FX_WORD)(('X' << 8) | 'F');
+    sFile.AppendBlock(&wType, sizeof(FX_WORD));
+    FX_WORD wVersion = 2;
+    sFile.AppendBlock(&wVersion, sizeof(FX_WORD));
+    sFile.AppendBlock(&nCount, sizeof(FX_DWORD));
+    FX_DWORD dwSize = sData.GetSize();
+    sFile.AppendBlock(&dwSize, sizeof(FX_DWORD));
 
-	sFile.AppendBlock(sData.GetBuffer(), sData.GetSize());
+    sFile.AppendBlock(sData.GetBuffer(), sData.GetSize());
 
-	CRYPT_ArcFourCryptBlock(sFile.GetBuffer(), sFile.GetSize(), JS_RC4KEY, sizeof(JS_RC4KEY));
-	WriteFileBuffer(m_sFilePath.c_str(), (const FX_CHAR*)sFile.GetBuffer(), sFile.GetSize());
+    CRYPT_ArcFourCryptBlock(sFile.GetBuffer(), sFile.GetSize(), JS_RC4KEY, sizeof(JS_RC4KEY));
+    WriteFileBuffer(m_sFilePath.c_str(), (const FX_CHAR*)sFile.GetBuffer(), sFile.GetSize());
 }
 
 void CJS_GlobalData::LoadFileBuffer(const FX_WCHAR* sFilePath, uint8_t*& pBuffer, int32_t& nLength)
@@ -524,58 +522,53 @@
 
 void CJS_GlobalData::MakeByteString(const CFX_ByteString& name, CJS_KeyValue* pData, CFX_BinaryBuf& sData)
 {
-	ASSERT(pData != NULL);
+    FX_WORD wType = (FX_WORD)pData->nType;
+    switch (wType)
+    {
+    case JS_GLOBALDATA_TYPE_NUMBER:
+        {
+            FX_DWORD dwNameLen = (FX_DWORD)name.GetLength();
+            sData.AppendBlock(&dwNameLen, sizeof(FX_DWORD));
+            sData.AppendString(name);
+            sData.AppendBlock(&wType, sizeof(FX_WORD));
 
-	FX_WORD wType = (FX_WORD)pData->nType;
+            double dData = pData->dData;
+            sData.AppendBlock(&dData, sizeof(double));
+        }
+        break;
+    case JS_GLOBALDATA_TYPE_BOOLEAN:
+        {
+            FX_DWORD dwNameLen = (FX_DWORD)name.GetLength();
+            sData.AppendBlock(&dwNameLen, sizeof(FX_DWORD));
+            sData.AppendString(name);
+            sData.AppendBlock(&wType, sizeof(FX_WORD));
 
-	switch (wType)
-	{
-	case JS_GLOBALDATA_TYPE_NUMBER:
-		{
-			FX_DWORD dwNameLen = (FX_DWORD)name.GetLength();
-			sData.AppendBlock(&dwNameLen, sizeof(FX_DWORD));
-			sData.AppendString(name);
+            FX_WORD wData = (FX_WORD)pData->bData;
+            sData.AppendBlock(&wData, sizeof(FX_WORD));
+        }
+        break;
+    case JS_GLOBALDATA_TYPE_STRING:
+        {
+            FX_DWORD dwNameLen = (FX_DWORD)name.GetLength();
+            sData.AppendBlock(&dwNameLen, sizeof(FX_DWORD));
+            sData.AppendString(name);
+            sData.AppendBlock(&wType, sizeof(FX_WORD));
 
-			sData.AppendBlock(&wType, sizeof(FX_WORD));
-			double dData = pData->dData;
-			sData.AppendBlock(&dData, sizeof(double));
-		}
-		break;
-	case JS_GLOBALDATA_TYPE_BOOLEAN:
-		{
-			FX_DWORD dwNameLen = (FX_DWORD)name.GetLength();
-			sData.AppendBlock(&dwNameLen, sizeof(FX_DWORD));
-			sData.AppendString(name);
-
-			sData.AppendBlock(&wType, sizeof(FX_WORD));
-			FX_WORD wData = (FX_WORD)pData->bData;
-			sData.AppendBlock(&wData, sizeof(FX_WORD));
-		}
-		break;
-	case JS_GLOBALDATA_TYPE_STRING:
-		{
-			FX_DWORD dwNameLen = (FX_DWORD)name.GetLength();
-			sData.AppendBlock(&dwNameLen, sizeof(FX_DWORD));
-			sData.AppendString(name);
-
-			sData.AppendBlock(&wType, sizeof(FX_WORD));
-
-			FX_DWORD dwDataLen = (FX_DWORD)pData->sData.GetLength();
-			sData.AppendBlock(&dwDataLen, sizeof(FX_DWORD));
-			sData.AppendString(pData->sData);
-		}
-		break;
-	case JS_GLOBALDATA_TYPE_NULL:
-		{
-			FX_DWORD dwNameLen = (FX_DWORD)name.GetLength();
-			sData.AppendBlock(&dwNameLen, sizeof(FX_DWORD));
-			sData.AppendString(name);
-
-			sData.AppendBlock(&wType, sizeof(FX_DWORD));
-		}
-		break;
-	default:
-		break;
-	}
+            FX_DWORD dwDataLen = (FX_DWORD)pData->sData.GetLength();
+            sData.AppendBlock(&dwDataLen, sizeof(FX_DWORD));
+            sData.AppendString(pData->sData);
+        }
+        break;
+    case JS_GLOBALDATA_TYPE_NULL:
+        {
+            FX_DWORD dwNameLen = (FX_DWORD)name.GetLength();
+            sData.AppendBlock(&dwNameLen, sizeof(FX_DWORD));
+            sData.AppendString(name);
+            sData.AppendBlock(&wType, sizeof(FX_DWORD));
+        }
+        break;
+    default:
+        break;
+    }
 }
 
diff --git a/fpdfsdk/src/javascript/JS_Runtime.cpp b/fpdfsdk/src/javascript/JS_Runtime.cpp
index 51aafd2..346b642 100644
--- a/fpdfsdk/src/javascript/JS_Runtime.cpp
+++ b/fpdfsdk/src/javascript/JS_Runtime.cpp
@@ -33,7 +33,7 @@
 {
 }
 
-IFXJS_Runtime*					CJS_RuntimeFactory::NewJSRuntime(CPDFDoc_Environment* pApp)
+IFXJS_Runtime*                  CJS_RuntimeFactory::NewJSRuntime(CPDFDoc_Environment* pApp)
 {
 	if (!m_bInit)
 	{
@@ -42,54 +42,51 @@
 	}
 	return new CJS_Runtime(pApp);
 }
-void							CJS_RuntimeFactory::AddRef()
+void                            CJS_RuntimeFactory::AddRef()
 {
-	//to do.Should be implemented as atom manipulation.
-	m_nRef++;
+    //to do.Should be implemented as atom manipulation.
+    m_nRef++;
 }
-void							CJS_RuntimeFactory::Release()
+void                            CJS_RuntimeFactory::Release()
 {
-	if(m_bInit)
-	{
-		//to do.Should be implemented as atom manipulation.
-		if (--m_nRef == 0)
-		{
-			JS_Release();
-			ReleaseGlobalData();
-			m_bInit = FALSE;
-		}
-	}
+    if(m_bInit)
+    {
+        //to do.Should be implemented as atom manipulation.
+        if (--m_nRef == 0)
+        {
+            JS_Release();
+            ReleaseGlobalData();
+            m_bInit = FALSE;
+        }
+    }
 }
 
-void							CJS_RuntimeFactory::DeleteJSRuntime(IFXJS_Runtime* pRuntime)
+void                            CJS_RuntimeFactory::DeleteJSRuntime(IFXJS_Runtime* pRuntime)
 {
     delete (CJS_Runtime*)pRuntime;
 }
 
-CJS_GlobalData*	CJS_RuntimeFactory::NewGlobalData(CPDFDoc_Environment* pApp)
+CJS_GlobalData* CJS_RuntimeFactory::NewGlobalData(CPDFDoc_Environment* pApp)
 {
-	if (m_pGlobalData)
-	{
-		m_nGlobalDataCount++;
-		return m_pGlobalData;
-	}
-	else
-	{
-		m_nGlobalDataCount = 1;
-		m_pGlobalData = new CJS_GlobalData(pApp);
-		return m_pGlobalData;
-	}
+    if (m_pGlobalData)
+    {
+        m_nGlobalDataCount++;
+        return m_pGlobalData;
+    }
+    m_nGlobalDataCount = 1;
+    m_pGlobalData = new CJS_GlobalData(pApp);
+    return m_pGlobalData;
 }
 
 void CJS_RuntimeFactory::ReleaseGlobalData()
 {
-	m_nGlobalDataCount--;
+    m_nGlobalDataCount--;
 
-	if (m_nGlobalDataCount <= 0)
-	{
- 		delete m_pGlobalData;
- 		m_pGlobalData = NULL;
-	}
+    if (m_nGlobalDataCount <= 0)
+    {
+        delete m_pGlobalData;
+        m_pGlobalData = NULL;
+    }
 }
 
 void* CJS_ArrayBufferAllocator::Allocate(size_t length) {
@@ -132,11 +129,11 @@
 		return;
 	}
 
-	InitJSObjects();
+    InitJSObjects();
 
-	CJS_Context * pContext = (CJS_Context*)NewContext();
-	JS_InitialRuntime(*this, this, pContext, m_context);
-	ReleaseContext(pContext);
+    CJS_Context * pContext = (CJS_Context*)NewContext();
+    JS_InitialRuntime(*this, this, pContext, m_context);
+    ReleaseContext(pContext);
 }
 
 CJS_Runtime::~CJS_Runtime()
@@ -145,19 +142,15 @@
 	for (int i=0;i < size; i++)
 		delete m_ContextArray.GetAt(i);
 
-	m_ContextArray.RemoveAll();
+    m_ContextArray.RemoveAll();
 
-	//JS_ReleaseRuntime(*this, m_context);
+    RemoveEventsInLoop(m_pFieldEventPath);
 
-	RemoveEventsInLoop(m_pFieldEventPath);
+    m_pApp = NULL;
+    m_pDocument = NULL;
+    m_pFieldEventPath = NULL;
+    m_context.Reset();
 
-	m_pApp = NULL;
-	m_pDocument = NULL;
-	m_pFieldEventPath = NULL;
-	m_context.Reset();
-
-	//m_isolate->Exit();
-	//m_isolate->Dispose();
 	m_isolate = NULL;
 }
 
@@ -206,31 +199,31 @@
 
 IFXJS_Context* CJS_Runtime::NewContext()
 {
-	CJS_Context * p = new CJS_Context(this);
-	m_ContextArray.Add(p);
-	return p;
+    CJS_Context * p = new CJS_Context(this);
+    m_ContextArray.Add(p);
+    return p;
 }
 
 void CJS_Runtime::ReleaseContext(IFXJS_Context * pContext)
 {
-	CJS_Context* pJSContext = (CJS_Context*)pContext;
+    CJS_Context* pJSContext = (CJS_Context*)pContext;
 
-	for (int i=0, sz=m_ContextArray.GetSize(); i<sz; i++)
-	{
-		if (pJSContext == m_ContextArray.GetAt(i))
-		{
-			delete pJSContext;
-			m_ContextArray.RemoveAt(i);
-			break;
-		}
-	}
+    for (int i=0, sz=m_ContextArray.GetSize(); i<sz; i++)
+    {
+        if (pJSContext == m_ContextArray.GetAt(i))
+        {
+            delete pJSContext;
+            m_ContextArray.RemoveAt(i);
+            break;
+        }
+    }
 }
 
-IFXJS_Context*	CJS_Runtime::GetCurrentContext()
+IFXJS_Context*  CJS_Runtime::GetCurrentContext()
 {
-	if(!m_ContextArray.GetSize())
-		return NULL;
-	return m_ContextArray.GetAt(m_ContextArray.GetSize()-1);
+    if(!m_ContextArray.GetSize())
+        return NULL;
+    return m_ContextArray.GetAt(m_ContextArray.GetSize()-1);
 }
 
 void CJS_Runtime::SetReaderDocument(CPDFSDK_Document* pReaderDoc)
@@ -268,94 +261,94 @@
 	}
 }
 
-FX_BOOL	CJS_Runtime::AddEventToLoop(const CFX_WideString& sTargetName, JS_EVENT_T eEventType)
+FX_BOOL CJS_Runtime::AddEventToLoop(const CFX_WideString& sTargetName, JS_EVENT_T eEventType)
 {
-	if (m_pFieldEventPath == NULL)
-	{
-		m_pFieldEventPath = new CJS_FieldEvent;
-		m_pFieldEventPath->sTargetName = sTargetName;
-		m_pFieldEventPath->eEventType = eEventType;
-		m_pFieldEventPath->pNext = NULL;
+    if (m_pFieldEventPath == NULL)
+    {
+        m_pFieldEventPath = new CJS_FieldEvent;
+        m_pFieldEventPath->sTargetName = sTargetName;
+        m_pFieldEventPath->eEventType = eEventType;
+        m_pFieldEventPath->pNext = NULL;
 
-		return TRUE;
-	}
+        return TRUE;
+    }
 
-	//to search
-	CJS_FieldEvent* p = m_pFieldEventPath;
-	CJS_FieldEvent* pLast = m_pFieldEventPath;
-	while (p)
-	{
-		if (p->eEventType == eEventType && p->sTargetName == sTargetName)
-			return FALSE;
+    //to search
+    CJS_FieldEvent* p = m_pFieldEventPath;
+    CJS_FieldEvent* pLast = m_pFieldEventPath;
+    while (p)
+    {
+        if (p->eEventType == eEventType && p->sTargetName == sTargetName)
+            return FALSE;
 
-		pLast = p;
-		p = p->pNext;
-	}
+        pLast = p;
+        p = p->pNext;
+    }
 
-	//to add
-	CJS_FieldEvent* pNew = new CJS_FieldEvent;
-	pNew->sTargetName = sTargetName;
-	pNew->eEventType = eEventType;
-	pNew->pNext = NULL;
+    //to add
+    CJS_FieldEvent* pNew = new CJS_FieldEvent;
+    pNew->sTargetName = sTargetName;
+    pNew->eEventType = eEventType;
+    pNew->pNext = NULL;
 
-	pLast->pNext = pNew;
+    pLast->pNext = pNew;
 
-	return TRUE;
+    return TRUE;
 }
 
 void CJS_Runtime::RemoveEventInLoop(const CFX_WideString& sTargetName, JS_EVENT_T eEventType)
 {
-	FX_BOOL bFind = FALSE;
+    FX_BOOL bFind = FALSE;
 
-	CJS_FieldEvent* p = m_pFieldEventPath;
-	CJS_FieldEvent* pLast = NULL;
-	while (p)
-	{
-		if (p->eEventType == eEventType && p->sTargetName == sTargetName)
-		{
-			bFind = TRUE;
-			break;
-		}
+    CJS_FieldEvent* p = m_pFieldEventPath;
+    CJS_FieldEvent* pLast = NULL;
+    while (p)
+    {
+        if (p->eEventType == eEventType && p->sTargetName == sTargetName)
+        {
+            bFind = TRUE;
+            break;
+        }
 
-		pLast = p;
-		p = p->pNext;
-	}
+        pLast = p;
+        p = p->pNext;
+    }
 
-	if (bFind)
-	{
-		RemoveEventsInLoop(p);
+    if (bFind)
+    {
+        RemoveEventsInLoop(p);
 
-		if (p == m_pFieldEventPath)
-			m_pFieldEventPath = NULL;
+        if (p == m_pFieldEventPath)
+            m_pFieldEventPath = NULL;
 
-		if (pLast)
-			pLast->pNext = NULL;
-	}
+        if (pLast)
+            pLast->pNext = NULL;
+    }
 }
 
 void CJS_Runtime::RemoveEventsInLoop(CJS_FieldEvent* pStart)
 {
-	CJS_FieldEvent* p = pStart;
+    CJS_FieldEvent* p = pStart;
 
-	while (p)
-	{
-		CJS_FieldEvent* pOld = p;
-		p = pOld->pNext;
+    while (p)
+    {
+        CJS_FieldEvent* pOld = p;
+        p = pOld->pNext;
 
-		delete pOld;
-	}
+        delete pOld;
+    }
 }
 
-v8::Local<v8::Context>	CJS_Runtime::NewJSContext()
+v8::Local<v8::Context>  CJS_Runtime::NewJSContext()
 {
-	return v8::Local<v8::Context>::New(m_isolate, m_context);
+    return v8::Local<v8::Context>::New(m_isolate, m_context);
 }
 
 CFX_WideString ChangeObjName(const CFX_WideString& str)
 {
-	CFX_WideString sRet = str;
-	sRet.Replace(L"_", L".");
-	return sRet;
+    CFX_WideString sRet = str;
+    sRet.Replace(L"_", L".");
+    return sRet;
 }
 FX_BOOL	CJS_Runtime::GetHValueByName(const CFX_ByteStringC& utf8Name, FXJSE_HVALUE hValue)
 {
diff --git a/fpdfsdk/src/javascript/PublicMethods.cpp b/fpdfsdk/src/javascript/PublicMethods.cpp
index 4c01609..c5cc84c 100644
--- a/fpdfsdk/src/javascript/PublicMethods.cpp
+++ b/fpdfsdk/src/javascript/PublicMethods.cpp
@@ -21,130 +21,131 @@
 
 static v8::Isolate* GetIsolate(IFXJS_Context* cc)
 {
-	CJS_Context* pContext = (CJS_Context *)cc;
-	ASSERT(pContext != NULL);
+    CJS_Context* pContext = (CJS_Context *)cc;
+    ASSERT(pContext != NULL);
 
-	CJS_Runtime* pRuntime = pContext->GetJSRuntime();
-	ASSERT(pRuntime != NULL);
+    CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+    ASSERT(pRuntime != NULL);
 
-	return pRuntime->GetIsolate();
+    return pRuntime->GetIsolate();
 }
 
 
 /* -------------------------------- CJS_PublicMethods -------------------------------- */
 
-#define DOUBLE_CORRECT	0.000000000000001
+#define DOUBLE_CORRECT  0.000000000000001
 
 BEGIN_JS_STATIC_GLOBAL_FUN(CJS_PublicMethods)
-	JS_STATIC_GLOBAL_FUN_ENTRY(AFNumber_Format)
-	JS_STATIC_GLOBAL_FUN_ENTRY(AFNumber_Keystroke)
-	JS_STATIC_GLOBAL_FUN_ENTRY(AFPercent_Format)
-	JS_STATIC_GLOBAL_FUN_ENTRY(AFPercent_Keystroke)
-	JS_STATIC_GLOBAL_FUN_ENTRY(AFDate_FormatEx)
-	JS_STATIC_GLOBAL_FUN_ENTRY(AFDate_KeystrokeEx)
-	JS_STATIC_GLOBAL_FUN_ENTRY(AFDate_Format)
-	JS_STATIC_GLOBAL_FUN_ENTRY(AFDate_Keystroke)
-	JS_STATIC_GLOBAL_FUN_ENTRY(AFTime_FormatEx)
-	JS_STATIC_GLOBAL_FUN_ENTRY(AFTime_KeystrokeEx)
-	JS_STATIC_GLOBAL_FUN_ENTRY(AFTime_Format)
-	JS_STATIC_GLOBAL_FUN_ENTRY(AFTime_Keystroke)
-	JS_STATIC_GLOBAL_FUN_ENTRY(AFSpecial_Format)
-	JS_STATIC_GLOBAL_FUN_ENTRY(AFSpecial_Keystroke)
-	JS_STATIC_GLOBAL_FUN_ENTRY(AFSpecial_KeystrokeEx)
-	JS_STATIC_GLOBAL_FUN_ENTRY(AFSimple)
-	JS_STATIC_GLOBAL_FUN_ENTRY(AFMakeNumber)
-	JS_STATIC_GLOBAL_FUN_ENTRY(AFSimple_Calculate)
-	JS_STATIC_GLOBAL_FUN_ENTRY(AFRange_Validate)
-	JS_STATIC_GLOBAL_FUN_ENTRY(AFMergeChange)
-	JS_STATIC_GLOBAL_FUN_ENTRY(AFParseDateEx)
-	JS_STATIC_GLOBAL_FUN_ENTRY(AFExtractNums)
+    JS_STATIC_GLOBAL_FUN_ENTRY(AFNumber_Format)
+    JS_STATIC_GLOBAL_FUN_ENTRY(AFNumber_Keystroke)
+    JS_STATIC_GLOBAL_FUN_ENTRY(AFPercent_Format)
+    JS_STATIC_GLOBAL_FUN_ENTRY(AFPercent_Keystroke)
+    JS_STATIC_GLOBAL_FUN_ENTRY(AFDate_FormatEx)
+    JS_STATIC_GLOBAL_FUN_ENTRY(AFDate_KeystrokeEx)
+    JS_STATIC_GLOBAL_FUN_ENTRY(AFDate_Format)
+    JS_STATIC_GLOBAL_FUN_ENTRY(AFDate_Keystroke)
+    JS_STATIC_GLOBAL_FUN_ENTRY(AFTime_FormatEx)
+    JS_STATIC_GLOBAL_FUN_ENTRY(AFTime_KeystrokeEx)
+    JS_STATIC_GLOBAL_FUN_ENTRY(AFTime_Format)
+    JS_STATIC_GLOBAL_FUN_ENTRY(AFTime_Keystroke)
+    JS_STATIC_GLOBAL_FUN_ENTRY(AFSpecial_Format)
+    JS_STATIC_GLOBAL_FUN_ENTRY(AFSpecial_Keystroke)
+    JS_STATIC_GLOBAL_FUN_ENTRY(AFSpecial_KeystrokeEx)
+    JS_STATIC_GLOBAL_FUN_ENTRY(AFSimple)
+    JS_STATIC_GLOBAL_FUN_ENTRY(AFMakeNumber)
+    JS_STATIC_GLOBAL_FUN_ENTRY(AFSimple_Calculate)
+    JS_STATIC_GLOBAL_FUN_ENTRY(AFRange_Validate)
+    JS_STATIC_GLOBAL_FUN_ENTRY(AFMergeChange)
+    JS_STATIC_GLOBAL_FUN_ENTRY(AFParseDateEx)
+    JS_STATIC_GLOBAL_FUN_ENTRY(AFExtractNums)
 END_JS_STATIC_GLOBAL_FUN()
 
 IMPLEMENT_JS_STATIC_GLOBAL_FUN(CJS_PublicMethods)
 
 static const FX_WCHAR* months[] =
 {
-	L"Jan", L"Feb", L"Mar", L"Apr", L"May", L"Jun", L"Jul", L"Aug", L"Sep", L"Oct", L"Nov", L"Dec"
+    L"Jan", L"Feb", L"Mar", L"Apr", L"May", L"Jun", L"Jul", L"Aug", L"Sep", L"Oct", L"Nov", L"Dec"
 };
 
 static const FX_WCHAR* const fullmonths[] =
 {
-	L"January", L"February", L"March", L"April", L"May", L"June", L"July", L"August", L"September", L"October", L"November", L"December"
+    L"January", L"February", L"March", L"April", L"May", L"June", L"July", L"August", L"September", L"October", L"November", L"December"
 };
 
 FX_BOOL CJS_PublicMethods::IsNumber(const FX_WCHAR* string)
 {
-	CFX_WideString sTrim = StrTrim(string);
-	const FX_WCHAR* pTrim = sTrim.c_str();
-	const FX_WCHAR* p = pTrim;
+    CFX_WideString sTrim = StrTrim(string);
+    const FX_WCHAR* pTrim = sTrim.c_str();
+    const FX_WCHAR* p = pTrim;
 
 
-	FX_BOOL bDot = FALSE;
-	FX_BOOL bKXJS = FALSE;
+    FX_BOOL bDot = FALSE;
+    FX_BOOL bKXJS = FALSE;
 
-	wchar_t c;
-	while ((c = *p))
-	{
-		if (c == '.' || c == ',')
-		{
-			if (bDot) return FALSE;
-			bDot = TRUE;
-		}
-		else if (c == '-' || c == '+')
-		{
-			if (p != pTrim)
-				return FALSE;
-		}
-		else if (c == 'e' || c == 'E')
-		{
-			if (bKXJS) return FALSE;
+    wchar_t c;
+    while ((c = *p))
+    {
+        if (c == '.' || c == ',')
+        {
+            if (bDot) return FALSE;
+            bDot = TRUE;
+        }
+        else if (c == '-' || c == '+')
+        {
+            if (p != pTrim)
+                return FALSE;
+        }
+        else if (c == 'e' || c == 'E')
+        {
+            if (bKXJS)
+                return FALSE;
 
-			p++;
-			c = *p;
-			if (c == '+' || c == '-')
-			{
-				bKXJS = TRUE;
-			}
-			else
-			{
-				return FALSE;
-			}
-		}
-		else if (!IsDigit(c))
-		{
-			return FALSE;
-		}
-		p++;
-	}
+            p++;
+            c = *p;
+            if (c == '+' || c == '-')
+            {
+                bKXJS = TRUE;
+            }
+            else
+            {
+                return FALSE;
+            }
+        }
+        else if (!IsDigit(c))
+        {
+            return FALSE;
+        }
+        p++;
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL CJS_PublicMethods::IsDigit(wchar_t ch)
 {
-	return (ch >= L'0' && ch <= L'9');
+    return (ch >= L'0' && ch <= L'9');
 }
 
 FX_BOOL CJS_PublicMethods::IsDigit(char ch)
 {
-	return (ch >= '0' && ch <= '9');
+    return (ch >= '0' && ch <= '9');
 }
 
 FX_BOOL CJS_PublicMethods::IsAlphabetic(wchar_t ch)
 {
-	return ((ch >= L'a' && ch <= L'z') || (ch >= L'A' && ch <= L'Z'));
+    return ((ch >= L'a' && ch <= L'z') || (ch >= L'A' && ch <= L'Z'));
 }
 
 FX_BOOL CJS_PublicMethods::IsAlphaNumeric(wchar_t ch)
 {
-	return (IsDigit(ch) || IsAlphabetic(ch));
+    return (IsDigit(ch) || IsAlphabetic(ch));
 }
 
 FX_BOOL CJS_PublicMethods::maskSatisfied(wchar_t c_Change,wchar_t c_Mask)
 {
-	switch (c_Mask)
-	{
-	case L'9':
+    switch (c_Mask)
+    {
+    case L'9':
         return IsDigit(c_Change);
     case L'A':
         return IsAlphabetic(c_Change);
@@ -152,870 +153,869 @@
         return IsAlphaNumeric(c_Change);
     case L'X':
         return TRUE;
-	default:
+    default:
         return (c_Change == c_Mask);
-	}
+    }
 }
 
 FX_BOOL CJS_PublicMethods::isReservedMaskChar(wchar_t ch)
 {
-	return ch == L'9' || ch == L'A' || ch == L'O' || ch == L'X';
+    return ch == L'9' || ch == L'A' || ch == L'O' || ch == L'X';
 }
 
 double CJS_PublicMethods::AF_Simple(const FX_WCHAR* sFuction, double dValue1, double dValue2)
 {
-	if (FXSYS_wcsicmp(sFuction,L"AVG") == 0 || FXSYS_wcsicmp(sFuction,L"SUM") == 0)
-	{
-		return dValue1 + dValue2;
-	}
-	else if (FXSYS_wcsicmp(sFuction, L"PRD") == 0)
-	{
-		return dValue1 * dValue2;
-	}
-	else if (FXSYS_wcsicmp(sFuction,L"MIN") == 0)
-	{
-		return FX_MIN(dValue1, dValue2);
-	}
-	else if (FXSYS_wcsicmp(sFuction,L"MAX") == 0)
-	{
-		return FX_MAX(dValue1, dValue2);
-	}
-
-	return dValue1;
+    if (FXSYS_wcsicmp(sFuction,L"AVG") == 0 || FXSYS_wcsicmp(sFuction,L"SUM") == 0)
+    {
+        return dValue1 + dValue2;
+    }
+    if (FXSYS_wcsicmp(sFuction, L"PRD") == 0)
+    {
+        return dValue1 * dValue2;
+    }
+    if (FXSYS_wcsicmp(sFuction,L"MIN") == 0)
+    {
+        return FX_MIN(dValue1, dValue2);
+    }
+    if (FXSYS_wcsicmp(sFuction,L"MAX") == 0)
+    {
+        return FX_MAX(dValue1, dValue2);
+    }
+    return dValue1;
 }
 
 CFX_WideString CJS_PublicMethods::StrLTrim(const FX_WCHAR* pStr)
 {
-	while (*pStr && *pStr == L' ') pStr++;
+    while (*pStr && *pStr == L' ') pStr++;
 
-	return pStr;
+    return pStr;
 }
 
 CFX_WideString CJS_PublicMethods::StrRTrim(const FX_WCHAR* pStr)
 {
-	const FX_WCHAR* p = pStr;
-	while (*p) p++;
-	while (p > pStr && *(p - 1) == L' ') p--;
+    const FX_WCHAR* p = pStr;
+    while (*p) p++;
+    while (p > pStr && *(p - 1) == L' ') p--;
 
-	return CFX_WideString(pStr, p - pStr);
+    return CFX_WideString(pStr, p - pStr);
 }
 
 CFX_WideString CJS_PublicMethods::StrTrim(const FX_WCHAR* pStr)
 {
-	return StrRTrim(StrLTrim(pStr).c_str());
+    return StrRTrim(StrLTrim(pStr).c_str());
 }
 
 CFX_ByteString CJS_PublicMethods::StrLTrim(const FX_CHAR* pStr)
 {
-	while (*pStr && *pStr == ' ') pStr++;
+    while (*pStr && *pStr == ' ') pStr++;
 
         return pStr;
 }
 
 CFX_ByteString CJS_PublicMethods::StrRTrim(const FX_CHAR* pStr)
 {
-	const FX_CHAR* p = pStr;
-	while (*p) p++;
-	while (p > pStr && *(p - 1) == L' ') p--;
+    const FX_CHAR* p = pStr;
+    while (*p) p++;
+    while (p > pStr && *(p - 1) == L' ') p--;
 
-	return CFX_ByteString(pStr,p-pStr);
+    return CFX_ByteString(pStr,p-pStr);
 }
 
 CFX_ByteString CJS_PublicMethods::StrTrim(const FX_CHAR* pStr)
 {
-	return StrRTrim(StrLTrim(pStr));
+    return StrRTrim(StrLTrim(pStr));
 }
 
 double CJS_PublicMethods::ParseNumber(const FX_WCHAR* swSource, FX_BOOL& bAllDigits, FX_BOOL& bDot, FX_BOOL& bSign, FX_BOOL& bKXJS)
 {
-	bDot = FALSE;
-	bSign = FALSE;
-	bKXJS = FALSE;
+    bDot = FALSE;
+    bSign = FALSE;
+    bKXJS = FALSE;
 
-	FX_BOOL bDigitExist = FALSE;
+    FX_BOOL bDigitExist = FALSE;
 
-	const FX_WCHAR* p = swSource;
-	wchar_t c;
+    const FX_WCHAR* p = swSource;
+    wchar_t c;
 
-	const FX_WCHAR* pStart = NULL;
-	const FX_WCHAR* pEnd = NULL;
+    const FX_WCHAR* pStart = NULL;
+    const FX_WCHAR* pEnd = NULL;
 
-	while ((c = *p))
-	{
-		if (!pStart && c != L' ')
-		{
-			pStart = p;
-		}
+    while ((c = *p))
+    {
+        if (!pStart && c != L' ')
+        {
+            pStart = p;
+        }
 
-		pEnd = p;
-		p++;
-	}
+        pEnd = p;
+        p++;
+    }
 
-	if (!pStart)
-	{
-		bAllDigits = FALSE;
-		return 0;
-	}
+    if (!pStart)
+    {
+        bAllDigits = FALSE;
+        return 0;
+    }
 
-	while (pEnd != pStart)
-	{
-		if (*pEnd == L' ')
-			pEnd --;
-		else
-			break;
-	}
+    while (pEnd != pStart)
+    {
+        if (*pEnd == L' ')
+            pEnd --;
+        else
+            break;
+    }
 
-	double dRet = 0;
-	p = pStart;
-	bAllDigits = TRUE;
-	CFX_WideString swDigits;
+    double dRet = 0;
+    p = pStart;
+    bAllDigits = TRUE;
+    CFX_WideString swDigits;
 
-	while (p <= pEnd)
-	{
-		c = *p;
+    while (p <= pEnd)
+    {
+        c = *p;
 
-		if (IsDigit(c))
-		{
-			swDigits += c;
-			bDigitExist = TRUE;
-		}
-		else
-		{
-			switch (c)
-			{
-			case L' ':
-				bAllDigits = FALSE;
-				break;
-			case L'.':
-			case L',':
-				if (!bDot)
-				{
-					if (bDigitExist)
-					{
-						swDigits += L'.';
-					}
-					else
-					{
-						swDigits += L'0';
-						swDigits += L'.';
-						bDigitExist = TRUE;
-					}
+        if (IsDigit(c))
+        {
+            swDigits += c;
+            bDigitExist = TRUE;
+        }
+        else
+        {
+            switch (c)
+            {
+            case L' ':
+                bAllDigits = FALSE;
+                break;
+            case L'.':
+            case L',':
+                if (!bDot)
+                {
+                    if (bDigitExist)
+                    {
+                        swDigits += L'.';
+                    }
+                    else
+                    {
+                        swDigits += L'0';
+                        swDigits += L'.';
+                        bDigitExist = TRUE;
+                    }
 
-					bDot = TRUE;
-					break;
-				}
-			case 'e':
-			case 'E':
-				if (!bKXJS)
-				{
-					p++;
-					c = *p;
-					if (c == '+' || c == '-')
-					{
-						bKXJS = TRUE;
-						swDigits += 'e';
-						swDigits += c;
-					}
-					break;
-				}
-			case L'-':
-				if (!bDigitExist && !bSign)
-				{
-					swDigits += c;
-					bSign = TRUE;
-					break;
-				}
-			default:
-				bAllDigits = FALSE;
+                    bDot = TRUE;
+                    break;
+                }
+            case 'e':
+            case 'E':
+                if (!bKXJS)
+                {
+                    p++;
+                    c = *p;
+                    if (c == '+' || c == '-')
+                    {
+                        bKXJS = TRUE;
+                        swDigits += 'e';
+                        swDigits += c;
+                    }
+                    break;
+                }
+            case L'-':
+                if (!bDigitExist && !bSign)
+                {
+                    swDigits += c;
+                    bSign = TRUE;
+                    break;
+                }
+            default:
+                bAllDigits = FALSE;
 
-				if (p != pStart && !bDot && bDigitExist)
-				{
-					swDigits += L'.';
-					bDot = TRUE;
-				}
-				else
-				{
-					bDot = FALSE;
-					bDigitExist = FALSE;
-					swDigits = L"";
-				}
-				break;
-			}
-		}
+                if (p != pStart && !bDot && bDigitExist)
+                {
+                    swDigits += L'.';
+                    bDot = TRUE;
+                }
+                else
+                {
+                    bDot = FALSE;
+                    bDigitExist = FALSE;
+                    swDigits = L"";
+                }
+                break;
+            }
+        }
 
-		p++;
-	}
+        p++;
+    }
 
-	if (swDigits.GetLength() > 0 && swDigits.GetLength() < 17)
-	{
-		CFX_ByteString sDigits = swDigits.UTF8Encode();
+    if (swDigits.GetLength() > 0 && swDigits.GetLength() < 17)
+    {
+        CFX_ByteString sDigits = swDigits.UTF8Encode();
 
-		if (bKXJS)
-		{
-			dRet = atof(sDigits);
-		}
-		else
-		{
-			if (bDot)
-			{
-				char* pStopString;
-				dRet = ::strtod(sDigits, &pStopString);
-			}
-			else
-			{
-				dRet = atol(sDigits);
-			}
-		}
+        if (bKXJS)
+        {
+            dRet = atof(sDigits);
+        }
+        else
+        {
+            if (bDot)
+            {
+                char* pStopString;
+                dRet = ::strtod(sDigits, &pStopString);
+            }
+            else
+            {
+                dRet = atol(sDigits);
+            }
+        }
 
-	}
+    }
 
-	return dRet;
+    return dRet;
 }
 
 double CJS_PublicMethods::ParseStringToNumber(const FX_WCHAR* swSource)
 {
-	FX_BOOL bAllDigits = FALSE;
-	FX_BOOL bDot = FALSE;
-	FX_BOOL bSign = FALSE;
-	FX_BOOL bKXJS = FALSE;
+    FX_BOOL bAllDigits = FALSE;
+    FX_BOOL bDot = FALSE;
+    FX_BOOL bSign = FALSE;
+    FX_BOOL bKXJS = FALSE;
 
-	return ParseNumber(swSource, bAllDigits, bDot, bSign, bKXJS);
+    return ParseNumber(swSource, bAllDigits, bDot, bSign, bKXJS);
 }
 
-FX_BOOL	CJS_PublicMethods::ConvertStringToNumber(const FX_WCHAR* swSource, double & dRet, FX_BOOL & bDot)
+FX_BOOL CJS_PublicMethods::ConvertStringToNumber(const FX_WCHAR* swSource, double & dRet, FX_BOOL & bDot)
 {
-	FX_BOOL bAllDigits = FALSE;
-	FX_BOOL bSign = FALSE;
-	FX_BOOL bKXJS = FALSE;
+    FX_BOOL bAllDigits = FALSE;
+    FX_BOOL bSign = FALSE;
+    FX_BOOL bKXJS = FALSE;
 
-	dRet = ParseNumber(swSource, bAllDigits, bDot, bSign, bKXJS);
+    dRet = ParseNumber(swSource, bAllDigits, bDot, bSign, bKXJS);
 
-	return bAllDigits;
+    return bAllDigits;
 }
 
 CJS_Array CJS_PublicMethods::AF_MakeArrayFromList(v8::Isolate* isolate, CJS_Value val)
 {
-	CJS_Array StrArray(isolate);
-	if(val.IsArrayObject())
-	{
-		val.ConvertToArray(StrArray);
-		return StrArray;
-	}
-	CFX_WideString wsStr = val.ToCFXWideString();
-	CFX_ByteString t = CFX_ByteString::FromUnicode(wsStr);
-	const char * p = (const char *)t;
+    CJS_Array StrArray(isolate);
+    if(val.IsArrayObject())
+    {
+        val.ConvertToArray(StrArray);
+        return StrArray;
+    }
+    CFX_WideString wsStr = val.ToCFXWideString();
+    CFX_ByteString t = CFX_ByteString::FromUnicode(wsStr);
+    const char * p = (const char *)t;
 
 
-	int ch = ',' ;
-	int nIndex = 0;
+    int ch = ',' ;
+    int nIndex = 0;
 
-	while (*p)
-	{
-		const char * pTemp = strchr(p, ch);
-		if (pTemp == NULL)
-		{
-			StrArray.SetElement(nIndex, CJS_Value(isolate, StrTrim(p).c_str()));
-			break;
-		}
-		else
-		{
-			char * pSub = new char[pTemp - p + 1];
-			strncpy(pSub, p, pTemp - p);
-			*(pSub + (pTemp - p)) = '\0';
+    while (*p)
+    {
+        const char * pTemp = strchr(p, ch);
+        if (pTemp == NULL)
+        {
+            StrArray.SetElement(nIndex, CJS_Value(isolate, StrTrim(p).c_str()));
+            break;
+        }
+        else
+        {
+            char * pSub = new char[pTemp - p + 1];
+            strncpy(pSub, p, pTemp - p);
+            *(pSub + (pTemp - p)) = '\0';
 
-			StrArray.SetElement(nIndex, CJS_Value(isolate, StrTrim(pSub).c_str()));
-			delete []pSub;
+            StrArray.SetElement(nIndex, CJS_Value(isolate, StrTrim(pSub).c_str()));
+            delete []pSub;
 
-			nIndex ++;
-			p = ++pTemp;
-		}
+            nIndex ++;
+            p = ++pTemp;
+        }
 
-	}
-	return StrArray;
+    }
+    return StrArray;
 }
 
 int CJS_PublicMethods::ParseStringInteger(const CFX_WideString& string,int nStart,int& nSkip, int nMaxStep)
 {
-	int nRet = 0;
-	nSkip = 0;
-	for (int i=nStart, sz=string.GetLength(); i < sz; i++)
-	{
-		if (i-nStart > 10)
-			break;
+    int nRet = 0;
+    nSkip = 0;
+    for (int i=nStart, sz=string.GetLength(); i < sz; i++)
+    {
+        if (i-nStart > 10)
+            break;
 
-		FX_WCHAR c = string.GetAt(i);
-		if (IsDigit((wchar_t)c))
-		{
-			nRet = nRet * 10 + (c - '0');
-			nSkip = i - nStart + 1;
-			if (nSkip >= nMaxStep)
-				break;
-		}
-		else
-			break;
-	}
+        FX_WCHAR c = string.GetAt(i);
+        if (IsDigit((wchar_t)c))
+        {
+            nRet = nRet * 10 + (c - '0');
+            nSkip = i - nStart + 1;
+            if (nSkip >= nMaxStep)
+                break;
+        }
+        else
+            break;
+    }
 
-	return nRet;
+    return nRet;
 }
 
 CFX_WideString CJS_PublicMethods::ParseStringString(const CFX_WideString& string, int nStart, int& nSkip)
 {
-	CFX_WideString swRet;
-	nSkip = 0;
-	for (int i=nStart, sz=string.GetLength(); i < sz; i++)
-	{
-		FX_WCHAR c = string.GetAt(i);
-		if ((c >= L'a' && c <= L'z') || (c >= L'A' && c <= L'Z'))
-		{
-			swRet += c;
-			nSkip = i - nStart + 1;
-		}
-		else
-			break;
-	}
+    CFX_WideString swRet;
+    nSkip = 0;
+    for (int i=nStart, sz=string.GetLength(); i < sz; i++)
+    {
+        FX_WCHAR c = string.GetAt(i);
+        if ((c >= L'a' && c <= L'z') || (c >= L'A' && c <= L'Z'))
+        {
+            swRet += c;
+            nSkip = i - nStart + 1;
+        }
+        else
+            break;
+    }
 
-	return swRet;
+    return swRet;
 }
 
 double CJS_PublicMethods::ParseNormalDate(const CFX_WideString & value, FX_BOOL& bWrongFormat)
 {
-	double dt = JS_GetDateTime();
+    double dt = JS_GetDateTime();
 
-	int nYear = JS_GetYearFromTime(dt);
-	int nMonth = JS_GetMonthFromTime(dt) + 1;
-	int nDay = JS_GetDayFromTime(dt);
-	int nHour = JS_GetHourFromTime(dt);
-	int nMin = JS_GetMinFromTime(dt);
-	int nSec = JS_GetSecFromTime(dt);
+    int nYear = JS_GetYearFromTime(dt);
+    int nMonth = JS_GetMonthFromTime(dt) + 1;
+    int nDay = JS_GetDayFromTime(dt);
+    int nHour = JS_GetHourFromTime(dt);
+    int nMin = JS_GetMinFromTime(dt);
+    int nSec = JS_GetSecFromTime(dt);
 
-	int number[3];
+    int number[3];
 
-	int nSkip = 0;
-	int nLen = value.GetLength();
-	int nIndex = 0;
-	int i = 0;
-	while (i < nLen)
-	{
-		if (nIndex > 2) break;
+    int nSkip = 0;
+    int nLen = value.GetLength();
+    int nIndex = 0;
+    int i = 0;
+    while (i < nLen)
+    {
+        if (nIndex > 2) break;
 
-		FX_WCHAR c = value.GetAt(i);
-		if (IsDigit((wchar_t)c))
-		{
-			number[nIndex++] = ParseStringInteger(value, i, nSkip, 4);
-			i += nSkip;
-		}
-		else
-		{
-			i ++;
-		}
-	}
+        FX_WCHAR c = value.GetAt(i);
+        if (IsDigit((wchar_t)c))
+        {
+            number[nIndex++] = ParseStringInteger(value, i, nSkip, 4);
+            i += nSkip;
+        }
+        else
+        {
+            i ++;
+        }
+    }
 
-	if (nIndex == 2)
-	{
-		// case2: month/day
-		// case3: day/month
-		if ((number[0] >= 1 && number[0] <= 12) && (number[1] >= 1 && number[1] <= 31))
-		{
-			nMonth = number[0];
-			nDay = number[1];
-		}
-		else if ((number[0] >= 1 && number[0] <= 31) && (number[1] >= 1 && number[1] <= 12))
-		{
-			nDay = number[0];
-			nMonth = number[1];
-		}
+    if (nIndex == 2)
+    {
+        // case2: month/day
+        // case3: day/month
+        if ((number[0] >= 1 && number[0] <= 12) && (number[1] >= 1 && number[1] <= 31))
+        {
+            nMonth = number[0];
+            nDay = number[1];
+        }
+        else if ((number[0] >= 1 && number[0] <= 31) && (number[1] >= 1 && number[1] <= 12))
+        {
+            nDay = number[0];
+            nMonth = number[1];
+        }
 
-		bWrongFormat = FALSE;
-	}
-	else if (nIndex == 3)
-	{
-		// case1: year/month/day
-		// case2: month/day/year
-		// case3: day/month/year
+        bWrongFormat = FALSE;
+    }
+    else if (nIndex == 3)
+    {
+        // case1: year/month/day
+        // case2: month/day/year
+        // case3: day/month/year
 
-		if (number[0] > 12 && (number[1] >= 1 && number[1] <= 12) && (number[2] >= 1 && number[2] <= 31))
-		{
-			nYear = number[0];
-			nMonth = number[1];
-			nDay = number[2];
-		}
-		else if ((number[0] >= 1 && number[0] <= 12) && (number[1] >= 1 && number[1] <= 31) && number[2] > 31)
-		{
-			nMonth = number[0];
-			nDay = number[1];
-			nYear = number[2];
-		}
-		else if ((number[0] >= 1 && number[0] <= 31) && (number[1] >= 1 && number[1] <= 12) && number[2] > 31)
-		{
-			nDay = number[0];
-			nMonth = number[1];
-			nYear = number[2];
-		}
+        if (number[0] > 12 && (number[1] >= 1 && number[1] <= 12) && (number[2] >= 1 && number[2] <= 31))
+        {
+            nYear = number[0];
+            nMonth = number[1];
+            nDay = number[2];
+        }
+        else if ((number[0] >= 1 && number[0] <= 12) && (number[1] >= 1 && number[1] <= 31) && number[2] > 31)
+        {
+            nMonth = number[0];
+            nDay = number[1];
+            nYear = number[2];
+        }
+        else if ((number[0] >= 1 && number[0] <= 31) && (number[1] >= 1 && number[1] <= 12) && number[2] > 31)
+        {
+            nDay = number[0];
+            nMonth = number[1];
+            nYear = number[2];
+        }
 
-		bWrongFormat = FALSE;
-	}
-	else
-	{
-		bWrongFormat = TRUE;
-		return dt;
-	}
+        bWrongFormat = FALSE;
+    }
+    else
+    {
+        bWrongFormat = TRUE;
+        return dt;
+    }
 
-	CFX_WideString swTemp;
-	swTemp.Format(L"%d/%d/%d %d:%d:%d",nMonth,nDay,nYear,nHour,nMin,nSec);
-	return JS_DateParse(swTemp.c_str());
+    CFX_WideString swTemp;
+    swTemp.Format(L"%d/%d/%d %d:%d:%d",nMonth,nDay,nYear,nHour,nMin,nSec);
+    return JS_DateParse(swTemp.c_str());
 }
 
 double CJS_PublicMethods::MakeRegularDate(const CFX_WideString & value, const CFX_WideString & format, FX_BOOL& bWrongFormat)
 {
-	double dt = JS_GetDateTime();
+    double dt = JS_GetDateTime();
 
-	if (format.IsEmpty() || value.IsEmpty())
-		return dt;
+    if (format.IsEmpty() || value.IsEmpty())
+        return dt;
 
-	int nYear = JS_GetYearFromTime(dt);
-	int nMonth = JS_GetMonthFromTime(dt) + 1;
-	int nDay = JS_GetDayFromTime(dt);
-	int nHour = JS_GetHourFromTime(dt);
-	int nMin = JS_GetMinFromTime(dt);
-	int nSec = JS_GetSecFromTime(dt);
+    int nYear = JS_GetYearFromTime(dt);
+    int nMonth = JS_GetMonthFromTime(dt) + 1;
+    int nDay = JS_GetDayFromTime(dt);
+    int nHour = JS_GetHourFromTime(dt);
+    int nMin = JS_GetMinFromTime(dt);
+    int nSec = JS_GetSecFromTime(dt);
 
-	int nYearSub = 99; //nYear - 2000;
+    int nYearSub = 99; //nYear - 2000;
 
-	FX_BOOL bPm = FALSE;
-	FX_BOOL bExit = FALSE;
-	bWrongFormat = FALSE;
+    FX_BOOL bPm = FALSE;
+    FX_BOOL bExit = FALSE;
+    bWrongFormat = FALSE;
 
-	int i=0;
-	int j=0;
+    int i=0;
+    int j=0;
 
-	while (i < format.GetLength())
-	{
-		if (bExit) break;
+    while (i < format.GetLength())
+    {
+        if (bExit) break;
 
-		FX_WCHAR c = format.GetAt(i);
-		switch (c)
-		{
-			case ':':
-			case '.':
-			case '-':
-			case '\\':
-			case '/':
-				i++;
-				j++;
-				break;
+        FX_WCHAR c = format.GetAt(i);
+        switch (c)
+        {
+            case ':':
+            case '.':
+            case '-':
+            case '\\':
+            case '/':
+                i++;
+                j++;
+                break;
 
-			case 'y':
-			case 'm':
-			case 'd':
-			case 'H':
-			case 'h':
-			case 'M':
-			case 's':
-			case 't':
-				{
-					int oldj = j;
-					int nSkip = 0;
-					int remaining = format.GetLength() - i - 1;
+            case 'y':
+            case 'm':
+            case 'd':
+            case 'H':
+            case 'h':
+            case 'M':
+            case 's':
+            case 't':
+                {
+                    int oldj = j;
+                    int nSkip = 0;
+                    int remaining = format.GetLength() - i - 1;
 
-					if (remaining == 0 || format.GetAt(i+1) != c)
-					{
-						switch (c)
-						{
-							case 'y':
-								i++;
-								j++;
-								break;
-							case 'm':
-								nMonth = ParseStringInteger(value, j, nSkip, 2);
-								i++;
-								j += nSkip;
-								break;
-							case 'd':
-								nDay = ParseStringInteger(value, j, nSkip, 2);
-								i++;
-								j += nSkip;
-								break;
-							case 'H':
-								nHour = ParseStringInteger(value, j, nSkip, 2);
-								i++;
-								j += nSkip;
-								break;
-							case 'h':
-								nHour = ParseStringInteger(value, j, nSkip, 2);
-								i++;
-								j += nSkip;
-								break;
-							case 'M':
-								nMin = ParseStringInteger(value, j, nSkip, 2);
-								i++;
-								j += nSkip;
-								break;
-							case 's':
-								nSec = ParseStringInteger(value, j, nSkip, 2);
-								i++;
-								j += nSkip;
-								break;
-							case 't':
-								bPm = (j < value.GetLength() && value.GetAt(j) == 'p');
-								i++;
-								j++;
-								break;
-						}
-					}
-					else if (remaining == 1 || format.GetAt(i+2) != c)
-					{
-						switch (c)
-						{
-							case 'y':
-								nYear = ParseStringInteger(value, j, nSkip, 4);
-								i += 2;
-								j += nSkip;
-								break;
-							case 'm':
-								nMonth = ParseStringInteger(value, j, nSkip, 2);
-								i += 2;
-								j += nSkip;
-								break;
-							case 'd':
-								nDay = ParseStringInteger(value, j, nSkip, 2);
-								i += 2;
-								j += nSkip;
-								break;
-							case 'H':
-								nHour = ParseStringInteger(value, j, nSkip, 2);
-								i += 2;
-								j += nSkip;
-								break;
-							case 'h':
-								nHour = ParseStringInteger(value, j, nSkip, 2);
-								i += 2;
-								j += nSkip;
-								break;
-							case 'M':
-								nMin = ParseStringInteger(value, j, nSkip, 2);
-								i += 2;
-								j += nSkip;
-								break;
-							case 's':
-								nSec = ParseStringInteger(value, j, nSkip, 2);
-								i += 2;
-								j += nSkip;
-								break;
-							case 't':
-								bPm = (j + 1 < value.GetLength() && value.GetAt(j) == 'p' && value.GetAt(j+1) == 'm');
-								i += 2;
-								j += 2;
-								break;
-						}
-					}
-					else if (remaining == 2 || format.GetAt(i+3) != c)
-					{
-						switch (c)
-						{
-							case 'm':
-								{
-									CFX_WideString sMonth = ParseStringString(value, j, nSkip);
-									FX_BOOL bFind = FALSE;
-									for (int m = 0; m < 12; m++)
-									{
-										if (sMonth.CompareNoCase(months[m]) == 0)
-										{
-											nMonth = m + 1;
-											i+=3;
-											j+=nSkip;
-											bFind = TRUE;
-											break;
-										}
-									}
+                    if (remaining == 0 || format.GetAt(i+1) != c)
+                    {
+                        switch (c)
+                        {
+                            case 'y':
+                                i++;
+                                j++;
+                                break;
+                            case 'm':
+                                nMonth = ParseStringInteger(value, j, nSkip, 2);
+                                i++;
+                                j += nSkip;
+                                break;
+                            case 'd':
+                                nDay = ParseStringInteger(value, j, nSkip, 2);
+                                i++;
+                                j += nSkip;
+                                break;
+                            case 'H':
+                                nHour = ParseStringInteger(value, j, nSkip, 2);
+                                i++;
+                                j += nSkip;
+                                break;
+                            case 'h':
+                                nHour = ParseStringInteger(value, j, nSkip, 2);
+                                i++;
+                                j += nSkip;
+                                break;
+                            case 'M':
+                                nMin = ParseStringInteger(value, j, nSkip, 2);
+                                i++;
+                                j += nSkip;
+                                break;
+                            case 's':
+                                nSec = ParseStringInteger(value, j, nSkip, 2);
+                                i++;
+                                j += nSkip;
+                                break;
+                            case 't':
+                                bPm = (j < value.GetLength() && value.GetAt(j) == 'p');
+                                i++;
+                                j++;
+                                break;
+                        }
+                    }
+                    else if (remaining == 1 || format.GetAt(i+2) != c)
+                    {
+                        switch (c)
+                        {
+                            case 'y':
+                                nYear = ParseStringInteger(value, j, nSkip, 4);
+                                i += 2;
+                                j += nSkip;
+                                break;
+                            case 'm':
+                                nMonth = ParseStringInteger(value, j, nSkip, 2);
+                                i += 2;
+                                j += nSkip;
+                                break;
+                            case 'd':
+                                nDay = ParseStringInteger(value, j, nSkip, 2);
+                                i += 2;
+                                j += nSkip;
+                                break;
+                            case 'H':
+                                nHour = ParseStringInteger(value, j, nSkip, 2);
+                                i += 2;
+                                j += nSkip;
+                                break;
+                            case 'h':
+                                nHour = ParseStringInteger(value, j, nSkip, 2);
+                                i += 2;
+                                j += nSkip;
+                                break;
+                            case 'M':
+                                nMin = ParseStringInteger(value, j, nSkip, 2);
+                                i += 2;
+                                j += nSkip;
+                                break;
+                            case 's':
+                                nSec = ParseStringInteger(value, j, nSkip, 2);
+                                i += 2;
+                                j += nSkip;
+                                break;
+                            case 't':
+                                bPm = (j + 1 < value.GetLength() && value.GetAt(j) == 'p' && value.GetAt(j+1) == 'm');
+                                i += 2;
+                                j += 2;
+                                break;
+                        }
+                    }
+                    else if (remaining == 2 || format.GetAt(i+3) != c)
+                    {
+                        switch (c)
+                        {
+                            case 'm':
+                                {
+                                    CFX_WideString sMonth = ParseStringString(value, j, nSkip);
+                                    FX_BOOL bFind = FALSE;
+                                    for (int m = 0; m < 12; m++)
+                                    {
+                                        if (sMonth.CompareNoCase(months[m]) == 0)
+                                        {
+                                            nMonth = m + 1;
+                                            i+=3;
+                                            j+=nSkip;
+                                            bFind = TRUE;
+                                            break;
+                                        }
+                                    }
 
-									if (!bFind)
-									{
-										nMonth = ParseStringInteger(value, j, nSkip, 3);
-										i+=3;
-										j += nSkip;
-									}
-								}
-								break;
-							case 'y':
-								break;
-							default:
-								i+=3;
-								j+=3;
-								break;
-						}
-					}
-					else if (remaining == 3 || format.GetAt(i+4) != c)
-					{
-						switch (c)
-						{
+                                    if (!bFind)
+                                    {
+                                        nMonth = ParseStringInteger(value, j, nSkip, 3);
+                                        i+=3;
+                                        j += nSkip;
+                                    }
+                                }
+                                break;
+                            case 'y':
+                                break;
+                            default:
+                                i+=3;
+                                j+=3;
+                                break;
+                        }
+                    }
+                    else if (remaining == 3 || format.GetAt(i+4) != c)
+                    {
+                        switch (c)
+                        {
 
 
-							case 'y':
-								nYear = ParseStringInteger(value, j, nSkip, 4);
-								j += nSkip;
-								i += 4;
-								break;
-							case 'm':
-								{
-									FX_BOOL bFind = FALSE;
+                            case 'y':
+                                nYear = ParseStringInteger(value, j, nSkip, 4);
+                                j += nSkip;
+                                i += 4;
+                                break;
+                            case 'm':
+                                {
+                                    FX_BOOL bFind = FALSE;
 
-									CFX_WideString sMonth = ParseStringString(value, j, nSkip);
-									sMonth.MakeLower();
+                                    CFX_WideString sMonth = ParseStringString(value, j, nSkip);
+                                    sMonth.MakeLower();
 
-									for (int m = 0; m < 12; m++)
-									{
-										CFX_WideString sFullMonths = fullmonths[m];
-										sFullMonths.MakeLower();
+                                    for (int m = 0; m < 12; m++)
+                                    {
+                                        CFX_WideString sFullMonths = fullmonths[m];
+                                        sFullMonths.MakeLower();
 
-										if (sFullMonths.Find(sMonth.c_str(), 0) != -1)
-										{
-											nMonth = m + 1;
-											i += 4;
-											j += nSkip;
-											bFind = TRUE;
-											break;
-										}
-									}
+                                        if (sFullMonths.Find(sMonth.c_str(), 0) != -1)
+                                        {
+                                            nMonth = m + 1;
+                                            i += 4;
+                                            j += nSkip;
+                                            bFind = TRUE;
+                                            break;
+                                        }
+                                    }
 
-									if (!bFind)
-									{
-										nMonth = ParseStringInteger(value, j, nSkip, 4);
-										i+=4;
-										j += nSkip;
-									}
-								}
-								break;
-							default:
-								i += 4;
-								j += 4;
-								break;
-						}
-					}
-					else
-					{
-						if (j >= value.GetLength() || format.GetAt(i) != value.GetAt(j))
-						{
-							bWrongFormat = TRUE;
-							bExit = TRUE;
-						}
-						i++;
-						j++;
-					}
+                                    if (!bFind)
+                                    {
+                                        nMonth = ParseStringInteger(value, j, nSkip, 4);
+                                        i+=4;
+                                        j += nSkip;
+                                    }
+                                }
+                                break;
+                            default:
+                                i += 4;
+                                j += 4;
+                                break;
+                        }
+                    }
+                    else
+                    {
+                        if (j >= value.GetLength() || format.GetAt(i) != value.GetAt(j))
+                        {
+                            bWrongFormat = TRUE;
+                            bExit = TRUE;
+                        }
+                        i++;
+                        j++;
+                    }
 
-					if (oldj == j)
-					{
-						bWrongFormat = TRUE;
-						bExit = TRUE;
-					}
-				}
+                    if (oldj == j)
+                    {
+                        bWrongFormat = TRUE;
+                        bExit = TRUE;
+                    }
+                }
 
-				break;
-			default:
-				if (value.GetLength() <= j)
-				{
-					bExit = TRUE;
-				}
-				else if (format.GetAt(i) != value.GetAt(j))
-				{
-					bWrongFormat = TRUE;
-					bExit = TRUE;
-				}
+                break;
+            default:
+                if (value.GetLength() <= j)
+                {
+                    bExit = TRUE;
+                }
+                else if (format.GetAt(i) != value.GetAt(j))
+                {
+                    bWrongFormat = TRUE;
+                    bExit = TRUE;
+                }
 
-				i++;
-				j++;
-				break;
-		}
-	}
+                i++;
+                j++;
+                break;
+        }
+    }
 
-	if (bPm) nHour += 12;
+    if (bPm) nHour += 12;
 
-	if (nYear >= 0 && nYear <= nYearSub)
-		nYear += 2000;
+    if (nYear >= 0 && nYear <= nYearSub)
+        nYear += 2000;
 
-	if (nMonth < 1 || nMonth > 12)
-		bWrongFormat = TRUE;
+    if (nMonth < 1 || nMonth > 12)
+        bWrongFormat = TRUE;
 
-	if (nDay < 1 || nDay > 31)
-		bWrongFormat = TRUE;
+    if (nDay < 1 || nDay > 31)
+        bWrongFormat = TRUE;
 
-	if (nHour < 0 || nHour > 24)
-		bWrongFormat = TRUE;
+    if (nHour < 0 || nHour > 24)
+        bWrongFormat = TRUE;
 
-	if (nMin < 0 || nMin > 60)
-		bWrongFormat = TRUE;
+    if (nMin < 0 || nMin > 60)
+        bWrongFormat = TRUE;
 
-	if (nSec < 0 || nSec > 60)
-		bWrongFormat = TRUE;
+    if (nSec < 0 || nSec > 60)
+        bWrongFormat = TRUE;
 
-	double dRet = 0;
+    double dRet = 0;
 
-	if (bWrongFormat)
-	{
-		dRet = ParseNormalDate(value, bWrongFormat);
-	}
-	else
-	{
-		dRet = JS_MakeDate(JS_MakeDay(nYear,nMonth - 1,nDay),JS_MakeTime(nHour, nMin, nSec, 0));
+    if (bWrongFormat)
+    {
+        dRet = ParseNormalDate(value, bWrongFormat);
+    }
+    else
+    {
+        dRet = JS_MakeDate(JS_MakeDay(nYear,nMonth - 1,nDay),JS_MakeTime(nHour, nMin, nSec, 0));
 
-		if (JS_PortIsNan(dRet))
-		{
-			dRet = JS_DateParse(value.c_str());
-		}
-	}
+        if (JS_PortIsNan(dRet))
+        {
+            dRet = JS_DateParse(value.c_str());
+        }
+    }
 
-	if (JS_PortIsNan(dRet))
-	{
-		dRet = ParseNormalDate(value, bWrongFormat);
-	}
+    if (JS_PortIsNan(dRet))
+    {
+        dRet = ParseNormalDate(value, bWrongFormat);
+    }
 
-	return dRet;
+    return dRet;
 
 }
 
 CFX_WideString CJS_PublicMethods::MakeFormatDate(double dDate, const CFX_WideString & format)
 {
-	CFX_WideString sRet = L"",sPart = L"";
+    CFX_WideString sRet = L"",sPart = L"";
 
-	int nYear = JS_GetYearFromTime(dDate);
-	int nMonth = JS_GetMonthFromTime(dDate) + 1;
-	int nDay = JS_GetDayFromTime(dDate);
-	int nHour = JS_GetHourFromTime(dDate);
-	int nMin = JS_GetMinFromTime(dDate);
-	int nSec = JS_GetSecFromTime(dDate);
+    int nYear = JS_GetYearFromTime(dDate);
+    int nMonth = JS_GetMonthFromTime(dDate) + 1;
+    int nDay = JS_GetDayFromTime(dDate);
+    int nHour = JS_GetHourFromTime(dDate);
+    int nMin = JS_GetMinFromTime(dDate);
+    int nSec = JS_GetSecFromTime(dDate);
 
-	int i = 0;
-	while (i < format.GetLength())
-	{
-	        FX_WCHAR c = format.GetAt(i);
+    int i = 0;
+    while (i < format.GetLength())
+    {
+            FX_WCHAR c = format.GetAt(i);
                 int remaining = format.GetLength() - i - 1;
-		sPart = L"";
-		switch (c)
-		{
-			case 'y':
-			case 'm':
-			case 'd':
-			case 'H':
-			case 'h':
-			case 'M':
-			case 's':
-			case 't':
-				if (remaining == 0 || format.GetAt(i+1) != c)
-				{
-					switch (c)
-					{
-						case 'y':
-							sPart += c;
-							break;
-						case 'm':
-							sPart.Format(L"%d",nMonth);
-							break;
-						case 'd':
-							sPart.Format(L"%d",nDay);
-							break;
-						case 'H':
-							sPart.Format(L"%d",nHour);
-							break;
-						case 'h':
-							sPart.Format(L"%d",nHour>12?nHour - 12:nHour);
-							break;
-						case 'M':
-							sPart.Format(L"%d",nMin);
-							break;
-						case 's':
-							sPart.Format(L"%d",nSec);
-							break;
-						case 't':
-							sPart += nHour>12?'p':'a';
-							break;
-					}
-					i++;
-				}
-				else if (remaining == 1 || format.GetAt(i+2) != c)
-				{
-					switch (c)
-					{
-						case 'y':
-							sPart.Format(L"%02d",nYear - (nYear / 100) * 100);
-							break;
-						case 'm':
-							sPart.Format(L"%02d",nMonth);
-							break;
-						case 'd':
-							sPart.Format(L"%02d",nDay);
-							break;
-						case 'H':
-							sPart.Format(L"%02d",nHour);
-							break;
-						case 'h':
-							sPart.Format(L"%02d",nHour>12?nHour - 12:nHour);
-							break;
-						case 'M':
-							sPart.Format(L"%02d",nMin);
-							break;
-						case 's':
-							sPart.Format(L"%02d",nSec);
-							break;
-						case 't':
-							sPart = nHour>12? L"pm": L"am";
-							break;
-					}
-					i+=2;
-				}
-				else if (remaining == 2 || format.GetAt(i+3) != c)
-				{
-					switch (c)
-					{
-						case 'm':
-							i+=3;
-							if (nMonth > 0&&nMonth <= 12)
-								sPart += months[nMonth - 1];
-							break;
-						default:
-							i+=3;
-							sPart += c;
-							sPart += c;
-							sPart += c;
-							break;
-					}
-				}
-				else if (remaining == 3 || format.GetAt(i+4) != c)
-				{
-					switch (c)
-					{
-						case 'y':
-							sPart.Format(L"%04d",nYear);
-							i += 4;
-							break;
-						case 'm':
-							i+=4;
-							if (nMonth > 0&&nMonth <= 12)
-								sPart += fullmonths[nMonth - 1];
-							break;
-						default:
-							i += 4;
-							sPart += c;
-							sPart += c;
-							sPart += c;
-							sPart += c;
-							break;
-					}
-				}
-				else
-				{
-					i++;
-					sPart += c;
-				}
-				break;
-			default:
-				i++;
-				sPart += c;
-				break;
-		}
+        sPart = L"";
+        switch (c)
+        {
+            case 'y':
+            case 'm':
+            case 'd':
+            case 'H':
+            case 'h':
+            case 'M':
+            case 's':
+            case 't':
+                if (remaining == 0 || format.GetAt(i+1) != c)
+                {
+                    switch (c)
+                    {
+                        case 'y':
+                            sPart += c;
+                            break;
+                        case 'm':
+                            sPart.Format(L"%d",nMonth);
+                            break;
+                        case 'd':
+                            sPart.Format(L"%d",nDay);
+                            break;
+                        case 'H':
+                            sPart.Format(L"%d",nHour);
+                            break;
+                        case 'h':
+                            sPart.Format(L"%d",nHour>12?nHour - 12:nHour);
+                            break;
+                        case 'M':
+                            sPart.Format(L"%d",nMin);
+                            break;
+                        case 's':
+                            sPart.Format(L"%d",nSec);
+                            break;
+                        case 't':
+                            sPart += nHour>12?'p':'a';
+                            break;
+                    }
+                    i++;
+                }
+                else if (remaining == 1 || format.GetAt(i+2) != c)
+                {
+                    switch (c)
+                    {
+                        case 'y':
+                            sPart.Format(L"%02d",nYear - (nYear / 100) * 100);
+                            break;
+                        case 'm':
+                            sPart.Format(L"%02d",nMonth);
+                            break;
+                        case 'd':
+                            sPart.Format(L"%02d",nDay);
+                            break;
+                        case 'H':
+                            sPart.Format(L"%02d",nHour);
+                            break;
+                        case 'h':
+                            sPart.Format(L"%02d",nHour>12?nHour - 12:nHour);
+                            break;
+                        case 'M':
+                            sPart.Format(L"%02d",nMin);
+                            break;
+                        case 's':
+                            sPart.Format(L"%02d",nSec);
+                            break;
+                        case 't':
+                            sPart = nHour>12? L"pm": L"am";
+                            break;
+                    }
+                    i+=2;
+                }
+                else if (remaining == 2 || format.GetAt(i+3) != c)
+                {
+                    switch (c)
+                    {
+                        case 'm':
+                            i+=3;
+                            if (nMonth > 0&&nMonth <= 12)
+                                sPart += months[nMonth - 1];
+                            break;
+                        default:
+                            i+=3;
+                            sPart += c;
+                            sPart += c;
+                            sPart += c;
+                            break;
+                    }
+                }
+                else if (remaining == 3 || format.GetAt(i+4) != c)
+                {
+                    switch (c)
+                    {
+                        case 'y':
+                            sPart.Format(L"%04d",nYear);
+                            i += 4;
+                            break;
+                        case 'm':
+                            i+=4;
+                            if (nMonth > 0&&nMonth <= 12)
+                                sPart += fullmonths[nMonth - 1];
+                            break;
+                        default:
+                            i += 4;
+                            sPart += c;
+                            sPart += c;
+                            sPart += c;
+                            sPart += c;
+                            break;
+                    }
+                }
+                else
+                {
+                    i++;
+                    sPart += c;
+                }
+                break;
+            default:
+                i++;
+                sPart += c;
+                break;
+        }
 
-		sRet += sPart;
-	}
+        sRet += sPart;
+    }
 
-	return sRet;
+    return sRet;
 }
 
 /* -------------------------------------------------------------------------- */
@@ -1225,137 +1225,134 @@
 	}
 	Value = strValue2.c_str();
 #endif
-	return TRUE;
+    return TRUE;
 }
 
 //function AFNumber_Keystroke(nDec, sepStyle, negStyle, currStyle, strCurrency, bCurrencyPrepend)
 FX_BOOL CJS_PublicMethods::AFNumber_Keystroke(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	CJS_Context* pContext = (CJS_Context *)cc;
-	ASSERT(pContext != NULL);
-	CJS_EventHandler* pEvent = pContext->GetEventHandler();
-	ASSERT(pEvent != NULL);
+    CJS_Context* pContext = (CJS_Context *)cc;
+    ASSERT(pContext != NULL);
+    CJS_EventHandler* pEvent = pContext->GetEventHandler();
+    ASSERT(pEvent != NULL);
 
-	if(params.size() < 2)
-		return FALSE;
-	int iSepStyle = params[1].ToInt();
+    if(params.size() < 2)
+        return FALSE;
+    int iSepStyle = params[1].ToInt();
 
-	if (iSepStyle < 0 || iSepStyle > 3)
-		iSepStyle = 0;
-	if(!pEvent->m_pValue)
-		return FALSE;
-	CFX_WideString & val = pEvent->Value();
-	CFX_WideString & w_strChange = pEvent->Change();
+    if (iSepStyle < 0 || iSepStyle > 3)
+        iSepStyle = 0;
+    if(!pEvent->m_pValue)
+        return FALSE;
+    CFX_WideString & val = pEvent->Value();
+    CFX_WideString & w_strChange = pEvent->Change();
     CFX_WideString w_strValue = val;
 
-	if (pEvent->WillCommit())
-	{
-		CFX_WideString wstrChange = w_strChange;
-		CFX_WideString wstrValue = StrLTrim(w_strValue.c_str());
-		if (wstrValue.IsEmpty())
-			return TRUE;
+    if (pEvent->WillCommit())
+    {
+        CFX_WideString wstrChange = w_strChange;
+        CFX_WideString wstrValue = StrLTrim(w_strValue.c_str());
+        if (wstrValue.IsEmpty())
+            return TRUE;
 
-		CFX_WideString swTemp = wstrValue;
-		swTemp.Replace(L",", L".");
-		if (!IsNumber(swTemp.c_str()))
-		{
-			pEvent->Rc() = FALSE;
-			sError = JSGetStringFromID(pContext, IDS_STRING_JSAFNUMBER_KEYSTROKE);
-			Alert(pContext, sError.c_str());
-			return TRUE;
-		}
-		return TRUE; // it happens after the last keystroke and before validating,
-	}
+        CFX_WideString swTemp = wstrValue;
+        swTemp.Replace(L",", L".");
+        if (!IsNumber(swTemp.c_str()))
+        {
+            pEvent->Rc() = FALSE;
+            sError = JSGetStringFromID(pContext, IDS_STRING_JSAFNUMBER_KEYSTROKE);
+            Alert(pContext, sError.c_str());
+            return TRUE;
+        }
+        return TRUE; // it happens after the last keystroke and before validating,
+    }
 
-	std::wstring w_strValue2 = w_strValue.c_str();
-	std::wstring w_strChange2 = w_strChange.c_str();
-	std::wstring w_strSelected;
-	if(-1 != pEvent->SelStart())
-		w_strSelected = w_strValue2.substr(pEvent->SelStart(),(pEvent->SelEnd() - pEvent->SelStart()));
-	FX_BOOL bHasSign = (w_strValue2.find('-') != -1) && (w_strSelected.find('-') == -1);
-	if (bHasSign)
-	{
-		//can't insert "change" in front to sign postion.
-		if (pEvent->SelStart() == 0)
-		{
+    std::wstring w_strValue2 = w_strValue.c_str();
+    std::wstring w_strChange2 = w_strChange.c_str();
+    std::wstring w_strSelected;
+    if(-1 != pEvent->SelStart())
+        w_strSelected = w_strValue2.substr(pEvent->SelStart(),(pEvent->SelEnd() - pEvent->SelStart()));
+    FX_BOOL bHasSign = (w_strValue2.find('-') != -1) && (w_strSelected.find('-') == -1);
+    if (bHasSign)
+    {
+        //can't insert "change" in front to sign postion.
+        if (pEvent->SelStart() == 0)
+        {
             FX_BOOL &bRc = pEvent->Rc();
-			bRc = FALSE;
-			return TRUE;
-		}
-	}
+            bRc = FALSE;
+            return TRUE;
+        }
+    }
 
-	char cSep = L'.';
+    char cSep = L'.';
 
-	switch (iSepStyle)
-	{
-	case 0:
-	case 1:
-		cSep = L'.';
-		break;
-	case 2:
-	case 3:
-		cSep = L',';
-		break;
-	}
+    switch (iSepStyle)
+    {
+    case 0:
+    case 1:
+        cSep = L'.';
+        break;
+    case 2:
+    case 3:
+        cSep = L',';
+        break;
+    }
 
-	FX_BOOL bHasSep = (w_strValue2.find(cSep) != -1);
-	for (std::wstring::iterator it = w_strChange2.begin(); it != w_strChange2.end(); it++)
-	{
-		if (*it == cSep)
-		{
-			if (bHasSep)
-			{
-				FX_BOOL &bRc = pEvent->Rc();
-				bRc = FALSE;
-				return TRUE;
-			}
-			else
-			{
-				bHasSep = TRUE;
-				continue;
-			}
-		}
-		if (*it == L'-')
-		{
-			if (bHasSign)
-			{
-				FX_BOOL &bRc = pEvent->Rc();
-				bRc = FALSE;
-				return TRUE;
-			}
-			else if (it != w_strChange2.begin()) //sign's position is not correct
-			{
-				FX_BOOL &bRc = pEvent->Rc();
-				bRc = FALSE;
-				return TRUE;
-			}
-			else if (pEvent->SelStart() != 0)
-			{
-				FX_BOOL &bRc = pEvent->Rc();
-				bRc = FALSE;
-				return TRUE;
-			}
-			bHasSign = TRUE;
-			continue;
-		}
+    FX_BOOL bHasSep = (w_strValue2.find(cSep) != -1);
+    for (std::wstring::iterator it = w_strChange2.begin(); it != w_strChange2.end(); it++)
+    {
+        if (*it == cSep)
+        {
+            if (bHasSep)
+            {
+                FX_BOOL &bRc = pEvent->Rc();
+                bRc = FALSE;
+                return TRUE;
+            }
+            bHasSep = TRUE;
+            continue;
+        }
+        if (*it == L'-')
+        {
+            if (bHasSign)
+            {
+                FX_BOOL &bRc = pEvent->Rc();
+                bRc = FALSE;
+                return TRUE;
+            }
+            if (it != w_strChange2.begin()) //sign's position is not correct
+            {
+                FX_BOOL &bRc = pEvent->Rc();
+                bRc = FALSE;
+                return TRUE;
+            }
+            if (pEvent->SelStart() != 0)
+            {
+                FX_BOOL &bRc = pEvent->Rc();
+                bRc = FALSE;
+                return TRUE;
+            }
+            bHasSign = TRUE;
+            continue;
+        }
 
-		if (!IsDigit(*it))
-		{
-			FX_BOOL &bRc = pEvent->Rc();
-			bRc = FALSE;
-			return TRUE;
-		}
-	}
+        if (!IsDigit(*it))
+        {
+            FX_BOOL &bRc = pEvent->Rc();
+            bRc = FALSE;
+            return TRUE;
+        }
+    }
 
 
-	std::wstring w_prefix = w_strValue2.substr(0,pEvent->SelStart());
-	std::wstring w_postfix;
-	if (pEvent->SelEnd()<(int)w_strValue2.length())
-		w_postfix  = w_strValue2.substr(pEvent->SelEnd());
-	w_strValue2 = w_prefix + w_strChange2 + w_postfix;
-	w_strValue = w_strValue2.c_str();
-	val = w_strValue;
-	return TRUE;
+    std::wstring w_prefix = w_strValue2.substr(0,pEvent->SelStart());
+    std::wstring w_postfix;
+    if (pEvent->SelEnd()<(int)w_strValue2.length())
+        w_postfix  = w_strValue2.substr(pEvent->SelEnd());
+    w_strValue2 = w_prefix + w_strChange2 + w_postfix;
+    w_strValue = w_strValue2.c_str();
+    val = w_strValue;
+    return TRUE;
 
 }
 
@@ -1363,10 +1360,10 @@
 FX_BOOL CJS_PublicMethods::AFPercent_Format(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
 #if _FX_OS_ != _FX_ANDROID_
-	CJS_Context* pContext = (CJS_Context *)cc;
-	ASSERT(pContext != NULL);
-	CJS_EventHandler* pEvent = pContext->GetEventHandler();
-	ASSERT(pEvent != NULL);
+    CJS_Context* pContext = (CJS_Context *)cc;
+    ASSERT(pContext != NULL);
+    CJS_EventHandler* pEvent = pContext->GetEventHandler();
+    ASSERT(pEvent != NULL);
 
     if (params.size() != 2)
 	{
@@ -1466,708 +1463,708 @@
 	strValue += "%";
 	Value = CFX_WideString::FromLocal(strValue);
 #endif
-	return TRUE;
+    return TRUE;
 }
 //AFPercent_Keystroke(nDec, sepStyle)
 FX_BOOL CJS_PublicMethods::AFPercent_Keystroke(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	return AFNumber_Keystroke(cc,params,vRet,sError);
+    return AFNumber_Keystroke(cc,params,vRet,sError);
 }
 
 //function AFDate_FormatEx(cFormat)
 FX_BOOL CJS_PublicMethods::AFDate_FormatEx(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	CJS_Context* pContext = (CJS_Context *)cc;
-	ASSERT(pContext != NULL);
-	CJS_EventHandler* pEvent = pContext->GetEventHandler();
-	ASSERT(pEvent != NULL);
+    CJS_Context* pContext = (CJS_Context *)cc;
+    ASSERT(pContext != NULL);
+    CJS_EventHandler* pEvent = pContext->GetEventHandler();
+    ASSERT(pEvent != NULL);
 
-	if (params.size() != 1)
-	{
-		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
-		return FALSE;
-	}
-	if(!pEvent->m_pValue)
-		return FALSE;
+    if (params.size() != 1)
+    {
+        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& val = pEvent->Value();
+    CFX_WideString strValue = val;
+    if (strValue.IsEmpty())
+        return TRUE;
 
-	CFX_WideString sFormat = params[0].ToCFXWideString();
-	FX_BOOL bWrongFormat = FALSE;
-	double dDate = 0.0f;
+    CFX_WideString sFormat = params[0].ToCFXWideString();
+    FX_BOOL bWrongFormat = FALSE;
+    double dDate = 0.0f;
 
-	if(strValue.Find(L"GMT") != -1)
-	{
-		//for GMT format time
-		//such as "Tue Aug 11 14:24:16 GMT+08002009"
-		dDate = MakeInterDate(strValue);
-	}
-	else
-	{
-		dDate = MakeRegularDate(strValue,sFormat,bWrongFormat);
-	}
+    if(strValue.Find(L"GMT") != -1)
+    {
+        //for GMT format time
+        //such as "Tue Aug 11 14:24:16 GMT+08002009"
+        dDate = MakeInterDate(strValue);
+    }
+    else
+    {
+        dDate = MakeRegularDate(strValue,sFormat,bWrongFormat);
+    }
 
-	if (JS_PortIsNan(dDate))
-	{
-		CFX_WideString swMsg;
-		swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSPARSEDATE).c_str(), sFormat.c_str());
-		Alert(pContext, swMsg.c_str());
-		return FALSE;
-	}
+    if (JS_PortIsNan(dDate))
+    {
+        CFX_WideString swMsg;
+        swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSPARSEDATE).c_str(), sFormat.c_str());
+        Alert(pContext, swMsg.c_str());
+        return FALSE;
+    }
 
-	val =  MakeFormatDate(dDate,sFormat);
-	return TRUE;
+    val =  MakeFormatDate(dDate,sFormat);
+    return TRUE;
 }
 
 double CJS_PublicMethods::MakeInterDate(CFX_WideString strValue)
 {
-	int nHour;
-	int nMin;
-	int nSec;
-	int nYear;
-	int nMonth;
-	int nDay;
+    int nHour;
+    int nMin;
+    int nSec;
+    int nYear;
+    int nMonth;
+    int nDay;
 
-	CFX_WideStringArray wsArray;
-	CFX_WideString sMonth = L"";
-	CFX_WideString sTemp = L"";
-	int nSize = strValue.GetLength();
+    CFX_WideStringArray wsArray;
+    CFX_WideString sMonth = L"";
+    CFX_WideString sTemp = L"";
+    int nSize = strValue.GetLength();
 
-	for(int i = 0; i < nSize; i++)
-	{
-		FX_WCHAR c = strValue.GetAt(i);
-		if(c == L' ' || c == L':')
-		{
-			wsArray.Add(sTemp);
-			sTemp = L"";
-			continue;
-		}
+    for(int i = 0; i < nSize; i++)
+    {
+        FX_WCHAR c = strValue.GetAt(i);
+        if(c == L' ' || c == L':')
+        {
+            wsArray.Add(sTemp);
+            sTemp = L"";
+            continue;
+        }
 
-		sTemp += c;
-	}
+        sTemp += c;
+    }
 
-	wsArray.Add(sTemp);
-	if(wsArray.GetSize() != 8)return 0;
+    wsArray.Add(sTemp);
+    if(wsArray.GetSize() != 8)return 0;
 
-	sTemp = wsArray[1];
-	if(sTemp.Compare(L"Jan") == 0) nMonth = 1;
-	if(sTemp.Compare(L"Feb") == 0) nMonth = 2;
-	if(sTemp.Compare(L"Mar") == 0) nMonth = 3;
-	if(sTemp.Compare(L"Apr") == 0) nMonth = 4;
-	if(sTemp.Compare(L"May") == 0) nMonth = 5;
-	if(sTemp.Compare(L"Jun") == 0) nMonth = 6;
-	if(sTemp.Compare(L"Jul") == 0) nMonth = 7;
-	if(sTemp.Compare(L"Aug") == 0) nMonth = 8;
-	if(sTemp.Compare(L"Sep") == 0) nMonth = 9;
-	if(sTemp.Compare(L"Oct") == 0) nMonth = 10;
-	if(sTemp.Compare(L"Nov") == 0) nMonth = 11;
-	if(sTemp.Compare(L"Dec") == 0) nMonth = 12;
+    sTemp = wsArray[1];
+    if(sTemp.Compare(L"Jan") == 0) nMonth = 1;
+    if(sTemp.Compare(L"Feb") == 0) nMonth = 2;
+    if(sTemp.Compare(L"Mar") == 0) nMonth = 3;
+    if(sTemp.Compare(L"Apr") == 0) nMonth = 4;
+    if(sTemp.Compare(L"May") == 0) nMonth = 5;
+    if(sTemp.Compare(L"Jun") == 0) nMonth = 6;
+    if(sTemp.Compare(L"Jul") == 0) nMonth = 7;
+    if(sTemp.Compare(L"Aug") == 0) nMonth = 8;
+    if(sTemp.Compare(L"Sep") == 0) nMonth = 9;
+    if(sTemp.Compare(L"Oct") == 0) nMonth = 10;
+    if(sTemp.Compare(L"Nov") == 0) nMonth = 11;
+    if(sTemp.Compare(L"Dec") == 0) nMonth = 12;
 
-	nDay = (int)ParseStringToNumber(wsArray[2].c_str());
-	nHour = (int)ParseStringToNumber(wsArray[3].c_str());
-	nMin = (int)ParseStringToNumber(wsArray[4].c_str());
-	nSec = (int)ParseStringToNumber(wsArray[5].c_str());
-	nYear = (int)ParseStringToNumber(wsArray[7].c_str());
+    nDay = (int)ParseStringToNumber(wsArray[2].c_str());
+    nHour = (int)ParseStringToNumber(wsArray[3].c_str());
+    nMin = (int)ParseStringToNumber(wsArray[4].c_str());
+    nSec = (int)ParseStringToNumber(wsArray[5].c_str());
+    nYear = (int)ParseStringToNumber(wsArray[7].c_str());
 
-	double dRet = JS_MakeDate(JS_MakeDay(nYear,nMonth - 1,nDay),JS_MakeTime(nHour, nMin, nSec, 0));
+    double dRet = JS_MakeDate(JS_MakeDay(nYear,nMonth - 1,nDay),JS_MakeTime(nHour, nMin, nSec, 0));
 
-	if (JS_PortIsNan(dRet))
-	{
-		dRet = JS_DateParse(strValue.c_str());
-	}
+    if (JS_PortIsNan(dRet))
+    {
+        dRet = JS_DateParse(strValue.c_str());
+    }
 
-	return dRet;
+    return dRet;
 }
 
 //AFDate_KeystrokeEx(cFormat)
 FX_BOOL CJS_PublicMethods::AFDate_KeystrokeEx(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	CJS_Context* pContext = (CJS_Context *)cc;
-	ASSERT(pContext != NULL);
-	CJS_EventHandler* pEvent = pContext->GetEventHandler();
-	ASSERT(pEvent != NULL);
+    CJS_Context* pContext = (CJS_Context *)cc;
+    ASSERT(pContext != NULL);
+    CJS_EventHandler* pEvent = pContext->GetEventHandler();
+    ASSERT(pEvent != NULL);
 
-	if (params.size() != 1)
-	{
-		sError = L"AFDate_KeystrokeEx's parameters' size r not correct";
-		return FALSE;
-	}
+    if (params.size() != 1)
+    {
+        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 (pEvent->WillCommit())
+    {
+        if(!pEvent->m_pValue)
+            return FALSE;
+        CFX_WideString strValue = pEvent->Value();
+        if (strValue.IsEmpty())
+            return TRUE;
 
-		CFX_WideString sFormat = params[0].ToCFXWideString();
-		FX_BOOL bWrongFormat = FALSE;
-		double dRet = MakeRegularDate(strValue,sFormat,bWrongFormat);
-		if (bWrongFormat || JS_PortIsNan(dRet))
-		{
-			CFX_WideString swMsg;
-			swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSPARSEDATE).c_str(), sFormat.c_str());
-			Alert(pContext, swMsg.c_str());
-			pEvent->Rc() = FALSE;
-			return TRUE;
-		}
-	}
-	return TRUE;
+        CFX_WideString sFormat = params[0].ToCFXWideString();
+        FX_BOOL bWrongFormat = FALSE;
+        double dRet = MakeRegularDate(strValue,sFormat,bWrongFormat);
+        if (bWrongFormat || JS_PortIsNan(dRet))
+        {
+            CFX_WideString swMsg;
+            swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSPARSEDATE).c_str(), sFormat.c_str());
+            Alert(pContext, swMsg.c_str());
+            pEvent->Rc() = FALSE;
+            return TRUE;
+        }
+    }
+    return TRUE;
 }
 
 FX_BOOL CJS_PublicMethods::AFDate_Format(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	v8::Isolate* isolate = ::GetIsolate(cc);
+    v8::Isolate* isolate = ::GetIsolate(cc);
 
-	if (params.size() != 1)
-	{
-		CJS_Context* pContext = (CJS_Context*)cc;
-		ASSERT(pContext != NULL);
+    if (params.size() != 1)
+    {
+        CJS_Context* pContext = (CJS_Context*)cc;
+        ASSERT(pContext != NULL);
 
-		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
-		return FALSE;
-	}
+        sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+        return FALSE;
+    }
 
-	int iIndex = params[0].ToInt();
-	const FX_WCHAR* 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" };
+    int iIndex = params[0].ToInt();
+    const FX_WCHAR* 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" };
 
-	ASSERT(iIndex < FX_ArraySize(cFormats));
+    ASSERT(iIndex < FX_ArraySize(cFormats));
 
-	if (iIndex < 0)
-		iIndex = 0;
-	if (iIndex >= FX_ArraySize(cFormats))
-		iIndex = 0;
-	CJS_Parameters newParams;
-	CJS_Value val(isolate,cFormats[iIndex]);
-	newParams.push_back(val);
-	return AFDate_FormatEx(cc,newParams,vRet,sError);
+    if (iIndex < 0)
+        iIndex = 0;
+    if (iIndex >= FX_ArraySize(cFormats))
+        iIndex = 0;
+    CJS_Parameters newParams;
+    CJS_Value val(isolate,cFormats[iIndex]);
+    newParams.push_back(val);
+    return AFDate_FormatEx(cc,newParams,vRet,sError);
 }
 
 //AFDate_KeystrokeEx(cFormat)
 FX_BOOL CJS_PublicMethods::AFDate_Keystroke(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	v8::Isolate* isolate = ::GetIsolate(cc);
+    v8::Isolate* isolate = ::GetIsolate(cc);
 
-	if (params.size() != 1)
-	{
-		CJS_Context* pContext = (CJS_Context*)cc;
-		ASSERT(pContext != NULL);
+    if (params.size() != 1)
+    {
+        CJS_Context* pContext = (CJS_Context*)cc;
+        ASSERT(pContext != NULL);
 
-		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
-		return FALSE;
-	}
+        sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+        return FALSE;
+    }
 
-	int iIndex = params[0].ToInt();
-	const FX_WCHAR* 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" };
+    int iIndex = params[0].ToInt();
+    const FX_WCHAR* 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" };
 
-	ASSERT(iIndex<FX_ArraySize(cFormats));
+    ASSERT(iIndex<FX_ArraySize(cFormats));
 
-	if (iIndex < 0)
-		iIndex = 0;
-	if (iIndex >= FX_ArraySize(cFormats))
-		iIndex = 0;
-	CJS_Parameters newParams;
-	CJS_Value val(isolate,cFormats[iIndex]);
-	newParams.push_back(val);
-	return AFDate_KeystrokeEx(cc,newParams,vRet,sError);
+    if (iIndex < 0)
+        iIndex = 0;
+    if (iIndex >= FX_ArraySize(cFormats))
+        iIndex = 0;
+    CJS_Parameters newParams;
+    CJS_Value val(isolate,cFormats[iIndex]);
+    newParams.push_back(val);
+    return AFDate_KeystrokeEx(cc,newParams,vRet,sError);
 }
 
 //function AFTime_Format(ptf)
 FX_BOOL CJS_PublicMethods::AFTime_Format(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	v8::Isolate* isolate = ::GetIsolate(cc);
+    v8::Isolate* isolate = ::GetIsolate(cc);
 
-	if (params.size() != 1)
-	{
-		CJS_Context* pContext = (CJS_Context*)cc;
-		ASSERT(pContext != NULL);
-		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
-		return FALSE;
-	}
+    if (params.size() != 1)
+    {
+        CJS_Context* pContext = (CJS_Context*)cc;
+        ASSERT(pContext != NULL);
+        sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+        return FALSE;
+    }
 
-	int iIndex = params[0].ToInt();
-	const FX_WCHAR* cFormats[] = {L"HH:MM", L"h:MM tt", L"HH:MM:ss", L"h:MM:ss tt"};
+    int iIndex = params[0].ToInt();
+    const FX_WCHAR* cFormats[] = {L"HH:MM", L"h:MM tt", L"HH:MM:ss", L"h:MM:ss tt"};
 
-	ASSERT(iIndex<FX_ArraySize(cFormats));
+    ASSERT(iIndex<FX_ArraySize(cFormats));
 
-	if (iIndex < 0)
-		iIndex = 0;
-	if (iIndex >= FX_ArraySize(cFormats))
-		iIndex = 0;
-	CJS_Parameters newParams;
-	CJS_Value val(isolate,cFormats[iIndex]);
-	newParams.push_back(val);
-	return AFDate_FormatEx(cc,newParams,vRet,sError);
+    if (iIndex < 0)
+        iIndex = 0;
+    if (iIndex >= FX_ArraySize(cFormats))
+        iIndex = 0;
+    CJS_Parameters newParams;
+    CJS_Value val(isolate,cFormats[iIndex]);
+    newParams.push_back(val);
+    return AFDate_FormatEx(cc,newParams,vRet,sError);
 }
 
 FX_BOOL CJS_PublicMethods::AFTime_Keystroke(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	v8::Isolate* isolate = ::GetIsolate(cc);
-	if (params.size() != 1)
-	{
-		CJS_Context* pContext = (CJS_Context*)cc;
-		ASSERT(pContext != NULL);
-		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
-		return FALSE;
-	}
+    v8::Isolate* isolate = ::GetIsolate(cc);
+    if (params.size() != 1)
+    {
+        CJS_Context* pContext = (CJS_Context*)cc;
+        ASSERT(pContext != NULL);
+        sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+        return FALSE;
+    }
 
-	int iIndex = params[0].ToInt();
-	const FX_WCHAR* cFormats[] = {L"HH:MM", L"h:MM tt", L"HH:MM:ss", L"h:MM:ss tt"};
+    int iIndex = params[0].ToInt();
+    const FX_WCHAR* cFormats[] = {L"HH:MM", L"h:MM tt", L"HH:MM:ss", L"h:MM:ss tt"};
 
-	ASSERT(iIndex<FX_ArraySize(cFormats));
+    ASSERT(iIndex<FX_ArraySize(cFormats));
 
-	if (iIndex < 0)
-		iIndex = 0;
-	if (iIndex >= FX_ArraySize(cFormats))
-		iIndex = 0;
-	CJS_Parameters newParams;
-	CJS_Value val(isolate,cFormats[iIndex]);
-	newParams.push_back(val);
-	return AFDate_KeystrokeEx(cc,newParams,vRet,sError);
+    if (iIndex < 0)
+        iIndex = 0;
+    if (iIndex >= FX_ArraySize(cFormats))
+        iIndex = 0;
+    CJS_Parameters newParams;
+    CJS_Value val(isolate,cFormats[iIndex]);
+    newParams.push_back(val);
+    return AFDate_KeystrokeEx(cc,newParams,vRet,sError);
 }
 
 FX_BOOL CJS_PublicMethods::AFTime_FormatEx(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	return AFDate_FormatEx(cc,params,vRet,sError);
+    return AFDate_FormatEx(cc,params,vRet,sError);
 }
 
 FX_BOOL CJS_PublicMethods::AFTime_KeystrokeEx(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	return AFDate_KeystrokeEx(cc,params,vRet,sError);
+    return AFDate_KeystrokeEx(cc,params,vRet,sError);
 }
 
 //function AFSpecial_Format(psf)
 FX_BOOL CJS_PublicMethods::AFSpecial_Format(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	CJS_Context* pContext = (CJS_Context *)cc;
-	ASSERT(pContext != NULL);
+    CJS_Context* pContext = (CJS_Context *)cc;
+    ASSERT(pContext != NULL);
 
-	if (params.size() != 1)
-	{
-		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
-		return FALSE;
-	}
+    if (params.size() != 1)
+    {
+        sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+        return FALSE;
+    }
 
-	std::string cFormat;
-	int iIndex = params[0].ToInt();
+    std::string cFormat;
+    int iIndex = params[0].ToInt();
 
-	CJS_EventHandler* pEvent = pContext->GetEventHandler();
-	ASSERT(pEvent != NULL);
+    CJS_EventHandler* pEvent = pContext->GetEventHandler();
+    ASSERT(pEvent != NULL);
 
-	if(!pEvent->m_pValue)
-		return FALSE;
-	CFX_WideString& Value = pEvent->Value();
-	std::string strSrc = CFX_ByteString::FromUnicode(Value).c_str();
+    if(!pEvent->m_pValue)
+        return FALSE;
+    CFX_WideString& Value = pEvent->Value();
+    std::string strSrc = CFX_ByteString::FromUnicode(Value).c_str();
 
-	switch (iIndex)
-	{
-	case 0:
-		cFormat = "99999";
-		break;
-	case 1:
-		cFormat = "99999-9999";
-		break;
-	case 2:
-		{
-			std::string NumberStr;
-			util::printx("9999999999", strSrc,NumberStr);
-			if (NumberStr.length() >= 10 )
-				cFormat = "(999) 999-9999";
-			else
-				cFormat = "999-9999";
-			break;
-		}
-	case 3:
-		cFormat = "999-99-9999";
-		break;
-	}
+    switch (iIndex)
+    {
+    case 0:
+        cFormat = "99999";
+        break;
+    case 1:
+        cFormat = "99999-9999";
+        break;
+    case 2:
+        {
+            std::string NumberStr;
+            util::printx("9999999999", strSrc,NumberStr);
+            if (NumberStr.length() >= 10 )
+                cFormat = "(999) 999-9999";
+            else
+                cFormat = "999-9999";
+            break;
+        }
+    case 3:
+        cFormat = "999-99-9999";
+        break;
+    }
 
-	std::string strDes;
-	util::printx(cFormat,strSrc,strDes);
-	Value = CFX_WideString::FromLocal(strDes.c_str());
-	return TRUE;
+    std::string strDes;
+    util::printx(cFormat,strSrc,strDes);
+    Value = CFX_WideString::FromLocal(strDes.c_str());
+    return TRUE;
 }
 
 
 //function AFSpecial_KeystrokeEx(mask)
 FX_BOOL CJS_PublicMethods::AFSpecial_KeystrokeEx(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	CJS_Context* pContext = (CJS_Context *)cc;
-	ASSERT(pContext != NULL);
-	CJS_EventHandler* pEvent = pContext->GetEventHandler();
+    CJS_Context* pContext = (CJS_Context *)cc;
+    ASSERT(pContext != NULL);
+    CJS_EventHandler* pEvent = pContext->GetEventHandler();
 
-	ASSERT(pEvent != NULL);
+    ASSERT(pEvent != NULL);
 
-	if (params.size() < 1)
-	{
-		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
-		return FALSE;
-	}
+    if (params.size() < 1)
+    {
+        sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+        return FALSE;
+    }
 
-	if(!pEvent->m_pValue)
-		return FALSE;
-	CFX_WideString& valEvent = pEvent->Value();
+    if(!pEvent->m_pValue)
+        return FALSE;
+    CFX_WideString& valEvent = pEvent->Value();
 
-	CFX_WideString wstrMask = params[0].ToCFXWideString();
-	if (wstrMask.IsEmpty())
-		return TRUE;
+    CFX_WideString wstrMask = params[0].ToCFXWideString();
+    if (wstrMask.IsEmpty())
+        return TRUE;
 
-	std::wstring wstrValue = valEvent.c_str();
+    std::wstring wstrValue = valEvent.c_str();
 
-	if (pEvent->WillCommit())
-	{
-		if (wstrValue.empty())
-			return TRUE;
-		int iIndexMask = 0;
-		for (std::wstring::iterator it = wstrValue.begin(); it != wstrValue.end(); it++)
-		{
-			wchar_t w_Value = *it;
-			if (!maskSatisfied(w_Value,wstrMask[iIndexMask]))
-				break;
-			iIndexMask++;
-		}
+    if (pEvent->WillCommit())
+    {
+        if (wstrValue.empty())
+            return TRUE;
+        int iIndexMask = 0;
+        for (std::wstring::iterator it = wstrValue.begin(); it != wstrValue.end(); it++)
+        {
+            wchar_t w_Value = *it;
+            if (!maskSatisfied(w_Value,wstrMask[iIndexMask]))
+                break;
+            iIndexMask++;
+        }
 
-		if (iIndexMask != wstrMask.GetLength() || (iIndexMask != wstrValue.size() && wstrMask.GetLength() != 0))
-		{
-			Alert(pContext, JSGetStringFromID(pContext, IDS_STRING_JSAFNUMBER_KEYSTROKE).c_str());
-			pEvent->Rc() = FALSE;
-		}
-		return TRUE;
-	}
+        if (iIndexMask != wstrMask.GetLength() || (iIndexMask != wstrValue.size() && wstrMask.GetLength() != 0))
+        {
+            Alert(pContext, JSGetStringFromID(pContext, IDS_STRING_JSAFNUMBER_KEYSTROKE).c_str());
+            pEvent->Rc() = FALSE;
+        }
+        return TRUE;
+    }
 
-	CFX_WideString &wideChange = pEvent->Change();
-	std::wstring wChange = wideChange.c_str();
-	if (wChange.empty())
-		return TRUE;
+    CFX_WideString &wideChange = pEvent->Change();
+    std::wstring wChange = wideChange.c_str();
+    if (wChange.empty())
+        return TRUE;
 
-	int iIndexMask = pEvent->SelStart();
+    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).c_str());
-		pEvent->Rc() = FALSE;
-		return TRUE;
-	}
+    if (wstrValue.length() - (pEvent->SelEnd()-pEvent->SelStart()) + wChange.length() > (FX_DWORD)wstrMask.GetLength())
+    {
+        Alert(pContext, JSGetStringFromID(pContext, IDS_STRING_JSPARAM_TOOLONG).c_str());
+        pEvent->Rc() = FALSE;
+        return TRUE;
+    }
 
-	if (iIndexMask >= wstrMask.GetLength() && (!wChange.empty()))
-	{
-		Alert(pContext, JSGetStringFromID(pContext, IDS_STRING_JSPARAM_TOOLONG).c_str());
-		pEvent->Rc() = FALSE;
-		return TRUE;
-	}
+    if (iIndexMask >= wstrMask.GetLength() && (!wChange.empty()))
+    {
+        Alert(pContext, JSGetStringFromID(pContext, IDS_STRING_JSPARAM_TOOLONG).c_str());
+        pEvent->Rc() = FALSE;
+        return TRUE;
+    }
 
-	for (std::wstring::iterator it = wChange.begin(); it != wChange.end(); it++)
-	{
-		if (iIndexMask >= wstrMask.GetLength())
-		{
-			Alert(pContext, JSGetStringFromID(pContext, IDS_STRING_JSPARAM_TOOLONG).c_str());
-			pEvent->Rc() = FALSE;
-			return TRUE;
-		}
-		wchar_t w_Mask = wstrMask[iIndexMask];
-		if (!isReservedMaskChar(w_Mask))
-		{
-			*it = w_Mask;
-		}
-		wchar_t w_Change = *it;
-		if (!maskSatisfied(w_Change,w_Mask))
-		{
-			pEvent->Rc() = FALSE;
-			return TRUE;
-		}
-		iIndexMask++;
-	}
+    for (std::wstring::iterator it = wChange.begin(); it != wChange.end(); it++)
+    {
+        if (iIndexMask >= wstrMask.GetLength())
+        {
+            Alert(pContext, JSGetStringFromID(pContext, IDS_STRING_JSPARAM_TOOLONG).c_str());
+            pEvent->Rc() = FALSE;
+            return TRUE;
+        }
+        wchar_t w_Mask = wstrMask[iIndexMask];
+        if (!isReservedMaskChar(w_Mask))
+        {
+            *it = w_Mask;
+        }
+        wchar_t w_Change = *it;
+        if (!maskSatisfied(w_Change,w_Mask))
+        {
+            pEvent->Rc() = FALSE;
+            return TRUE;
+        }
+        iIndexMask++;
+    }
 
-	wideChange = wChange.c_str();
-	return TRUE;
+    wideChange = wChange.c_str();
+    return TRUE;
 }
 
 
 //function AFSpecial_Keystroke(psf)
 FX_BOOL CJS_PublicMethods::AFSpecial_Keystroke(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	v8::Isolate* isolate = ::GetIsolate(cc);
+    v8::Isolate* isolate = ::GetIsolate(cc);
 
-	CJS_Context* pContext = (CJS_Context *)cc;
-	ASSERT(pContext != NULL);
-	CJS_EventHandler* pEvent = pContext->GetEventHandler();
-	ASSERT(pEvent != NULL);
+    CJS_Context* pContext = (CJS_Context *)cc;
+    ASSERT(pContext != NULL);
+    CJS_EventHandler* pEvent = pContext->GetEventHandler();
+    ASSERT(pEvent != NULL);
 
-	if (params.size() != 1)
-	{
-		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
-		return FALSE;
-	}
+    if (params.size() != 1)
+    {
+        sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+        return FALSE;
+    }
 
-	std::string cFormat;
-	int iIndex = params[0].ToInt();
+    std::string cFormat;
+    int iIndex = params[0].ToInt();
 
-	if(!pEvent->m_pValue)
-		return FALSE;
-	//CJS_Value val = pEvent->Value();
-	CFX_WideString& val = pEvent->Value();
-	std::string strSrc = CFX_ByteString::FromUnicode(val).c_str();
-	std::wstring wstrChange = pEvent->Change().c_str();
+    if(!pEvent->m_pValue)
+        return FALSE;
+    //CJS_Value val = pEvent->Value();
+    CFX_WideString& val = pEvent->Value();
+    std::string strSrc = CFX_ByteString::FromUnicode(val).c_str();
+    std::wstring wstrChange = pEvent->Change().c_str();
 
-	switch (iIndex)
-	{
-	case 0:
-		cFormat = "99999";
-		break;
-	case 1:
-		//cFormat = "99999-9999";
-		cFormat = "999999999";
-		break;
-	case 2:
-		{
-			std::string NumberStr;
-			util::printx("9999999999", strSrc,NumberStr);
-			if (strSrc.length() + wstrChange.length() > 7 )
-				//cFormat = "(999) 999-9999";
-				cFormat = "9999999999";
-			else
-				//cFormat = "999-9999";
-				cFormat = "9999999";
-			break;
-		}
-	case 3:
-		//cFormat = "999-99-9999";
-		cFormat = "999999999";
-		break;
-	}
+    switch (iIndex)
+    {
+    case 0:
+        cFormat = "99999";
+        break;
+    case 1:
+        //cFormat = "99999-9999";
+        cFormat = "999999999";
+        break;
+    case 2:
+        {
+            std::string NumberStr;
+            util::printx("9999999999", strSrc,NumberStr);
+            if (strSrc.length() + wstrChange.length() > 7 )
+                //cFormat = "(999) 999-9999";
+                cFormat = "9999999999";
+            else
+                //cFormat = "999-9999";
+                cFormat = "9999999";
+            break;
+        }
+    case 3:
+        //cFormat = "999-99-9999";
+        cFormat = "999999999";
+        break;
+    }
 
-	CJS_Parameters params2;
-	CJS_Value vMask(isolate, cFormat.c_str());
-	params2.push_back(vMask);
+    CJS_Parameters params2;
+    CJS_Value vMask(isolate, cFormat.c_str());
+    params2.push_back(vMask);
 
     return AFSpecial_KeystrokeEx(cc,params2,vRet,sError);
 }
 
 FX_BOOL CJS_PublicMethods::AFMergeChange(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	CJS_Context* pContext = (CJS_Context *)cc;
-	ASSERT(pContext != NULL);
-	CJS_EventHandler* pEventHandler = pContext->GetEventHandler();
-	ASSERT(pEventHandler != NULL);
+    CJS_Context* pContext = (CJS_Context *)cc;
+    ASSERT(pContext != NULL);
+    CJS_EventHandler* pEventHandler = pContext->GetEventHandler();
+    ASSERT(pEventHandler != NULL);
 
-	if (params.size() != 1)
-	{
-		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
-		return FALSE;
-	}
+    if (params.size() != 1)
+    {
+        sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+        return FALSE;
+    }
 
-	CFX_WideString swValue;
-	if (pEventHandler->m_pValue != NULL)
-		swValue = pEventHandler->Value();
+    CFX_WideString swValue;
+    if (pEventHandler->m_pValue != NULL)
+        swValue = pEventHandler->Value();
 
-	if (pEventHandler->WillCommit())
-	{
-		vRet = swValue.c_str();
-		return TRUE;
-	}
+    if (pEventHandler->WillCommit())
+    {
+        vRet = swValue.c_str();
+        return TRUE;
+    }
 
-	CFX_WideString prefix,postfix;
+    CFX_WideString prefix,postfix;
 
-	if (pEventHandler->SelStart() >= 0)
-		prefix = swValue.Mid(0,pEventHandler->SelStart());
-	else
-		prefix = L"";
+    if (pEventHandler->SelStart() >= 0)
+        prefix = swValue.Mid(0,pEventHandler->SelStart());
+    else
+        prefix = L"";
 
 
-	if (pEventHandler->SelEnd() >= 0 && pEventHandler->SelEnd() <= swValue.GetLength())
-		postfix = swValue.Mid(pEventHandler->SelEnd(), swValue.GetLength() - pEventHandler->SelEnd());
-	else postfix = L"";
+    if (pEventHandler->SelEnd() >= 0 && pEventHandler->SelEnd() <= swValue.GetLength())
+        postfix = swValue.Mid(pEventHandler->SelEnd(), swValue.GetLength() - pEventHandler->SelEnd());
+    else postfix = L"";
 
-	vRet = (prefix + pEventHandler->Change() + postfix).c_str();
+    vRet = (prefix + pEventHandler->Change() + postfix).c_str();
 
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL CJS_PublicMethods::AFParseDateEx(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	CJS_Context* pContext = (CJS_Context *)cc;
-	ASSERT(pContext != NULL);
+    CJS_Context* pContext = (CJS_Context *)cc;
+    ASSERT(pContext != NULL);
 
-	if (params.size() != 2)
-	{
-		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
-		return FALSE;
-	}
+    if (params.size() != 2)
+    {
+        sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+        return FALSE;
+    }
 
-	CFX_WideString sValue = params[0].ToCFXWideString();
-	CFX_WideString sFormat = params[1].ToCFXWideString();
+    CFX_WideString sValue = params[0].ToCFXWideString();
+    CFX_WideString sFormat = params[1].ToCFXWideString();
 
-	FX_BOOL bWrongFormat = FALSE;
-	double dDate = MakeRegularDate(sValue,sFormat,bWrongFormat);
+    FX_BOOL bWrongFormat = FALSE;
+    double dDate = MakeRegularDate(sValue,sFormat,bWrongFormat);
 
-	if (JS_PortIsNan(dDate))
-	{
-		CFX_WideString swMsg;
-		swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSPARSEDATE).c_str(), sFormat.c_str());
-		Alert((CJS_Context *)cc, swMsg.c_str());
-		return FALSE;
-	}
+    if (JS_PortIsNan(dDate))
+    {
+        CFX_WideString swMsg;
+        swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSPARSEDATE).c_str(), sFormat.c_str());
+        Alert((CJS_Context *)cc, swMsg.c_str());
+        return FALSE;
+    }
 
-	vRet = dDate;
-	return TRUE;
+    vRet = dDate;
+    return TRUE;
 }
 
 FX_BOOL CJS_PublicMethods::AFSimple(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	if (params.size() != 3)
-	{
-		CJS_Context* pContext = (CJS_Context *)cc;
-		ASSERT(pContext != NULL);
+    if (params.size() != 3)
+    {
+        CJS_Context* pContext = (CJS_Context *)cc;
+        ASSERT(pContext != NULL);
 
-		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
-		return FALSE;
-	}
+        sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+        return FALSE;
+    }
 
-	vRet = (double)AF_Simple(params[0].ToCFXWideString().c_str(), params[1].ToDouble(), params[2].ToDouble());
-	return TRUE;
+    vRet = (double)AF_Simple(params[0].ToCFXWideString().c_str(), params[1].ToDouble(), params[2].ToDouble());
+    return TRUE;
 }
 
 FX_BOOL CJS_PublicMethods::AFMakeNumber(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	if (params.size() != 1)
-	{
-		CJS_Context* pContext = (CJS_Context *)cc;
-		ASSERT(pContext != NULL);
+    if (params.size() != 1)
+    {
+        CJS_Context* pContext = (CJS_Context *)cc;
+        ASSERT(pContext != NULL);
 
-		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
-		return FALSE;
-	}
-	vRet = ParseStringToNumber(params[0].ToCFXWideString().c_str());
-	return TRUE;
+        sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+        return FALSE;
+    }
+    vRet = ParseStringToNumber(params[0].ToCFXWideString().c_str());
+    return TRUE;
 }
 
 FX_BOOL CJS_PublicMethods::AFSimple_Calculate(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	v8::Isolate* isolate = ::GetIsolate(cc);
+    v8::Isolate* isolate = ::GetIsolate(cc);
 
-	CJS_Context* pContext = (CJS_Context *)cc;
-	ASSERT(pContext != NULL);
+    CJS_Context* pContext = (CJS_Context *)cc;
+    ASSERT(pContext != NULL);
 
-	if (params.size() != 2)
-	{
-		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
-		return FALSE;
-	}
+    if (params.size() != 2)
+    {
+        sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+        return FALSE;
+    }
 
-	CJS_Value params1 = params[1];
+    CJS_Value params1 = params[1];
 
-	if (!params1.IsArrayObject() && params1.GetType() != VT_string)
-	{
-		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
-		return FALSE;
-	}
+    if (!params1.IsArrayObject() && params1.GetType() != VT_string)
+    {
+        sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+        return FALSE;
+    }
 
-	CPDFSDK_Document* pReaderDoc = pContext->GetReaderDocument();
+    CPDFSDK_Document* pReaderDoc = pContext->GetReaderDocument();
     ASSERT(pReaderDoc != NULL);
 
-	CPDFSDK_InterForm* pReaderInterForm = pReaderDoc->GetInterForm();
-	ASSERT(pReaderInterForm != NULL);
+    CPDFSDK_InterForm* pReaderInterForm = pReaderDoc->GetInterForm();
+    ASSERT(pReaderInterForm != NULL);
 
-	CPDF_InterForm* pInterForm = pReaderInterForm->GetInterForm();
-	ASSERT(pInterForm != NULL);
+    CPDF_InterForm* pInterForm = pReaderInterForm->GetInterForm();
+    ASSERT(pInterForm != NULL);
 
-	double dValue;
-	CFX_WideString sFunction = params[0].ToCFXWideString();
-	if (wcscmp(sFunction.c_str(), L"PRD") == 0)
-    	dValue = 1.0;
-	else
-		dValue = 0.0;
+    double dValue;
+    CFX_WideString sFunction = params[0].ToCFXWideString();
+    if (wcscmp(sFunction.c_str(), L"PRD") == 0)
+        dValue = 1.0;
+    else
+        dValue = 0.0;
 
-	CJS_Array FieldNameArray = AF_MakeArrayFromList(isolate,params1);
+    CJS_Array FieldNameArray = AF_MakeArrayFromList(isolate,params1);
 
-	int nFieldsCount = 0;
+    int nFieldsCount = 0;
 
-	for (int i=0,isz=FieldNameArray.GetLength(); i<isz; i++)
-	{
-		CJS_Value jsValue(isolate);
-		FieldNameArray.GetElement(i,jsValue);
-		CFX_WideString wsFieldName = jsValue.ToCFXWideString();
+    for (int i=0,isz=FieldNameArray.GetLength(); i<isz; i++)
+    {
+        CJS_Value jsValue(isolate);
+        FieldNameArray.GetElement(i,jsValue);
+        CFX_WideString wsFieldName = jsValue.ToCFXWideString();
 
         for (int j=0,jsz=pInterForm->CountFields(wsFieldName); j<jsz; j++)
-		{
-			if (CPDF_FormField* pFormField = pInterForm->GetField(j, wsFieldName))
-			{
-				double dTemp = 0.0;
+        {
+            if (CPDF_FormField* pFormField = pInterForm->GetField(j, wsFieldName))
+            {
+                double dTemp = 0.0;
 
-				switch (pFormField->GetFieldType())
-				{
-				case FIELDTYPE_TEXTFIELD:
-				case FIELDTYPE_COMBOBOX:
-					{
-						dTemp = ParseStringToNumber(pFormField->GetValue().c_str());
-						break;
-					}
-				case FIELDTYPE_PUSHBUTTON:
-					{
-						dTemp = 0.0;
-						break;
-					}
-				case FIELDTYPE_CHECKBOX:
-				case FIELDTYPE_RADIOBUTTON:
-					{
-						dTemp = 0.0;
-						for (int c=0,csz=pFormField->CountControls(); c<csz; c++)
-						{
-							if (CPDF_FormControl* pFormCtrl = pFormField->GetControl(c))
-							{
-								if (pFormCtrl->IsChecked())
-								{
-									dTemp += ParseStringToNumber(pFormCtrl->GetExportValue().c_str());
-									break;
-								}
-								else
-									continue;
-							}
-						}
-						break;
-					}
-				case FIELDTYPE_LISTBOX:
-					{
-						dTemp = 0.0;
-						if (pFormField->CountSelectedItems() > 1)
-							break;
-						else
-						{
-							dTemp = ParseStringToNumber(pFormField->GetValue().c_str());
-							break;
-						}
-					}
-				default:
-					break;
-				}
+                switch (pFormField->GetFieldType())
+                {
+                case FIELDTYPE_TEXTFIELD:
+                case FIELDTYPE_COMBOBOX:
+                    {
+                        dTemp = ParseStringToNumber(pFormField->GetValue().c_str());
+                        break;
+                    }
+                case FIELDTYPE_PUSHBUTTON:
+                    {
+                        dTemp = 0.0;
+                        break;
+                    }
+                case FIELDTYPE_CHECKBOX:
+                case FIELDTYPE_RADIOBUTTON:
+                    {
+                        dTemp = 0.0;
+                        for (int c=0,csz=pFormField->CountControls(); c<csz; c++)
+                        {
+                            if (CPDF_FormControl* pFormCtrl = pFormField->GetControl(c))
+                            {
+                                if (pFormCtrl->IsChecked())
+                                {
+                                    dTemp += ParseStringToNumber(pFormCtrl->GetExportValue().c_str());
+                                    break;
+                                }
+                                else
+                                    continue;
+                            }
+                        }
+                        break;
+                    }
+                case FIELDTYPE_LISTBOX:
+                    {
+                        dTemp = 0.0;
+                        if (pFormField->CountSelectedItems() > 1)
+                            break;
+                        else
+                        {
+                            dTemp = ParseStringToNumber(pFormField->GetValue().c_str());
+                            break;
+                        }
+                    }
+                default:
+                    break;
+                }
 
-				if (i == 0 && j == 0 && (wcscmp(sFunction.c_str(), L"MIN") == 0 || wcscmp(sFunction.c_str(), L"MAX") == 0))
-					dValue = dTemp;
+                if (i == 0 && j == 0 && (wcscmp(sFunction.c_str(), L"MIN") == 0 || wcscmp(sFunction.c_str(), L"MAX") == 0))
+                    dValue = dTemp;
 
-				dValue = AF_Simple(sFunction.c_str(), dValue, dTemp);
+                dValue = AF_Simple(sFunction.c_str(), dValue, dTemp);
 
-				nFieldsCount++;
-			}
-		}
-	}
+                nFieldsCount++;
+            }
+        }
+    }
 
-	if (wcscmp(sFunction.c_str(), L"AVG") == 0 && nFieldsCount > 0)
-		dValue /= nFieldsCount;
+    if (wcscmp(sFunction.c_str(), L"AVG") == 0 && nFieldsCount > 0)
+        dValue /= nFieldsCount;
 
-	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.ToCFXWideString();
+    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.ToCFXWideString();
 
-	return TRUE;
+    return TRUE;
 }
 
 /* This function validates the current event to ensure that its value is
@@ -2175,104 +2172,104 @@
 
 FX_BOOL CJS_PublicMethods::AFRange_Validate(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	CJS_Context* pContext = (CJS_Context *)cc;
-	ASSERT(pContext != NULL);
-	CJS_EventHandler* pEvent = pContext->GetEventHandler();
-	ASSERT(pEvent != NULL);
+    CJS_Context* pContext = (CJS_Context *)cc;
+    ASSERT(pContext != NULL);
+    CJS_EventHandler* pEvent = pContext->GetEventHandler();
+    ASSERT(pEvent != NULL);
 
-	if (params.size() != 4)
-	{
-		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
-		return FALSE;
-	}
+    if (params.size() != 4)
+    {
+        sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+        return FALSE;
+    }
 
-	if(!pEvent->m_pValue)
-		return FALSE;
-	if (pEvent->Value().IsEmpty() )
-		return TRUE;
-	double dEentValue = atof(CFX_ByteString::FromUnicode(pEvent->Value()));
-	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;
+    if(!pEvent->m_pValue)
+        return FALSE;
+    if (pEvent->Value().IsEmpty() )
+        return TRUE;
+    double dEentValue = atof(CFX_ByteString::FromUnicode(pEvent->Value()));
+    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;
 
-	if (bGreaterThan && bLessThan)
-	{
-		if (dEentValue < dGreaterThan || dEentValue > dLessThan)
-			swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE1).c_str(),
-						 params[1].ToCFXWideString().c_str(),
-						 params[3].ToCFXWideString().c_str());
-	}
-	else if (bGreaterThan)
-	{
-		if (dEentValue < dGreaterThan)
-			swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE2).c_str(),
-						 params[1].ToCFXWideString().c_str());
-	}
-	else if (bLessThan)
-	{
-		if (dEentValue > dLessThan)
-			swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE3).c_str(),
-						 params[3].ToCFXWideString().c_str());
-	}
+    if (bGreaterThan && bLessThan)
+    {
+        if (dEentValue < dGreaterThan || dEentValue > dLessThan)
+            swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE1).c_str(),
+                         params[1].ToCFXWideString().c_str(),
+                         params[3].ToCFXWideString().c_str());
+    }
+    else if (bGreaterThan)
+    {
+        if (dEentValue < dGreaterThan)
+            swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE2).c_str(),
+                         params[1].ToCFXWideString().c_str());
+    }
+    else if (bLessThan)
+    {
+        if (dEentValue > dLessThan)
+            swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE3).c_str(),
+                         params[3].ToCFXWideString().c_str());
+    }
 
-	if (!swMsg.IsEmpty())
-	{
-		Alert(pContext, swMsg.c_str());
-		pEvent->Rc() = FALSE;
-	}
-	return TRUE;
+    if (!swMsg.IsEmpty())
+    {
+        Alert(pContext, swMsg.c_str());
+        pEvent->Rc() = FALSE;
+    }
+    return TRUE;
 }
 
 FX_BOOL CJS_PublicMethods::AFExtractNums(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	v8::Isolate* isolate = ::GetIsolate(cc);
-	CJS_Context* pContext = (CJS_Context*)cc;
-	ASSERT(pContext != NULL);
+    v8::Isolate* isolate = ::GetIsolate(cc);
+    CJS_Context* pContext = (CJS_Context*)cc;
+    ASSERT(pContext != NULL);
 
-	if (params.size() != 1)
-	{
-		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
-		return FALSE;
-	}
+    if (params.size() != 1)
+    {
+        sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+        return FALSE;
+    }
 
-	CJS_Array nums(isolate);
+    CJS_Array nums(isolate);
 
-	CFX_WideString str = params[0].ToCFXWideString();
-	CFX_WideString sPart;
+    CFX_WideString str = params[0].ToCFXWideString();
+    CFX_WideString sPart;
 
-	if (str.GetAt(0) == L'.' || str.GetAt(0) == L',')
-		str = L"0" + str;
+    if (str.GetAt(0) == L'.' || str.GetAt(0) == L',')
+        str = L"0" + str;
 
-	int nIndex = 0;
-	for (int i=0, sz=str.GetLength(); i<sz; i++)
-	{
-		FX_WCHAR wc = str.GetAt(i);
-		if (IsDigit((wchar_t)wc))
-		{
-			sPart += wc;
-		}
-		else
-		{
-			if (sPart.GetLength() > 0)
-			{
-				nums.SetElement(nIndex,CJS_Value(isolate,sPart.c_str()));
-				sPart = L"";
-				nIndex ++;
-			}
-		}
-	}
+    int nIndex = 0;
+    for (int i=0, sz=str.GetLength(); i<sz; i++)
+    {
+        FX_WCHAR wc = str.GetAt(i);
+        if (IsDigit((wchar_t)wc))
+        {
+            sPart += wc;
+        }
+        else
+        {
+            if (sPart.GetLength() > 0)
+            {
+                nums.SetElement(nIndex,CJS_Value(isolate,sPart.c_str()));
+                sPart = L"";
+                nIndex ++;
+            }
+        }
+    }
 
-	if (sPart.GetLength() > 0)
-	{
-		nums.SetElement(nIndex,CJS_Value(isolate,sPart.c_str()));
-	}
+    if (sPart.GetLength() > 0)
+    {
+        nums.SetElement(nIndex,CJS_Value(isolate,sPart.c_str()));
+    }
 
-	if (nums.GetLength() > 0)
-		vRet = nums;
-	else
-		vRet.SetNull();
+    if (nums.GetLength() > 0)
+        vRet = nums;
+    else
+        vRet.SetNull();
 
-	return TRUE;
+    return TRUE;
 }
diff --git a/fpdfsdk/src/javascript/global.cpp b/fpdfsdk/src/javascript/global.cpp
index 52b79d3..9733d81 100644
--- a/fpdfsdk/src/javascript/global.cpp
+++ b/fpdfsdk/src/javascript/global.cpp
@@ -92,27 +92,27 @@
 END_JS_STATIC_PROP()
 
 BEGIN_JS_STATIC_METHOD(CJS_Global)
-	JS_STATIC_METHOD_ENTRY(setPersistent)
+    JS_STATIC_METHOD_ENTRY(setPersistent)
 END_JS_STATIC_METHOD()
 
 IMPLEMENT_SPECIAL_JS_CLASS(CJS_Global, global_alternate, global);
 
-FX_BOOL	CJS_Global::InitInstance(IFXJS_Context* cc)
+FX_BOOL CJS_Global::InitInstance(IFXJS_Context* cc)
 {
-	CJS_Context* pContext = (CJS_Context*)cc;
-	ASSERT(pContext != NULL);
+    CJS_Context* pContext = (CJS_Context*)cc;
+    ASSERT(pContext != NULL);
 
-	global_alternate* pGlobal = (global_alternate*)GetEmbedObject();
-	ASSERT(pGlobal != NULL);
+    global_alternate* pGlobal = (global_alternate*)GetEmbedObject();
+    ASSERT(pGlobal != NULL);
 
-	pGlobal->Initial(pContext->GetReaderApp());
+    pGlobal->Initial(pContext->GetReaderApp());
 
-	return TRUE;
+    return TRUE;
 };
 
 global_alternate::global_alternate(CJS_Object* pJSObject)
-	: CJS_EmbedObj(pJSObject),
-	m_pApp(NULL)
+    : CJS_EmbedObj(pJSObject),
+    m_pApp(NULL)
 {
 }
 
@@ -129,472 +129,459 @@
 	UpdateGlobalPersistentVariables();
 }
 
-FX_BOOL	global_alternate::QueryProperty(const FX_WCHAR* propname)
+FX_BOOL global_alternate::QueryProperty(const FX_WCHAR* propname)
 {
-	return CFX_WideString(propname) != L"setPersistent";
+    return CFX_WideString(propname) != L"setPersistent";
 }
 
-FX_BOOL	global_alternate::DelProperty(IFXJS_Context* cc, const FX_WCHAR* propname, CFX_WideString& sError)
+FX_BOOL global_alternate::DelProperty(IFXJS_Context* cc, const FX_WCHAR* propname, CFX_WideString& sError)
 {
-	js_global_data* pData = NULL;
-	CFX_ByteString sPropName = CFX_ByteString::FromUnicode(propname);
+    js_global_data* pData = NULL;
+    CFX_ByteString sPropName = CFX_ByteString::FromUnicode(propname);
 
-	if (m_mapGlobal.Lookup(sPropName, (void*&)pData))
-	{
-		pData->bDeleted = TRUE;
-		return TRUE;
-	}
+    if (m_mapGlobal.Lookup(sPropName, (void*&)pData))
+    {
+        pData->bDeleted = TRUE;
+        return TRUE;
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
 FX_BOOL global_alternate::DoProperty(IFXJS_Context* cc, const FX_WCHAR* propname, CJS_PropValue& vp, CFX_WideString& sError)
 {
-	if (vp.IsSetting())
-	{
-		CFX_ByteString sPropName = CFX_ByteString::FromUnicode(propname);
-		switch (vp.GetType())
-		{
-		case VT_number:
-			{
-				double dData;
-				vp >> dData;
-				return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_NUMBER, dData, false, "", v8::Local<v8::Object>(), FALSE);
-			}
-		case VT_boolean:
-			{
-				bool bData;
-				vp >> bData;
-				return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_BOOLEAN, 0, bData, "", v8::Local<v8::Object>(), FALSE);
-			}
-		case VT_string:
-			{
-				CFX_ByteString sData;
-				vp >> sData;
-				return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_STRING, 0, false, sData, v8::Local<v8::Object>(), FALSE);
-			}
-		case VT_object:
-			{
-				JSObject pData;
-				vp >> pData;
-				return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_OBJECT, 0, false, "", pData, FALSE);
-			}
-		case VT_null:
-			{
-				return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_NULL, 0, false, "", v8::Local<v8::Object>(), FALSE);
-			}
-		case VT_undefined:
-			{
-				DelProperty(cc, propname, sError);
-				return TRUE;
-			}
-		default:
-			return FALSE;
-		}
-	}
-	else
-	{
-		js_global_data* pData = NULL;
-		CFX_ByteString sPropName = CFX_ByteString::FromUnicode(propname);
+    if (vp.IsSetting())
+    {
+        CFX_ByteString sPropName = CFX_ByteString::FromUnicode(propname);
+        switch (vp.GetType())
+        {
+        case VT_number:
+            {
+                double dData;
+                vp >> dData;
+                return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_NUMBER, dData, false, "", v8::Local<v8::Object>(), FALSE);
+            }
+        case VT_boolean:
+            {
+                bool bData;
+                vp >> bData;
+                return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_BOOLEAN, 0, bData, "", v8::Local<v8::Object>(), FALSE);
+            }
+        case VT_string:
+            {
+                CFX_ByteString sData;
+                vp >> sData;
+                return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_STRING, 0, false, sData, v8::Local<v8::Object>(), FALSE);
+            }
+        case VT_object:
+            {
+                JSObject pData;
+                vp >> pData;
+                return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_OBJECT, 0, false, "", pData, FALSE);
+            }
+        case VT_null:
+            {
+                return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_NULL, 0, false, "", v8::Local<v8::Object>(), FALSE);
+            }
+        case VT_undefined:
+            {
+                DelProperty(cc, propname, sError);
+                return TRUE;
+            }
+        default:
+            break;
+        }
+    }
+    else
+    {
+        void* pVoid = nullptr;
+        if (!m_mapGlobal.Lookup(CFX_ByteString::FromUnicode(propname), pVoid))
+        {
+            vp.SetNull();
+            return TRUE;
+        }
+        if (!pVoid)
+        {
+            vp.SetNull();
+            return TRUE;
+        }
+        js_global_data* pData = (js_global_data*)pVoid;
+        if (pData->bDeleted)
+            return TRUE;
 
-		if (m_mapGlobal.Lookup(sPropName, (void*&)pData))
-		{
-			if (pData)
-			{
-				if (!pData->bDeleted)
-				{
-					switch (pData->nType)
-					{
-					case JS_GLOBALDATA_TYPE_NUMBER:
-						vp << pData->dData;
-						break;
-					case JS_GLOBALDATA_TYPE_BOOLEAN:
-						vp << pData->bData;
-						break;
-					case JS_GLOBALDATA_TYPE_STRING:
-						vp << pData->sData;
-						break;
-					case JS_GLOBALDATA_TYPE_OBJECT:
-						{
-							v8::Local<v8::Object> obj = v8::Local<v8::Object>::New(vp.GetIsolate(),pData->pData);
-							vp << obj;
-							break;
-						}
-					case JS_GLOBALDATA_TYPE_NULL:
-						vp.SetNull();
-						break;
-					default:
-						return FALSE;
-					}
-					return TRUE;
-				}
-				else
-				{
-					return TRUE;
-				}
-			}
-			else
-			{
-				vp.SetNull();
-				return TRUE;
-			}
-		}
-		else
-		{
-			vp.SetNull();
-			return TRUE;
-		}
-	}
-
-	return FALSE;
+        switch (pData->nType)
+        {
+            case JS_GLOBALDATA_TYPE_NUMBER:
+                vp << pData->dData;
+                return TRUE;
+            case JS_GLOBALDATA_TYPE_BOOLEAN:
+                vp << pData->bData;
+                return TRUE;
+            case JS_GLOBALDATA_TYPE_STRING:
+                vp << pData->sData;
+                return TRUE;
+            case JS_GLOBALDATA_TYPE_OBJECT:
+                {
+                    v8::Local<v8::Object> obj = v8::Local<v8::Object>::New(vp.GetIsolate(),pData->pData);
+                    vp << obj;
+                    return TRUE;
+                }
+            case JS_GLOBALDATA_TYPE_NULL:
+                vp.SetNull();
+                return TRUE;
+            default:
+                break;
+        }
+    }
+    return FALSE;
 }
 
 FX_BOOL global_alternate::setPersistent(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	CJS_Context* pContext = static_cast<CJS_Context*>(cc);
-	if (params.size() != 2)
-	{
-		sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
-		return FALSE;
-	}
+    CJS_Context* pContext = static_cast<CJS_Context*>(cc);
+    if (params.size() != 2)
+    {
+        sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+        return FALSE;
+    }
 
-	CFX_ByteString sName = params[0].ToCFXByteString();
+    CFX_ByteString sName = params[0].ToCFXByteString();
 
-	js_global_data* pData = NULL;
-	if (m_mapGlobal.Lookup(sName, (void*&)pData))
-	{
-		if (pData && !pData->bDeleted)
-		{
-			pData->bPersistent = params[1].ToBool();
-			return TRUE;
-		}
-	}
+    js_global_data* pData = NULL;
+    if (m_mapGlobal.Lookup(sName, (void*&)pData))
+    {
+        if (pData && !pData->bDeleted)
+        {
+            pData->bPersistent = params[1].ToBool();
+            return TRUE;
+        }
+    }
 
-	sError = JSGetStringFromID(pContext, IDS_STRING_JSNOGLOBAL);
-	return FALSE;
+    sError = JSGetStringFromID(pContext, IDS_STRING_JSNOGLOBAL);
+    return FALSE;
 }
 
 void global_alternate::UpdateGlobalPersistentVariables()
 {
-	ASSERT(m_pGlobalData != NULL);
+    ASSERT(m_pGlobalData != NULL);
 
-	for (int i=0,sz=m_pGlobalData->GetSize(); i<sz; i++)
-	{
-		CJS_GlobalData_Element* pData = m_pGlobalData->GetAt(i);
-		ASSERT(pData != NULL);
+    for (int i=0,sz=m_pGlobalData->GetSize(); i<sz; i++)
+    {
+        CJS_GlobalData_Element* pData = m_pGlobalData->GetAt(i);
+        ASSERT(pData != NULL);
 
-		switch (pData->data.nType)
-		{
-		case JS_GLOBALDATA_TYPE_NUMBER:
-			SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_NUMBER, pData->data.dData, false, "", v8::Local<v8::Object>(), pData->bPersistent == 1);
-			JS_PutObjectNumber(NULL,(JSFXObject)(*m_pJSObject),
-							   pData->data.sKey.UTF8Decode().c_str(), pData->data.dData);
-			break;
-		case JS_GLOBALDATA_TYPE_BOOLEAN:
-			SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_BOOLEAN, 0, (bool)(pData->data.bData == 1), "", v8::Local<v8::Object>(), pData->bPersistent == 1);
-			JS_PutObjectBoolean(NULL,(JSFXObject)(*m_pJSObject),
-								pData->data.sKey.UTF8Decode().c_str(), (bool)(pData->data.bData == 1));
-			break;
-		case JS_GLOBALDATA_TYPE_STRING:
-			SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_STRING, 0, false, pData->data.sData, v8::Local<v8::Object>(), pData->bPersistent == 1);
-			JS_PutObjectString(NULL, (JSFXObject)(*m_pJSObject),
-							   pData->data.sKey.UTF8Decode().c_str(),
-							   pData->data.sData.UTF8Decode().c_str());
-			break;
-		case JS_GLOBALDATA_TYPE_OBJECT:
-			{
-				IJS_Runtime* pRuntime = JS_GetRuntime((JSFXObject)(*m_pJSObject));
-				v8::Local<v8::Object> pObj = JS_NewFxDynamicObj(pRuntime, NULL, -1);
+        switch (pData->data.nType)
+        {
+        case JS_GLOBALDATA_TYPE_NUMBER:
+            SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_NUMBER, pData->data.dData, false, "", v8::Local<v8::Object>(), pData->bPersistent == 1);
+            JS_PutObjectNumber(NULL,(JSFXObject)(*m_pJSObject),
+                               pData->data.sKey.UTF8Decode().c_str(), pData->data.dData);
+            break;
+        case JS_GLOBALDATA_TYPE_BOOLEAN:
+            SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_BOOLEAN, 0, (bool)(pData->data.bData == 1), "", v8::Local<v8::Object>(), pData->bPersistent == 1);
+            JS_PutObjectBoolean(NULL,(JSFXObject)(*m_pJSObject),
+                                pData->data.sKey.UTF8Decode().c_str(), (bool)(pData->data.bData == 1));
+            break;
+        case JS_GLOBALDATA_TYPE_STRING:
+            SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_STRING, 0, false, pData->data.sData, v8::Local<v8::Object>(), pData->bPersistent == 1);
+            JS_PutObjectString(NULL, (JSFXObject)(*m_pJSObject),
+                               pData->data.sKey.UTF8Decode().c_str(),
+                               pData->data.sData.UTF8Decode().c_str());
+            break;
+        case JS_GLOBALDATA_TYPE_OBJECT:
+            {
+                IJS_Runtime* pRuntime = JS_GetRuntime((JSFXObject)(*m_pJSObject));
+                v8::Local<v8::Object> pObj = JS_NewFxDynamicObj(pRuntime, NULL, -1);
 
-				PutObjectProperty(pObj, &pData->data);
+                PutObjectProperty(pObj, &pData->data);
 
-				SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_OBJECT, 0, false, "",
-					(JSObject)pObj, pData->bPersistent == 1);
-				JS_PutObjectObject(NULL,(JSFXObject)(*m_pJSObject),
-								   pData->data.sKey.UTF8Decode().c_str(), (JSObject)pObj);
-			}
-			break;
-		case JS_GLOBALDATA_TYPE_NULL:
-			SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_NULL, 0, false, "", v8::Local<v8::Object>(), pData->bPersistent == 1);
-			JS_PutObjectNull(NULL,(JSFXObject)(*m_pJSObject),
-							 pData->data.sKey.UTF8Decode().c_str());
-			break;
-		}
-	}
+                SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_OBJECT, 0, false, "",
+                    (JSObject)pObj, pData->bPersistent == 1);
+                JS_PutObjectObject(NULL,(JSFXObject)(*m_pJSObject),
+                                   pData->data.sKey.UTF8Decode().c_str(), (JSObject)pObj);
+            }
+            break;
+        case JS_GLOBALDATA_TYPE_NULL:
+            SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_NULL, 0, false, "", v8::Local<v8::Object>(), pData->bPersistent == 1);
+            JS_PutObjectNull(NULL,(JSFXObject)(*m_pJSObject),
+                             pData->data.sKey.UTF8Decode().c_str());
+            break;
+        }
+    }
 }
 
 void global_alternate::CommitGlobalPersisitentVariables()
 {
-	ASSERT(m_pGlobalData != NULL);
+    ASSERT(m_pGlobalData != NULL);
 
-	FX_POSITION	 pos = m_mapGlobal.GetStartPosition();
-	while (pos)
-	{
-		CFX_ByteString name;
-		js_global_data* pData = NULL;
-		m_mapGlobal.GetNextAssoc(pos, name, (void*&)pData);
+    FX_POSITION  pos = m_mapGlobal.GetStartPosition();
+    while (pos)
+    {
+        CFX_ByteString name;
+        js_global_data* pData = NULL;
+        m_mapGlobal.GetNextAssoc(pos, name, (void*&)pData);
 
-		if (pData)
-		{
-			if (pData->bDeleted)
-			{
-				m_pGlobalData->DeleteGlobalVariable(name);
-			}
-			else
-			{
-				switch (pData->nType)
-				{
-				case JS_GLOBALDATA_TYPE_NUMBER:
-					m_pGlobalData->SetGlobalVariableNumber(name, pData->dData);
-					m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
-					break;
-				case JS_GLOBALDATA_TYPE_BOOLEAN:
-					m_pGlobalData->SetGlobalVariableBoolean(name, pData->bData);
-					m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
-					break;
-				case JS_GLOBALDATA_TYPE_STRING:
-					m_pGlobalData->SetGlobalVariableString(name, pData->sData);
-					m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
-					break;
-				case JS_GLOBALDATA_TYPE_OBJECT:
-					//if (pData->pData)
-					{
-						CJS_GlobalVariableArray array;
-						v8::Local<v8::Object> obj = v8::Local<v8::Object>::New(GetJSObject()->GetIsolate(),pData->pData);
-						ObjectToArray(obj, array);
-						m_pGlobalData->SetGlobalVariableObject(name, array);
-						m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
-					}
-					break;
-				case JS_GLOBALDATA_TYPE_NULL:
-					m_pGlobalData->SetGlobalVariableNull(name);
-					m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
-					break;
-				}
-			}
-		}
-	}
+        if (pData)
+        {
+            if (pData->bDeleted)
+            {
+                m_pGlobalData->DeleteGlobalVariable(name);
+            }
+            else
+            {
+                switch (pData->nType)
+                {
+                case JS_GLOBALDATA_TYPE_NUMBER:
+                    m_pGlobalData->SetGlobalVariableNumber(name, pData->dData);
+                    m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
+                    break;
+                case JS_GLOBALDATA_TYPE_BOOLEAN:
+                    m_pGlobalData->SetGlobalVariableBoolean(name, pData->bData);
+                    m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
+                    break;
+                case JS_GLOBALDATA_TYPE_STRING:
+                    m_pGlobalData->SetGlobalVariableString(name, pData->sData);
+                    m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
+                    break;
+                case JS_GLOBALDATA_TYPE_OBJECT:
+                    //if (pData->pData)
+                    {
+                        CJS_GlobalVariableArray array;
+                        v8::Local<v8::Object> obj = v8::Local<v8::Object>::New(GetJSObject()->GetIsolate(),pData->pData);
+                        ObjectToArray(obj, array);
+                        m_pGlobalData->SetGlobalVariableObject(name, array);
+                        m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
+                    }
+                    break;
+                case JS_GLOBALDATA_TYPE_NULL:
+                    m_pGlobalData->SetGlobalVariableNull(name);
+                    m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
+                    break;
+                }
+            }
+        }
+    }
 }
 
 void global_alternate::ObjectToArray(v8::Local<v8::Object> pObj, CJS_GlobalVariableArray& array)
 {
-	v8::Local<v8::Context> context = pObj->CreationContext();
-	v8::Isolate* isolate = context->GetIsolate();
-	v8::Local<v8::Array> pKeyList = JS_GetObjectElementNames(isolate, pObj);
-	int	nObjElements = pKeyList->Length();
+    v8::Local<v8::Context> context = pObj->CreationContext();
+    v8::Isolate* isolate = context->GetIsolate();
+    v8::Local<v8::Array> pKeyList = JS_GetObjectElementNames(isolate, pObj);
+    int nObjElements = pKeyList->Length();
 
-	for (int i=0; i<nObjElements; i++)
-	{
+    for (int i=0; i<nObjElements; i++)
+    {
 
-		CFX_WideString ws = JS_ToString(isolate, JS_GetArrayElement(isolate, pKeyList, i));
-		CFX_ByteString sKey = ws.UTF8Encode();
+        CFX_WideString ws = JS_ToString(isolate, JS_GetArrayElement(isolate, pKeyList, i));
+        CFX_ByteString sKey = ws.UTF8Encode();
 
-		v8::Local<v8::Value> v = JS_GetObjectElement(isolate, pObj, ws.c_str());
-		FXJSVALUETYPE vt = GET_VALUE_TYPE(v);
-		switch (vt)
-		{
-		case VT_number:
-			{
-				CJS_KeyValue* pObjElement = new CJS_KeyValue;
-				pObjElement->nType = JS_GLOBALDATA_TYPE_NUMBER;
-				pObjElement->sKey = sKey;
-				pObjElement->dData = JS_ToNumber(isolate, v);
-				array.Add(pObjElement);
-			}
-			break;
-		case VT_boolean:
-			{
-				CJS_KeyValue* pObjElement = new CJS_KeyValue;
-				pObjElement->nType = JS_GLOBALDATA_TYPE_BOOLEAN;
-				pObjElement->sKey = sKey;
-				pObjElement->dData = JS_ToBoolean(isolate, v);
-				array.Add(pObjElement);
-			}
-			break;
-		case 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;
-				pObjElement->sData = sValue;
-				array.Add(pObjElement);
-			}
-			break;
-		case VT_object:
-			{
-				CJS_KeyValue* pObjElement = new CJS_KeyValue;
-				pObjElement->nType = JS_GLOBALDATA_TYPE_OBJECT;
-				pObjElement->sKey = sKey;
-				ObjectToArray(JS_ToObject(isolate, v), pObjElement->objData);
-				array.Add(pObjElement);
-			}
-			break;
-		case VT_null:
-			{
-				CJS_KeyValue* pObjElement = new CJS_KeyValue;
-				pObjElement->nType = JS_GLOBALDATA_TYPE_NULL;
-				pObjElement->sKey = sKey;
-				array.Add(pObjElement);
-			}
-			break;
-		default:
-			break;
-		}
-	}
+        v8::Local<v8::Value> v = JS_GetObjectElement(isolate, pObj, ws.c_str());
+        FXJSVALUETYPE vt = GET_VALUE_TYPE(v);
+        switch (vt)
+        {
+        case VT_number:
+            {
+                CJS_KeyValue* pObjElement = new CJS_KeyValue;
+                pObjElement->nType = JS_GLOBALDATA_TYPE_NUMBER;
+                pObjElement->sKey = sKey;
+                pObjElement->dData = JS_ToNumber(isolate, v);
+                array.Add(pObjElement);
+            }
+            break;
+        case VT_boolean:
+            {
+                CJS_KeyValue* pObjElement = new CJS_KeyValue;
+                pObjElement->nType = JS_GLOBALDATA_TYPE_BOOLEAN;
+                pObjElement->sKey = sKey;
+                pObjElement->dData = JS_ToBoolean(isolate, v);
+                array.Add(pObjElement);
+            }
+            break;
+        case 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;
+                pObjElement->sData = sValue;
+                array.Add(pObjElement);
+            }
+            break;
+        case VT_object:
+            {
+                CJS_KeyValue* pObjElement = new CJS_KeyValue;
+                pObjElement->nType = JS_GLOBALDATA_TYPE_OBJECT;
+                pObjElement->sKey = sKey;
+                ObjectToArray(JS_ToObject(isolate, v), pObjElement->objData);
+                array.Add(pObjElement);
+            }
+            break;
+        case VT_null:
+            {
+                CJS_KeyValue* pObjElement = new CJS_KeyValue;
+                pObjElement->nType = JS_GLOBALDATA_TYPE_NULL;
+                pObjElement->sKey = sKey;
+                array.Add(pObjElement);
+            }
+            break;
+        default:
+            break;
+        }
+    }
 }
 
 void global_alternate::PutObjectProperty(v8::Local<v8::Object> pObj, CJS_KeyValue* pData)
 {
-	ASSERT(pData != NULL);
+    ASSERT(pData != NULL);
 
-	for (int i=0,sz=pData->objData.Count(); i<sz; i++)
-	{
-		CJS_KeyValue* pObjData = pData->objData.GetAt(i);
-		ASSERT(pObjData != NULL);
+    for (int i=0,sz=pData->objData.Count(); i<sz; i++)
+    {
+        CJS_KeyValue* pObjData = pData->objData.GetAt(i);
+        ASSERT(pObjData != NULL);
 
-		switch (pObjData->nType)
-		{
-		case JS_GLOBALDATA_TYPE_NUMBER:
-			JS_PutObjectNumber(NULL,(JSObject)pObj, pObjData->sKey.UTF8Decode().c_str(), pObjData->dData);
-			break;
-		case JS_GLOBALDATA_TYPE_BOOLEAN:
-			JS_PutObjectBoolean(NULL,(JSObject)pObj, pObjData->sKey.UTF8Decode().c_str(), (bool)(pObjData->bData == 1));
-			break;
-		case JS_GLOBALDATA_TYPE_STRING:
-			JS_PutObjectString(NULL,(JSObject)pObj, pObjData->sKey.UTF8Decode().c_str(), pObjData->sData.UTF8Decode().c_str());
-			break;
-		case JS_GLOBALDATA_TYPE_OBJECT:
-			{
-				IJS_Runtime* pRuntime = JS_GetRuntime((JSFXObject)(*m_pJSObject));
-				v8::Local<v8::Object> pNewObj = JS_NewFxDynamicObj(pRuntime, NULL, -1);
-				PutObjectProperty(pNewObj, pObjData);
-				JS_PutObjectObject(NULL, (JSObject)pObj, pObjData->sKey.UTF8Decode().c_str(), (JSObject)pNewObj);
-			}
-			break;
-		case JS_GLOBALDATA_TYPE_NULL:
-			JS_PutObjectNull(NULL,(JSObject)pObj, pObjData->sKey.UTF8Decode().c_str());
-			break;
-		}
-	}
+        switch (pObjData->nType)
+        {
+        case JS_GLOBALDATA_TYPE_NUMBER:
+            JS_PutObjectNumber(NULL,(JSObject)pObj, pObjData->sKey.UTF8Decode().c_str(), pObjData->dData);
+            break;
+        case JS_GLOBALDATA_TYPE_BOOLEAN:
+            JS_PutObjectBoolean(NULL,(JSObject)pObj, pObjData->sKey.UTF8Decode().c_str(), (bool)(pObjData->bData == 1));
+            break;
+        case JS_GLOBALDATA_TYPE_STRING:
+            JS_PutObjectString(NULL,(JSObject)pObj, pObjData->sKey.UTF8Decode().c_str(), pObjData->sData.UTF8Decode().c_str());
+            break;
+        case JS_GLOBALDATA_TYPE_OBJECT:
+            {
+                IJS_Runtime* pRuntime = JS_GetRuntime((JSFXObject)(*m_pJSObject));
+                v8::Local<v8::Object> pNewObj = JS_NewFxDynamicObj(pRuntime, NULL, -1);
+                PutObjectProperty(pNewObj, pObjData);
+                JS_PutObjectObject(NULL, (JSObject)pObj, pObjData->sKey.UTF8Decode().c_str(), (JSObject)pNewObj);
+            }
+            break;
+        case JS_GLOBALDATA_TYPE_NULL:
+            JS_PutObjectNull(NULL,(JSObject)pObj, pObjData->sKey.UTF8Decode().c_str());
+            break;
+        }
+    }
 }
 
 void global_alternate::DestroyGlobalPersisitentVariables()
 {
-	FX_POSITION	 pos = m_mapGlobal.GetStartPosition();
-	while (pos)
-	{
-		CFX_ByteString name;
-		js_global_data* pData = NULL;
-		m_mapGlobal.GetNextAssoc(pos, name, (void*&)pData);
-		delete pData;
-	}
+    FX_POSITION  pos = m_mapGlobal.GetStartPosition();
+    while (pos)
+    {
+        CFX_ByteString name;
+        js_global_data* pData = NULL;
+        m_mapGlobal.GetNextAssoc(pos, name, (void*&)pData);
+        delete pData;
+    }
 
-	m_mapGlobal.RemoveAll();
+    m_mapGlobal.RemoveAll();
 }
 
 
 FX_BOOL global_alternate::SetGlobalVariables(const FX_CHAR* propname, int nType,
-				double dData, bool bData, const CFX_ByteString& sData, JSObject pData, bool bDefaultPersistent)
+                double dData, bool bData, const CFX_ByteString& sData, JSObject pData, bool bDefaultPersistent)
 {
-	if (propname == NULL) return FALSE;
+    if (propname == NULL) return FALSE;
 
-	js_global_data* pTemp = NULL;
-	m_mapGlobal.Lookup(propname, (void*&)pTemp);
+    js_global_data* pTemp = NULL;
+    m_mapGlobal.Lookup(propname, (void*&)pTemp);
 
-	if (pTemp)
-	{
-		if (pTemp->bDeleted || pTemp->nType != nType)
-		{
-			pTemp->dData = 0;
-			pTemp->bData = 0;
-			pTemp->sData = "";
-			pTemp->nType = nType;
-		}
+    if (pTemp)
+    {
+        if (pTemp->bDeleted || pTemp->nType != nType)
+        {
+            pTemp->dData = 0;
+            pTemp->bData = 0;
+            pTemp->sData = "";
+            pTemp->nType = nType;
+        }
 
-		pTemp->bDeleted = FALSE;
+        pTemp->bDeleted = FALSE;
 
-		switch (nType)
-		{
-		case JS_GLOBALDATA_TYPE_NUMBER:
-			{
-				pTemp->dData = dData;
-			}
-			break;
-		case JS_GLOBALDATA_TYPE_BOOLEAN:
-			{
-				pTemp->bData = bData;
-			}
-			break;
-		case JS_GLOBALDATA_TYPE_STRING:
-			{
-				pTemp->sData = sData;
-			}
-			break;
-		case JS_GLOBALDATA_TYPE_OBJECT:
-			{
-				pTemp->pData.Reset(JS_GetRuntime(pData), pData);
-			}
-			break;
-		case JS_GLOBALDATA_TYPE_NULL:
-			break;
-		default:
-			return FALSE;
-		}
+        switch (nType)
+        {
+        case JS_GLOBALDATA_TYPE_NUMBER:
+            {
+                pTemp->dData = dData;
+            }
+            break;
+        case JS_GLOBALDATA_TYPE_BOOLEAN:
+            {
+                pTemp->bData = bData;
+            }
+            break;
+        case JS_GLOBALDATA_TYPE_STRING:
+            {
+                pTemp->sData = sData;
+            }
+            break;
+        case JS_GLOBALDATA_TYPE_OBJECT:
+            {
+                pTemp->pData.Reset(JS_GetRuntime(pData), pData);
+            }
+            break;
+        case JS_GLOBALDATA_TYPE_NULL:
+            break;
+        default:
+            return FALSE;
+        }
 
-		return TRUE;
-	}
+        return TRUE;
+    }
 
-	js_global_data* pNewData = NULL;
+    js_global_data* pNewData = NULL;
 
-	switch (nType)
-	{
-	case JS_GLOBALDATA_TYPE_NUMBER:
-		{
-			pNewData = new js_global_data;
-			pNewData->nType = JS_GLOBALDATA_TYPE_NUMBER;
-			pNewData->dData = dData;
-			pNewData->bPersistent = bDefaultPersistent;
-		}
-		break;
-	case JS_GLOBALDATA_TYPE_BOOLEAN:
-		{
-			pNewData = new js_global_data;
-			pNewData->nType = JS_GLOBALDATA_TYPE_BOOLEAN;
-			pNewData->bData = bData;
-			pNewData->bPersistent = bDefaultPersistent;
-		}
-		break;
-	case JS_GLOBALDATA_TYPE_STRING:
-		{
-			pNewData = new js_global_data;
-			pNewData->nType = JS_GLOBALDATA_TYPE_STRING;
-			pNewData->sData = sData;
-			pNewData->bPersistent = bDefaultPersistent;
-		}
-		break;
-	case JS_GLOBALDATA_TYPE_OBJECT:
-		{
-			pNewData = new js_global_data;
-			pNewData->nType = JS_GLOBALDATA_TYPE_OBJECT;
-			pNewData->pData.Reset(JS_GetRuntime(pData), pData);
-			pNewData->bPersistent = bDefaultPersistent;
-		}
-		break;
-	case JS_GLOBALDATA_TYPE_NULL:
-		{
-			pNewData = new js_global_data;
-			pNewData->nType = JS_GLOBALDATA_TYPE_NULL;
-			pNewData->bPersistent = bDefaultPersistent;
-		}
-		break;
-	default:
-		return FALSE;
-	}
+    switch (nType)
+    {
+    case JS_GLOBALDATA_TYPE_NUMBER:
+        {
+            pNewData = new js_global_data;
+            pNewData->nType = JS_GLOBALDATA_TYPE_NUMBER;
+            pNewData->dData = dData;
+            pNewData->bPersistent = bDefaultPersistent;
+        }
+        break;
+    case JS_GLOBALDATA_TYPE_BOOLEAN:
+        {
+            pNewData = new js_global_data;
+            pNewData->nType = JS_GLOBALDATA_TYPE_BOOLEAN;
+            pNewData->bData = bData;
+            pNewData->bPersistent = bDefaultPersistent;
+        }
+        break;
+    case JS_GLOBALDATA_TYPE_STRING:
+        {
+            pNewData = new js_global_data;
+            pNewData->nType = JS_GLOBALDATA_TYPE_STRING;
+            pNewData->sData = sData;
+            pNewData->bPersistent = bDefaultPersistent;
+        }
+        break;
+    case JS_GLOBALDATA_TYPE_OBJECT:
+        {
+            pNewData = new js_global_data;
+            pNewData->nType = JS_GLOBALDATA_TYPE_OBJECT;
+            pNewData->pData.Reset(JS_GetRuntime(pData), pData);
+            pNewData->bPersistent = bDefaultPersistent;
+        }
+        break;
+    case JS_GLOBALDATA_TYPE_NULL:
+        {
+            pNewData = new js_global_data;
+            pNewData->nType = JS_GLOBALDATA_TYPE_NULL;
+            pNewData->bPersistent = bDefaultPersistent;
+        }
+        break;
+    default:
+        return FALSE;
+    }
 
-	m_mapGlobal.SetAt(propname, (void*)pNewData);
+    m_mapGlobal.SetAt(propname, (void*)pNewData);
 
-	return TRUE;
+    return TRUE;
 }
 
 FXJSVALUETYPE GET_VALUE_TYPE(v8::Local<v8::Value> p)
@@ -620,4 +607,3 @@
 
   return VT_unknown;
 }
-
diff --git a/fpdfsdk/src/javascript/util.cpp b/fpdfsdk/src/javascript/util.cpp
index c4f0309..4083ed5 100644
--- a/fpdfsdk/src/javascript/util.cpp
+++ b/fpdfsdk/src/javascript/util.cpp
@@ -22,13 +22,13 @@
 
 static v8::Isolate* GetIsolate(IFXJS_Context* cc)
 {
-	CJS_Context* pContext = (CJS_Context *)cc;
-	ASSERT(pContext != NULL);
+    CJS_Context* pContext = (CJS_Context *)cc;
+    ASSERT(pContext != NULL);
 
-	CJS_Runtime* pRuntime = pContext->GetJSRuntime();
-	ASSERT(pRuntime != NULL);
+    CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+    ASSERT(pRuntime != NULL);
 
-	return pRuntime->GetIsolate();
+    return pRuntime->GetIsolate();
 }
 
 BEGIN_JS_STATIC_CONST(CJS_Util)
@@ -38,11 +38,11 @@
 END_JS_STATIC_PROP()
 
 BEGIN_JS_STATIC_METHOD(CJS_Util)
-	JS_STATIC_METHOD_ENTRY(printd)
-	JS_STATIC_METHOD_ENTRY(printf)
-	JS_STATIC_METHOD_ENTRY(printx)
-	JS_STATIC_METHOD_ENTRY(scand)
-	JS_STATIC_METHOD_ENTRY(byteToChar)
+    JS_STATIC_METHOD_ENTRY(printd)
+    JS_STATIC_METHOD_ENTRY(printf)
+    JS_STATIC_METHOD_ENTRY(printx)
+    JS_STATIC_METHOD_ENTRY(scand)
+    JS_STATIC_METHOD_ENTRY(byteToChar)
 END_JS_STATIC_METHOD()
 
 IMPLEMENT_JS_CLASS(CJS_Util,util)
@@ -58,549 +58,539 @@
 
 struct stru_TbConvert
 {
-	const FX_WCHAR* lpszJSMark;
-	const FX_WCHAR* lpszCppMark;
+    const FX_WCHAR* lpszJSMark;
+    const FX_WCHAR* lpszCppMark;
 };
 
 const stru_TbConvert fcTable[] = {
-	{ L"mmmm", L"%B" },
-	{ L"mmm", L"%b" },
-	{ L"mm",  L"%m" },
-	//"m"
-	{ L"dddd", L"%A" },
-	{ L"ddd", L"%a" },
-	{ L"dd",  L"%d" },
-	//"d",   "%w",
-	{ L"yyyy", L"%Y" },
-	{ L"yy",  L"%y" },
-	{ L"HH",  L"%H" },
-	//"H"
-	{ L"hh",  L"%I" },
-	//"h"
-	{ L"MM",  L"%M" },
-	//"M"
-	{ L"ss",  L"%S" },
-	//"s
-	{ L"TT",  L"%p" },
-	//"t"
+    { L"mmmm", L"%B" },
+    { L"mmm", L"%b" },
+    { L"mm",  L"%m" },
+    //"m"
+    { L"dddd", L"%A" },
+    { L"ddd", L"%a" },
+    { L"dd",  L"%d" },
+    //"d",   "%w",
+    { L"yyyy", L"%Y" },
+    { L"yy",  L"%y" },
+    { L"HH",  L"%H" },
+    //"H"
+    { L"hh",  L"%I" },
+    //"h"
+    { L"MM",  L"%M" },
+    //"M"
+    { L"ss",  L"%S" },
+    //"s
+    { L"TT",  L"%p" },
+    //"t"
 #if defined(_WIN32)
-	{ L"tt",  L"%p" },
-	{ L"h",  L"%#I" },
+    { L"tt",  L"%p" },
+    { L"h",  L"%#I" },
 #else
-	{ L"tt",  L"%P" },
-	{ L"h",  L"%l" },
+    { L"tt",  L"%P" },
+    { L"h",  L"%l" },
 #endif
 };
 
-#define UTIL_INT			0
-#define UTIL_DOUBLE			1
-#define UTIL_STRING			2
+#define UTIL_INT            0
+#define UTIL_DOUBLE         1
+#define UTIL_STRING         2
 
 int util::ParstDataType(std::wstring* sFormat)
 {
-        size_t i = 0;
-	bool bPercent = FALSE;
-	for (i=0; i<sFormat->length(); ++i)
-	{
-		wchar_t c = (*sFormat)[i];
-		if (c == L'%')
-		{
-			bPercent = true;
-			continue;
-		}
+    bool bPercent = FALSE;
+    for (size_t i = 0; i < sFormat->length(); ++i)
+    {
+        wchar_t c = (*sFormat)[i];
+        if (c == L'%')
+        {
+            bPercent = true;
+            continue;
+        }
 
-		if (bPercent)
-		{
-			if (c == L'c' || c == L'C' || c == L'd' || c == L'i' || c == L'o' || c == L'u' || c == L'x' || c == L'X')
-			{
-				return UTIL_INT;
-			}
-			else if (c == L'e' || c == L'E' || c == L'f' || c == L'g' || c == L'G')
-			{
-				return UTIL_DOUBLE;
-			}
-			else if (c == L's' || c == L'S')
-			{
-				// Map s to S since we always deal internally
-				// with wchar_t strings.
-				(*sFormat)[i] = L'S';
-				return UTIL_STRING;
-			}
-			else if (c == L'.' || c == L'+' || c == L'-' || c == L'#' || c == L' ' || CJS_PublicMethods::IsDigit(c))
-			{
-				continue;
-			}
-			else break;
-		}
-	}
+        if (bPercent)
+        {
+            if (c == L'c' || c == L'C' || c == L'd' || c == L'i' || c == L'o' || c == L'u' || c == L'x' || c == L'X')
+            {
+                return UTIL_INT;
+            }
+            if (c == L'e' || c == L'E' || c == L'f' || c == L'g' || c == L'G')
+            {
+                return UTIL_DOUBLE;
+            }
+            if (c == L's' || c == L'S')
+            {
+                // Map s to S since we always deal internally
+                // with wchar_t strings.
+                (*sFormat)[i] = L'S';
+                return UTIL_STRING;
+            }
+            if (c == L'.' || c == L'+' || c == L'-' || c == L'#' || c == L' ' || CJS_PublicMethods::IsDigit(c))
+            {
+                continue;
+            }
+            break;
+        }
+    }
 
-	return -1;
+    return -1;
 }
 
 FX_BOOL util::printf(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	int iSize = params.size();
-	if (iSize < 1)
-		return FALSE;
-	std::wstring c_ConvChar(params[0].ToCFXWideString().c_str());
-	std::vector<std::wstring> c_strConvers;
-	int iOffset = 0;
-	int iOffend = 0;
-	c_ConvChar.insert(c_ConvChar.begin(),L'S');
-	while(iOffset != -1)
-	{
-		iOffend = c_ConvChar.find(L"%",iOffset+1);
-		std::wstring strSub;
-		if (iOffend == -1)
-			strSub = c_ConvChar.substr(iOffset);
-		else
-			strSub = c_ConvChar.substr(iOffset ,iOffend - iOffset);
-		c_strConvers.push_back(strSub);
-		iOffset = iOffend ;
-	}
+    int iSize = params.size();
+    if (iSize < 1)
+        return FALSE;
+    std::wstring c_ConvChar(params[0].ToCFXWideString().c_str());
+    std::vector<std::wstring> c_strConvers;
+    int iOffset = 0;
+    int iOffend = 0;
+    c_ConvChar.insert(c_ConvChar.begin(),L'S');
+    while(iOffset != -1)
+    {
+        iOffend = c_ConvChar.find(L"%",iOffset+1);
+        std::wstring strSub;
+        if (iOffend == -1)
+            strSub = c_ConvChar.substr(iOffset);
+        else
+            strSub = c_ConvChar.substr(iOffset ,iOffend - iOffset);
+        c_strConvers.push_back(strSub);
+        iOffset = iOffend ;
+    }
 
-	std::wstring c_strResult;
+    std::wstring c_strResult;
 
-	//for(int iIndex = 1;iIndex < params.size();iIndex++)
-	std::wstring c_strFormat;
-	for(int iIndex = 0;iIndex < (int)c_strConvers.size();iIndex++)
-	{
-		c_strFormat = c_strConvers[iIndex];
-		if (iIndex == 0)
-		{
-			c_strResult = c_strFormat;
-			continue;
-		}
+    //for(int iIndex = 1;iIndex < params.size();iIndex++)
+    std::wstring c_strFormat;
+    for(int iIndex = 0;iIndex < (int)c_strConvers.size();iIndex++)
+    {
+        c_strFormat = c_strConvers[iIndex];
+        if (iIndex == 0)
+        {
+            c_strResult = c_strFormat;
+            continue;
+        }
 
 
-		CFX_WideString strSegment;
-		if (iIndex >= iSize) {
-			c_strResult += c_strFormat;
-			continue;
-		}
+        CFX_WideString strSegment;
+        if (iIndex >= iSize) {
+            c_strResult += c_strFormat;
+            continue;
+        }
 
-		switch (ParstDataType(&c_strFormat))
-		{
-			case UTIL_INT:
-				strSegment.Format(c_strFormat.c_str(), params[iIndex].ToInt());
-				break;
-			case UTIL_DOUBLE:
-				strSegment.Format(c_strFormat.c_str(), params[iIndex].ToDouble());
-				break;
-			case UTIL_STRING:
-				strSegment.Format(c_strFormat.c_str(), params[iIndex].ToCFXWideString().c_str());
-				break;
-			default:
-				strSegment.Format(L"%S", c_strFormat.c_str());
-				break;
-		}
-		c_strResult += strSegment.GetBuffer(strSegment.GetLength()+1);
-	}
+        switch (ParstDataType(&c_strFormat))
+        {
+            case UTIL_INT:
+                strSegment.Format(c_strFormat.c_str(), params[iIndex].ToInt());
+                break;
+            case UTIL_DOUBLE:
+                strSegment.Format(c_strFormat.c_str(), params[iIndex].ToDouble());
+                break;
+            case UTIL_STRING:
+                strSegment.Format(c_strFormat.c_str(), params[iIndex].ToCFXWideString().c_str());
+                break;
+            default:
+                strSegment.Format(L"%S", c_strFormat.c_str());
+                break;
+        }
+        c_strResult += strSegment.GetBuffer(strSegment.GetLength()+1);
+    }
 
-	c_strResult.erase(c_strResult.begin());
-	vRet = c_strResult.c_str();
-	return TRUE;
+    c_strResult.erase(c_strResult.begin());
+    vRet = c_strResult.c_str();
+    return TRUE;
 }
 
 FX_BOOL util::printd(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	v8::Isolate* isolate = GetIsolate(cc);
+    v8::Isolate* isolate = GetIsolate(cc);
 
-	int iSize = params.size();
-	if (iSize < 2)
-		return FALSE;
+    int iSize = params.size();
+    if (iSize < 2)
+        return FALSE;
 
-	CJS_Value p1(isolate);
-	p1 = params[0];
+    CJS_Value p1(isolate);
+    p1 = params[0];
 
-	CJS_Value p2 = params[1];
-	CJS_Date jsDate(isolate);
-	if (!p2.ConvertToDate(jsDate))
-	{
-		sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPRINT1);
-		return FALSE;
-	}
+    CJS_Value p2 = params[1];
+    CJS_Date jsDate(isolate);
+    if (!p2.ConvertToDate(jsDate))
+    {
+        sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPRINT1);
+        return FALSE;
+    }
 
-	if (!jsDate.IsValidDate())
-	{
-		sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPRINT2);
-		return FALSE;
-	}
+    if (!jsDate.IsValidDate())
+    {
+        sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPRINT2);
+        return FALSE;
+    }
 
-	if (p1.GetType() == VT_number)
-	{
-		int nFormat = p1.ToInt();
-		CFX_WideString swResult;
+    if (p1.GetType() == VT_number)
+    {
+        int nFormat = p1.ToInt();
+        CFX_WideString swResult;
 
-		switch (nFormat)
-		{
-		case 0:
-			swResult.Format(L"D:%04d%02d%02d%02d%02d%02d",
-				jsDate.GetYear(),
-				jsDate.GetMonth() + 1,
-				jsDate.GetDay(),
-				jsDate.GetHours(),
-				jsDate.GetMinutes(),
-				jsDate.GetSeconds());
-			break;
-		case 1:
-			swResult.Format(L"%04d.%02d.%02d %02d:%02d:%02d",
-				jsDate.GetYear(),
-				jsDate.GetMonth() + 1,
-				jsDate.GetDay(),
-				jsDate.GetHours(),
-				jsDate.GetMinutes(),
-				jsDate.GetSeconds());
-			break;
-		case 2:
-			swResult.Format(L"%04d/%02d/%02d %02d:%02d:%02d",
-				jsDate.GetYear(),
-				jsDate.GetMonth() + 1,
-				jsDate.GetDay(),
-				jsDate.GetHours(),
-				jsDate.GetMinutes(),
-				jsDate.GetSeconds());
-			break;
-		default:
-			return FALSE;
-		}
+        switch (nFormat)
+        {
+        case 0:
+            swResult.Format(L"D:%04d%02d%02d%02d%02d%02d",
+                jsDate.GetYear(),
+                jsDate.GetMonth() + 1,
+                jsDate.GetDay(),
+                jsDate.GetHours(),
+                jsDate.GetMinutes(),
+                jsDate.GetSeconds());
+            break;
+        case 1:
+            swResult.Format(L"%04d.%02d.%02d %02d:%02d:%02d",
+                jsDate.GetYear(),
+                jsDate.GetMonth() + 1,
+                jsDate.GetDay(),
+                jsDate.GetHours(),
+                jsDate.GetMinutes(),
+                jsDate.GetSeconds());
+            break;
+        case 2:
+            swResult.Format(L"%04d/%02d/%02d %02d:%02d:%02d",
+                jsDate.GetYear(),
+                jsDate.GetMonth() + 1,
+                jsDate.GetDay(),
+                jsDate.GetHours(),
+                jsDate.GetMinutes(),
+                jsDate.GetSeconds());
+            break;
+        default:
+            return FALSE;
+        }
 
-		vRet = swResult.c_str();
-		return TRUE;
-	}
-	else if (p1.GetType() == VT_string)
-	{
-		std::basic_string<wchar_t> cFormat = p1.ToCFXWideString().c_str();
+        vRet = swResult.c_str();
+        return TRUE;
+    }
+    if (p1.GetType() == VT_string)
+    {
+        std::basic_string<wchar_t> cFormat = p1.ToCFXWideString().c_str();
 
-		bool bXFAPicture = false;
-		if (iSize > 2)
-		{
-			bXFAPicture = params[2].ToBool();
-		}
+        bool bXFAPicture = false;
+        if (iSize > 2)
+        {
+            bXFAPicture = params[2].ToBool();
+        }
 
-		if (bXFAPicture)
-		{
-			return FALSE; //currently, it doesn't support XFAPicture.
-		}
+        if (bXFAPicture)
+        {
+            return FALSE; //currently, it doesn't support XFAPicture.
+        }
 
         int iIndex;
-		for(iIndex = 0;iIndex<sizeof(fcTable)/sizeof(stru_TbConvert);iIndex++)
-		{
-			int iStart = 0;
-			int iEnd;
-			while((iEnd = cFormat.find(fcTable[iIndex].lpszJSMark, iStart)) != -1)
-			{
-				cFormat.replace(iEnd, FXSYS_wcslen(fcTable[iIndex].lpszJSMark), fcTable[iIndex].lpszCppMark);
-				iStart = iEnd;
-			}
-		}
+        for(iIndex = 0;iIndex<sizeof(fcTable)/sizeof(stru_TbConvert);iIndex++)
+        {
+            int iStart = 0;
+            int iEnd;
+            while((iEnd = cFormat.find(fcTable[iIndex].lpszJSMark, iStart)) != -1)
+            {
+                cFormat.replace(iEnd, FXSYS_wcslen(fcTable[iIndex].lpszJSMark), fcTable[iIndex].lpszCppMark);
+                iStart = iEnd;
+            }
+        }
 
-		int iYear,iMonth,iDay,iHour,iMin,iSec;
-		iYear = jsDate.GetYear();
-		iMonth = jsDate.GetMonth();
-		iDay = jsDate.GetDay();
-		iHour = jsDate.GetHours();
-		iMin = jsDate.GetMinutes();
-		iSec = jsDate.GetSeconds();
+        int iYear,iMonth,iDay,iHour,iMin,iSec;
+        iYear = jsDate.GetYear();
+        iMonth = jsDate.GetMonth();
+        iDay = jsDate.GetDay();
+        iHour = jsDate.GetHours();
+        iMin = jsDate.GetMinutes();
+        iSec = jsDate.GetSeconds();
 
-		struct tm time = {};
-		time.tm_year = iYear-1900;
-		time.tm_mon = iMonth;
-		time.tm_mday = iDay;
-		time.tm_hour = iHour;
-		time.tm_min = iMin;
-		time.tm_sec = iSec;
-		//COleDateTime cppTm(iYear,iMonth+1,iDay,iHour,iMin,iSec);
-		//CString strFormat = cppTm.Format(cFormat.c_str());
+        struct tm time = {};
+        time.tm_year = iYear-1900;
+        time.tm_mon = iMonth;
+        time.tm_mday = iDay;
+        time.tm_hour = iHour;
+        time.tm_min = iMin;
+        time.tm_sec = iSec;
 
-		struct stru_TbConvertAd
-		{
-			const FX_WCHAR* lpszJSMark;
-			int     iValue;
-		};
+        struct stru_TbConvertAd
+        {
+            const FX_WCHAR* lpszJSMark;
+            int     iValue;
+        };
 
-		stru_TbConvertAd cTableAd[] ={
-			{ L"m", iMonth+1 },
-			{ L"d", iDay },
-			{ L"H", iHour },
-			{ L"h", iHour>12?iHour-12:iHour },
-			{ L"M", iMin },
-			{ L"s", iSec },
-		};
+        stru_TbConvertAd cTableAd[] ={
+            { L"m", iMonth+1 },
+            { L"d", iDay },
+            { L"H", iHour },
+            { L"h", iHour>12?iHour-12:iHour },
+            { L"M", iMin },
+            { L"s", iSec },
+        };
 
-		//cFormat = strFormat.GetBuffer(strFormat.GetLength()+1);
-		for(iIndex = 0;iIndex<sizeof(cTableAd)/sizeof(stru_TbConvertAd);iIndex++)
-		{
-			wchar_t tszValue[10];
-			//_itot(cTableAd[iIndex].iValue,tszValue,10);
-			CFX_WideString sValue;
-			sValue.Format(L"%d",cTableAd[iIndex].iValue);
-			memcpy(tszValue, (wchar_t *)sValue.GetBuffer(sValue.GetLength()+1),
+        for(iIndex = 0;iIndex<sizeof(cTableAd)/sizeof(stru_TbConvertAd);iIndex++)
+        {
+            wchar_t tszValue[10];
+            CFX_WideString sValue;
+            sValue.Format(L"%d",cTableAd[iIndex].iValue);
+            memcpy(tszValue, (wchar_t *)sValue.GetBuffer(sValue.GetLength()+1),
                                (sValue.GetLength()+1)*sizeof(wchar_t));
 
-			//strFormat.Replace(cTableAd[iIndex].lpszJSMark,"%d");
-			//strFormat.Format(strFormat,cTableAd[iIndex].iValue);
-			int iStart = 0;
-			int iEnd;
-			while((iEnd = cFormat.find(cTableAd[iIndex].lpszJSMark, iStart)) != -1)
-			{
-				if (iEnd > 0)
-				{
-					if (cFormat[iEnd-1] == L'%')
-					{
-						iStart = iEnd+1;
-						continue;
-					}
-				}
-				cFormat.replace(iEnd, FXSYS_wcslen(cTableAd[iIndex].lpszJSMark), tszValue);
-				iStart = iEnd;
-			}
-		}
+            int iStart = 0;
+            int iEnd;
+            while((iEnd = cFormat.find(cTableAd[iIndex].lpszJSMark, iStart)) != -1)
+            {
+                if (iEnd > 0)
+                {
+                    if (cFormat[iEnd-1] == L'%')
+                    {
+                        iStart = iEnd+1;
+                        continue;
+                    }
+                }
+                cFormat.replace(iEnd, FXSYS_wcslen(cTableAd[iIndex].lpszJSMark), tszValue);
+                iStart = iEnd;
+            }
+        }
 
-		CFX_WideString strFormat;
-//		strFormat.Format(L"%d,%d,%d,%d,%d,%d",iYear, iMonth, iDay, iHour, iMin, iSec);
-//		CString strFormat = cppTm.Format(cFormat.c_str());
-		wchar_t buf[64] = {};
-		strFormat = wcsftime(buf, 64, cFormat.c_str(), &time);
-		cFormat = buf;
-		vRet = cFormat.c_str();
-		//rtRet = strFormat.GetBuffer(strFormat.GetLength()+1);
-		return TRUE;
-	}
-	return FALSE;
+        CFX_WideString strFormat;
+        wchar_t buf[64] = {};
+        strFormat = wcsftime(buf, 64, cFormat.c_str(), &time);
+        cFormat = buf;
+        vRet = cFormat.c_str();
+        return TRUE;
+    }
+    return FALSE;
 }
 
 void util::printd(const std::wstring &cFormat2, CJS_Date jsDate, bool bXFAPicture, std::wstring &cPurpose)
 {
-	std::wstring cFormat = cFormat2;
+    std::wstring cFormat = cFormat2;
 
-	if (bXFAPicture)
-	{
-		return ; //currently, it doesn't support XFAPicture.
-	}
+    if (bXFAPicture)
+    {
+        return ; //currently, it doesn't support XFAPicture.
+    }
 
     int iIndex;
-	for(iIndex = 0;iIndex<sizeof(fcTable)/sizeof(stru_TbConvert);iIndex++)
-	{
-		int iStart = 0;
-		int iEnd;
-		while((iEnd = cFormat.find(fcTable[iIndex].lpszJSMark, iStart)) != -1)
-		{
-			cFormat.replace(iEnd,FXSYS_wcslen(fcTable[iIndex].lpszJSMark), fcTable[iIndex].lpszCppMark);
-			iStart = iEnd;
-		}
-	}
+    for(iIndex = 0;iIndex<sizeof(fcTable)/sizeof(stru_TbConvert);iIndex++)
+    {
+        int iStart = 0;
+        int iEnd;
+        while((iEnd = cFormat.find(fcTable[iIndex].lpszJSMark, iStart)) != -1)
+        {
+            cFormat.replace(iEnd,FXSYS_wcslen(fcTable[iIndex].lpszJSMark), fcTable[iIndex].lpszCppMark);
+            iStart = iEnd;
+        }
+    }
 
-	int iYear,iMonth,iDay,iHour,iMin,iSec;
-	iYear = jsDate.GetYear();
-	iMonth = jsDate.GetMonth();
-	iDay = jsDate.GetDay();
-	iHour = jsDate.GetHours();
-	iMin = jsDate.GetMinutes();
-	iSec = jsDate.GetSeconds();
+    int iYear,iMonth,iDay,iHour,iMin,iSec;
+    iYear = jsDate.GetYear();
+    iMonth = jsDate.GetMonth();
+    iDay = jsDate.GetDay();
+    iHour = jsDate.GetHours();
+    iMin = jsDate.GetMinutes();
+    iSec = jsDate.GetSeconds();
 
-	struct tm time = {};
-	time.tm_year = iYear-1900;
-	time.tm_mon = iMonth;
-	time.tm_mday = iDay;
-	time.tm_hour = iHour;
-	time.tm_min = iMin;
-	time.tm_sec = iSec;
-//	COleDateTime cppTm(iYear,iMonth+1,iDay,iHour,iMin,iSec);
-	//CString strFormat = cppTm.Format(cFormat.c_str());
+    struct tm time = {};
+    time.tm_year = iYear-1900;
+    time.tm_mon = iMonth;
+    time.tm_mday = iDay;
+    time.tm_hour = iHour;
+    time.tm_min = iMin;
+    time.tm_sec = iSec;
+//  COleDateTime cppTm(iYear,iMonth+1,iDay,iHour,iMin,iSec);
+    //CString strFormat = cppTm.Format(cFormat.c_str());
 
-	struct stru_TbConvertAd
-	{
-		const FX_WCHAR* lpszJSMark;
-		int     iValue;
-	};
+    struct stru_TbConvertAd
+    {
+        const FX_WCHAR* lpszJSMark;
+        int     iValue;
+    };
 
-	stru_TbConvertAd cTableAd[] ={
-		{ L"m", iMonth+1 },
-		{ L"d", iDay },
-		{ L"H", iHour },
-		{ L"h", iHour>12?iHour-12:iHour },
-		{ L"M", iMin },
-		{ L"s", iSec },
-	};
+    stru_TbConvertAd cTableAd[] ={
+        { L"m", iMonth+1 },
+        { L"d", iDay },
+        { L"H", iHour },
+        { L"h", iHour>12?iHour-12:iHour },
+        { L"M", iMin },
+        { L"s", iSec },
+    };
 
-	//cFormat = strFormat.GetBuffer(strFormat.GetLength()+1);
-	for(iIndex = 0;iIndex<sizeof(cTableAd)/sizeof(stru_TbConvertAd);iIndex++)
-	{
-		wchar_t tszValue[10];
-		//_itot(cTableAd[iIndex].iValue,tszValue,10);
-		CFX_WideString sValue;
-		sValue.Format(L"%d",cTableAd[iIndex].iValue);
-		memcpy(tszValue, (wchar_t *)sValue.GetBuffer(sValue.GetLength()+1),sValue.GetLength()*sizeof(wchar_t));
+    //cFormat = strFormat.GetBuffer(strFormat.GetLength()+1);
+    for(iIndex = 0;iIndex<sizeof(cTableAd)/sizeof(stru_TbConvertAd);iIndex++)
+    {
+        wchar_t tszValue[10];
+        //_itot(cTableAd[iIndex].iValue,tszValue,10);
+        CFX_WideString sValue;
+        sValue.Format(L"%d",cTableAd[iIndex].iValue);
+        memcpy(tszValue, (wchar_t *)sValue.GetBuffer(sValue.GetLength()+1),sValue.GetLength()*sizeof(wchar_t));
 
 
-		//strFormat.Replace(cTableAd[iIndex].lpszJSMark,"%d");
-		//strFormat.Format(strFormat,cTableAd[iIndex].iValue);
-		int iStart = 0;
-		int iEnd;
-		while((iEnd = cFormat.find(cTableAd[iIndex].lpszJSMark, iStart)) != -1)
-		{
-			if (iEnd > 0)
-			{
-				if (cFormat[iEnd-1] == L'%')
-				{
-					iStart = iEnd+1;
-					continue;
-				}
-			}
-			cFormat.replace(iEnd,FXSYS_wcslen(cTableAd[iIndex].lpszJSMark),tszValue);
-			iStart = iEnd;
-		}
-	}
+        //strFormat.Replace(cTableAd[iIndex].lpszJSMark,"%d");
+        //strFormat.Format(strFormat,cTableAd[iIndex].iValue);
+        int iStart = 0;
+        int iEnd;
+        while((iEnd = cFormat.find(cTableAd[iIndex].lpszJSMark, iStart)) != -1)
+        {
+            if (iEnd > 0)
+            {
+                if (cFormat[iEnd-1] == L'%')
+                {
+                    iStart = iEnd+1;
+                    continue;
+                }
+            }
+            cFormat.replace(iEnd,FXSYS_wcslen(cTableAd[iIndex].lpszJSMark),tszValue);
+            iStart = iEnd;
+        }
+    }
 
-	CFX_WideString strFormat;
-	wchar_t buf[64] = {};
-	strFormat = wcsftime(buf, 64, cFormat.c_str(), &time);
-	cFormat = buf;
-	cPurpose = cFormat;
+    CFX_WideString strFormat;
+    wchar_t buf[64] = {};
+    strFormat = wcsftime(buf, 64, cFormat.c_str(), &time);
+    cFormat = buf;
+    cPurpose = cFormat;
 }
 
 FX_BOOL util::printx(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	int iSize = params.size();
-	if (iSize<2)
-		return FALSE;
-	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;
-	printx(cFormat,cSource,cDest);
-	vRet = cDest.c_str();
-	return TRUE;
+    int iSize = params.size();
+    if (iSize<2)
+        return FALSE;
+    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;
+    printx(cFormat,cSource,cDest);
+    vRet = cDest.c_str();
+    return TRUE;
 }
 
 void util::printx(const std::string &cFormat,const std::string &cSource2,std::string &cPurpose)
 {
-	std::string cSource(cSource2);
-	if (!cPurpose.empty())
-		//cPurpose.clear();
-		cPurpose.erase();
-	int itSource = 0;
-	int iSize = cSource.size();
-	for(int iIndex = 0; iIndex < (int)cFormat.size() && itSource<iSize; iIndex++)
-	{
-		char letter = cFormat[iIndex];
-		switch(letter)
-		{
-		case '?':
-			//cPurpose.push_back(cSource[itSource]);
-			cPurpose += cSource[itSource];
-			itSource++;
-			break;
-		case 'X':
-			{
-				while(itSource < iSize)
-				{
-					if ((cSource[itSource]>='0'&&cSource[itSource]<='9') || (cSource[itSource]>='a' && cSource[itSource]<='z') || (cSource[itSource]>='A' && cSource[itSource]<='Z'))
-					{
-						//cPurpose.push_back(cSource[itSource]);
-						cPurpose += cSource[itSource];
-						itSource++;
-						break;
-					}
-					itSource++;
-				}
-				break;
-			}
-			break;
-		case 'A':
-			{
-				while(itSource < iSize)
-				{
-					if ((cSource[itSource]>='a' && cSource[itSource]<='z') || (cSource[itSource]>='A' && cSource[itSource]<='Z'))
-					{
-						//cPurpose.push_back(cSource[itSource]);
-						cPurpose += cSource[itSource];
-						itSource++;
-						break;
-					}
-					itSource++;
-				}
-				break;
-			}
-			break;
-		case '9':
-			{
-				while(itSource < iSize)
-				{
-					if (cSource[itSource]>='0'&&cSource[itSource]<='9')
-					{
-						//cPurpose.push_back(cSource[itSource]);
-						cPurpose += cSource[itSource];
-						itSource++;
-						break;
-					}
-					itSource++;
-				}
-				break;
-			}
-		case '*':
-			{
-				cPurpose.append(cSource,itSource,iSize-itSource);
-				itSource = iSize-1;
-				break;
-			}
-		case '\\':
-			break;
-		case '>':
-			{
-				for(std::string::iterator it = cSource.begin();it != cSource.end(); it++)
-				{
-					*it = toupper(*it);
-				}
-				break;
-			}
-		case '<':
-			{
-				for(std::string::iterator it = cSource.begin();it != cSource.end(); it++)
-				{
-					*it = tolower(*it);
-				}
-				break;
-			}
-		case '=':
-			break;
-		default:
-			//cPurpose.push_back(letter);
-			cPurpose += letter;
-			break;
-		}
-	}
+    std::string cSource(cSource2);
+    if (!cPurpose.empty())
+        //cPurpose.clear();
+        cPurpose.erase();
+    int itSource = 0;
+    int iSize = cSource.size();
+    for(int iIndex = 0; iIndex < (int)cFormat.size() && itSource<iSize; iIndex++)
+    {
+        char letter = cFormat[iIndex];
+        switch(letter)
+        {
+        case '?':
+            //cPurpose.push_back(cSource[itSource]);
+            cPurpose += cSource[itSource];
+            itSource++;
+            break;
+        case 'X':
+            {
+                while(itSource < iSize)
+                {
+                    if ((cSource[itSource]>='0'&&cSource[itSource]<='9') || (cSource[itSource]>='a' && cSource[itSource]<='z') || (cSource[itSource]>='A' && cSource[itSource]<='Z'))
+                    {
+                        //cPurpose.push_back(cSource[itSource]);
+                        cPurpose += cSource[itSource];
+                        itSource++;
+                        break;
+                    }
+                    itSource++;
+                }
+                break;
+            }
+            break;
+        case 'A':
+            {
+                while(itSource < iSize)
+                {
+                    if ((cSource[itSource]>='a' && cSource[itSource]<='z') || (cSource[itSource]>='A' && cSource[itSource]<='Z'))
+                    {
+                        //cPurpose.push_back(cSource[itSource]);
+                        cPurpose += cSource[itSource];
+                        itSource++;
+                        break;
+                    }
+                    itSource++;
+                }
+                break;
+            }
+            break;
+        case '9':
+            {
+                while(itSource < iSize)
+                {
+                    if (cSource[itSource]>='0'&&cSource[itSource]<='9')
+                    {
+                        //cPurpose.push_back(cSource[itSource]);
+                        cPurpose += cSource[itSource];
+                        itSource++;
+                        break;
+                    }
+                    itSource++;
+                }
+                break;
+            }
+        case '*':
+            {
+                cPurpose.append(cSource,itSource,iSize-itSource);
+                itSource = iSize-1;
+                break;
+            }
+        case '\\':
+            break;
+        case '>':
+            {
+                for(std::string::iterator it = cSource.begin();it != cSource.end(); it++)
+                {
+                    *it = toupper(*it);
+                }
+                break;
+            }
+        case '<':
+            {
+                for(std::string::iterator it = cSource.begin();it != cSource.end(); it++)
+                {
+                    *it = tolower(*it);
+                }
+                break;
+            }
+        case '=':
+            break;
+        default:
+            //cPurpose.push_back(letter);
+            cPurpose += letter;
+            break;
+        }
+    }
 }
 
 FX_BOOL util::scand(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	v8::Isolate* isolate = GetIsolate(cc);
-	int iSize = params.size();
-	if (iSize < 2)
-		return FALSE;
+    v8::Isolate* isolate = GetIsolate(cc);
+    int iSize = params.size();
+    if (iSize < 2)
+        return FALSE;
 
-	CFX_WideString sFormat = params[0].ToCFXWideString();
-	CFX_WideString sDate = params[1].ToCFXWideString();
-	double dDate = JS_GetDateTime();
-	if (sDate.GetLength() > 0)
-	{
-		FX_BOOL bWrongFormat = FALSE;
-		dDate = CJS_PublicMethods::MakeRegularDate(sDate,sFormat,bWrongFormat);
-	}
+    CFX_WideString sFormat = params[0].ToCFXWideString();
+    CFX_WideString sDate = params[1].ToCFXWideString();
+    double dDate = JS_GetDateTime();
+    if (sDate.GetLength() > 0)
+    {
+        FX_BOOL bWrongFormat = FALSE;
+        dDate = CJS_PublicMethods::MakeRegularDate(sDate,sFormat,bWrongFormat);
+    }
 
-	if (!JS_PortIsNan(dDate))
-	{
-		CJS_Date date(isolate,dDate);
-		vRet = date;
-	}
-	else
-	{
-		vRet.SetNull();
-	}
+    if (!JS_PortIsNan(dDate))
+    {
+        CJS_Date date(isolate,dDate);
+        vRet = date;
+    }
+    else
+    {
+        vRet.SetNull();
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 int64_t FX_atoi64(const char *nptr)
@@ -625,21 +615,18 @@
             c = (int)(unsigned char)*nptr++;    /* get next char */
         }
 
-        if (sign == '-')
-            return -total;
-        else
-            return total;   /* return result, negated if necessary */
+        return sign == '-' ? -total : total;
 }
 
 FX_BOOL util::byteToChar(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
 {
-	int iSize = params.size();
-	if (iSize == 0)
-		return FALSE;
-	int nByte = params[0].ToInt();
-	unsigned char cByte = (unsigned char)nByte;
-	CFX_WideString csValue;
-	csValue.Format(L"%c", cByte);
-	vRet = csValue.c_str();
-	return TRUE;
+    int iSize = params.size();
+    if (iSize == 0)
+        return FALSE;
+    int nByte = params[0].ToInt();
+    unsigned char cByte = (unsigned char)nByte;
+    CFX_WideString csValue;
+    csValue.Format(L"%c", cByte);
+    vRet = csValue.c_str();
+    return TRUE;
 }
diff --git a/fpdfsdk/src/pdfwindow/PWL_ComboBox.cpp b/fpdfsdk/src/pdfwindow/PWL_ComboBox.cpp
index f946ecd..80115ab 100644
--- a/fpdfsdk/src/pdfwindow/PWL_ComboBox.cpp
+++ b/fpdfsdk/src/pdfwindow/PWL_ComboBox.cpp
@@ -14,481 +14,481 @@
 
 #define PWLCB_DEFAULTFONTSIZE  12.0f
 
-#define IsFloatZero(f)						((f) < 0.0001 && (f) > -0.0001)
-#define IsFloatBigger(fa,fb)				((fa) > (fb) && !IsFloatZero((fa) - (fb)))
-#define IsFloatSmaller(fa,fb)				((fa) < (fb) && !IsFloatZero((fa) - (fb)))
-#define IsFloatEqual(fa,fb)					IsFloatZero((fa)-(fb))
+#define IsFloatZero(f)                      ((f) < 0.0001 && (f) > -0.0001)
+#define IsFloatBigger(fa,fb)                ((fa) > (fb) && !IsFloatZero((fa) - (fb)))
+#define IsFloatSmaller(fa,fb)               ((fa) < (fb) && !IsFloatZero((fa) - (fb)))
+#define IsFloatEqual(fa,fb)                 IsFloatZero((fa)-(fb))
 
 
 /* ---------------------------- CPWL_CBListBox ---------------------------- */
 
-FX_BOOL	CPWL_CBListBox::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag)
+FX_BOOL CPWL_CBListBox::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag)
 {
-	CPWL_Wnd::OnLButtonUp(point,nFlag);
+    CPWL_Wnd::OnLButtonUp(point,nFlag);
 
-	if (m_bMouseDown)
-	{
-		ReleaseCapture();
-		m_bMouseDown = FALSE;
+    if (m_bMouseDown)
+    {
+        ReleaseCapture();
+        m_bMouseDown = FALSE;
 
-		if (ClientHitTest(point))
-		{
-			if (CPWL_Wnd * pParent = GetParentWindow())
-			{
-				pParent->OnNotify(this,PNM_LBUTTONUP,0,PWL_MAKEDWORD(point.x,point.y));
-			}
+        if (ClientHitTest(point))
+        {
+            if (CPWL_Wnd * pParent = GetParentWindow())
+            {
+                pParent->OnNotify(this,PNM_LBUTTONUP,0,PWL_MAKEDWORD(point.x,point.y));
+            }
 
-			FX_BOOL bExit = FALSE;
-			OnNotifySelChanged(FALSE,bExit, nFlag);
-			if (bExit) return FALSE;
-		}
-	}
+            FX_BOOL bExit = FALSE;
+            OnNotifySelChanged(FALSE,bExit, nFlag);
+            if (bExit) return FALSE;
+        }
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL CPWL_CBListBox::OnKeyDownWithExit(FX_WORD nChar, FX_BOOL & bExit, FX_DWORD nFlag)
 {
-	if (!m_pList) return FALSE;
+    if (!m_pList) return FALSE;
 
-	switch (nChar)
-	{
-	default:
-		return FALSE;
-	case FWL_VKEY_Up:
-	case FWL_VKEY_Down:
-	case FWL_VKEY_Home:
-	case FWL_VKEY_Left:
-	case FWL_VKEY_End:
-	case FWL_VKEY_Right:
-		break;
-	}
+    switch (nChar)
+    {
+    default:
+        return FALSE;
+    case FWL_VKEY_Up:
+    case FWL_VKEY_Down:
+    case FWL_VKEY_Home:
+    case FWL_VKEY_Left:
+    case FWL_VKEY_End:
+    case FWL_VKEY_Right:
+        break;
+    }
 
-	switch (nChar)
-	{
-	case FWL_VKEY_Up:
-		m_pList->OnVK_UP(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
-		break;
-	case FWL_VKEY_Down:
-		m_pList->OnVK_DOWN(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
-		break;
-	case FWL_VKEY_Home:
-		m_pList->OnVK_HOME(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
-		break;
-	case FWL_VKEY_Left:
-		m_pList->OnVK_LEFT(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
-		break;
-	case FWL_VKEY_End:
-		m_pList->OnVK_END(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
-		break;
-	case FWL_VKEY_Right:
-		m_pList->OnVK_RIGHT(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
-		break;
-	case FWL_VKEY_Delete:
-		break;
-	}
+    switch (nChar)
+    {
+    case FWL_VKEY_Up:
+        m_pList->OnVK_UP(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
+        break;
+    case FWL_VKEY_Down:
+        m_pList->OnVK_DOWN(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
+        break;
+    case FWL_VKEY_Home:
+        m_pList->OnVK_HOME(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
+        break;
+    case FWL_VKEY_Left:
+        m_pList->OnVK_LEFT(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
+        break;
+    case FWL_VKEY_End:
+        m_pList->OnVK_END(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
+        break;
+    case FWL_VKEY_Right:
+        m_pList->OnVK_RIGHT(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
+        break;
+    case FWL_VKEY_Delete:
+        break;
+    }
 
-	OnNotifySelChanged(TRUE,bExit, nFlag);
+    OnNotifySelChanged(TRUE,bExit, nFlag);
 
-	return TRUE;
+    return TRUE;
 }
 
-FX_BOOL	CPWL_CBListBox::OnCharWithExit(FX_WORD nChar, FX_BOOL & bExit, FX_DWORD nFlag)
+FX_BOOL CPWL_CBListBox::OnCharWithExit(FX_WORD nChar, FX_BOOL & bExit, FX_DWORD nFlag)
 {
-	if (!m_pList) return FALSE;
+    if (!m_pList) return FALSE;
 
-	if (!m_pList->OnChar(nChar,IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag))) return FALSE;
+    if (!m_pList->OnChar(nChar,IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag))) return FALSE;
 
-	if (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetParentWindow())
-	{
-		pComboBox->SetSelectText();
-	}
+    if (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetParentWindow())
+    {
+        pComboBox->SetSelectText();
+    }
 
-	OnNotifySelChanged(TRUE,bExit,nFlag);
+    OnNotifySelChanged(TRUE,bExit,nFlag);
 
-	return TRUE;
+    return TRUE;
 }
 
 /* ---------------------------- CPWL_CBButton ---------------------------- */
 
 void CPWL_CBButton::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)
 {
-	CPWL_Wnd::GetThisAppearanceStream(sAppStream);
+    CPWL_Wnd::GetThisAppearanceStream(sAppStream);
 
-	CPDF_Rect rectWnd = CPWL_Wnd::GetWindowRect();
+    CPDF_Rect rectWnd = CPWL_Wnd::GetWindowRect();
 
-	if (IsVisible() && !rectWnd.IsEmpty())
-	{
-		CFX_ByteTextBuf sButton;
+    if (IsVisible() && !rectWnd.IsEmpty())
+    {
+        CFX_ByteTextBuf sButton;
 
-		CPDF_Point ptCenter = GetCenterPoint();
+        CPDF_Point ptCenter = GetCenterPoint();
 
-		CPDF_Point pt1(ptCenter.x - PWL_CBBUTTON_TRIANGLE_HALFLEN,ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f);
-		CPDF_Point pt2(ptCenter.x + PWL_CBBUTTON_TRIANGLE_HALFLEN,ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f);
-		CPDF_Point pt3(ptCenter.x,ptCenter.y - PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f);
+        CPDF_Point pt1(ptCenter.x - PWL_CBBUTTON_TRIANGLE_HALFLEN,ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f);
+        CPDF_Point pt2(ptCenter.x + PWL_CBBUTTON_TRIANGLE_HALFLEN,ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f);
+        CPDF_Point pt3(ptCenter.x,ptCenter.y - PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f);
 
-		if (IsFloatBigger(rectWnd.right - rectWnd.left,PWL_CBBUTTON_TRIANGLE_HALFLEN * 2)
-			&&
-			IsFloatBigger(rectWnd.top - rectWnd.bottom,PWL_CBBUTTON_TRIANGLE_HALFLEN)
-			)
-		{
-			sButton << "0 g\n";
-			sButton << pt1.x << " " << pt1.y << " m\n";
-			sButton << pt2.x << " " << pt2.y << " l\n";
-			sButton << pt3.x << " " << pt3.y << " l\n";
-			sButton << pt1.x << " " << pt1.y << " l f\n";
+        if (IsFloatBigger(rectWnd.right - rectWnd.left,PWL_CBBUTTON_TRIANGLE_HALFLEN * 2)
+            &&
+            IsFloatBigger(rectWnd.top - rectWnd.bottom,PWL_CBBUTTON_TRIANGLE_HALFLEN)
+            )
+        {
+            sButton << "0 g\n";
+            sButton << pt1.x << " " << pt1.y << " m\n";
+            sButton << pt2.x << " " << pt2.y << " l\n";
+            sButton << pt3.x << " " << pt3.y << " l\n";
+            sButton << pt1.x << " " << pt1.y << " l f\n";
 
-			sAppStream << "q\n" << sButton << "Q\n";
-		}
-	}
+            sAppStream << "q\n" << sButton << "Q\n";
+        }
+    }
 }
 
 void CPWL_CBButton::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
 {
-	CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device);
+    CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device);
 
-	CPDF_Rect rectWnd = CPWL_Wnd::GetWindowRect();
+    CPDF_Rect rectWnd = CPWL_Wnd::GetWindowRect();
 
-	if (IsVisible() && !rectWnd.IsEmpty())
-	{
-		CPDF_Point ptCenter = GetCenterPoint();
+    if (IsVisible() && !rectWnd.IsEmpty())
+    {
+        CPDF_Point ptCenter = GetCenterPoint();
 
-		CPDF_Point pt1(ptCenter.x - PWL_CBBUTTON_TRIANGLE_HALFLEN,ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f);
-		CPDF_Point pt2(ptCenter.x + PWL_CBBUTTON_TRIANGLE_HALFLEN,ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f);
-		CPDF_Point pt3(ptCenter.x,ptCenter.y - PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f);
+        CPDF_Point pt1(ptCenter.x - PWL_CBBUTTON_TRIANGLE_HALFLEN,ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f);
+        CPDF_Point pt2(ptCenter.x + PWL_CBBUTTON_TRIANGLE_HALFLEN,ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f);
+        CPDF_Point pt3(ptCenter.x,ptCenter.y - PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f);
 
-		if (IsFloatBigger(rectWnd.right - rectWnd.left,PWL_CBBUTTON_TRIANGLE_HALFLEN * 2)
-			&&
-			IsFloatBigger(rectWnd.top - rectWnd.bottom,PWL_CBBUTTON_TRIANGLE_HALFLEN)
-			)
-		{
-			CFX_PathData path;
+        if (IsFloatBigger(rectWnd.right - rectWnd.left,PWL_CBBUTTON_TRIANGLE_HALFLEN * 2)
+            &&
+            IsFloatBigger(rectWnd.top - rectWnd.bottom,PWL_CBBUTTON_TRIANGLE_HALFLEN)
+            )
+        {
+            CFX_PathData path;
 
-			path.SetPointCount(4);
-			path.SetPoint(0, pt1.x, pt1.y, FXPT_MOVETO);
-			path.SetPoint(1, pt2.x, pt2.y, FXPT_LINETO);
-			path.SetPoint(2, pt3.x, pt3.y, FXPT_LINETO);
-			path.SetPoint(3, pt1.x, pt1.y, FXPT_LINETO);
+            path.SetPointCount(4);
+            path.SetPoint(0, pt1.x, pt1.y, FXPT_MOVETO);
+            path.SetPoint(1, pt2.x, pt2.y, FXPT_LINETO);
+            path.SetPoint(2, pt3.x, pt3.y, FXPT_LINETO);
+            path.SetPoint(3, pt1.x, pt1.y, FXPT_LINETO);
 
-			pDevice->DrawPath(&path, pUser2Device, NULL,
-				CPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_BLACKCOLOR,GetTransparency()),
-				0, FXFILL_ALTERNATE);
-		}
-	}
+            pDevice->DrawPath(&path, pUser2Device, NULL,
+                CPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_BLACKCOLOR,GetTransparency()),
+                0, FXFILL_ALTERNATE);
+        }
+    }
 }
 
-FX_BOOL	CPWL_CBButton::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)
+FX_BOOL CPWL_CBButton::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)
 {
-	CPWL_Wnd::OnLButtonDown(point,nFlag);
+    CPWL_Wnd::OnLButtonDown(point,nFlag);
 
-	SetCapture();
+    SetCapture();
 
-	if (CPWL_Wnd * pParent = GetParentWindow())
-	{
-		pParent->OnNotify(this,PNM_LBUTTONDOWN,0,PWL_MAKEDWORD(point.x,point.y));
-	}
+    if (CPWL_Wnd * pParent = GetParentWindow())
+    {
+        pParent->OnNotify(this,PNM_LBUTTONDOWN,0,PWL_MAKEDWORD(point.x,point.y));
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
-FX_BOOL	CPWL_CBButton::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag)
+FX_BOOL CPWL_CBButton::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag)
 {
-	CPWL_Wnd::OnLButtonUp(point, nFlag);
+    CPWL_Wnd::OnLButtonUp(point, nFlag);
 
-	ReleaseCapture();
+    ReleaseCapture();
 
-	return TRUE;
+    return TRUE;
 }
 
 /* ---------------------------- CPWL_ComboBox ---------------------------- */
 
 CPWL_ComboBox::CPWL_ComboBox() : m_pEdit(NULL),
-	m_pButton(NULL),
-	m_pList(NULL),
-	m_bPopup(FALSE),
-	m_nPopupWhere(0),
-	m_nSelectItem(-1),
-	m_pFillerNotify(NULL)
+    m_pButton(NULL),
+    m_pList(NULL),
+    m_bPopup(FALSE),
+    m_nPopupWhere(0),
+    m_nSelectItem(-1),
+    m_pFillerNotify(NULL)
 {
 }
 
 CFX_ByteString CPWL_ComboBox::GetClassName() const
 {
-	return "CPWL_ComboBox";
+    return "CPWL_ComboBox";
 }
 
 void CPWL_ComboBox::OnCreate(PWL_CREATEPARAM & cp)
 {
-	cp.dwFlags &= ~PWS_HSCROLL;
-	cp.dwFlags &= ~PWS_VSCROLL;
+    cp.dwFlags &= ~PWS_HSCROLL;
+    cp.dwFlags &= ~PWS_VSCROLL;
 }
 
 void CPWL_ComboBox::SetFocus()
 {
-	if (m_pEdit)
-		m_pEdit->SetFocus();
+    if (m_pEdit)
+        m_pEdit->SetFocus();
 }
 
 void CPWL_ComboBox::KillFocus()
 {
-	SetPopup(FALSE);
-	CPWL_Wnd::KillFocus();
+    SetPopup(FALSE);
+    CPWL_Wnd::KillFocus();
 }
 
 CFX_WideString CPWL_ComboBox::GetText() const
 {
-	if (m_pEdit)
-	{
-		return m_pEdit->GetText();
-	}
-	return CFX_WideString();
+    if (m_pEdit)
+    {
+        return m_pEdit->GetText();
+    }
+    return CFX_WideString();
 }
 
 void CPWL_ComboBox::SetText(const FX_WCHAR* text)
 {
-	if (m_pEdit)
-		m_pEdit->SetText(text);
+    if (m_pEdit)
+        m_pEdit->SetText(text);
 }
 
 void CPWL_ComboBox::AddString(const FX_WCHAR* string)
 {
-	if (m_pList)
-		m_pList->AddString(string);
+    if (m_pList)
+        m_pList->AddString(string);
 }
 
 int32_t CPWL_ComboBox::GetSelect() const
 {
-	return m_nSelectItem;
+    return m_nSelectItem;
 }
 
 void CPWL_ComboBox::SetSelect(int32_t nItemIndex)
 {
-	if (m_pList)
-		m_pList->Select(nItemIndex);
+    if (m_pList)
+        m_pList->Select(nItemIndex);
 
-	m_pEdit->SetText(m_pList->GetText().c_str());
+    m_pEdit->SetText(m_pList->GetText().c_str());
 
-	m_nSelectItem = nItemIndex;
+    m_nSelectItem = nItemIndex;
 }
 
 void CPWL_ComboBox::SetEditSel(int32_t nStartChar,int32_t nEndChar)
 {
-	if (m_pEdit)
-	{
-		m_pEdit->SetSel(nStartChar,nEndChar);
-	}
+    if (m_pEdit)
+    {
+        m_pEdit->SetSel(nStartChar,nEndChar);
+    }
 }
 
 void CPWL_ComboBox::GetEditSel(int32_t & nStartChar, int32_t & nEndChar) const
 {
-	nStartChar = -1;
-	nEndChar = -1;
+    nStartChar = -1;
+    nEndChar = -1;
 
-	if (m_pEdit)
-	{
-		m_pEdit->GetSel(nStartChar,nEndChar);
-	}
+    if (m_pEdit)
+    {
+        m_pEdit->GetSel(nStartChar,nEndChar);
+    }
 }
 
 void CPWL_ComboBox::Clear()
 {
-	if (m_pEdit)
-	{
-		m_pEdit->Clear();
-	}
+    if (m_pEdit)
+    {
+        m_pEdit->Clear();
+    }
 }
 
 void CPWL_ComboBox::CreateChildWnd(const PWL_CREATEPARAM & cp)
 {
-	CreateEdit(cp);
-	CreateButton(cp);
-	CreateListBox(cp);
+    CreateEdit(cp);
+    CreateButton(cp);
+    CreateListBox(cp);
 }
 
 void CPWL_ComboBox::CreateEdit(const PWL_CREATEPARAM & cp)
 {
-	if (!m_pEdit)
-	{
-		m_pEdit = new CPWL_CBEdit;
-		m_pEdit->AttachFFLData(m_pFormFiller);
+    if (!m_pEdit)
+    {
+        m_pEdit = new CPWL_CBEdit;
+        m_pEdit->AttachFFLData(m_pFormFiller);
 
-		PWL_CREATEPARAM ecp = cp;
-		ecp.pParentWnd = this;
-		ecp.dwFlags =  PWS_VISIBLE | PWS_CHILD | PWS_BORDER | PES_CENTER | PES_AUTOSCROLL | PES_UNDO;
+        PWL_CREATEPARAM ecp = cp;
+        ecp.pParentWnd = this;
+        ecp.dwFlags =  PWS_VISIBLE | PWS_CHILD | PWS_BORDER | PES_CENTER | PES_AUTOSCROLL | PES_UNDO;
 
-		if (HasFlag(PWS_AUTOFONTSIZE))
-			ecp.dwFlags |= PWS_AUTOFONTSIZE;
+        if (HasFlag(PWS_AUTOFONTSIZE))
+            ecp.dwFlags |= PWS_AUTOFONTSIZE;
 
-		if (!HasFlag(PCBS_ALLOWCUSTOMTEXT))
-			ecp.dwFlags |= PWS_READONLY;
+        if (!HasFlag(PCBS_ALLOWCUSTOMTEXT))
+            ecp.dwFlags |= PWS_READONLY;
 
-		ecp.rcRectWnd = CPDF_Rect(0,0,0,0);
-		ecp.dwBorderWidth = 0;
-		ecp.nBorderStyle = PBS_SOLID;
+        ecp.rcRectWnd = CPDF_Rect(0,0,0,0);
+        ecp.dwBorderWidth = 0;
+        ecp.nBorderStyle = PBS_SOLID;
 
-		m_pEdit->Create(ecp);
-	}
+        m_pEdit->Create(ecp);
+    }
 }
 
 void CPWL_ComboBox::CreateButton(const PWL_CREATEPARAM & cp)
 {
-	if (!m_pButton)
-	{
-		m_pButton = new CPWL_CBButton;
+    if (!m_pButton)
+    {
+        m_pButton = new CPWL_CBButton;
 
-		PWL_CREATEPARAM bcp = cp;
-		bcp.pParentWnd = this;
-		bcp.dwFlags = PWS_VISIBLE | PWS_CHILD | PWS_BORDER | PWS_BACKGROUND;
-		bcp.sBackgroundColor = PWL_SCROLLBAR_BKCOLOR;
-		bcp.sBorderColor = PWL_DEFAULT_BLACKCOLOR;
-		bcp.dwBorderWidth = 2;
-		bcp.nBorderStyle = PBS_BEVELED;
-		bcp.eCursorType = FXCT_ARROW;
+        PWL_CREATEPARAM bcp = cp;
+        bcp.pParentWnd = this;
+        bcp.dwFlags = PWS_VISIBLE | PWS_CHILD | PWS_BORDER | PWS_BACKGROUND;
+        bcp.sBackgroundColor = PWL_SCROLLBAR_BKCOLOR;
+        bcp.sBorderColor = PWL_DEFAULT_BLACKCOLOR;
+        bcp.dwBorderWidth = 2;
+        bcp.nBorderStyle = PBS_BEVELED;
+        bcp.eCursorType = FXCT_ARROW;
 
-		m_pButton->Create(bcp);
-	}
+        m_pButton->Create(bcp);
+    }
 }
 
 void CPWL_ComboBox::CreateListBox(const PWL_CREATEPARAM & cp)
 {
-	if (!m_pList)
-	{
-		m_pList = new CPWL_CBListBox;
-		m_pList->AttachFFLData(m_pFormFiller);
-		PWL_CREATEPARAM lcp = cp;
-		lcp.pParentWnd = this;
-		lcp.dwFlags = PWS_CHILD | PWS_BORDER | PWS_BACKGROUND | PLBS_HOVERSEL | PWS_VSCROLL;
-		lcp.nBorderStyle = PBS_SOLID;
-		lcp.dwBorderWidth = 1;
-		lcp.eCursorType = FXCT_ARROW;
-		lcp.rcRectWnd = CPDF_Rect(0,0,0,0);
+    if (!m_pList)
+    {
+        m_pList = new CPWL_CBListBox;
+        m_pList->AttachFFLData(m_pFormFiller);
+        PWL_CREATEPARAM lcp = cp;
+        lcp.pParentWnd = this;
+        lcp.dwFlags = PWS_CHILD | PWS_BORDER | PWS_BACKGROUND | PLBS_HOVERSEL | PWS_VSCROLL;
+        lcp.nBorderStyle = PBS_SOLID;
+        lcp.dwBorderWidth = 1;
+        lcp.eCursorType = FXCT_ARROW;
+        lcp.rcRectWnd = CPDF_Rect(0,0,0,0);
 
-		if (cp.dwFlags & PWS_AUTOFONTSIZE)
-			lcp.fFontSize = PWLCB_DEFAULTFONTSIZE;
-		else
-			lcp.fFontSize = cp.fFontSize;
+        if (cp.dwFlags & PWS_AUTOFONTSIZE)
+            lcp.fFontSize = PWLCB_DEFAULTFONTSIZE;
+        else
+            lcp.fFontSize = cp.fFontSize;
 
-		if (cp.sBorderColor.nColorType == COLORTYPE_TRANSPARENT)
-			lcp.sBorderColor = PWL_DEFAULT_BLACKCOLOR;
+        if (cp.sBorderColor.nColorType == COLORTYPE_TRANSPARENT)
+            lcp.sBorderColor = PWL_DEFAULT_BLACKCOLOR;
 
-		if (cp.sBackgroundColor.nColorType == COLORTYPE_TRANSPARENT)
-			lcp.sBackgroundColor = PWL_DEFAULT_WHITECOLOR;
+        if (cp.sBackgroundColor.nColorType == COLORTYPE_TRANSPARENT)
+            lcp.sBackgroundColor = PWL_DEFAULT_WHITECOLOR;
 
-		m_pList->Create(lcp);
-	}
+        m_pList->Create(lcp);
+    }
 }
 
 void CPWL_ComboBox::RePosChildWnd()
 {
-	CPDF_Rect rcClient = GetClientRect();
+    CPDF_Rect rcClient = GetClientRect();
 
-	if (m_bPopup)
-	{
-		CPDF_Rect rclient = GetClientRect();
-		CPDF_Rect rcButton = rclient;
-		CPDF_Rect rcEdit = rcClient;
-		CPDF_Rect rcList = CPWL_Wnd::GetWindowRect();
+    if (m_bPopup)
+    {
+        CPDF_Rect rclient = GetClientRect();
+        CPDF_Rect rcButton = rclient;
+        CPDF_Rect rcEdit = rcClient;
+        CPDF_Rect rcList = CPWL_Wnd::GetWindowRect();
 
-		FX_FLOAT fOldWindowHeight = m_rcOldWindow.Height();
-		FX_FLOAT fOldClientHeight = fOldWindowHeight - GetBorderWidth() * 2;
+        FX_FLOAT fOldWindowHeight = m_rcOldWindow.Height();
+        FX_FLOAT fOldClientHeight = fOldWindowHeight - GetBorderWidth() * 2;
 
-		switch (m_nPopupWhere)
-		{
-		case 0:
-			rcButton.left = rcButton.right - PWL_COMBOBOX_BUTTON_WIDTH;
+        switch (m_nPopupWhere)
+        {
+        case 0:
+            rcButton.left = rcButton.right - PWL_COMBOBOX_BUTTON_WIDTH;
 
-			if (rcButton.left < rclient.left)
-				rcButton.left = rclient.left;
+            if (rcButton.left < rclient.left)
+                rcButton.left = rclient.left;
 
-			rcButton.bottom = rcButton.top - fOldClientHeight;
+            rcButton.bottom = rcButton.top - fOldClientHeight;
 
-			rcEdit.right = rcButton.left - 1.0f;
+            rcEdit.right = rcButton.left - 1.0f;
 
-			if (rcEdit.left < rclient.left)
-				rcEdit.left = rclient.left;
+            if (rcEdit.left < rclient.left)
+                rcEdit.left = rclient.left;
 
-			if (rcEdit.right < rcEdit.left)
-				rcEdit.right = rcEdit.left;
+            if (rcEdit.right < rcEdit.left)
+                rcEdit.right = rcEdit.left;
 
-			rcEdit.bottom = rcEdit.top - fOldClientHeight;
+            rcEdit.bottom = rcEdit.top - fOldClientHeight;
 
-			rcList.top -= fOldWindowHeight;
+            rcList.top -= fOldWindowHeight;
 
-			break;
-		case 1:
-			rcButton.left = rcButton.right - PWL_COMBOBOX_BUTTON_WIDTH;
+            break;
+        case 1:
+            rcButton.left = rcButton.right - PWL_COMBOBOX_BUTTON_WIDTH;
 
-			if (rcButton.left < rclient.left)
-				rcButton.left = rclient.left;
+            if (rcButton.left < rclient.left)
+                rcButton.left = rclient.left;
 
-			rcButton.top = rcButton.bottom + fOldClientHeight;
+            rcButton.top = rcButton.bottom + fOldClientHeight;
 
-			rcEdit.right = rcButton.left - 1.0f;
+            rcEdit.right = rcButton.left - 1.0f;
 
-			if (rcEdit.left < rclient.left)
-				rcEdit.left = rclient.left;
+            if (rcEdit.left < rclient.left)
+                rcEdit.left = rclient.left;
 
-			if (rcEdit.right < rcEdit.left)
-				rcEdit.right = rcEdit.left;
+            if (rcEdit.right < rcEdit.left)
+                rcEdit.right = rcEdit.left;
 
-			rcEdit.top = rcEdit.bottom + fOldClientHeight;
+            rcEdit.top = rcEdit.bottom + fOldClientHeight;
 
-			rcList.bottom += fOldWindowHeight;
+            rcList.bottom += fOldWindowHeight;
 
-			break;
-		}
+            break;
+        }
 
-		if (m_pButton)
-			m_pButton->Move(rcButton,TRUE,FALSE);
+        if (m_pButton)
+            m_pButton->Move(rcButton,TRUE,FALSE);
 
-		if (m_pEdit)
-			m_pEdit->Move(rcEdit,TRUE,FALSE);
+        if (m_pEdit)
+            m_pEdit->Move(rcEdit,TRUE,FALSE);
 
-		if (m_pList)
-		{
-			m_pList->SetVisible(TRUE);
-			m_pList->Move(rcList,TRUE,FALSE);
-			m_pList->ScrollToListItem(m_nSelectItem);
-		}
-	}
-	else
-	{
-		CPDF_Rect rcButton = rcClient;
+        if (m_pList)
+        {
+            m_pList->SetVisible(TRUE);
+            m_pList->Move(rcList,TRUE,FALSE);
+            m_pList->ScrollToListItem(m_nSelectItem);
+        }
+    }
+    else
+    {
+        CPDF_Rect rcButton = rcClient;
 
-		rcButton.left = rcButton.right - PWL_COMBOBOX_BUTTON_WIDTH;
+        rcButton.left = rcButton.right - PWL_COMBOBOX_BUTTON_WIDTH;
 
-		if (rcButton.left < rcClient.left)
-			rcButton.left = rcClient.left;
+        if (rcButton.left < rcClient.left)
+            rcButton.left = rcClient.left;
 
-		if (m_pButton)
-			m_pButton->Move(rcButton,TRUE,FALSE);
+        if (m_pButton)
+            m_pButton->Move(rcButton,TRUE,FALSE);
 
-		CPDF_Rect rcEdit = rcClient;
-		rcEdit.right = rcButton.left - 1.0f;
+        CPDF_Rect rcEdit = rcClient;
+        rcEdit.right = rcButton.left - 1.0f;
 
-		if (rcEdit.left < rcClient.left)
-			rcEdit.left = rcClient.left;
+        if (rcEdit.left < rcClient.left)
+            rcEdit.left = rcClient.left;
 
-		if (rcEdit.right < rcEdit.left)
-			rcEdit.right = rcEdit.left;
+        if (rcEdit.right < rcEdit.left)
+            rcEdit.right = rcEdit.left;
 
-		if (m_pEdit)
-			m_pEdit->Move(rcEdit,TRUE,FALSE);
+        if (m_pEdit)
+            m_pEdit->Move(rcEdit,TRUE,FALSE);
 
-		if (m_pList)
-			m_pList->SetVisible(FALSE);
-	}
+        if (m_pList)
+            m_pList->SetVisible(FALSE);
+    }
 }
 
 void CPWL_ComboBox::SelectAll()
 {
-	if (m_pEdit && HasFlag(PCBS_ALLOWCUSTOMTEXT))
-		m_pEdit->SelectAll();
+    if (m_pEdit && HasFlag(PCBS_ALLOWCUSTOMTEXT))
+        m_pEdit->SelectAll();
 }
 
 CPDF_Rect CPWL_ComboBox::GetFocusRect() const
 {
-	return CPDF_Rect();
+    return CPDF_Rect();
 }
 
 void CPWL_ComboBox::SetPopup(FX_BOOL bPopup)
@@ -600,99 +600,94 @@
 
 	if (HasFlag(PCBS_ALLOWCUSTOMTEXT))
 		return m_pEdit->OnKeyDown(nChar,nFlag);
-	else
-		return FALSE;
+
+    return FALSE;
 }
 
 FX_BOOL CPWL_ComboBox::OnChar(FX_WORD nChar, FX_DWORD nFlag)
 {
-	if (!m_pList) return FALSE;
-	if (!m_pEdit) return FALSE;
+    if (!m_pList)
+        return FALSE;
 
-	m_nSelectItem = -1;
-	FX_BOOL bExit = FALSE;
+    if (!m_pEdit)
+        return FALSE;
 
+    m_nSelectItem = -1;
 	if (HasFlag(PCBS_ALLOWCUSTOMTEXT))
-	{
 		return m_pEdit->OnChar(nChar,nFlag);
-	}
-	else
-	{
-		if (m_pFillerNotify)
-		{
-			bExit = FALSE;
-			m_pFillerNotify->OnPopupPreOpen(GetAttachedData(), bExit, nFlag);
-			if (bExit) return FALSE;
 
-			bExit = FALSE;
-			m_pFillerNotify->OnPopupPostOpen(GetAttachedData(), bExit, nFlag);
-			if (bExit) return FALSE;
-		}
-		if (m_pList->OnCharWithExit(nChar,bExit,nFlag))
-		{
-			return bExit;
-		}
-		else
-			return FALSE;
-	}
+    FX_BOOL bExit = FALSE;
+    if (m_pFillerNotify)
+    {
+        m_pFillerNotify->OnPopupPreOpen(GetAttachedData(), bExit, nFlag);
+        if (bExit)
+            return FALSE;
+
+        m_pFillerNotify->OnPopupPostOpen(GetAttachedData(), bExit, nFlag);
+        if (bExit)
+            return FALSE;
+    }
+    if (m_pList->OnCharWithExit(nChar,bExit,nFlag))
+        return bExit;
+
+    return FALSE;
 }
 
 void CPWL_ComboBox::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, intptr_t wParam, intptr_t lParam)
 {
-	switch (msg)
-	{
-	case PNM_LBUTTONDOWN:
-		if (pWnd == m_pButton)
-		{
-			SetPopup(!m_bPopup);
-			return;
-		}
-		break;
-	case PNM_LBUTTONUP:
-		if (m_pEdit && m_pList)
-		{
-			if (pWnd == m_pList)
-			{
-				SetSelectText();
-				SelectAll();
-				m_pEdit->SetFocus();
-				SetPopup(FALSE);
-				return;
-			}
-		}
-	}
+    switch (msg)
+    {
+    case PNM_LBUTTONDOWN:
+        if (pWnd == m_pButton)
+        {
+            SetPopup(!m_bPopup);
+            return;
+        }
+        break;
+    case PNM_LBUTTONUP:
+        if (m_pEdit && m_pList)
+        {
+            if (pWnd == m_pList)
+            {
+                SetSelectText();
+                SelectAll();
+                m_pEdit->SetFocus();
+                SetPopup(FALSE);
+                return;
+            }
+        }
+    }
 
-	CPWL_Wnd::OnNotify(pWnd,msg,wParam,lParam);
+    CPWL_Wnd::OnNotify(pWnd,msg,wParam,lParam);
 }
 
 FX_BOOL CPWL_ComboBox::IsPopup() const
 {
-	return m_bPopup;
+    return m_bPopup;
 }
 
 void CPWL_ComboBox::SetSelectText()
 {
-	CFX_WideString swText = m_pList->GetText();
-	m_pEdit->SelectAll();
-	m_pEdit->ReplaceSel(m_pList->GetText().c_str());
-	m_pEdit->SelectAll();
+    CFX_WideString swText = m_pList->GetText();
+    m_pEdit->SelectAll();
+    m_pEdit->ReplaceSel(m_pList->GetText().c_str());
+    m_pEdit->SelectAll();
 
-	m_nSelectItem = m_pList->GetCurSel();
+    m_nSelectItem = m_pList->GetCurSel();
 }
 
 FX_BOOL CPWL_ComboBox::IsModified() const
 {
-	return m_pEdit->IsModified();
+    return m_pEdit->IsModified();
 }
 
 void CPWL_ComboBox::SetFillerNotify(IPWL_Filler_Notify* pNotify)
 {
-	 m_pFillerNotify = pNotify;
+     m_pFillerNotify = pNotify;
 
-	 if (m_pEdit)
-		 m_pEdit->SetFillerNotify(pNotify);
+     if (m_pEdit)
+         m_pEdit->SetFillerNotify(pNotify);
 
-	 if (m_pList)
-		 m_pList->SetFillerNotify(pNotify);
+     if (m_pList)
+         m_pList->SetFillerNotify(pNotify);
 }
-
diff --git a/fpdfsdk/src/pdfwindow/PWL_EditCtrl.cpp b/fpdfsdk/src/pdfwindow/PWL_EditCtrl.cpp
index f562076..0d14587 100644
--- a/fpdfsdk/src/pdfwindow/PWL_EditCtrl.cpp
+++ b/fpdfsdk/src/pdfwindow/PWL_EditCtrl.cpp
@@ -12,558 +12,558 @@
 #include "../../include/pdfwindow/PWL_Caret.h"
 #include "../../include/pdfwindow/PWL_FontMap.h"
 
-#define IsFloatZero(f)						((f) < 0.0001 && (f) > -0.0001)
-#define IsFloatBigger(fa,fb)				((fa) > (fb) && !IsFloatZero((fa) - (fb)))
-#define IsFloatSmaller(fa,fb)				((fa) < (fb) && !IsFloatZero((fa) - (fb)))
-#define IsFloatEqual(fa,fb)					IsFloatZero((fa)-(fb))
+#define IsFloatZero(f)                      ((f) < 0.0001 && (f) > -0.0001)
+#define IsFloatBigger(fa,fb)                ((fa) > (fb) && !IsFloatZero((fa) - (fb)))
+#define IsFloatSmaller(fa,fb)               ((fa) < (fb) && !IsFloatZero((fa) - (fb)))
+#define IsFloatEqual(fa,fb)                 IsFloatZero((fa)-(fb))
 
 /* ---------------------------- CPWL_EditCtrl ------------------------------ */
 
 CPWL_EditCtrl::CPWL_EditCtrl() :
-	m_pEdit(NULL),
-	m_pEditCaret(NULL),
-	m_bMouseDown(FALSE),
-	m_pEditNotify(NULL),
-	m_nCharSet(DEFAULT_CHARSET),
-	m_nCodePage(0)
+    m_pEdit(NULL),
+    m_pEditCaret(NULL),
+    m_bMouseDown(FALSE),
+    m_pEditNotify(NULL),
+    m_nCharSet(DEFAULT_CHARSET),
+    m_nCodePage(0)
 {
-	m_pEdit = IFX_Edit::NewEdit();
-	ASSERT(m_pEdit != NULL);
+    m_pEdit = IFX_Edit::NewEdit();
+    ASSERT(m_pEdit != NULL);
 }
 
 CPWL_EditCtrl::~CPWL_EditCtrl()
 {
-	IFX_Edit::DelEdit(m_pEdit);
+    IFX_Edit::DelEdit(m_pEdit);
 }
 
-void CPWL_EditCtrl::OnCreate(PWL_CREATEPARAM & cp)
+void CPWL_EditCtrl::OnCreate(PWL_CREATEPARAM& cp)
 {
-	cp.eCursorType = FXCT_VBEAM;
+    cp.eCursorType = FXCT_VBEAM;
 }
 
 void CPWL_EditCtrl::OnCreated()
 {
-	SetFontSize(GetCreationParam().fFontSize);
+    SetFontSize(GetCreationParam().fFontSize);
 
-	m_pEdit->SetFontMap(GetFontMap());
-	m_pEdit->SetNotify(this);
-	m_pEdit->Initialize();
+    m_pEdit->SetFontMap(GetFontMap());
+    m_pEdit->SetNotify(this);
+    m_pEdit->Initialize();
 }
 
 FX_BOOL CPWL_EditCtrl::IsWndHorV()
 {
-	CPDF_Matrix mt = GetWindowMatrix();
-	CPDF_Point point1(0,1);
-	CPDF_Point point2(1,1);
+    CPDF_Matrix mt = GetWindowMatrix();
+    CPDF_Point point1(0,1);
+    CPDF_Point point2(1,1);
 
-	mt.Transform(point1.x, point1.y);
-	mt.Transform(point2.x, point2.y);
+    mt.Transform(point1.x, point1.y);
+    mt.Transform(point2.x, point2.y);
 
-	return point2.y == point1.y;
+    return point2.y == point1.y;
 }
 
 void CPWL_EditCtrl::SetCursor()
 {
-	if (IsValid())
-	{
-		if (IFX_SystemHandler* pSH = GetSystemHandler())
-		{
-			if (IsWndHorV())
-				pSH->SetCursor(FXCT_VBEAM);
-			else
-				pSH->SetCursor(FXCT_HBEAM);
-		}
-	}
+    if (IsValid())
+    {
+        if (IFX_SystemHandler* pSH = GetSystemHandler())
+        {
+            if (IsWndHorV())
+                pSH->SetCursor(FXCT_VBEAM);
+            else
+                pSH->SetCursor(FXCT_HBEAM);
+        }
+    }
 }
 
 void CPWL_EditCtrl::RePosChildWnd()
 {
-	m_pEdit->SetPlateRect(GetClientRect());
+    m_pEdit->SetPlateRect(GetClientRect());
 }
 
 void CPWL_EditCtrl::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, intptr_t wParam, intptr_t lParam)
 {
-	CPWL_Wnd::OnNotify(pWnd,msg,wParam,lParam);
+    CPWL_Wnd::OnNotify(pWnd,msg,wParam,lParam);
 
-	switch (msg)
-	{
-		case PNM_SETSCROLLINFO:
-			switch (wParam)
-			{
-				case SBT_VSCROLL:
-					if (CPWL_Wnd * pChild = GetVScrollBar())
-					{
-						pChild->OnNotify(pWnd,PNM_SETSCROLLINFO,wParam,lParam);
-					}
-					break;
-			}
-			break;
-		case PNM_SETSCROLLPOS:
-			switch (wParam)
-			{
-				case SBT_VSCROLL:
-					if (CPWL_Wnd * pChild = GetVScrollBar())
-					{
-						pChild->OnNotify(pWnd,PNM_SETSCROLLPOS,wParam,lParam);
-					}
-					break;
-			}
-			break;
-		case PNM_SCROLLWINDOW:
-			{
-				FX_FLOAT fPos = *(FX_FLOAT*)lParam;
-				switch (wParam)
-				{
-					case SBT_VSCROLL:
-						m_pEdit->SetScrollPos(CPDF_Point(m_pEdit->GetScrollPos().x,fPos));
-						break;
-				}
-			}
-			break;
-		case PNM_SETCARETINFO:
-			{
-				if (PWL_CARET_INFO * pCaretInfo = (PWL_CARET_INFO *)wParam)
-				{
-					SetCaret(pCaretInfo->bVisible,
-						pCaretInfo->ptHead,
-						pCaretInfo->ptFoot);
-				}
-			}
-			break;
-	}
+    switch (msg)
+    {
+        case PNM_SETSCROLLINFO:
+            switch (wParam)
+            {
+                case SBT_VSCROLL:
+                    if (CPWL_Wnd * pChild = GetVScrollBar())
+                    {
+                        pChild->OnNotify(pWnd,PNM_SETSCROLLINFO,wParam,lParam);
+                    }
+                    break;
+            }
+            break;
+        case PNM_SETSCROLLPOS:
+            switch (wParam)
+            {
+                case SBT_VSCROLL:
+                    if (CPWL_Wnd * pChild = GetVScrollBar())
+                    {
+                        pChild->OnNotify(pWnd,PNM_SETSCROLLPOS,wParam,lParam);
+                    }
+                    break;
+            }
+            break;
+        case PNM_SCROLLWINDOW:
+            {
+                FX_FLOAT fPos = *(FX_FLOAT*)lParam;
+                switch (wParam)
+                {
+                    case SBT_VSCROLL:
+                        m_pEdit->SetScrollPos(CPDF_Point(m_pEdit->GetScrollPos().x,fPos));
+                        break;
+                }
+            }
+            break;
+        case PNM_SETCARETINFO:
+            {
+                if (PWL_CARET_INFO * pCaretInfo = (PWL_CARET_INFO *)wParam)
+                {
+                    SetCaret(pCaretInfo->bVisible,
+                        pCaretInfo->ptHead,
+                        pCaretInfo->ptFoot);
+                }
+            }
+            break;
+    }
 }
 
 void CPWL_EditCtrl::CreateChildWnd(const PWL_CREATEPARAM & cp)
 {
-	if (!IsReadOnly())
-		CreateEditCaret(cp);
+    if (!IsReadOnly())
+        CreateEditCaret(cp);
 }
 
 void CPWL_EditCtrl::CreateEditCaret(const PWL_CREATEPARAM & cp)
 {
-	if (!m_pEditCaret)
-	{
-		m_pEditCaret = new CPWL_Caret;
-		m_pEditCaret->SetInvalidRect(GetClientRect());
+    if (!m_pEditCaret)
+    {
+        m_pEditCaret = new CPWL_Caret;
+        m_pEditCaret->SetInvalidRect(GetClientRect());
 
-		PWL_CREATEPARAM	ecp = cp;
-		ecp.pParentWnd = this;
-		ecp.dwFlags = PWS_CHILD | PWS_NOREFRESHCLIP;
-		ecp.dwBorderWidth = 0;
-		ecp.nBorderStyle = PBS_SOLID;
-		ecp.rcRectWnd = CPDF_Rect(0,0,0,0);
+        PWL_CREATEPARAM ecp = cp;
+        ecp.pParentWnd = this;
+        ecp.dwFlags = PWS_CHILD | PWS_NOREFRESHCLIP;
+        ecp.dwBorderWidth = 0;
+        ecp.nBorderStyle = PBS_SOLID;
+        ecp.rcRectWnd = CPDF_Rect(0,0,0,0);
 
-		m_pEditCaret->Create(ecp);
-	}
+        m_pEditCaret->Create(ecp);
+    }
 }
 
 void CPWL_EditCtrl::SetFontSize(FX_FLOAT fFontSize)
 {
-	m_pEdit->SetFontSize(fFontSize);
+    m_pEdit->SetFontSize(fFontSize);
 }
 
 FX_FLOAT CPWL_EditCtrl::GetFontSize() const
 {
-	return m_pEdit->GetFontSize();
+    return m_pEdit->GetFontSize();
 }
 
 FX_BOOL CPWL_EditCtrl::OnKeyDown(FX_WORD nChar, FX_DWORD nFlag)
 {
-	if (m_bMouseDown) return TRUE;
+    if (m_bMouseDown) return TRUE;
 
-	FX_BOOL bRet = CPWL_Wnd::OnKeyDown(nChar,nFlag);
+    FX_BOOL bRet = CPWL_Wnd::OnKeyDown(nChar,nFlag);
 
-	//FILTER
-	switch (nChar)
-	{
-	default:
-		return FALSE;
-	case FWL_VKEY_Delete:
-	case FWL_VKEY_Up:
-	case FWL_VKEY_Down:
-	case FWL_VKEY_Left:
-	case FWL_VKEY_Right:
-	case FWL_VKEY_Home:
-	case FWL_VKEY_End:
-	case FWL_VKEY_Insert:
-	case 'C':
-	case 'V':
-	case 'X':
-	case 'A':
-	case 'Z':
-	case 'c':
-	case 'v':
-	case 'x':
-	case 'a':
-	case 'z':
-		break;
-	}
+    //FILTER
+    switch (nChar)
+    {
+    default:
+        return FALSE;
+    case FWL_VKEY_Delete:
+    case FWL_VKEY_Up:
+    case FWL_VKEY_Down:
+    case FWL_VKEY_Left:
+    case FWL_VKEY_Right:
+    case FWL_VKEY_Home:
+    case FWL_VKEY_End:
+    case FWL_VKEY_Insert:
+    case 'C':
+    case 'V':
+    case 'X':
+    case 'A':
+    case 'Z':
+    case 'c':
+    case 'v':
+    case 'x':
+    case 'a':
+    case 'z':
+        break;
+    }
 
-	if (nChar == FWL_VKEY_Delete)
-	{
-		if (m_pEdit->IsSelected())
-			nChar = FWL_VKEY_Unknown;
-	}
+    if (nChar == FWL_VKEY_Delete)
+    {
+        if (m_pEdit->IsSelected())
+            nChar = FWL_VKEY_Unknown;
+    }
 
-	switch (nChar)
-	{
-		case FWL_VKEY_Delete:
-			Delete();
-			return TRUE;
-		case FWL_VKEY_Insert:
-			if (IsSHIFTpressed(nFlag))
-				PasteText();
-			return TRUE;
-		case FWL_VKEY_Up:
-			m_pEdit->OnVK_UP(IsSHIFTpressed(nFlag),FALSE);
-			return TRUE;
-		case FWL_VKEY_Down:
-			m_pEdit->OnVK_DOWN(IsSHIFTpressed(nFlag),FALSE);
-			return TRUE;
-		case FWL_VKEY_Left:
-			m_pEdit->OnVK_LEFT(IsSHIFTpressed(nFlag),FALSE);
-			return TRUE;
-		case FWL_VKEY_Right:
-			m_pEdit->OnVK_RIGHT(IsSHIFTpressed(nFlag),FALSE);
-			return TRUE;
-		case FWL_VKEY_Home:
-			m_pEdit->OnVK_HOME(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
-			return TRUE;
-		case FWL_VKEY_End:
-			m_pEdit->OnVK_END(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
-			return TRUE;
-		case FWL_VKEY_Unknown:
-			if (!IsSHIFTpressed(nFlag))
-				Clear();
-			else
-				CutText();
-			return TRUE;
-		default:
-			break;
-	}
+    switch (nChar)
+    {
+        case FWL_VKEY_Delete:
+            Delete();
+            return TRUE;
+        case FWL_VKEY_Insert:
+            if (IsSHIFTpressed(nFlag))
+                PasteText();
+            return TRUE;
+        case FWL_VKEY_Up:
+            m_pEdit->OnVK_UP(IsSHIFTpressed(nFlag),FALSE);
+            return TRUE;
+        case FWL_VKEY_Down:
+            m_pEdit->OnVK_DOWN(IsSHIFTpressed(nFlag),FALSE);
+            return TRUE;
+        case FWL_VKEY_Left:
+            m_pEdit->OnVK_LEFT(IsSHIFTpressed(nFlag),FALSE);
+            return TRUE;
+        case FWL_VKEY_Right:
+            m_pEdit->OnVK_RIGHT(IsSHIFTpressed(nFlag),FALSE);
+            return TRUE;
+        case FWL_VKEY_Home:
+            m_pEdit->OnVK_HOME(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
+            return TRUE;
+        case FWL_VKEY_End:
+            m_pEdit->OnVK_END(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
+            return TRUE;
+        case FWL_VKEY_Unknown:
+            if (!IsSHIFTpressed(nFlag))
+                Clear();
+            else
+                CutText();
+            return TRUE;
+        default:
+            break;
+    }
 
-	return bRet;
+    return bRet;
 }
 
 FX_BOOL CPWL_EditCtrl::OnChar(FX_WORD nChar, FX_DWORD nFlag)
 {
-	if (m_bMouseDown) return TRUE;
+    if (m_bMouseDown) return TRUE;
 
-	CPWL_Wnd::OnChar(nChar,nFlag);
+    CPWL_Wnd::OnChar(nChar,nFlag);
 
-	//FILTER
-	switch (nChar)
-	{
-		case 0x0A:
-		case 0x1B:
-			return FALSE;
-		default:
-			break;
-	}
+    //FILTER
+    switch (nChar)
+    {
+        case 0x0A:
+        case 0x1B:
+            return FALSE;
+        default:
+            break;
+    }
 
-	FX_BOOL bCtrl = IsCTRLpressed(nFlag);
-	FX_BOOL bAlt = IsALTpressed(nFlag);
-	FX_BOOL bShift = IsSHIFTpressed(nFlag);
+    FX_BOOL bCtrl = IsCTRLpressed(nFlag);
+    FX_BOOL bAlt = IsALTpressed(nFlag);
+    FX_BOOL bShift = IsSHIFTpressed(nFlag);
 
-	FX_WORD word = nChar;
+    FX_WORD word = nChar;
 
-	if (bCtrl && !bAlt)
-	{
-		switch (nChar)
-		{
-			case 'C' - 'A' + 1:
-				CopyText();
-				return TRUE;
-			case 'V' - 'A' + 1:
-				PasteText();
-				return TRUE;
-			case 'X' - 'A' + 1:
-				CutText();
-				return TRUE;
-			case 'A' - 'A' + 1:
-				SelectAll();
-				return TRUE;
-			case 'Z' - 'A' + 1:
-				if (bShift)
-					Redo();
-				else
-					Undo();
-				return TRUE;
-			default:
-				if (nChar < 32)
-					return FALSE;
-		}
-	}
+    if (bCtrl && !bAlt)
+    {
+        switch (nChar)
+        {
+            case 'C' - 'A' + 1:
+                CopyText();
+                return TRUE;
+            case 'V' - 'A' + 1:
+                PasteText();
+                return TRUE;
+            case 'X' - 'A' + 1:
+                CutText();
+                return TRUE;
+            case 'A' - 'A' + 1:
+                SelectAll();
+                return TRUE;
+            case 'Z' - 'A' + 1:
+                if (bShift)
+                    Redo();
+                else
+                    Undo();
+                return TRUE;
+            default:
+                if (nChar < 32)
+                    return FALSE;
+        }
+    }
 
-	if (IsReadOnly()) return TRUE;
+    if (IsReadOnly()) return TRUE;
 
-	if (m_pEdit->IsSelected() && word ==  FWL_VKEY_Back)
-		word = FWL_VKEY_Unknown;
+    if (m_pEdit->IsSelected() && word ==  FWL_VKEY_Back)
+        word = FWL_VKEY_Unknown;
 
-	Clear();
+    Clear();
 
-	switch (word)
-	{
-	case FWL_VKEY_Back:
-		Backspace();
-		break;
-	case FWL_VKEY_Return:
-		InsertReturn();
-		break;
-	case FWL_VKEY_Unknown:
-		break;
-	default:
-		if (IsINSERTpressed(nFlag))
-			Delete();
-		InsertWord(word, GetCharSet());
-		break;
-	}
+    switch (word)
+    {
+    case FWL_VKEY_Back:
+        Backspace();
+        break;
+    case FWL_VKEY_Return:
+        InsertReturn();
+        break;
+    case FWL_VKEY_Unknown:
+        break;
+    default:
+        if (IsINSERTpressed(nFlag))
+            Delete();
+        InsertWord(word, GetCharSet());
+        break;
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL CPWL_EditCtrl::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)
 {
-	CPWL_Wnd::OnLButtonDown(point,nFlag);
+    CPWL_Wnd::OnLButtonDown(point,nFlag);
 
-	if (ClientHitTest(point))
-	{
-		if (m_bMouseDown)
-			InvalidateRect();
+    if (ClientHitTest(point))
+    {
+        if (m_bMouseDown)
+            InvalidateRect();
 
-		m_bMouseDown = TRUE;
-		SetCapture();
+        m_bMouseDown = TRUE;
+        SetCapture();
 
-		m_pEdit->OnMouseDown(point,IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
-	}
+        m_pEdit->OnMouseDown(point,IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL CPWL_EditCtrl::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag)
 {
-	CPWL_Wnd::OnLButtonUp(point,nFlag);
+    CPWL_Wnd::OnLButtonUp(point,nFlag);
 
-	if (m_bMouseDown)
-	{
-		//can receive keybord message
-		if (ClientHitTest(point) && !IsFocused())
-			SetFocus();
+    if (m_bMouseDown)
+    {
+        //can receive keybord message
+        if (ClientHitTest(point) && !IsFocused())
+            SetFocus();
 
-		ReleaseCapture();
-		m_bMouseDown = FALSE;
-	}
+        ReleaseCapture();
+        m_bMouseDown = FALSE;
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 FX_BOOL CPWL_EditCtrl::OnMouseMove(const CPDF_Point & point, FX_DWORD nFlag)
 {
-	CPWL_Wnd::OnMouseMove(point,nFlag);
+    CPWL_Wnd::OnMouseMove(point,nFlag);
 
-	if (m_bMouseDown)
-		m_pEdit->OnMouseMove(point,FALSE,FALSE);
+    if (m_bMouseDown)
+        m_pEdit->OnMouseMove(point,FALSE,FALSE);
 
-	return TRUE;
+    return TRUE;
 }
 
 CPDF_Rect CPWL_EditCtrl::GetContentRect() const
 {
-	return m_pEdit->GetContentRect();
+    return m_pEdit->GetContentRect();
 }
 
 void CPWL_EditCtrl::SetEditCaret(FX_BOOL bVisible)
 {
-	CPDF_Point ptHead(0,0),ptFoot(0,0);
+    CPDF_Point ptHead(0,0),ptFoot(0,0);
 
-	if (bVisible)
-	{
-		GetCaretInfo(ptHead,ptFoot);
-	}
+    if (bVisible)
+    {
+        GetCaretInfo(ptHead,ptFoot);
+    }
 
-	CPVT_WordPlace wpTemp = m_pEdit->GetCaretWordPlace();
-	IOnSetCaret(bVisible,ptHead,ptFoot,wpTemp);
+    CPVT_WordPlace wpTemp = m_pEdit->GetCaretWordPlace();
+    IOnSetCaret(bVisible,ptHead,ptFoot,wpTemp);
 }
 
 void CPWL_EditCtrl::GetCaretInfo(CPDF_Point & ptHead, CPDF_Point & ptFoot) const
 {
-	if (IFX_Edit_Iterator * pIterator = m_pEdit->GetIterator())
-	{
-		pIterator->SetAt(m_pEdit->GetCaret());
-		CPVT_Word word;
-		CPVT_Line line;
-		if (pIterator->GetWord(word))
-		{
-			ptHead.x = word.ptWord.x + word.fWidth;
-			ptHead.y = word.ptWord.y + word.fAscent;
-			ptFoot.x = word.ptWord.x + word.fWidth;
-			ptFoot.y = word.ptWord.y + word.fDescent;
-		}
-		else if (pIterator->GetLine(line))
-		{
-			ptHead.x = line.ptLine.x;
-			ptHead.y = line.ptLine.y + line.fLineAscent;
-			ptFoot.x = line.ptLine.x;
-			ptFoot.y = line.ptLine.y + line.fLineDescent;
-		}
-	}
+    if (IFX_Edit_Iterator * pIterator = m_pEdit->GetIterator())
+    {
+        pIterator->SetAt(m_pEdit->GetCaret());
+        CPVT_Word word;
+        CPVT_Line line;
+        if (pIterator->GetWord(word))
+        {
+            ptHead.x = word.ptWord.x + word.fWidth;
+            ptHead.y = word.ptWord.y + word.fAscent;
+            ptFoot.x = word.ptWord.x + word.fWidth;
+            ptFoot.y = word.ptWord.y + word.fDescent;
+        }
+        else if (pIterator->GetLine(line))
+        {
+            ptHead.x = line.ptLine.x;
+            ptHead.y = line.ptLine.y + line.fLineAscent;
+            ptFoot.x = line.ptLine.x;
+            ptFoot.y = line.ptLine.y + line.fLineDescent;
+        }
+    }
 }
 
 void CPWL_EditCtrl::GetCaretPos(int32_t& x, int32_t& y) const
 {
-	CPDF_Point ptHead(0,0), ptFoot(0,0);
+    CPDF_Point ptHead(0,0), ptFoot(0,0);
 
-	GetCaretInfo(ptHead,ptFoot);
+    GetCaretInfo(ptHead,ptFoot);
 
-	PWLtoWnd(ptHead, x, y);
+    PWLtoWnd(ptHead, x, y);
 }
 
 void CPWL_EditCtrl::SetCaret(FX_BOOL bVisible, const CPDF_Point & ptHead, const CPDF_Point & ptFoot)
 {
-	if (m_pEditCaret)
-	{
-		if (!IsFocused() || m_pEdit->IsSelected())
-			bVisible = FALSE;
+    if (m_pEditCaret)
+    {
+        if (!IsFocused() || m_pEdit->IsSelected())
+            bVisible = FALSE;
 
-		m_pEditCaret->SetCaret(bVisible, ptHead, ptFoot);
-	}
+        m_pEditCaret->SetCaret(bVisible, ptHead, ptFoot);
+    }
 }
 
-FX_BOOL	CPWL_EditCtrl::IsModified() const
+FX_BOOL CPWL_EditCtrl::IsModified() const
 {
-	return m_pEdit->IsModified();
+    return m_pEdit->IsModified();
 }
 
 CFX_WideString CPWL_EditCtrl::GetText() const
 {
-	return m_pEdit->GetText();
+    return m_pEdit->GetText();
 }
 
 void CPWL_EditCtrl::SetSel(int32_t nStartChar,int32_t nEndChar)
 {
-	m_pEdit->SetSel(nStartChar, nEndChar);
+    m_pEdit->SetSel(nStartChar, nEndChar);
 }
 
 void CPWL_EditCtrl::GetSel(int32_t & nStartChar, int32_t & nEndChar ) const
 {
-	m_pEdit->GetSel(nStartChar, nEndChar);
+    m_pEdit->GetSel(nStartChar, nEndChar);
 }
 
 void CPWL_EditCtrl::Clear()
 {
-	if (!IsReadOnly())
-		m_pEdit->Clear();
+    if (!IsReadOnly())
+        m_pEdit->Clear();
 }
 
 void CPWL_EditCtrl::SelectAll()
 {
-	m_pEdit->SelectAll();
+    m_pEdit->SelectAll();
 }
 
 void CPWL_EditCtrl::Paint()
 {
-	if (m_pEdit)
-		m_pEdit->Paint();
+    if (m_pEdit)
+        m_pEdit->Paint();
 }
 
 void CPWL_EditCtrl::EnableRefresh(FX_BOOL bRefresh)
 {
-	if (m_pEdit)
-		m_pEdit->EnableRefresh(bRefresh);
+    if (m_pEdit)
+        m_pEdit->EnableRefresh(bRefresh);
 }
 
 int32_t CPWL_EditCtrl::GetCaret() const
 {
-	if (m_pEdit)
-		return m_pEdit->GetCaret();
+    if (m_pEdit)
+        return m_pEdit->GetCaret();
 
-	return -1;
+    return -1;
 }
 
 void CPWL_EditCtrl::SetCaret(int32_t nPos)
 {
-	if (m_pEdit)
-		m_pEdit->SetCaret(nPos);
+    if (m_pEdit)
+        m_pEdit->SetCaret(nPos);
 }
 
 int32_t CPWL_EditCtrl::GetTotalWords() const
 {
-	if (m_pEdit)
-		return m_pEdit->GetTotalWords();
+    if (m_pEdit)
+        return m_pEdit->GetTotalWords();
 
-	return 0;
+    return 0;
 }
 
 void CPWL_EditCtrl::SetScrollPos(const CPDF_Point& point)
 {
-	if (m_pEdit)
-		m_pEdit->SetScrollPos(point);
+    if (m_pEdit)
+        m_pEdit->SetScrollPos(point);
 }
 
 CPDF_Point CPWL_EditCtrl::GetScrollPos() const
 {
-	if (m_pEdit)
-		return m_pEdit->GetScrollPos();
+    if (m_pEdit)
+        return m_pEdit->GetScrollPos();
 
-	return CPDF_Point(0.0f, 0.0f);
+    return CPDF_Point(0.0f, 0.0f);
 }
 
 CPDF_Font * CPWL_EditCtrl::GetCaretFont() const
 {
-	int32_t nFontIndex = 0;
+    int32_t nFontIndex = 0;
 
-	if (IFX_Edit_Iterator * pIterator = m_pEdit->GetIterator())
-	{
-		pIterator->SetAt(m_pEdit->GetCaret());
-		CPVT_Word word;
-		CPVT_Section section;
-		if (pIterator->GetWord(word))
-		{
-			nFontIndex = word.nFontIndex;
-		}
-		else if (HasFlag(PES_RICH))
-		{
-			if (pIterator->GetSection(section))
-			{
-				nFontIndex = section.WordProps.nFontIndex;
-			}
-		}
-	}
+    if (IFX_Edit_Iterator * pIterator = m_pEdit->GetIterator())
+    {
+        pIterator->SetAt(m_pEdit->GetCaret());
+        CPVT_Word word;
+        CPVT_Section section;
+        if (pIterator->GetWord(word))
+        {
+            nFontIndex = word.nFontIndex;
+        }
+        else if (HasFlag(PES_RICH))
+        {
+            if (pIterator->GetSection(section))
+            {
+                nFontIndex = section.WordProps.nFontIndex;
+            }
+        }
+    }
 
-	if (IFX_Edit_FontMap * pFontMap = GetFontMap())
-		return pFontMap->GetPDFFont(nFontIndex);
-	else
-		return NULL;
+    if (IFX_Edit_FontMap* pFontMap = GetFontMap())
+        return pFontMap->GetPDFFont(nFontIndex);
+
+    return NULL;
 }
 
 FX_FLOAT CPWL_EditCtrl::GetCaretFontSize() const
 {
-	FX_FLOAT fFontSize = GetFontSize();
+    FX_FLOAT fFontSize = GetFontSize();
 
-	if (IFX_Edit_Iterator * pIterator = m_pEdit->GetIterator())
-	{
-		pIterator->SetAt(m_pEdit->GetCaret());
-		CPVT_Word word;
-		CPVT_Section section;
-		if (pIterator->GetWord(word))
-		{
-			fFontSize = word.fFontSize;
-		}
-		else if (HasFlag(PES_RICH))
-		{
-			if (pIterator->GetSection(section))
-			{
-				fFontSize = section.WordProps.fFontSize;
-			}
-		}
-	}
+    if (IFX_Edit_Iterator * pIterator = m_pEdit->GetIterator())
+    {
+        pIterator->SetAt(m_pEdit->GetCaret());
+        CPVT_Word word;
+        CPVT_Section section;
+        if (pIterator->GetWord(word))
+        {
+            fFontSize = word.fFontSize;
+        }
+        else if (HasFlag(PES_RICH))
+        {
+            if (pIterator->GetSection(section))
+            {
+                fFontSize = section.WordProps.fFontSize;
+            }
+        }
+    }
 
-	return fFontSize;
+    return fFontSize;
 }
 
 void CPWL_EditCtrl::SetText(const FX_WCHAR* csText)
 {
-	m_pEdit->SetText(csText);
+    m_pEdit->SetText(csText);
 }
 
 void CPWL_EditCtrl::CopyText()
@@ -584,79 +584,79 @@
 
 void CPWL_EditCtrl::InsertText(const FX_WCHAR* csText)
 {
-	if (!IsReadOnly())
-		m_pEdit->InsertText(csText);
+    if (!IsReadOnly())
+        m_pEdit->InsertText(csText);
 }
 
 void CPWL_EditCtrl::InsertWord(FX_WORD word, int32_t nCharset)
 {
-	if (!IsReadOnly())
-		m_pEdit->InsertWord(word, nCharset);
+    if (!IsReadOnly())
+        m_pEdit->InsertWord(word, nCharset);
 }
 
 void CPWL_EditCtrl::InsertReturn()
 {
-	if (!IsReadOnly())
-		m_pEdit->InsertReturn();
+    if (!IsReadOnly())
+        m_pEdit->InsertReturn();
 }
 
 void CPWL_EditCtrl::Delete()
 {
-	if (!IsReadOnly())
-		m_pEdit->Delete();
+    if (!IsReadOnly())
+        m_pEdit->Delete();
 }
 
 void CPWL_EditCtrl::Backspace()
 {
-	if (!IsReadOnly())
-		m_pEdit->Backspace();
+    if (!IsReadOnly())
+        m_pEdit->Backspace();
 }
 
-FX_BOOL	CPWL_EditCtrl::CanUndo() const
+FX_BOOL CPWL_EditCtrl::CanUndo() const
 {
-	return !IsReadOnly() && m_pEdit->CanUndo();
+    return !IsReadOnly() && m_pEdit->CanUndo();
 }
 
-FX_BOOL	CPWL_EditCtrl::CanRedo() const
+FX_BOOL CPWL_EditCtrl::CanRedo() const
 {
-	return !IsReadOnly() && m_pEdit->CanRedo();
+    return !IsReadOnly() && m_pEdit->CanRedo();
 }
 
 void CPWL_EditCtrl::Redo()
 {
-	if (CanRedo())
-		m_pEdit->Redo();
+    if (CanRedo())
+        m_pEdit->Redo();
 }
 
 void CPWL_EditCtrl::Undo()
 {
-	if (CanUndo())
-		m_pEdit->Undo();
+    if (CanUndo())
+        m_pEdit->Undo();
 }
 
 void CPWL_EditCtrl::IOnSetScrollInfoY(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax,
-												FX_FLOAT fContentMin, FX_FLOAT fContentMax,
-												FX_FLOAT fSmallStep, FX_FLOAT fBigStep)
+                                                FX_FLOAT fContentMin, FX_FLOAT fContentMax,
+                                                FX_FLOAT fSmallStep, FX_FLOAT fBigStep)
 {
-	PWL_SCROLL_INFO Info;
+    PWL_SCROLL_INFO Info;
 
-	Info.fPlateWidth = fPlateMax - fPlateMin;
-	Info.fContentMin = fContentMin;
-	Info.fContentMax = fContentMax;
-	Info.fSmallStep = fSmallStep;
-	Info.fBigStep = fBigStep;
+    Info.fPlateWidth = fPlateMax - fPlateMin;
+    Info.fContentMin = fContentMin;
+    Info.fContentMax = fContentMax;
+    Info.fSmallStep = fSmallStep;
+    Info.fBigStep = fBigStep;
 
-	OnNotify(this,PNM_SETSCROLLINFO,SBT_VSCROLL,(intptr_t)&Info);
+    OnNotify(this,PNM_SETSCROLLINFO,SBT_VSCROLL,(intptr_t)&Info);
 
-	if (IsFloatBigger(Info.fPlateWidth,Info.fContentMax-Info.fContentMin)
-		|| IsFloatEqual(Info.fPlateWidth,Info.fContentMax-Info.fContentMin))
-	{
-		ShowVScrollBar(FALSE);
-	}
-	else
-	{
-		ShowVScrollBar(TRUE);
-	}
+    if (IsFloatBigger(Info.fPlateWidth,Info.fContentMax-Info.fContentMin)
+        || IsFloatEqual(Info.fPlateWidth,Info.fContentMax-Info.fContentMin))
+    {
+        ShowVScrollBar(FALSE);
+    }
+    else
+    {
+        ShowVScrollBar(TRUE);
+    }
 }
 
 void CPWL_EditCtrl::IOnSetScrollPosY(FX_FLOAT fy)
@@ -666,12 +666,12 @@
 
 void CPWL_EditCtrl::IOnSetCaret(FX_BOOL bVisible, const CPDF_Point & ptHead, const CPDF_Point & ptFoot, const CPVT_WordPlace& place)
 {
-	PWL_CARET_INFO cInfo;
-	cInfo.bVisible = bVisible;
-	cInfo.ptHead = ptHead;
-	cInfo.ptFoot = ptFoot;
+    PWL_CARET_INFO cInfo;
+    cInfo.bVisible = bVisible;
+    cInfo.ptHead = ptHead;
+    cInfo.ptFoot = ptFoot;
 
-	OnNotify(this, PNM_SETCARETINFO, (intptr_t)&cInfo, (intptr_t)NULL);
+    OnNotify(this, PNM_SETCARETINFO, (intptr_t)&cInfo, (intptr_t)NULL);
 }
 
 void CPWL_EditCtrl::IOnCaretChange(const CPVT_SecProps & secProps, const CPVT_WordProps & wordProps)
@@ -680,13 +680,13 @@
 
 void CPWL_EditCtrl::IOnContentChange(const CPDF_Rect& rcContent)
 {
-	if (IsValid())
-	{
-		if (m_pEditNotify)
-		{
-			m_pEditNotify->OnContentChange(rcContent);
-		}
-	}
+    if (IsValid())
+    {
+        if (m_pEditNotify)
+        {
+            m_pEditNotify->OnContentChange(rcContent);
+        }
+    }
 }
 
 void CPWL_EditCtrl::IOnInvalidateRect(CPDF_Rect * pRect)
@@ -701,22 +701,22 @@
 
 void CPWL_EditCtrl::GetTextRange(const CPDF_Rect& rect, int32_t & nStartChar, int32_t & nEndChar) const
 {
-	nStartChar = m_pEdit->WordPlaceToWordIndex(m_pEdit->SearchWordPlace(CPDF_Point(rect.left, rect.top)));
-	nEndChar = m_pEdit->WordPlaceToWordIndex(m_pEdit->SearchWordPlace(CPDF_Point(rect.right, rect.bottom)));
+    nStartChar = m_pEdit->WordPlaceToWordIndex(m_pEdit->SearchWordPlace(CPDF_Point(rect.left, rect.top)));
+    nEndChar = m_pEdit->WordPlaceToWordIndex(m_pEdit->SearchWordPlace(CPDF_Point(rect.right, rect.bottom)));
 }
 
 CFX_WideString CPWL_EditCtrl::GetText(int32_t & nStartChar, int32_t & nEndChar) const
 {
-	CPVT_WordPlace wpStart = m_pEdit->WordIndexToWordPlace(nStartChar);
-	CPVT_WordPlace wpEnd = m_pEdit->WordIndexToWordPlace(nEndChar);
-	return m_pEdit->GetRangeText(CPVT_WordRange(wpStart, wpEnd));
+    CPVT_WordPlace wpStart = m_pEdit->WordIndexToWordPlace(nStartChar);
+    CPVT_WordPlace wpEnd = m_pEdit->WordIndexToWordPlace(nEndChar);
+    return m_pEdit->GetRangeText(CPVT_WordRange(wpStart, wpEnd));
 }
 
-void	CPWL_EditCtrl::SetReadyToInput()
+void    CPWL_EditCtrl::SetReadyToInput()
 {
-	if (m_bMouseDown)
-	{
-		ReleaseCapture();
-		m_bMouseDown = FALSE;
-	}
+    if (m_bMouseDown)
+    {
+        ReleaseCapture();
+        m_bMouseDown = FALSE;
+    }
 }
diff --git a/fpdfsdk/src/pdfwindow/PWL_FontMap.cpp b/fpdfsdk/src/pdfwindow/PWL_FontMap.cpp
index 1f20d12..5fb9c99 100644
--- a/fpdfsdk/src/pdfwindow/PWL_FontMap.cpp
+++ b/fpdfsdk/src/pdfwindow/PWL_FontMap.cpp
@@ -8,15 +8,15 @@
 #include "../../include/pdfwindow/PWL_Wnd.h"
 #include "../../include/pdfwindow/PWL_FontMap.h"
 
-#define DEFAULT_FONT_NAME			"Helvetica"
+#define DEFAULT_FONT_NAME           "Helvetica"
 
 /* ------------------------------ CPWL_FontMap ------------------------------ */
 
 CPWL_FontMap::CPWL_FontMap(IFX_SystemHandler* pSystemHandler) :
-	m_pPDFDoc(NULL),
-	m_pSystemHandler(pSystemHandler)
+    m_pPDFDoc(NULL),
+    m_pSystemHandler(pSystemHandler)
 {
-	ASSERT(m_pSystemHandler != NULL);
+    ASSERT(m_pSystemHandler != NULL);
 }
 
 CPWL_FontMap::~CPWL_FontMap()
@@ -29,7 +29,7 @@
 
 void CPWL_FontMap::SetSystemHandler(IFX_SystemHandler* pSystemHandler)
 {
-	m_pSystemHandler = pSystemHandler;
+    m_pSystemHandler = pSystemHandler;
 }
 
 CPDF_Document* CPWL_FontMap::GetDocument()
@@ -43,163 +43,153 @@
 		}
 	}
 
-	return m_pPDFDoc;
+    return m_pPDFDoc;
 }
 
 CPDF_Font* CPWL_FontMap::GetPDFFont(int32_t nFontIndex)
 {
-	if (nFontIndex >=0 && nFontIndex < m_aData.GetSize())
-	{
-		if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex))
-		{
-			return pData->pFont;
-		}
-	}
+    if (nFontIndex >=0 && nFontIndex < m_aData.GetSize())
+    {
+        if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex))
+        {
+            return pData->pFont;
+        }
+    }
 
-	return NULL;
+    return NULL;
 }
 
 CFX_ByteString CPWL_FontMap::GetPDFFontAlias(int32_t nFontIndex)
 {
-	if (nFontIndex >=0 && nFontIndex < m_aData.GetSize())
-	{
-		if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex))
-		{
-			return pData->sFontName;
-		}
-	}
+    if (nFontIndex >=0 && nFontIndex < m_aData.GetSize())
+    {
+        if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex))
+        {
+            return pData->sFontName;
+        }
+    }
 
-	return "";
+    return "";
 }
 
 FX_BOOL CPWL_FontMap::KnowWord(int32_t nFontIndex, FX_WORD word)
 {
-	if (nFontIndex >=0 && nFontIndex < m_aData.GetSize())
-	{
-		if (m_aData.GetAt(nFontIndex))
-		{
-			return CharCodeFromUnicode(nFontIndex, word) >= 0;
-		}
-	}
+    if (nFontIndex >=0 && nFontIndex < m_aData.GetSize())
+    {
+        if (m_aData.GetAt(nFontIndex))
+        {
+            return CharCodeFromUnicode(nFontIndex, word) >= 0;
+        }
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
 int32_t CPWL_FontMap::GetWordFontIndex(FX_WORD word, int32_t nCharset, int32_t nFontIndex)
 {
-	if (nFontIndex > 0)
-	{
-		if (KnowWord(nFontIndex, word))
-			return nFontIndex;
-	}
-	else
-	{
-		if (const CPWL_FontMap_Data* pData = GetFontMapData(0))
-		{
-			if (nCharset == DEFAULT_CHARSET ||
-				pData->nCharset == SYMBOL_CHARSET ||
-				nCharset == pData->nCharset)
-			{
-				if (KnowWord(0, word))
-				{
-					return 0;
-				}
-			}
-		}
-	}
+    if (nFontIndex > 0)
+    {
+        if (KnowWord(nFontIndex, word))
+            return nFontIndex;
+    }
+    else
+    {
+        if (const CPWL_FontMap_Data* pData = GetFontMapData(0))
+        {
+            if (nCharset == DEFAULT_CHARSET ||
+                pData->nCharset == SYMBOL_CHARSET ||
+                nCharset == pData->nCharset)
+            {
+                if (KnowWord(0, word))
+                    return 0;
+            }
+        }
+    }
 
-	int32_t nNewFontIndex = -1;
-
-	nNewFontIndex = GetFontIndex(GetNativeFontName(nCharset), nCharset, TRUE);
-	if (nNewFontIndex >= 0)
-	{
-		if (KnowWord(nNewFontIndex, word))
-			return nNewFontIndex;
-	}
-
-	nNewFontIndex = GetFontIndex("Arial Unicode MS", DEFAULT_CHARSET, FALSE);
-	if (nNewFontIndex >= 0)
-	{
-		if (KnowWord(nNewFontIndex, word))
-		return nNewFontIndex;
-	}
-
-	return -1;
+    int32_t nNewFontIndex = GetFontIndex(GetNativeFontName(nCharset), nCharset, TRUE);
+    if (nNewFontIndex >= 0)
+    {
+        if (KnowWord(nNewFontIndex, word))
+            return nNewFontIndex;
+    }
+    nNewFontIndex = GetFontIndex("Arial Unicode MS", DEFAULT_CHARSET, FALSE);
+    if (nNewFontIndex >= 0)
+    {
+        if (KnowWord(nNewFontIndex, word))
+            return nNewFontIndex;
+    }
+    return -1;
 }
 
 int32_t CPWL_FontMap::CharCodeFromUnicode(int32_t nFontIndex, FX_WORD word)
 {
-	if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex))
-	{
-		if (pData->pFont)
-		{
-			if (pData->pFont->IsUnicodeCompatible())
-			{
-				int nCharCode = pData->pFont->CharCodeFromUnicode(word);
-				pData->pFont->GlyphFromCharCode(nCharCode);
-				return nCharCode;
-			}
-			else
-			{
-				if (word < 0xFF)
-					return word;
-			}
-		}
-	}
-
-	return -1;
+    if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex))
+    {
+        if (pData->pFont)
+        {
+            if (pData->pFont->IsUnicodeCompatible())
+            {
+                int nCharCode = pData->pFont->CharCodeFromUnicode(word);
+                pData->pFont->GlyphFromCharCode(nCharCode);
+                return nCharCode;
+            }
+            if (word < 0xFF)
+                return word;
+        }
+    }
+    return -1;
 }
 
 CFX_ByteString CPWL_FontMap::GetNativeFontName(int32_t nCharset)
 {
-	//searching native font is slow, so we must save time
-	for (int32_t i=0,sz=m_aNativeFont.GetSize(); i<sz; i++)
-	{
-		if (CPWL_FontMap_Native* pData = m_aNativeFont.GetAt(i))
-		{
-			if (pData->nCharset == nCharset)
-				return pData->sFontName;
-		}
-	}
+    //searching native font is slow, so we must save time
+    for (int32_t i=0,sz=m_aNativeFont.GetSize(); i<sz; i++)
+    {
+        if (CPWL_FontMap_Native* pData = m_aNativeFont.GetAt(i))
+        {
+            if (pData->nCharset == nCharset)
+                return pData->sFontName;
+        }
+    }
 
-	CFX_ByteString sNew = GetNativeFont(nCharset);
+    CFX_ByteString sNew = GetNativeFont(nCharset);
 
-	if (!sNew.IsEmpty())
-	{
-		CPWL_FontMap_Native* pNewData = new CPWL_FontMap_Native;
-		pNewData->nCharset = nCharset;
-		pNewData->sFontName = sNew;
+    if (!sNew.IsEmpty())
+    {
+        CPWL_FontMap_Native* pNewData = new CPWL_FontMap_Native;
+        pNewData->nCharset = nCharset;
+        pNewData->sFontName = sNew;
 
-		m_aNativeFont.Add(pNewData);
-	}
+        m_aNativeFont.Add(pNewData);
+    }
 
-	return sNew;
+    return sNew;
 }
 
 void CPWL_FontMap::Empty()
 {
-	{
-		for (int32_t i=0, sz=m_aData.GetSize(); i<sz; i++)
-			delete m_aData.GetAt(i);
+    {
+        for (int32_t i=0, sz=m_aData.GetSize(); i<sz; i++)
+            delete m_aData.GetAt(i);
 
-		m_aData.RemoveAll();
-	}
-	{
-		for (int32_t i=0, sz=m_aNativeFont.GetSize(); i<sz; i++)
-			delete m_aNativeFont.GetAt(i);
+        m_aData.RemoveAll();
+    }
+    {
+        for (int32_t i=0, sz=m_aNativeFont.GetSize(); i<sz; i++)
+            delete m_aNativeFont.GetAt(i);
 
-		m_aNativeFont.RemoveAll();
-	}
+        m_aNativeFont.RemoveAll();
+    }
 }
 
 void CPWL_FontMap::Initial(const FX_CHAR* fontname)
 {
-	CFX_ByteString sFontName = fontname;
+    CFX_ByteString sFontName = fontname;
 
-	if (sFontName.IsEmpty())
-		sFontName = DEFAULT_FONT_NAME;
+    if (sFontName.IsEmpty())
+        sFontName = DEFAULT_FONT_NAME;
 
-	GetFontIndex(sFontName, ANSI_CHARSET, FALSE);
+    GetFontIndex(sFontName, ANSI_CHARSET, FALSE);
 }
 
 
@@ -212,122 +202,107 @@
 */
 
 const char* g_sDEStandardFontName[] = {"Courier", "Courier-Bold", "Courier-BoldOblique", "Courier-Oblique",
-	"Helvetica", "Helvetica-Bold", "Helvetica-BoldOblique", "Helvetica-Oblique",
-	"Times-Roman", "Times-Bold", "Times-Italic", "Times-BoldItalic",
-	"Symbol", "ZapfDingbats"};
+    "Helvetica", "Helvetica-Bold", "Helvetica-BoldOblique", "Helvetica-Oblique",
+    "Times-Roman", "Times-Bold", "Times-Italic", "Times-BoldItalic",
+    "Symbol", "ZapfDingbats"};
 
-FX_BOOL	CPWL_FontMap::IsStandardFont(const CFX_ByteString& sFontName)
+FX_BOOL CPWL_FontMap::IsStandardFont(const CFX_ByteString& sFontName)
 {
-	for (int32_t i=0; i<14; i++)
-	{
-		if (sFontName == g_sDEStandardFontName[i])
-			return TRUE;
-	}
+    for (int32_t i=0; i<14; i++)
+    {
+        if (sFontName == g_sDEStandardFontName[i])
+            return TRUE;
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
 int32_t CPWL_FontMap::FindFont(const CFX_ByteString& sFontName, int32_t nCharset)
 {
-	for (int32_t i=0,sz=m_aData.GetSize(); i<sz; i++)
-	{
-		if (CPWL_FontMap_Data* pData = m_aData.GetAt(i))
-		{
-			if (nCharset == DEFAULT_CHARSET || nCharset == pData->nCharset)
-			{
-				if (sFontName.IsEmpty() || pData->sFontName == sFontName)
-					return i;
-			}
-		}
-	}
+    for (int32_t i=0,sz=m_aData.GetSize(); i<sz; i++)
+    {
+        if (CPWL_FontMap_Data* pData = m_aData.GetAt(i))
+        {
+            if (nCharset == DEFAULT_CHARSET || nCharset == pData->nCharset)
+            {
+                if (sFontName.IsEmpty() || pData->sFontName == sFontName)
+                    return i;
+            }
+        }
+    }
 
-	return -1;
+    return -1;
 }
 
 int32_t CPWL_FontMap::GetFontIndex(const CFX_ByteString& sFontName, int32_t nCharset, FX_BOOL bFind)
 {
-	int32_t nFontIndex = FindFont(EncodeFontAlias(sFontName, nCharset), nCharset);
-	if (nFontIndex >= 0) return nFontIndex;
+    int32_t nFontIndex = FindFont(EncodeFontAlias(sFontName, nCharset), nCharset);
+    if (nFontIndex >= 0)
+        return nFontIndex;
 
-//	nFontIndex = FindFont("", nCharset);
-//	if (nFontIndex >= 0) return nFontIndex;
+    CFX_ByteString sAlias;
+    CPDF_Font* pFont = NULL;
+    if (bFind)
+        pFont = FindFontSameCharset(sAlias, nCharset);
 
-	CFX_ByteString sAlias;
-	CPDF_Font* pFont = NULL;
-
-	if (bFind)
-		pFont = FindFontSameCharset(sAlias, nCharset);
-
-	if (!pFont)
-	{
-		CFX_ByteString sTemp = sFontName;
-		pFont = AddFontToDocument(GetDocument(), sTemp, nCharset);
-
-		/*
-		if (FindFont(sAlias))
-		{
-			sAlias = EncodeFontAlias(sTemp, nCharset);
-		}
-		else
-		*/
-		{
-			sAlias = EncodeFontAlias(sTemp, nCharset);
-		}
-	}
-
-	AddedFont(pFont, sAlias);
-
-	return AddFontData(pFont, sAlias, nCharset);
+    if (!pFont)
+    {
+        CFX_ByteString sTemp = sFontName;
+        pFont = AddFontToDocument(GetDocument(), sTemp, nCharset);
+        sAlias = EncodeFontAlias(sTemp, nCharset);
+    }
+    AddedFont(pFont, sAlias);
+    return AddFontData(pFont, sAlias, nCharset);
 }
 
 int32_t CPWL_FontMap::GetPWLFontIndex(FX_WORD word, int32_t nCharset)
 {
-	int32_t nFind = -1;
+    int32_t nFind = -1;
 
-	for (int32_t i=0,sz=m_aData.GetSize(); i<sz; i++)
-	{
-		if (CPWL_FontMap_Data* pData = m_aData.GetAt(i))
-		{
-			if (pData->nCharset == nCharset)
-			{
-				nFind = i;
-				break;
-			}
-		}
-	}
+    for (int32_t i=0,sz=m_aData.GetSize(); i<sz; i++)
+    {
+        if (CPWL_FontMap_Data* pData = m_aData.GetAt(i))
+        {
+            if (pData->nCharset == nCharset)
+            {
+                nFind = i;
+                break;
+            }
+        }
+    }
 
-	CPDF_Font* pNewFont = GetPDFFont(nFind);
+    CPDF_Font* pNewFont = GetPDFFont(nFind);
 
-	if (!pNewFont) return -1;
+    if (!pNewFont) return -1;
 
-	/*
-	if (CPDF_Font* pFont = GetPDFFont(nFind))
-	{
-		PWLFont.AddWordToFontDict(pFontDict, word);
-	}
-	*/
+    /*
+    if (CPDF_Font* pFont = GetPDFFont(nFind))
+    {
+        PWLFont.AddWordToFontDict(pFontDict, word);
+    }
+    */
 
-	CFX_ByteString sAlias = EncodeFontAlias("Arial_Chrome", nCharset);
-	AddedFont(pNewFont, sAlias);
+    CFX_ByteString sAlias = EncodeFontAlias("Arial_Chrome", nCharset);
+    AddedFont(pNewFont, sAlias);
 
-	return AddFontData(pNewFont, sAlias, nCharset);
+    return AddFontData(pNewFont, sAlias, nCharset);
 }
 
 CPDF_Font* CPWL_FontMap::FindFontSameCharset(CFX_ByteString& sFontAlias, int32_t nCharset)
 {
-	return NULL;
+    return NULL;
 }
 
 int32_t CPWL_FontMap::AddFontData(CPDF_Font* pFont, const CFX_ByteString& sFontAlias, int32_t nCharset)
 {
-	CPWL_FontMap_Data* pNewData = new CPWL_FontMap_Data;
-	pNewData->pFont = pFont;
-	pNewData->sFontName = sFontAlias;
-	pNewData->nCharset = nCharset;
+    CPWL_FontMap_Data* pNewData = new CPWL_FontMap_Data;
+    pNewData->pFont = pFont;
+    pNewData->sFontName = sFontAlias;
+    pNewData->nCharset = nCharset;
 
-	m_aData.Add(pNewData);
+    m_aData.Add(pNewData);
 
-	return m_aData.GetSize() -1;
+    return m_aData.GetSize() -1;
 }
 
 void CPWL_FontMap::AddedFont(CPDF_Font* pFont, const CFX_ByteString& sFontAlias)
@@ -336,253 +311,250 @@
 
 CFX_ByteString CPWL_FontMap::GetFontName(int32_t nFontIndex)
 {
-	if (nFontIndex >=0 && nFontIndex < m_aData.GetSize())
-	{
-		if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex))
-		{
-			return pData->sFontName;
-		}
-	}
+    if (nFontIndex >=0 && nFontIndex < m_aData.GetSize())
+    {
+        if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex))
+        {
+            return pData->sFontName;
+        }
+    }
 
-	return "";
+    return "";
 }
 
 CFX_ByteString CPWL_FontMap::GetNativeFont(int32_t nCharset)
 {
-	CFX_ByteString sFontName;
 
-	if (nCharset == DEFAULT_CHARSET)
-		nCharset = GetNativeCharset();
+    if (nCharset == DEFAULT_CHARSET)
+        nCharset = GetNativeCharset();
 
-	sFontName = GetDefaultFontByCharset(nCharset);
+    CFX_ByteString sFontName = GetDefaultFontByCharset(nCharset);
+    if (m_pSystemHandler)
+    {
+        if (m_pSystemHandler->FindNativeTrueTypeFont(nCharset, sFontName))
+            return sFontName;
 
-	if (m_pSystemHandler)
-	{
-		if (m_pSystemHandler->FindNativeTrueTypeFont(nCharset, sFontName))
-			return sFontName;
-
-		sFontName = m_pSystemHandler->GetNativeTrueTypeFont(nCharset);
-	}
-
-	return sFontName;
+        sFontName = m_pSystemHandler->GetNativeTrueTypeFont(nCharset);
+    }
+    return sFontName;
 }
 
 CPDF_Font* CPWL_FontMap::AddFontToDocument(CPDF_Document* pDoc, CFX_ByteString& sFontName, uint8_t nCharset)
 {
-	if (IsStandardFont(sFontName))
-		return AddStandardFont(pDoc, sFontName);
-	else
-		return AddSystemFont(pDoc, sFontName, nCharset);
+    if (IsStandardFont(sFontName))
+        return AddStandardFont(pDoc, sFontName);
+
+    return AddSystemFont(pDoc, sFontName, nCharset);
 }
 
 CPDF_Font* CPWL_FontMap::AddStandardFont(CPDF_Document* pDoc, CFX_ByteString& sFontName)
 {
-	if (!pDoc) return NULL;
+    if (!pDoc) return NULL;
 
-	CPDF_Font* pFont = NULL;
+    CPDF_Font* pFont = NULL;
 
-	if (sFontName == "ZapfDingbats")
-		pFont = pDoc->AddStandardFont(sFontName, NULL);
-	else
-	{
-		CPDF_FontEncoding fe(PDFFONT_ENCODING_WINANSI);
-		pFont = pDoc->AddStandardFont(sFontName, &fe);
-	}
+    if (sFontName == "ZapfDingbats")
+        pFont = pDoc->AddStandardFont(sFontName, NULL);
+    else
+    {
+        CPDF_FontEncoding fe(PDFFONT_ENCODING_WINANSI);
+        pFont = pDoc->AddStandardFont(sFontName, &fe);
+    }
 
-	return pFont;
+    return pFont;
 }
 
 CPDF_Font* CPWL_FontMap::AddSystemFont(CPDF_Document* pDoc, CFX_ByteString& sFontName, uint8_t nCharset)
 {
-	if (!pDoc) return NULL;
+    if (!pDoc) return NULL;
 
-	if (sFontName.IsEmpty()) sFontName = GetNativeFont(nCharset);
-	if (nCharset == DEFAULT_CHARSET) nCharset = GetNativeCharset();
+    if (sFontName.IsEmpty()) sFontName = GetNativeFont(nCharset);
+    if (nCharset == DEFAULT_CHARSET) nCharset = GetNativeCharset();
 
-	if (m_pSystemHandler)
-		return m_pSystemHandler->AddNativeTrueTypeFontToPDF(pDoc, sFontName, nCharset);
+    if (m_pSystemHandler)
+        return m_pSystemHandler->AddNativeTrueTypeFontToPDF(pDoc, sFontName, nCharset);
 
-	return NULL;
+    return NULL;
 }
 
 CFX_ByteString CPWL_FontMap::EncodeFontAlias(const CFX_ByteString& sFontName, int32_t nCharset)
 {
-	CFX_ByteString sPostfix;
-	sPostfix.Format("_%02X", nCharset);
-	return EncodeFontAlias(sFontName) + sPostfix;
+    CFX_ByteString sPostfix;
+    sPostfix.Format("_%02X", nCharset);
+    return EncodeFontAlias(sFontName) + sPostfix;
 }
 
 CFX_ByteString CPWL_FontMap::EncodeFontAlias(const CFX_ByteString& sFontName)
 {
-	CFX_ByteString sRet = sFontName;
-	sRet.Remove(' ');
-	return sRet;
+    CFX_ByteString sRet = sFontName;
+    sRet.Remove(' ');
+    return sRet;
 }
 
 int32_t CPWL_FontMap::GetFontMapCount() const
 {
-	return m_aData.GetSize();
+    return m_aData.GetSize();
 }
 
 const CPWL_FontMap_Data* CPWL_FontMap::GetFontMapData(int32_t nIndex) const
 {
-	if (nIndex >=0 && nIndex < m_aData.GetSize())
-	{
-		return m_aData.GetAt(nIndex);
-	}
+    if (nIndex >=0 && nIndex < m_aData.GetSize())
+    {
+        return m_aData.GetAt(nIndex);
+    }
 
-	return NULL;
+    return NULL;
 }
 
 int32_t CPWL_FontMap::GetNativeCharset()
 {
-	uint8_t nCharset = ANSI_CHARSET;
-	int32_t iCodePage = FXSYS_GetACP();
-	switch (iCodePage)
-	{
-	case 932://Japan
-		nCharset = SHIFTJIS_CHARSET;
-		break;
-	case 936://Chinese (PRC, Singapore)
-		nCharset = GB2312_CHARSET;
-		break;
-	case 950://Chinese (Taiwan; Hong Kong SAR, PRC)
-		nCharset = GB2312_CHARSET;
-		break;
-	case 1252://Windows 3.1 Latin 1 (US, Western Europe)
-		nCharset = ANSI_CHARSET;
-		break;
-	case 874://Thai
-		nCharset = THAI_CHARSET;
-		break;
-	case 949://Korean
-		nCharset = HANGUL_CHARSET;
-		break;
-	case 1200://Unicode (BMP of ISO 10646)
-		nCharset = ANSI_CHARSET;
-		break;
-	case 1250://Windows 3.1 Eastern European
-		nCharset = EASTEUROPE_CHARSET;
-		break;
-	case 1251://Windows 3.1 Cyrillic
-		nCharset = RUSSIAN_CHARSET;
-		break;
-	case 1253://Windows 3.1 Greek
-		nCharset = GREEK_CHARSET;
-		break;
-	case 1254://Windows 3.1 Turkish
-		nCharset = TURKISH_CHARSET;
-		break;
-	case 1255://Hebrew
-		nCharset = HEBREW_CHARSET;
-		break;
-	case 1256://Arabic
-		nCharset = ARABIC_CHARSET;
-		break;
-	case 1257://Baltic
-		nCharset = BALTIC_CHARSET;
-		break;
-	case 1258://Vietnamese
-		nCharset = VIETNAMESE_CHARSET;
-		break;
-	case 1361://Korean(Johab)
-		nCharset = JOHAB_CHARSET;
-		break;
-	}
-	return nCharset;
+    uint8_t nCharset = ANSI_CHARSET;
+    int32_t iCodePage = FXSYS_GetACP();
+    switch (iCodePage)
+    {
+    case 932://Japan
+        nCharset = SHIFTJIS_CHARSET;
+        break;
+    case 936://Chinese (PRC, Singapore)
+        nCharset = GB2312_CHARSET;
+        break;
+    case 950://Chinese (Taiwan; Hong Kong SAR, PRC)
+        nCharset = GB2312_CHARSET;
+        break;
+    case 1252://Windows 3.1 Latin 1 (US, Western Europe)
+        nCharset = ANSI_CHARSET;
+        break;
+    case 874://Thai
+        nCharset = THAI_CHARSET;
+        break;
+    case 949://Korean
+        nCharset = HANGUL_CHARSET;
+        break;
+    case 1200://Unicode (BMP of ISO 10646)
+        nCharset = ANSI_CHARSET;
+        break;
+    case 1250://Windows 3.1 Eastern European
+        nCharset = EASTEUROPE_CHARSET;
+        break;
+    case 1251://Windows 3.1 Cyrillic
+        nCharset = RUSSIAN_CHARSET;
+        break;
+    case 1253://Windows 3.1 Greek
+        nCharset = GREEK_CHARSET;
+        break;
+    case 1254://Windows 3.1 Turkish
+        nCharset = TURKISH_CHARSET;
+        break;
+    case 1255://Hebrew
+        nCharset = HEBREW_CHARSET;
+        break;
+    case 1256://Arabic
+        nCharset = ARABIC_CHARSET;
+        break;
+    case 1257://Baltic
+        nCharset = BALTIC_CHARSET;
+        break;
+    case 1258://Vietnamese
+        nCharset = VIETNAMESE_CHARSET;
+        break;
+    case 1361://Korean(Johab)
+        nCharset = JOHAB_CHARSET;
+        break;
+    }
+    return nCharset;
 }
 
 const CPWL_FontMap::CharsetFontMap CPWL_FontMap::defaultTTFMap[] = {
-	{ ANSI_CHARSET, "Helvetica" },
-	{ GB2312_CHARSET, "SimSun" },
-	{ CHINESEBIG5_CHARSET, "MingLiU" },
-	{ SHIFTJIS_CHARSET, "MS Gothic" },
-	{ HANGUL_CHARSET, "Batang" },
-	{ RUSSIAN_CHARSET, "Arial" },
+    { ANSI_CHARSET, "Helvetica" },
+    { GB2312_CHARSET, "SimSun" },
+    { CHINESEBIG5_CHARSET, "MingLiU" },
+    { SHIFTJIS_CHARSET, "MS Gothic" },
+    { HANGUL_CHARSET, "Batang" },
+    { RUSSIAN_CHARSET, "Arial" },
 #if _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ || _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
-	{ EASTEUROPE_CHARSET, "Arial" },
+    { EASTEUROPE_CHARSET, "Arial" },
 #else
-	{ EASTEUROPE_CHARSET, "Tahoma" },
+    { EASTEUROPE_CHARSET, "Tahoma" },
 #endif
-	{ ARABIC_CHARSET, "Arial" },
-	{ -1, NULL }
+    { ARABIC_CHARSET, "Arial" },
+    { -1, NULL }
 };
 
 CFX_ByteString CPWL_FontMap::GetDefaultFontByCharset(int32_t nCharset)
 {
-	int i = 0;
-	while (defaultTTFMap[i].charset != -1) {
-		if (nCharset == defaultTTFMap[i].charset)
-			return defaultTTFMap[i].fontname;
+    int i = 0;
+    while (defaultTTFMap[i].charset != -1) {
+        if (nCharset == defaultTTFMap[i].charset)
+            return defaultTTFMap[i].fontname;
         ++i;
-	}
-	return "";
+    }
+    return "";
 }
 
 int32_t CPWL_FontMap::CharSetFromUnicode(FX_WORD word, int32_t nOldCharset)
 {
-	if(m_pSystemHandler && (-1 != m_pSystemHandler->GetCharSet()))
-		return m_pSystemHandler->GetCharSet();
-	//to avoid CJK Font to show ASCII
-	if (word < 0x7F) return ANSI_CHARSET;
-	//follow the old charset
-	if (nOldCharset != DEFAULT_CHARSET) return nOldCharset;
+    if(m_pSystemHandler && (-1 != m_pSystemHandler->GetCharSet()))
+        return m_pSystemHandler->GetCharSet();
+    //to avoid CJK Font to show ASCII
+    if (word < 0x7F) return ANSI_CHARSET;
+    //follow the old charset
+    if (nOldCharset != DEFAULT_CHARSET) return nOldCharset;
 
-	//find new charset
-	if ((word >= 0x4E00 && word <= 0x9FA5) ||
-		(word >= 0xE7C7 && word <= 0xE7F3) ||
-		(word >= 0x3000 && word <= 0x303F) ||
-		(word >= 0x2000 && word <= 0x206F))
-	{
-		return GB2312_CHARSET;
-	}
+    //find new charset
+    if ((word >= 0x4E00 && word <= 0x9FA5) ||
+        (word >= 0xE7C7 && word <= 0xE7F3) ||
+        (word >= 0x3000 && word <= 0x303F) ||
+        (word >= 0x2000 && word <= 0x206F))
+    {
+        return GB2312_CHARSET;
+    }
 
-	if (((word >= 0x3040) && (word <= 0x309F)) ||
-		((word >= 0x30A0) && (word <= 0x30FF)) ||
-		((word >= 0x31F0) && (word <= 0x31FF)) ||
-		((word >= 0xFF00) && (word <= 0xFFEF)) )
-	{
-		return SHIFTJIS_CHARSET;
-	}
+    if (((word >= 0x3040) && (word <= 0x309F)) ||
+        ((word >= 0x30A0) && (word <= 0x30FF)) ||
+        ((word >= 0x31F0) && (word <= 0x31FF)) ||
+        ((word >= 0xFF00) && (word <= 0xFFEF)) )
+    {
+        return SHIFTJIS_CHARSET;
+    }
 
-	if (((word >= 0xAC00) && (word <= 0xD7AF)) ||
-		((word >= 0x1100) && (word <= 0x11FF)) ||
-		((word >= 0x3130) && (word <= 0x318F)))
-	{
-		return HANGUL_CHARSET;
-	}
+    if (((word >= 0xAC00) && (word <= 0xD7AF)) ||
+        ((word >= 0x1100) && (word <= 0x11FF)) ||
+        ((word >= 0x3130) && (word <= 0x318F)))
+    {
+        return HANGUL_CHARSET;
+    }
 
-	if (word >= 0x0E00 && word <= 0x0E7F)
-		return THAI_CHARSET;
+    if (word >= 0x0E00 && word <= 0x0E7F)
+        return THAI_CHARSET;
 
-	if ((word >= 0x0370 && word <= 0x03FF) ||
-		(word >= 0x1F00 && word <= 0x1FFF))
-		return GREEK_CHARSET;
+    if ((word >= 0x0370 && word <= 0x03FF) ||
+        (word >= 0x1F00 && word <= 0x1FFF))
+        return GREEK_CHARSET;
 
-	if ((word >= 0x0600 && word <= 0x06FF) ||
-		(word >= 0xFB50 && word <= 0xFEFC))
-		return ARABIC_CHARSET;
+    if ((word >= 0x0600 && word <= 0x06FF) ||
+        (word >= 0xFB50 && word <= 0xFEFC))
+        return ARABIC_CHARSET;
 
-	if (word >= 0x0590 && word <= 0x05FF)
-		return HEBREW_CHARSET;
+    if (word >= 0x0590 && word <= 0x05FF)
+        return HEBREW_CHARSET;
 
-	if (word >= 0x0400 && word <= 0x04FF)
-		return RUSSIAN_CHARSET;
+    if (word >= 0x0400 && word <= 0x04FF)
+        return RUSSIAN_CHARSET;
 
-	if (word >= 0x0100 && word <= 0x024F)
-		return EASTEUROPE_CHARSET;
+    if (word >= 0x0100 && word <= 0x024F)
+        return EASTEUROPE_CHARSET;
 
-	if (word >= 0x1E00 && word <= 0x1EFF)
-		return VIETNAMESE_CHARSET;
+    if (word >= 0x1E00 && word <= 0x1EFF)
+        return VIETNAMESE_CHARSET;
 
-	return ANSI_CHARSET;
+    return ANSI_CHARSET;
 }
 
 /* ------------------------ CPWL_DocFontMap ------------------------ */
 
 CPWL_DocFontMap::CPWL_DocFontMap(IFX_SystemHandler* pSystemHandler, CPDF_Document* pAttachedDoc)
-	: CPWL_FontMap(pSystemHandler),
-	m_pAttachedDoc(pAttachedDoc)
+    : CPWL_FontMap(pSystemHandler),
+    m_pAttachedDoc(pAttachedDoc)
 {
 }
 
@@ -592,5 +564,5 @@
 
 CPDF_Document* CPWL_DocFontMap::GetDocument()
 {
-	return m_pAttachedDoc;
+    return m_pAttachedDoc;
 }
diff --git a/fpdfsdk/src/pdfwindow/PWL_Wnd.cpp b/fpdfsdk/src/pdfwindow/PWL_Wnd.cpp
index 89d4bab..1bb2ffd 100644
--- a/fpdfsdk/src/pdfwindow/PWL_Wnd.cpp
+++ b/fpdfsdk/src/pdfwindow/PWL_Wnd.cpp
@@ -21,17 +21,17 @@
 }
 
 CPWL_Timer::CPWL_Timer(CPWL_TimerHandler* pAttached, IFX_SystemHandler* pSystemHandler) :
-	m_nTimerID(0),
-	m_pAttached(pAttached),
-	m_pSystemHandler(pSystemHandler)
+    m_nTimerID(0),
+    m_pAttached(pAttached),
+    m_pSystemHandler(pSystemHandler)
 {
-	ASSERT(m_pAttached != NULL);
-	ASSERT(m_pSystemHandler != NULL);
+    ASSERT(m_pAttached != NULL);
+    ASSERT(m_pSystemHandler != NULL);
 }
 
 CPWL_Timer::~CPWL_Timer()
 {
-	KillPWLTimer();
+    KillPWLTimer();
 }
 
 int32_t CPWL_Timer::SetPWLTimer(int32_t nElapse)
@@ -78,17 +78,17 @@
 
 void CPWL_TimerHandler::BeginTimer(int32_t nElapse)
 {
-	if (!m_pTimer)
-		m_pTimer = new CPWL_Timer(this, GetSystemHandler());
+    if (!m_pTimer)
+        m_pTimer = new CPWL_Timer(this, GetSystemHandler());
 
-	if (m_pTimer)
-		m_pTimer->SetPWLTimer(nElapse);
+    if (m_pTimer)
+        m_pTimer->SetPWLTimer(nElapse);
 }
 
 void CPWL_TimerHandler::EndTimer()
 {
-	if (m_pTimer)
-		m_pTimer->KillPWLTimer();
+    if (m_pTimer)
+        m_pTimer->KillPWLTimer();
 }
 
 void CPWL_TimerHandler::TimerProc()
@@ -99,181 +99,181 @@
 
 class CPWL_MsgControl
 {
-	friend class CPWL_Wnd;
+    friend class CPWL_Wnd;
 
 public:
-	CPWL_MsgControl(CPWL_Wnd * pWnd)
-	{
-//		PWL_TRACE("new CPWL_MsgControl\n");
-		m_pCreatedWnd = pWnd;
-		Default();
-	}
+    CPWL_MsgControl(CPWL_Wnd * pWnd)
+    {
+//      PWL_TRACE("new CPWL_MsgControl\n");
+        m_pCreatedWnd = pWnd;
+        Default();
+    }
 
-	~CPWL_MsgControl()
-	{
-//		PWL_TRACE("~CPWL_MsgControl\n");
-		Default();
-	}
+    ~CPWL_MsgControl()
+    {
+//      PWL_TRACE("~CPWL_MsgControl\n");
+        Default();
+    }
 
-	void Default()
-	{
-		m_aMousePath.RemoveAll();
-		m_aKeyboardPath.RemoveAll();
-		m_pMainMouseWnd = NULL;
-		m_pMainKeyboardWnd = NULL;
-	}
+    void Default()
+    {
+        m_aMousePath.RemoveAll();
+        m_aKeyboardPath.RemoveAll();
+        m_pMainMouseWnd = NULL;
+        m_pMainKeyboardWnd = NULL;
+    }
 
-	FX_BOOL IsWndCreated(const CPWL_Wnd * pWnd) const
-	{
-		return m_pCreatedWnd == pWnd;
-	}
+    FX_BOOL IsWndCreated(const CPWL_Wnd * pWnd) const
+    {
+        return m_pCreatedWnd == pWnd;
+    }
 
-	FX_BOOL IsMainCaptureMouse(const CPWL_Wnd * pWnd) const
-	{
-		return pWnd == m_pMainMouseWnd;
-	}
+    FX_BOOL IsMainCaptureMouse(const CPWL_Wnd * pWnd) const
+    {
+        return pWnd == m_pMainMouseWnd;
+    }
 
-	FX_BOOL IsWndCaptureMouse(const CPWL_Wnd * pWnd) const
-	{
-		if (pWnd)
-			for( int32_t i=0,sz=m_aMousePath.GetSize(); i<sz; i++)
-				if (m_aMousePath.GetAt(i) == pWnd)
-					return TRUE;
+    FX_BOOL IsWndCaptureMouse(const CPWL_Wnd * pWnd) const
+    {
+        if (pWnd)
+            for( int32_t i=0,sz=m_aMousePath.GetSize(); i<sz; i++)
+                if (m_aMousePath.GetAt(i) == pWnd)
+                    return TRUE;
 
-		return FALSE;
-	}
+        return FALSE;
+    }
 
-	FX_BOOL IsMainCaptureKeyboard(const CPWL_Wnd * pWnd) const
-	{
-		return pWnd == m_pMainKeyboardWnd;
-	}
+    FX_BOOL IsMainCaptureKeyboard(const CPWL_Wnd * pWnd) const
+    {
+        return pWnd == m_pMainKeyboardWnd;
+    }
 
 
-	FX_BOOL IsWndCaptureKeyboard(const CPWL_Wnd * pWnd) const
-	{
-		if (pWnd)
-			for( int32_t i=0,sz=m_aKeyboardPath.GetSize(); i<sz; i++)
-				if (m_aKeyboardPath.GetAt(i) == pWnd)
-					return TRUE;
+    FX_BOOL IsWndCaptureKeyboard(const CPWL_Wnd * pWnd) const
+    {
+        if (pWnd)
+            for( int32_t i=0,sz=m_aKeyboardPath.GetSize(); i<sz; i++)
+                if (m_aKeyboardPath.GetAt(i) == pWnd)
+                    return TRUE;
 
-		return FALSE;
-	}
+        return FALSE;
+    }
 
-	void SetFocus(CPWL_Wnd * pWnd)
-	{
-		m_aKeyboardPath.RemoveAll();
+    void SetFocus(CPWL_Wnd * pWnd)
+    {
+        m_aKeyboardPath.RemoveAll();
 
-		if (pWnd)
-		{
-			m_pMainKeyboardWnd = pWnd;
+        if (pWnd)
+        {
+            m_pMainKeyboardWnd = pWnd;
 
-			CPWL_Wnd * pParent = pWnd;
-			while (pParent)
-			{
-				m_aKeyboardPath.Add(pParent);
-				pParent = pParent->GetParentWindow();
-			}
+            CPWL_Wnd * pParent = pWnd;
+            while (pParent)
+            {
+                m_aKeyboardPath.Add(pParent);
+                pParent = pParent->GetParentWindow();
+            }
 
-			pWnd->OnSetFocus();
-		}
-	}
+            pWnd->OnSetFocus();
+        }
+    }
 
-	void KillFocus()
-	{
-		if (m_aKeyboardPath.GetSize() > 0)
-			if (CPWL_Wnd* pWnd = m_aKeyboardPath.GetAt(0))
-				pWnd->OnKillFocus();
+    void KillFocus()
+    {
+        if (m_aKeyboardPath.GetSize() > 0)
+            if (CPWL_Wnd* pWnd = m_aKeyboardPath.GetAt(0))
+                pWnd->OnKillFocus();
 
-		m_pMainKeyboardWnd = NULL;
-		m_aKeyboardPath.RemoveAll();
-	}
+        m_pMainKeyboardWnd = NULL;
+        m_aKeyboardPath.RemoveAll();
+    }
 
-	void SetCapture(CPWL_Wnd * pWnd)
-	{
-		m_aMousePath.RemoveAll();
+    void SetCapture(CPWL_Wnd * pWnd)
+    {
+        m_aMousePath.RemoveAll();
 
-		if (pWnd)
-		{
-			m_pMainMouseWnd = pWnd;
+        if (pWnd)
+        {
+            m_pMainMouseWnd = pWnd;
 
-			CPWL_Wnd * pParent = pWnd;
-			while (pParent)
-			{
-				m_aMousePath.Add(pParent);
-				pParent = pParent->GetParentWindow();
-			}
-		}
-	}
+            CPWL_Wnd * pParent = pWnd;
+            while (pParent)
+            {
+                m_aMousePath.Add(pParent);
+                pParent = pParent->GetParentWindow();
+            }
+        }
+    }
 
-	void ReleaseCapture()
-	{
-		m_pMainMouseWnd = NULL;
-		m_aMousePath.RemoveAll();
-	}
+    void ReleaseCapture()
+    {
+        m_pMainMouseWnd = NULL;
+        m_aMousePath.RemoveAll();
+    }
 
 private:
-	CFX_ArrayTemplate<CPWL_Wnd*>	m_aMousePath;
-	CFX_ArrayTemplate<CPWL_Wnd*>	m_aKeyboardPath;
-	CPWL_Wnd*						m_pCreatedWnd;
-	CPWL_Wnd*						m_pMainMouseWnd;
-	CPWL_Wnd*						m_pMainKeyboardWnd;
+    CFX_ArrayTemplate<CPWL_Wnd*>    m_aMousePath;
+    CFX_ArrayTemplate<CPWL_Wnd*>    m_aKeyboardPath;
+    CPWL_Wnd*                       m_pCreatedWnd;
+    CPWL_Wnd*                       m_pMainMouseWnd;
+    CPWL_Wnd*                       m_pMainKeyboardWnd;
 };
 
 /* --------------------------- CPWL_Wnd ---------------------------- */
 
 CPWL_Wnd::CPWL_Wnd() :
-	m_pVScrollBar(NULL),
-	m_rcWindow(),
-	m_rcClip(),
-	m_bCreated(FALSE),
-	m_bVisible(FALSE),
-	m_bNotifying(FALSE),
-	m_bEnabled(TRUE)
+    m_pVScrollBar(NULL),
+    m_rcWindow(),
+    m_rcClip(),
+    m_bCreated(FALSE),
+    m_bVisible(FALSE),
+    m_bNotifying(FALSE),
+    m_bEnabled(TRUE)
 {
 }
 
 CPWL_Wnd::~CPWL_Wnd()
 {
-	ASSERT(m_bCreated == FALSE);
+    ASSERT(m_bCreated == FALSE);
 }
 
 CFX_ByteString CPWL_Wnd::GetClassName() const
 {
-	return "CPWL_Wnd";
+    return "CPWL_Wnd";
 }
 
 void CPWL_Wnd::Create(const PWL_CREATEPARAM & cp)
 {
-	if (!IsValid())
-	{
-		m_sPrivateParam = cp;
+    if (!IsValid())
+    {
+        m_sPrivateParam = cp;
 
-		OnCreate(m_sPrivateParam);
+        OnCreate(m_sPrivateParam);
 
-		m_sPrivateParam.rcRectWnd.Normalize();
-		m_rcWindow = m_sPrivateParam.rcRectWnd;
-		m_rcClip = CPWL_Utils::InflateRect(m_rcWindow,1.0f);
+        m_sPrivateParam.rcRectWnd.Normalize();
+        m_rcWindow = m_sPrivateParam.rcRectWnd;
+        m_rcClip = CPWL_Utils::InflateRect(m_rcWindow,1.0f);
 
-		CreateMsgControl();
+        CreateMsgControl();
 
-		if (m_sPrivateParam.pParentWnd)
-			m_sPrivateParam.pParentWnd->OnNotify(this, PNM_ADDCHILD);
+        if (m_sPrivateParam.pParentWnd)
+            m_sPrivateParam.pParentWnd->OnNotify(this, PNM_ADDCHILD);
 
-		PWL_CREATEPARAM ccp = m_sPrivateParam;
+        PWL_CREATEPARAM ccp = m_sPrivateParam;
 
-		ccp.dwFlags &= 0xFFFF0000L; //remove sub styles
-		ccp.mtChild = CPDF_Matrix(1,0,0,1,0,0);
+        ccp.dwFlags &= 0xFFFF0000L; //remove sub styles
+        ccp.mtChild = CPDF_Matrix(1,0,0,1,0,0);
 
-		CreateScrollBar(ccp);
-		CreateChildWnd(ccp);
+        CreateScrollBar(ccp);
+        CreateChildWnd(ccp);
 
-		m_bVisible = HasFlag(PWS_VISIBLE);
+        m_bVisible = HasFlag(PWS_VISIBLE);
 
-		OnCreated();
+        OnCreated();
 
-		RePosChildWnd();
-		m_bCreated = TRUE;
-	}
+        RePosChildWnd();
+        m_bCreated = TRUE;
+    }
 }
 
 void CPWL_Wnd::OnCreate(PWL_CREATEPARAM & cp)
@@ -290,86 +290,86 @@
 
 void CPWL_Wnd::Destroy()
 {
-	KillFocus();
+    KillFocus();
 
-	OnDestroy();
+    OnDestroy();
 
-	if (m_bCreated)
-	{
-		for (int32_t i = m_aChildren.GetSize()-1; i >= 0; i --)
-		{
-			if (CPWL_Wnd * pChild = m_aChildren[i])
-			{
-				pChild->Destroy();
-				delete pChild;
-				pChild = NULL;
-			}
-		}
+    if (m_bCreated)
+    {
+        for (int32_t i = m_aChildren.GetSize()-1; i >= 0; i --)
+        {
+            if (CPWL_Wnd * pChild = m_aChildren[i])
+            {
+                pChild->Destroy();
+                delete pChild;
+                pChild = NULL;
+            }
+        }
 
-		if (m_sPrivateParam.pParentWnd)
-			m_sPrivateParam.pParentWnd->OnNotify(this, PNM_REMOVECHILD);
-		m_bCreated = FALSE;
-	}
+        if (m_sPrivateParam.pParentWnd)
+            m_sPrivateParam.pParentWnd->OnNotify(this, PNM_REMOVECHILD);
+        m_bCreated = FALSE;
+    }
 
-	DestroyMsgControl();
+    DestroyMsgControl();
 
-	FXSYS_memset(&m_sPrivateParam, 0, sizeof(PWL_CREATEPARAM));
-	m_aChildren.RemoveAll();
-	m_pVScrollBar = NULL;
+    FXSYS_memset(&m_sPrivateParam, 0, sizeof(PWL_CREATEPARAM));
+    m_aChildren.RemoveAll();
+    m_pVScrollBar = NULL;
 }
 
 void CPWL_Wnd::Move(const CPDF_Rect & rcNew, FX_BOOL bReset,FX_BOOL bRefresh)
 {
-	if (IsValid())
-	{
-		CPDF_Rect rcOld = GetWindowRect();
+    if (IsValid())
+    {
+        CPDF_Rect rcOld = GetWindowRect();
 
-		m_rcWindow = rcNew;
-		m_rcWindow.Normalize();
+        m_rcWindow = rcNew;
+        m_rcWindow.Normalize();
 
-		if (rcOld.left != rcNew.left || rcOld.right != rcNew.right ||
-			rcOld.top != rcNew.top || rcOld.bottom != rcNew.bottom)
-		{
-			if (bReset)
-			{
-				RePosChildWnd();
-			}
+        if (rcOld.left != rcNew.left || rcOld.right != rcNew.right ||
+            rcOld.top != rcNew.top || rcOld.bottom != rcNew.bottom)
+        {
+            if (bReset)
+            {
+                RePosChildWnd();
+            }
 
-		}
-		if (bRefresh)
-		{
-			InvalidateRectMove(rcOld,rcNew);
-		}
+        }
+        if (bRefresh)
+        {
+            InvalidateRectMove(rcOld,rcNew);
+        }
 
-		m_sPrivateParam.rcRectWnd = m_rcWindow;
-	}
+        m_sPrivateParam.rcRectWnd = m_rcWindow;
+    }
 }
 
 void  CPWL_Wnd::InvalidateRectMove(const CPDF_Rect & rcOld, const CPDF_Rect & rcNew)
 {
-	CPDF_Rect rcUnion = rcOld;
-	rcUnion.Union(rcNew);
+    CPDF_Rect rcUnion = rcOld;
+    rcUnion.Union(rcNew);
 
-	InvalidateRect(&rcUnion);
+    InvalidateRect(&rcUnion);
 }
 
 void CPWL_Wnd::GetAppearanceStream(CFX_ByteString & sAppStream)
 {
-	if (IsValid())
-	{
-		CFX_ByteTextBuf sTextBuf;
-		GetAppearanceStream(sTextBuf);
-		sAppStream += sTextBuf.GetByteString();
-	}
+    if (IsValid())
+    {
+        CFX_ByteTextBuf sTextBuf;
+        GetAppearanceStream(sTextBuf);
+        sAppStream += sTextBuf.GetByteString();
+    }
 }
 
 void CPWL_Wnd::GetAppearanceStream(CFX_ByteTextBuf & sAppStream)
 {
-	if (IsValid() && IsVisible())
-	{
-		GetThisAppearanceStream(sAppStream);
-		GetChildAppearanceStream(sAppStream);
-	}
+    if (IsValid() && IsVisible())
+    {
+        GetThisAppearanceStream(sAppStream);
+        GetChildAppearanceStream(sAppStream);
+    }
 }
 
 //if don't set,Get default apperance stream
@@ -399,158 +399,158 @@
 
 void CPWL_Wnd::GetChildAppearanceStream(CFX_ByteTextBuf & sAppStream)
 {
-	for (int32_t i=0,sz=m_aChildren.GetSize(); i<sz; i++)
-	{
-		if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))
-		{
-			pChild->GetAppearanceStream(sAppStream);
-		}
-	}
+    for (int32_t i=0,sz=m_aChildren.GetSize(); i<sz; i++)
+    {
+        if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))
+        {
+            pChild->GetAppearanceStream(sAppStream);
+        }
+    }
 }
 
 void CPWL_Wnd::DrawAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
 {
-	if (IsValid() && IsVisible())
-	{
-		DrawThisAppearance(pDevice,pUser2Device);
-		DrawChildAppearance(pDevice,pUser2Device);
-	}
+    if (IsValid() && IsVisible())
+    {
+        DrawThisAppearance(pDevice,pUser2Device);
+        DrawChildAppearance(pDevice,pUser2Device);
+    }
 }
 
 void CPWL_Wnd::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
 {
-	CPDF_Rect rectWnd = GetWindowRect();
-	if (!rectWnd.IsEmpty())
-	{
-		if (HasFlag(PWS_BACKGROUND))
-		{
-			CPDF_Rect rcClient = CPWL_Utils::DeflateRect(rectWnd,(FX_FLOAT)(GetBorderWidth()+GetInnerBorderWidth()));
-			CPWL_Utils::DrawFillRect(pDevice,pUser2Device,rcClient, GetBackgroundColor(), GetTransparency());
-		}
+    CPDF_Rect rectWnd = GetWindowRect();
+    if (!rectWnd.IsEmpty())
+    {
+        if (HasFlag(PWS_BACKGROUND))
+        {
+            CPDF_Rect rcClient = CPWL_Utils::DeflateRect(rectWnd,(FX_FLOAT)(GetBorderWidth()+GetInnerBorderWidth()));
+            CPWL_Utils::DrawFillRect(pDevice,pUser2Device,rcClient, GetBackgroundColor(), GetTransparency());
+        }
 
-		if (HasFlag(PWS_BORDER))
-			CPWL_Utils::DrawBorder(pDevice,
-								pUser2Device,
-								rectWnd,
-								(FX_FLOAT)GetBorderWidth(),
-								GetBorderColor(),
-								GetBorderLeftTopColor(GetBorderStyle()),
-								GetBorderRightBottomColor(GetBorderStyle()),
-								GetBorderStyle(),
-								GetBorderDash(),
-								GetTransparency());
-	}
+        if (HasFlag(PWS_BORDER))
+            CPWL_Utils::DrawBorder(pDevice,
+                                pUser2Device,
+                                rectWnd,
+                                (FX_FLOAT)GetBorderWidth(),
+                                GetBorderColor(),
+                                GetBorderLeftTopColor(GetBorderStyle()),
+                                GetBorderRightBottomColor(GetBorderStyle()),
+                                GetBorderStyle(),
+                                GetBorderDash(),
+                                GetTransparency());
+    }
 }
 
 void CPWL_Wnd::DrawChildAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
 {
-	for (int32_t i=0,sz=m_aChildren.GetSize(); i<sz; i++)
-	{
-		if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))
-		{
-			CPDF_Matrix mt = pChild->GetChildMatrix();
-			if (mt.IsIdentity())
-			{
-				pChild->DrawAppearance(pDevice,pUser2Device);
-			}
-			else
-			{
-				mt.Concat(*pUser2Device);
-				pChild->DrawAppearance(pDevice,&mt);
-			}
-		}
-	}
+    for (int32_t i=0,sz=m_aChildren.GetSize(); i<sz; i++)
+    {
+        if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))
+        {
+            CPDF_Matrix mt = pChild->GetChildMatrix();
+            if (mt.IsIdentity())
+            {
+                pChild->DrawAppearance(pDevice,pUser2Device);
+            }
+            else
+            {
+                mt.Concat(*pUser2Device);
+                pChild->DrawAppearance(pDevice,&mt);
+            }
+        }
+    }
 }
 
 void CPWL_Wnd::InvalidateRect(CPDF_Rect* pRect)
 {
-	if (IsValid())
-	{
-		CPDF_Rect rcRefresh = pRect ? *pRect : GetWindowRect();
+    if (IsValid())
+    {
+        CPDF_Rect rcRefresh = pRect ? *pRect : GetWindowRect();
 
-		if (!HasFlag(PWS_NOREFRESHCLIP))
-		{
-			CPDF_Rect rcClip = GetClipRect();
-			if (!rcClip.IsEmpty())
-			{
-				rcRefresh.Intersect(rcClip);
-			}
-		}
+        if (!HasFlag(PWS_NOREFRESHCLIP))
+        {
+            CPDF_Rect rcClip = GetClipRect();
+            if (!rcClip.IsEmpty())
+            {
+                rcRefresh.Intersect(rcClip);
+            }
+        }
 
-		FX_RECT rcWin = PWLtoWnd(rcRefresh);
-		rcWin.left -= PWL_INVALIDATE_INFLATE;
-		rcWin.top -= PWL_INVALIDATE_INFLATE;
-		rcWin.right += PWL_INVALIDATE_INFLATE;
-		rcWin.bottom += PWL_INVALIDATE_INFLATE;
+        FX_RECT rcWin = PWLtoWnd(rcRefresh);
+        rcWin.left -= PWL_INVALIDATE_INFLATE;
+        rcWin.top -= PWL_INVALIDATE_INFLATE;
+        rcWin.right += PWL_INVALIDATE_INFLATE;
+        rcWin.bottom += PWL_INVALIDATE_INFLATE;
 
-		if (IFX_SystemHandler* pSH = GetSystemHandler())
-		{
-			if (FX_HWND hWnd = GetAttachedHWnd())
-			{
-				pSH->InvalidateRect(hWnd, rcWin);
-			}
-		}
-	}
+        if (IFX_SystemHandler* pSH = GetSystemHandler())
+        {
+            if (FX_HWND hWnd = GetAttachedHWnd())
+            {
+                pSH->InvalidateRect(hWnd, rcWin);
+            }
+        }
+    }
 }
 
 #define PWL_IMPLEMENT_KEY_METHOD(key_method_name)\
 FX_BOOL CPWL_Wnd::key_method_name(FX_WORD nChar, FX_DWORD nFlag)\
 {\
-	if (IsValid() && IsVisible() && IsEnabled())\
-	{\
-		if (IsWndCaptureKeyboard(this))\
-		{\
-			for (int32_t i=0,sz=m_aChildren.GetSize(); i<sz; i++)\
-			{\
-				if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))\
-				{\
-					if (IsWndCaptureKeyboard(pChild))\
-					{\
-						return pChild->key_method_name(nChar,nFlag);\
-					}\
-				}\
-			}\
-		}\
-	}\
-	return FALSE;\
+    if (IsValid() && IsVisible() && IsEnabled())\
+    {\
+        if (IsWndCaptureKeyboard(this))\
+        {\
+            for (int32_t i=0,sz=m_aChildren.GetSize(); i<sz; i++)\
+            {\
+                if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))\
+                {\
+                    if (IsWndCaptureKeyboard(pChild))\
+                    {\
+                        return pChild->key_method_name(nChar,nFlag);\
+                    }\
+                }\
+            }\
+        }\
+    }\
+    return FALSE;\
 }
 
 #define PWL_IMPLEMENT_MOUSE_METHOD(mouse_method_name)\
 FX_BOOL CPWL_Wnd::mouse_method_name(const CPDF_Point & point, FX_DWORD nFlag)\
 {\
-	if (IsValid() && IsVisible() && IsEnabled())\
-	{\
-		if (IsWndCaptureMouse(this))\
-		{\
-			for (int32_t i=0,sz=m_aChildren.GetSize(); i<sz; i++)\
-			{\
-				if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))\
-				{\
-					if (IsWndCaptureMouse(pChild))\
-					{\
-						return pChild->mouse_method_name(pChild->ParentToChild(point),nFlag);\
-					}\
-				}\
-			}\
-			SetCursor();\
-		}\
-		else\
-		{\
-			for (int32_t i=0,sz=m_aChildren.GetSize(); i<sz; i++)\
-			{\
-				if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))\
-				{\
-					if (pChild->WndHitTest(pChild->ParentToChild(point)))\
-					{\
-						return pChild->mouse_method_name(pChild->ParentToChild(point),nFlag);\
-					}\
-				}\
-			}\
-			if (WndHitTest(point))\
-				SetCursor();\
-		}\
-	}\
-	return FALSE;\
+    if (IsValid() && IsVisible() && IsEnabled())\
+    {\
+        if (IsWndCaptureMouse(this))\
+        {\
+            for (int32_t i=0,sz=m_aChildren.GetSize(); i<sz; i++)\
+            {\
+                if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))\
+                {\
+                    if (IsWndCaptureMouse(pChild))\
+                    {\
+                        return pChild->mouse_method_name(pChild->ParentToChild(point),nFlag);\
+                    }\
+                }\
+            }\
+            SetCursor();\
+        }\
+        else\
+        {\
+            for (int32_t i=0,sz=m_aChildren.GetSize(); i<sz; i++)\
+            {\
+                if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))\
+                {\
+                    if (pChild->WndHitTest(pChild->ParentToChild(point)))\
+                    {\
+                        return pChild->mouse_method_name(pChild->ParentToChild(point),nFlag);\
+                    }\
+                }\
+            }\
+            if (WndHitTest(point))\
+                SetCursor();\
+        }\
+    }\
+    return FALSE;\
 }
 
 PWL_IMPLEMENT_KEY_METHOD(OnKeyDown)
@@ -568,300 +568,294 @@
 PWL_IMPLEMENT_MOUSE_METHOD(OnRButtonUp)
 PWL_IMPLEMENT_MOUSE_METHOD(OnMouseMove)
 
-FX_BOOL	CPWL_Wnd::OnMouseWheel(short zDelta, const CPDF_Point & point, FX_DWORD nFlag)
+FX_BOOL CPWL_Wnd::OnMouseWheel(short zDelta, const CPDF_Point & point, FX_DWORD nFlag)
 {
-	if (IsValid() && IsVisible() && IsEnabled())
-	{
-		SetCursor();
-		if (IsWndCaptureKeyboard(this))
-		{
-			for (int32_t i=0,sz=m_aChildren.GetSize(); i<sz; i++)
-			{
-				if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))
-				{
-					if (IsWndCaptureKeyboard(pChild))
-					{
-						return pChild->OnMouseWheel(zDelta,pChild->ParentToChild(point), nFlag);
-					}
-				}
-			}
-		}
-	}
-	return FALSE;
+    if (IsValid() && IsVisible() && IsEnabled())
+    {
+        SetCursor();
+        if (IsWndCaptureKeyboard(this))
+        {
+            for (int32_t i=0,sz=m_aChildren.GetSize(); i<sz; i++)
+            {
+                if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))
+                {
+                    if (IsWndCaptureKeyboard(pChild))
+                    {
+                        return pChild->OnMouseWheel(zDelta,pChild->ParentToChild(point), nFlag);
+                    }
+                }
+            }
+        }
+    }
+    return FALSE;
 }
 
 void CPWL_Wnd::AddChild(CPWL_Wnd * pWnd)
 {
-	m_aChildren.Add(pWnd);
+    m_aChildren.Add(pWnd);
 }
 
 void CPWL_Wnd::RemoveChild(CPWL_Wnd * pWnd)
 {
-	for (int32_t i = m_aChildren.GetSize()-1; i >= 0; i --)
-	{
-		if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
-		{
-			if (pChild == pWnd)
-			{
-				m_aChildren.RemoveAt(i);
-				break;
-			}
-		}
-	}
+    for (int32_t i = m_aChildren.GetSize()-1; i >= 0; i --)
+    {
+        if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
+        {
+            if (pChild == pWnd)
+            {
+                m_aChildren.RemoveAt(i);
+                break;
+            }
+        }
+    }
 }
 
 void CPWL_Wnd::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, intptr_t wParam, intptr_t lParam)
 {
-	switch (msg)
-	{
-	case PNM_ADDCHILD:
-		AddChild(pWnd);
-		break;
-	case PNM_REMOVECHILD:
-		RemoveChild(pWnd);
-		break;
-	default:
-		break;
-	}
+    switch (msg)
+    {
+    case PNM_ADDCHILD:
+        AddChild(pWnd);
+        break;
+    case PNM_REMOVECHILD:
+        RemoveChild(pWnd);
+        break;
+    default:
+        break;
+    }
 }
 
 FX_BOOL CPWL_Wnd::IsValid() const
 {
-	return m_bCreated;
+    return m_bCreated;
 }
 
 PWL_CREATEPARAM CPWL_Wnd::GetCreationParam() const
 {
-	return m_sPrivateParam;
+    return m_sPrivateParam;
 }
 
 CPWL_Wnd* CPWL_Wnd::GetParentWindow() const
 {
-	return m_sPrivateParam.pParentWnd;
+    return m_sPrivateParam.pParentWnd;
 }
 
 CPDF_Rect CPWL_Wnd::GetOriginWindowRect() const
 {
-	return m_sPrivateParam.rcRectWnd;
+    return m_sPrivateParam.rcRectWnd;
 }
 
 CPDF_Rect CPWL_Wnd::GetWindowRect() const
 {
-	return m_rcWindow;
+    return m_rcWindow;
 }
 
 CPDF_Rect CPWL_Wnd::GetClientRect() const
 {
-	CPDF_Rect rcWindow = GetWindowRect();
-	CPDF_Rect rcClient = CPWL_Utils::DeflateRect(rcWindow,(FX_FLOAT)(GetBorderWidth()+GetInnerBorderWidth()));
+    CPDF_Rect rcWindow = GetWindowRect();
+    CPDF_Rect rcClient = CPWL_Utils::DeflateRect(rcWindow,(FX_FLOAT)(GetBorderWidth()+GetInnerBorderWidth()));
+    if (CPWL_ScrollBar* pVSB = GetVScrollBar())
+        rcClient.right -= pVSB->GetScrollBarWidth();
 
-	if (CPWL_ScrollBar * pVSB = GetVScrollBar())
-		rcClient.right -= pVSB->GetScrollBarWidth();
-
-	rcClient.Normalize();
-
-	if (rcWindow.Contains(rcClient))
-		return rcClient;
-	else
-		return CPDF_Rect();
+    rcClient.Normalize();
+    return rcWindow.Contains(rcClient) ? rcClient : CPDF_Rect();
 }
 
 CPDF_Point CPWL_Wnd::GetCenterPoint() const
 {
-	CPDF_Rect rcClient = GetClientRect();
-
-	return CPDF_Point((rcClient.left + rcClient.right) * 0.5f,
-		(rcClient.top + rcClient.bottom) * 0.5f);
+    CPDF_Rect rcClient = GetClientRect();
+    return CPDF_Point((rcClient.left + rcClient.right) * 0.5f,
+                      (rcClient.top + rcClient.bottom) * 0.5f);
 }
 
 CPDF_Rect CPWL_Wnd::GetClientCenterSquare() const
 {
-	return CPWL_Utils::GetCenterSquare(GetClientRect());
+    return CPWL_Utils::GetCenterSquare(GetClientRect());
 }
 
 CPDF_Rect CPWL_Wnd::GetWindowCenterSquare() const
 {
-	return CPWL_Utils::GetCenterSquare(CPWL_Utils::DeflateRect(GetWindowRect(),0.1f));
+    return CPWL_Utils::GetCenterSquare(CPWL_Utils::DeflateRect(GetWindowRect(),0.1f));
 }
 
 FX_BOOL CPWL_Wnd::HasFlag(FX_DWORD dwFlags) const
 {
-	return (m_sPrivateParam.dwFlags & dwFlags) != 0;
+    return (m_sPrivateParam.dwFlags & dwFlags) != 0;
 }
 
 void CPWL_Wnd::RemoveFlag(FX_DWORD dwFlags)
 {
-	m_sPrivateParam.dwFlags &= ~dwFlags;
+    m_sPrivateParam.dwFlags &= ~dwFlags;
 }
 
 void CPWL_Wnd::AddFlag(FX_DWORD dwFlags)
 {
-	m_sPrivateParam.dwFlags |= dwFlags;
+    m_sPrivateParam.dwFlags |= dwFlags;
 }
 
 CPWL_Color CPWL_Wnd::GetBackgroundColor() const
 {
-	return m_sPrivateParam.sBackgroundColor;
+    return m_sPrivateParam.sBackgroundColor;
 }
 
 void CPWL_Wnd::SetBackgroundColor(const CPWL_Color & color)
 {
-	m_sPrivateParam.sBackgroundColor = color;
+    m_sPrivateParam.sBackgroundColor = color;
 }
 
 void CPWL_Wnd::SetTextColor(const CPWL_Color & color)
 {
-	m_sPrivateParam.sTextColor = color;
+    m_sPrivateParam.sTextColor = color;
 }
 
 void CPWL_Wnd::SetTextStrokeColor(const CPWL_Color & color)
 {
-	m_sPrivateParam.sTextStrokeColor = color;
+    m_sPrivateParam.sTextStrokeColor = color;
 }
 
 CPWL_Color CPWL_Wnd::GetTextColor() const
 {
-	return m_sPrivateParam.sTextColor;
+    return m_sPrivateParam.sTextColor;
 }
 
 CPWL_Color CPWL_Wnd::GetTextStrokeColor() const
 {
-	return m_sPrivateParam.sTextStrokeColor;
+    return m_sPrivateParam.sTextStrokeColor;
 }
 
 int32_t CPWL_Wnd::GetBorderStyle() const
 {
-	return m_sPrivateParam.nBorderStyle;
+    return m_sPrivateParam.nBorderStyle;
 }
 
 void CPWL_Wnd::SetBorderStyle(int32_t nBorderStyle)
 {
-	if (HasFlag(PWS_BORDER))
-		m_sPrivateParam.nBorderStyle = nBorderStyle;
+    if (HasFlag(PWS_BORDER))
+        m_sPrivateParam.nBorderStyle = nBorderStyle;
 }
 
 int32_t CPWL_Wnd::GetBorderWidth() const
 {
-	if (HasFlag(PWS_BORDER))
-		return m_sPrivateParam.dwBorderWidth;
+    if (HasFlag(PWS_BORDER))
+        return m_sPrivateParam.dwBorderWidth;
 
-	return 0;
+    return 0;
 }
 
 int32_t CPWL_Wnd::GetInnerBorderWidth() const
 {
-	/*
-	switch (GetBorderStyle())
-	{
-	case PBS_BEVELED:
-	case PBS_INSET:
-		return GetBorderWidth() / 2;
-	}
-	*/
-	return 0;
+    /*
+    switch (GetBorderStyle())
+    {
+    case PBS_BEVELED:
+    case PBS_INSET:
+        return GetBorderWidth() / 2;
+    }
+    */
+    return 0;
 }
 
 void CPWL_Wnd::SetBorderWidth(int32_t nBorderWidth)
 {
-	if (HasFlag(PWS_BORDER))
-		m_sPrivateParam.dwBorderWidth = nBorderWidth;
+    if (HasFlag(PWS_BORDER))
+        m_sPrivateParam.dwBorderWidth = nBorderWidth;
 }
 
 CPWL_Color CPWL_Wnd::GetBorderColor() const
 {
-	if (HasFlag(PWS_BORDER))
-		return m_sPrivateParam.sBorderColor;
+    if (HasFlag(PWS_BORDER))
+        return m_sPrivateParam.sBorderColor;
 
-	return CPWL_Color();
+    return CPWL_Color();
 }
 
 void CPWL_Wnd::SetBorderColor(const CPWL_Color & color)
 {
-	if (HasFlag(PWS_BORDER))
-		m_sPrivateParam.sBorderColor = color;
+    if (HasFlag(PWS_BORDER))
+        m_sPrivateParam.sBorderColor = color;
 }
 
 CPWL_Dash CPWL_Wnd::GetBorderDash() const
 {
-	return m_sPrivateParam.sDash;
+    return m_sPrivateParam.sDash;
 }
 
 void* CPWL_Wnd::GetAttachedData() const
 {
-	return m_sPrivateParam.pAttachedData;
+    return m_sPrivateParam.pAttachedData;
 }
 
 void CPWL_Wnd::SetBorderDash(const CPWL_Dash & sDash)
 {
-	if (HasFlag(PWS_BORDER))
-		m_sPrivateParam.sDash = sDash;
+    if (HasFlag(PWS_BORDER))
+        m_sPrivateParam.sDash = sDash;
 }
 
 CPWL_ScrollBar* CPWL_Wnd::GetVScrollBar() const
 {
-	if (HasFlag(PWS_VSCROLL))
-		return m_pVScrollBar;
+    if (HasFlag(PWS_VSCROLL))
+        return m_pVScrollBar;
 
-	return NULL;
+    return NULL;
 }
 
 void CPWL_Wnd::CreateScrollBar(const PWL_CREATEPARAM & cp)
 {
-	CreateVScrollBar(cp);
+    CreateVScrollBar(cp);
 }
 
 void CPWL_Wnd::CreateVScrollBar(const PWL_CREATEPARAM & cp)
 {
-	if (!m_pVScrollBar && HasFlag(PWS_VSCROLL))
-	{
-		PWL_CREATEPARAM scp = cp;
+    if (!m_pVScrollBar && HasFlag(PWS_VSCROLL))
+    {
+        PWL_CREATEPARAM scp = cp;
 
-		//flags
-		scp.dwFlags = PWS_CHILD| PWS_BACKGROUND | PWS_AUTOTRANSPARENT | PWS_NOREFRESHCLIP;
+        //flags
+        scp.dwFlags = PWS_CHILD| PWS_BACKGROUND | PWS_AUTOTRANSPARENT | PWS_NOREFRESHCLIP;
 
-		scp.pParentWnd = this;
-		scp.sBackgroundColor = PWL_DEFAULT_WHITECOLOR;
-		scp.eCursorType = FXCT_ARROW;
-		scp.nTransparency = PWL_SCROLLBAR_TRANSPARANCY;
+        scp.pParentWnd = this;
+        scp.sBackgroundColor = PWL_DEFAULT_WHITECOLOR;
+        scp.eCursorType = FXCT_ARROW;
+        scp.nTransparency = PWL_SCROLLBAR_TRANSPARANCY;
 
-		if ((m_pVScrollBar = new CPWL_ScrollBar(SBT_VSCROLL)))
-			m_pVScrollBar->Create(scp);
-	}
+        if ((m_pVScrollBar = new CPWL_ScrollBar(SBT_VSCROLL)))
+            m_pVScrollBar->Create(scp);
+    }
 }
 
 void CPWL_Wnd::SetCapture()
 {
-	if (CPWL_MsgControl * pMsgCtrl = GetMsgControl())
-		pMsgCtrl->SetCapture(this);
+    if (CPWL_MsgControl * pMsgCtrl = GetMsgControl())
+        pMsgCtrl->SetCapture(this);
 }
 
 void CPWL_Wnd::ReleaseCapture()
 {
-	for (int32_t i=0,sz=m_aChildren.GetSize(); i<sz; i++)
-		if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
-			pChild->ReleaseCapture();
+    for (int32_t i=0,sz=m_aChildren.GetSize(); i<sz; i++)
+        if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
+            pChild->ReleaseCapture();
 
-	if (CPWL_MsgControl * pMsgCtrl = GetMsgControl())
-		pMsgCtrl->ReleaseCapture();
+    if (CPWL_MsgControl * pMsgCtrl = GetMsgControl())
+        pMsgCtrl->ReleaseCapture();
 }
 
 void CPWL_Wnd::SetFocus()
 {
-	if (CPWL_MsgControl * pMsgCtrl = GetMsgControl())
-	{
-		if (!pMsgCtrl->IsMainCaptureKeyboard(this))
-			pMsgCtrl->KillFocus();
-		pMsgCtrl->SetFocus(this);
-	}
+    if (CPWL_MsgControl * pMsgCtrl = GetMsgControl())
+    {
+        if (!pMsgCtrl->IsMainCaptureKeyboard(this))
+            pMsgCtrl->KillFocus();
+        pMsgCtrl->SetFocus(this);
+    }
 }
 
 void CPWL_Wnd::KillFocus()
 {
-	if (CPWL_MsgControl * pMsgCtrl = GetMsgControl())
-	{
-		if (pMsgCtrl->IsWndCaptureKeyboard(this))
-			pMsgCtrl->KillFocus();
-	}
+    if (CPWL_MsgControl * pMsgCtrl = GetMsgControl())
+    {
+        if (pMsgCtrl->IsWndCaptureKeyboard(this))
+            pMsgCtrl->KillFocus();
+    }
 }
 
 void CPWL_Wnd::OnSetFocus()
@@ -872,73 +866,73 @@
 {
 }
 
-FX_BOOL	CPWL_Wnd::WndHitTest(const CPDF_Point & point) const
+FX_BOOL CPWL_Wnd::WndHitTest(const CPDF_Point & point) const
 {
-	return IsValid() && IsVisible() && GetWindowRect().Contains(point.x,point.y);
+    return IsValid() && IsVisible() && GetWindowRect().Contains(point.x,point.y);
 }
 
 FX_BOOL CPWL_Wnd::ClientHitTest(const CPDF_Point & point) const
 {
-	return IsValid() && IsVisible() && GetClientRect().Contains(point.x,point.y);
+    return IsValid() && IsVisible() && GetClientRect().Contains(point.x,point.y);
 }
 
-const CPWL_Wnd * CPWL_Wnd::GetRootWnd() const
+const CPWL_Wnd* CPWL_Wnd::GetRootWnd() const
 {
-	if (m_sPrivateParam.pParentWnd)
-		return m_sPrivateParam.pParentWnd->GetRootWnd();
-	else
-		return this;
+    if (m_sPrivateParam.pParentWnd)
+        return m_sPrivateParam.pParentWnd->GetRootWnd();
+
+    return this;
 }
 
 void CPWL_Wnd::SetVisible(FX_BOOL bVisible)
 {
-	if (IsValid())
-	{
-		for (int32_t i=0,sz=m_aChildren.GetSize(); i<sz; i++)
-		{
-			if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
-			{
-				pChild->SetVisible(bVisible);
-			}
-		}
+    if (IsValid())
+    {
+        for (int32_t i=0,sz=m_aChildren.GetSize(); i<sz; i++)
+        {
+            if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
+            {
+                pChild->SetVisible(bVisible);
+            }
+        }
 
-		if (bVisible != m_bVisible)
-		{
-			m_bVisible = bVisible;
-			RePosChildWnd();
-			InvalidateRect();
-		}
-	}
+        if (bVisible != m_bVisible)
+        {
+            m_bVisible = bVisible;
+            RePosChildWnd();
+            InvalidateRect();
+        }
+    }
 }
 
 void CPWL_Wnd::SetClipRect(const CPDF_Rect & rect)
 {
-	m_rcClip = rect;
-	m_rcClip.Normalize();
+    m_rcClip = rect;
+    m_rcClip.Normalize();
 }
 
 CPDF_Rect CPWL_Wnd::GetClipRect() const
 {
-	return m_rcClip;
+    return m_rcClip;
 }
 
-FX_BOOL	CPWL_Wnd::IsReadOnly() const
+FX_BOOL CPWL_Wnd::IsReadOnly() const
 {
-	return HasFlag(PWS_READONLY);
+    return HasFlag(PWS_READONLY);
 }
 
 void CPWL_Wnd::RePosChildWnd()
 {
-	CPDF_Rect rcContent = CPWL_Utils::DeflateRect(GetWindowRect(),(FX_FLOAT)(GetBorderWidth()+GetInnerBorderWidth()));
+    CPDF_Rect rcContent = CPWL_Utils::DeflateRect(GetWindowRect(),(FX_FLOAT)(GetBorderWidth()+GetInnerBorderWidth()));
 
-	CPWL_ScrollBar * pVSB = GetVScrollBar();
+    CPWL_ScrollBar * pVSB = GetVScrollBar();
 
-	CPDF_Rect rcVScroll = CPDF_Rect(rcContent.right - PWL_SCROLLBAR_WIDTH,
-							rcContent.bottom,
-							rcContent.right-1.0f,
-							rcContent.top);
+    CPDF_Rect rcVScroll = CPDF_Rect(rcContent.right - PWL_SCROLLBAR_WIDTH,
+                            rcContent.bottom,
+                            rcContent.right-1.0f,
+                            rcContent.top);
 
-	if (pVSB) pVSB->Move(rcVScroll,TRUE,FALSE);
+    if (pVSB) pVSB->Move(rcVScroll,TRUE,FALSE);
 }
 
 void CPWL_Wnd::CreateChildWnd(const PWL_CREATEPARAM & cp)
@@ -947,317 +941,307 @@
 
 void CPWL_Wnd::SetCursor()
 {
-	if (IsValid())
-	{
-		if (IFX_SystemHandler* pSH = GetSystemHandler())
-		{
-			int32_t nCursorType = GetCreationParam().eCursorType;
-			pSH->SetCursor(nCursorType);
-		}
-	}
+    if (IsValid())
+    {
+        if (IFX_SystemHandler* pSH = GetSystemHandler())
+        {
+            int32_t nCursorType = GetCreationParam().eCursorType;
+            pSH->SetCursor(nCursorType);
+        }
+    }
 }
 
 void CPWL_Wnd::CreateMsgControl()
 {
-	if (!m_sPrivateParam.pMsgControl)
-		m_sPrivateParam.pMsgControl = new CPWL_MsgControl(this);
+    if (!m_sPrivateParam.pMsgControl)
+        m_sPrivateParam.pMsgControl = new CPWL_MsgControl(this);
 }
 
 void CPWL_Wnd::DestroyMsgControl()
 {
-	if (CPWL_MsgControl* pMsgControl = GetMsgControl())
-		if (pMsgControl->IsWndCreated(this))
-			delete pMsgControl;
+    if (CPWL_MsgControl* pMsgControl = GetMsgControl())
+        if (pMsgControl->IsWndCreated(this))
+            delete pMsgControl;
 }
 
 CPWL_MsgControl* CPWL_Wnd::GetMsgControl() const
 {
-	return m_sPrivateParam.pMsgControl;
+    return m_sPrivateParam.pMsgControl;
 }
 
 FX_BOOL CPWL_Wnd::IsCaptureMouse() const
 {
-	return IsWndCaptureMouse(this);
+    return IsWndCaptureMouse(this);
 }
 
 FX_BOOL CPWL_Wnd::IsWndCaptureMouse(const CPWL_Wnd * pWnd) const
 {
-	if (CPWL_MsgControl * pCtrl = GetMsgControl())
-		return pCtrl->IsWndCaptureMouse(pWnd);
+    if (CPWL_MsgControl * pCtrl = GetMsgControl())
+        return pCtrl->IsWndCaptureMouse(pWnd);
 
-	return FALSE;
+    return FALSE;
 }
 
 FX_BOOL CPWL_Wnd::IsWndCaptureKeyboard(const CPWL_Wnd * pWnd) const
 {
-	if (CPWL_MsgControl * pCtrl = GetMsgControl())
-		return pCtrl->IsWndCaptureKeyboard(pWnd);
+    if (CPWL_MsgControl * pCtrl = GetMsgControl())
+        return pCtrl->IsWndCaptureKeyboard(pWnd);
 
-	return FALSE;
+    return FALSE;
 }
 
 FX_BOOL CPWL_Wnd::IsFocused() const
 {
-	if (CPWL_MsgControl * pCtrl = GetMsgControl())
-		return pCtrl->IsMainCaptureKeyboard(this);
+    if (CPWL_MsgControl * pCtrl = GetMsgControl())
+        return pCtrl->IsMainCaptureKeyboard(this);
 
-	return FALSE;
+    return FALSE;
 }
 
 CPDF_Rect CPWL_Wnd::GetFocusRect() const
 {
-	return CPWL_Utils::InflateRect(GetWindowRect(),1);
+    return CPWL_Utils::InflateRect(GetWindowRect(),1);
 }
 
 FX_FLOAT CPWL_Wnd::GetFontSize() const
 {
-	return m_sPrivateParam.fFontSize;
+    return m_sPrivateParam.fFontSize;
 }
 
 void CPWL_Wnd::SetFontSize(FX_FLOAT fFontSize)
 {
-	m_sPrivateParam.fFontSize = fFontSize;
+    m_sPrivateParam.fFontSize = fFontSize;
 }
 
 IFX_SystemHandler* CPWL_Wnd::GetSystemHandler() const
 {
-	return m_sPrivateParam.pSystemHandler;
+    return m_sPrivateParam.pSystemHandler;
 }
 
 IPWL_FocusHandler* CPWL_Wnd::GetFocusHandler() const
 {
-	return m_sPrivateParam.pFocusHandler;
+    return m_sPrivateParam.pFocusHandler;
 }
 
 IPWL_Provider* CPWL_Wnd::GetProvider() const
 {
-	return m_sPrivateParam.pProvider;
+    return m_sPrivateParam.pProvider;
 }
 
 IFX_Edit_FontMap* CPWL_Wnd::GetFontMap() const
 {
-	return m_sPrivateParam.pFontMap;
+    return m_sPrivateParam.pFontMap;
 }
 
 CPWL_Color CPWL_Wnd::GetBorderLeftTopColor(int32_t nBorderStyle) const
 {
-	CPWL_Color color;
+    CPWL_Color color;
 
-	switch (nBorderStyle)
-	{
-		case PBS_SOLID:
-			break;
-		case PBS_DASH:
-			break;
-		case PBS_BEVELED:
-			color = CPWL_Color(COLORTYPE_GRAY,1);
-			break;
-		case PBS_INSET:
-			color = CPWL_Color(COLORTYPE_GRAY,0.5f);
-			break;
-		case PBS_UNDERLINED:
-			break;
-	}
+    switch (nBorderStyle)
+    {
+        case PBS_SOLID:
+            break;
+        case PBS_DASH:
+            break;
+        case PBS_BEVELED:
+            color = CPWL_Color(COLORTYPE_GRAY,1);
+            break;
+        case PBS_INSET:
+            color = CPWL_Color(COLORTYPE_GRAY,0.5f);
+            break;
+        case PBS_UNDERLINED:
+            break;
+    }
 
-	return color;
+    return color;
 }
 
 CPWL_Color CPWL_Wnd::GetBorderRightBottomColor(int32_t nBorderStyle) const
 {
-	CPWL_Color color;
+    CPWL_Color color;
 
-	switch (nBorderStyle)
-	{
-		case PBS_SOLID:
-			break;
-		case PBS_DASH:
-			break;
-		case PBS_BEVELED:
-			color = CPWL_Utils::DevideColor(GetBackgroundColor(),2);
-			break;
-		case PBS_INSET:
-			color = CPWL_Color(COLORTYPE_GRAY,0.75f);
-			break;
-		case PBS_UNDERLINED:
-			break;
-	}
+    switch (nBorderStyle)
+    {
+        case PBS_SOLID:
+            break;
+        case PBS_DASH:
+            break;
+        case PBS_BEVELED:
+            color = CPWL_Utils::DevideColor(GetBackgroundColor(),2);
+            break;
+        case PBS_INSET:
+            color = CPWL_Color(COLORTYPE_GRAY,0.75f);
+            break;
+        case PBS_UNDERLINED:
+            break;
+    }
 
-	return color;
+    return color;
 }
 
 /* ----------------------------------------------------------------- */
 
 int32_t CPWL_Wnd::GetTransparency()
 {
-	return m_sPrivateParam.nTransparency;
+    return m_sPrivateParam.nTransparency;
 }
 
 void CPWL_Wnd::SetTransparency(int32_t nTransparency)
 {
-	for (int32_t i=0,sz=m_aChildren.GetSize(); i<sz; i++)
-	{
-		if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
-		{
-			pChild->SetTransparency(nTransparency);
-		}
-	}
+    for (int32_t i=0,sz=m_aChildren.GetSize(); i<sz; i++)
+    {
+        if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
+        {
+            pChild->SetTransparency(nTransparency);
+        }
+    }
 
-	m_sPrivateParam.nTransparency = nTransparency;
+    m_sPrivateParam.nTransparency = nTransparency;
 }
 
-CPDF_Matrix	CPWL_Wnd::GetWindowMatrix() const
+CPDF_Matrix CPWL_Wnd::GetWindowMatrix() const
 {
-	CPDF_Matrix mt = GetChildToRoot();
+    CPDF_Matrix mt = GetChildToRoot();
 
-	if (IPWL_Provider* pProvider = GetProvider())
-	{
-		mt.Concat(pProvider->GetWindowMatrix(GetAttachedData()));
-		return mt;
-	}
+    if (IPWL_Provider* pProvider = GetProvider())
+    {
+        mt.Concat(pProvider->GetWindowMatrix(GetAttachedData()));
+        return mt;
+    }
 
-	return mt;
+    return mt;
 }
 
 void CPWL_Wnd::PWLtoWnd(const CPDF_Point& point, int32_t& x, int32_t& y) const
 {
-	CPDF_Matrix mt = GetWindowMatrix();
-	CPDF_Point pt = point;
-	mt.Transform(pt.x,pt.y);
-	x = (int32_t)(pt.x+0.5);
-	y = (int32_t)(pt.y+0.5);
+    CPDF_Matrix mt = GetWindowMatrix();
+    CPDF_Point pt = point;
+    mt.Transform(pt.x,pt.y);
+    x = (int32_t)(pt.x+0.5);
+    y = (int32_t)(pt.y+0.5);
 }
 
 FX_RECT CPWL_Wnd::PWLtoWnd(const CPDF_Rect & rect) const
 {
-	CPDF_Rect rcTemp = rect;
-	CPDF_Matrix mt = GetWindowMatrix();
-	mt.TransformRect(rcTemp);
-	return FX_RECT((int32_t)(rcTemp.left+0.5), (int32_t)(rcTemp.bottom+0.5), (int32_t)(rcTemp.right+0.5), (int32_t)(rcTemp.top+0.5));
+    CPDF_Rect rcTemp = rect;
+    CPDF_Matrix mt = GetWindowMatrix();
+    mt.TransformRect(rcTemp);
+    return FX_RECT((int32_t)(rcTemp.left+0.5), (int32_t)(rcTemp.bottom+0.5), (int32_t)(rcTemp.right+0.5), (int32_t)(rcTemp.top+0.5));
 }
 
 FX_HWND CPWL_Wnd::GetAttachedHWnd() const
 {
-	return m_sPrivateParam.hAttachedWnd;
+    return m_sPrivateParam.hAttachedWnd;
 }
 
 CPDF_Point CPWL_Wnd::ChildToParent(const CPDF_Point& point) const
 {
-	CPDF_Matrix mt = GetChildMatrix();
-	if (mt.IsIdentity())
-		return point;
-	else
-	{
-		CPDF_Point pt = point;
-		mt.Transform(pt.x,pt.y);
-		return pt;
-	}
+    CPDF_Matrix mt = GetChildMatrix();
+    if (mt.IsIdentity())
+        return point;
+
+    CPDF_Point pt = point;
+    mt.Transform(pt.x,pt.y);
+    return pt;
 }
 
 CPDF_Rect CPWL_Wnd::ChildToParent(const CPDF_Rect& rect) const
 {
-	CPDF_Matrix mt = GetChildMatrix();
-	if (mt.IsIdentity())
-		return rect;
-	else
-	{
-		CPDF_Rect rc = rect;
-		mt.TransformRect(rc);
-		return rc;
-	}
+    CPDF_Matrix mt = GetChildMatrix();
+    if (mt.IsIdentity())
+        return rect;
+
+    CPDF_Rect rc = rect;
+    mt.TransformRect(rc);
+    return rc;
 }
 
 CPDF_Point CPWL_Wnd::ParentToChild(const CPDF_Point& point) const
 {
-	CPDF_Matrix mt = GetChildMatrix();
-	if (mt.IsIdentity())
-		return point;
-	else
-	{
-		mt.SetReverse(mt);
-		CPDF_Point pt = point;
-		mt.Transform(pt.x,pt.y);
-		return pt;
-	}
+    CPDF_Matrix mt = GetChildMatrix();
+    if (mt.IsIdentity())
+        return point;
+
+    mt.SetReverse(mt);
+    CPDF_Point pt = point;
+    mt.Transform(pt.x,pt.y);
+    return pt;
 }
 
 CPDF_Rect CPWL_Wnd::ParentToChild(const CPDF_Rect& rect) const
 {
-	CPDF_Matrix mt = GetChildMatrix();
-	if (mt.IsIdentity())
-		return rect;
-	else
-	{
-		mt.SetReverse(mt);
-		CPDF_Rect rc = rect;
-		mt.TransformRect(rc);
-		return rc;
-	}
+    CPDF_Matrix mt = GetChildMatrix();
+    if (mt.IsIdentity())
+        return rect;
+
+    mt.SetReverse(mt);
+    CPDF_Rect rc = rect;
+    mt.TransformRect(rc);
+    return rc;
 }
 
 CPDF_Matrix CPWL_Wnd::GetChildToRoot() const
 {
-	CPDF_Matrix mt(1,0,0,1,0,0);
-
-	if (HasFlag(PWS_CHILD))
-	{
-		const CPWL_Wnd* pParent = this;
-		while (pParent)
-		{
-			mt.Concat(pParent->GetChildMatrix());
-			pParent = pParent->GetParentWindow();
-		}
-	}
-
-	return mt;
+    CPDF_Matrix mt(1, 0, 0, 1, 0, 0);
+    if (HasFlag(PWS_CHILD))
+    {
+        const CPWL_Wnd* pParent = this;
+        while (pParent)
+        {
+            mt.Concat(pParent->GetChildMatrix());
+            pParent = pParent->GetParentWindow();
+        }
+    }
+    return mt;
 }
 
 CPDF_Matrix CPWL_Wnd::GetChildMatrix() const
 {
-	if (HasFlag(PWS_CHILD))
-		return m_sPrivateParam.mtChild;
+    if (HasFlag(PWS_CHILD))
+        return m_sPrivateParam.mtChild;
 
-	return CPDF_Matrix(1,0,0,1,0,0);
+    return CPDF_Matrix(1,0,0,1,0,0);
 }
 
 void CPWL_Wnd::SetChildMatrix(const CPDF_Matrix& mt)
 {
-	m_sPrivateParam.mtChild = mt;
+    m_sPrivateParam.mtChild = mt;
 }
 
-const CPWL_Wnd*	CPWL_Wnd::GetFocused() const
+const CPWL_Wnd* CPWL_Wnd::GetFocused() const
 {
-	if (CPWL_MsgControl * pMsgCtrl = GetMsgControl())
-	{
-		return pMsgCtrl->m_pMainKeyboardWnd;
-	}
+    if (CPWL_MsgControl * pMsgCtrl = GetMsgControl())
+    {
+        return pMsgCtrl->m_pMainKeyboardWnd;
+    }
 
-	return NULL;
+    return NULL;
 }
 
 void CPWL_Wnd::EnableWindow(FX_BOOL bEnable)
 {
-	if (m_bEnabled != bEnable)
-	{
-		for (int32_t i=0,sz=m_aChildren.GetSize(); i<sz; i++)
-		{
-			if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
-			{
-				pChild->EnableWindow(bEnable);
-			}
-		}
+    if (m_bEnabled != bEnable)
+    {
+        for (int32_t i=0,sz=m_aChildren.GetSize(); i<sz; i++)
+        {
+            if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
+            {
+                pChild->EnableWindow(bEnable);
+            }
+        }
 
-		m_bEnabled = bEnable;
+        m_bEnabled = bEnable;
 
-		if (bEnable)
-			OnEnabled();
-		else
-			OnDisabled();
-	}
+        if (bEnable)
+            OnEnabled();
+        else
+            OnDisabled();
+    }
 }
 
 FX_BOOL CPWL_Wnd::IsEnabled()
 {
-	return m_bEnabled;
+    return m_bEnabled;
 }
 
 void CPWL_Wnd::OnEnabled()
@@ -1270,41 +1254,40 @@
 
 FX_BOOL CPWL_Wnd::IsCTRLpressed(FX_DWORD nFlag) const
 {
-	if (IFX_SystemHandler* pSystemHandler = GetSystemHandler())
-	{
-		return pSystemHandler->IsCTRLKeyDown(nFlag);
-	}
+    if (IFX_SystemHandler* pSystemHandler = GetSystemHandler())
+    {
+        return pSystemHandler->IsCTRLKeyDown(nFlag);
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
-FX_BOOL	CPWL_Wnd::IsSHIFTpressed(FX_DWORD nFlag) const
+FX_BOOL CPWL_Wnd::IsSHIFTpressed(FX_DWORD nFlag) const
 {
-	if (IFX_SystemHandler* pSystemHandler = GetSystemHandler())
-	{
-		return pSystemHandler->IsSHIFTKeyDown(nFlag);
-	}
+    if (IFX_SystemHandler* pSystemHandler = GetSystemHandler())
+    {
+        return pSystemHandler->IsSHIFTKeyDown(nFlag);
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
-FX_BOOL	CPWL_Wnd::IsALTpressed(FX_DWORD nFlag) const
+FX_BOOL CPWL_Wnd::IsALTpressed(FX_DWORD nFlag) const
 {
-	if (IFX_SystemHandler* pSystemHandler = GetSystemHandler())
-	{
-		return pSystemHandler->IsALTKeyDown(nFlag);
-	}
+    if (IFX_SystemHandler* pSystemHandler = GetSystemHandler())
+    {
+        return pSystemHandler->IsALTKeyDown(nFlag);
+    }
 
-	return FALSE;
+    return FALSE;
 }
 
-FX_BOOL	CPWL_Wnd::IsINSERTpressed(FX_DWORD nFlag) const
+FX_BOOL CPWL_Wnd::IsINSERTpressed(FX_DWORD nFlag) const
 {
-	if (IFX_SystemHandler* pSystemHandler = GetSystemHandler())
-	{
-		return pSystemHandler->IsINSERTKeyDown(nFlag);
-	}
+    if (IFX_SystemHandler* pSystemHandler = GetSystemHandler())
+    {
+        return pSystemHandler->IsINSERTKeyDown(nFlag);
+    }
 
-	return FALSE;
+    return FALSE;
 }
-
