/*-----------------------------------------------------------------------------------------------------
NSIS Installer script for OpenCPN (Windows)
NSIS version 2.46
Written by Gunther Pilz (Netsurfer) netsurfer@opencpn.de
-------------------------------------------------------------------------------------------------------
CMake variables
	CPACK_PACKAGE_NAME "OpenCPN"
	CPACK_NSIS_PACKAGE_NAME_LC "opencpn"
	CPACK_PACKAGE_VENDOR "opencpn.org"
	CPACK_PACKAGE_VERSION_MAJOR ${VERSION_MAJOR}
	CPACK_PACKAGE_VERSION_MINOR ${VERSION_MINOR}
	CPACK_PACKAGE_VERSION_PATCH ${VERSION_PATCH}
	CPACK_PACKAGE_VERSION ${PACKAGE_VERSION}
	CPACK_NSIS_INSTALLED_ICON_NAME "opencpn.exe"
	CPACK_PACKAGE_ICON "${PROJECT_SOURCE_DIR}/src/bitmaps\\\\opencpn.ico"
	CPACK_NSIS_EXTRA_INSTALL_COMMANDS ${CPACK_NSIS_EXTRA_INSTALL_COMMANDS}
	CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/data/license.txt"
	CPACK_BUILDWIN_DIR "${PROJECT_SOURCE_DIR}/buildwin"
	CPACK_NSIS_DIR "${PROJECT_SOURCE_DIR}/buildwin/NSIS_Unicode")

	#CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_CURRENT_BINARY_DIR};${PACKAGE_NAME};ALL;/"
	#CPACK_PACKAGE_EXECUTABLES ${PACKAGE_NAME} "OpenCPN"
	#CPACK_PACKAGE_INSTALL_DIRECTORY ${PACKAGE_NAME} "OpenCPN"
	#CPACK_PACKAGE_DESCRIPTION_SUMMARY "OpenCPN ${PACKAGE_VERSION}"
	#CPACK_NSIS_LINK_NAME "${CPACK_PACKAGE_NAME} ${PACKAGE_VERSION}"
	#CPACK_NSIS_DISPLAY_NAME "${CPACK_PACKAGE_NAME} Version ${PACKAGE_VERSION}"
	#CPACK_NSIS_HELP_LINK "http:\\\\\\\\www.opencpn.org"
	#CPACK_NSIS_URL_INFO_ABOUT "http:\\\\\\\\www.opencpn.org"
	#CPACK_NSIS_CONTACT "http:\\\\\\\\www.opencpn.org"
	#CPACK_PACKAGE_FILE_NAME "${PACKAGE_NAME}_${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}_setup"

----------------------------------------------------------------------------------------------------------*/
;# Set compression
	SetCompressor /FINAL lzma

;--------------------------------
;# You must define these values
	!define OCPN_INSTALLER_VERSION "1.0.0"
	/*
	!define CPACK_NSIS_INSTALLED_ICON_NAME "opencpn.exe"
	!define CPACK_NSIS_PACKAGE_NAME_LC "opencpn"
	!define CPACK_NSIS_DISPLAY_NAME "${CPACK_PACKAGE_NAME} ${PACKAGE_VERSION}"
	!define CPACK_PACKAGE_ICON "${PROJECT_SOURCE_DIR}/src/bitmaps/opencpn.ico"
	!define CPACK_BUILDWIN_DIR "${PROJECT_SOURCE_DIR}/buildwin"
	!define CPACK_NSIS_DIR "${PROJECT_SOURCE_DIR}/buildwin/NSIS_Unicode"
	*/
	!define /date YEAR "%Y"
	!define OUTPUT_FILE_NAME "@CPACK_NSIS_PACKAGE_NAME_LC@_@CPACK_PACKAGE_VERSION@_setup.exe"
	!define INST_DIR "@CPACK_TEMPORARY_DIRECTORY@"
	!define REG_ROOT_KEY "Software"
	!define REG_KEY "Software\s63_pi"
	!define REG_ROOT_KEY_UN "Software\Microsoft\Windows\CurrentVersion\Uninstall"
	!define REG_KEY_UN "Software\Microsoft\Windows\CurrentVersion\Uninstall\s63_pi @CPACK_PACKAGE_VERSION@"
	!define CSIDL_LOCAL_APPDATA "0x1C"
	!define Explode "!insertmacro Explode"
	!define unExplode "!insertmacro unExplode"


;--------------------------------
;# Variables
	Var INST_USER_SID
	Var CONFIG_EXISTS
	Var CONFIG_EMPTY
	Var INI_EXISTS
	Var CHARTDB_EXISTS
	Var SENC_EXISTS
	Var CM93_EXISTS
	Var NAVOBJ_EXISTS
	Var LOG_EXISTS
	Var REG_LANG
	Var Count_SecGrpResetConfig
	Var SecGrpEndSetConfig_Text
	Var RESET_CONFIG
	Var STARTMENU_FOLDER
	Var OLD_INSTALLS
	Var Prev_Install_RegKey
	Var MULTIPLE_INSTALLS
	Var VERSION_EXISTS
	Var VERSION_NEWER
	Var VERSION_OLDER
	Var CANCEL_INSTALLER
	Var VERSION_DATE
	Var LANG_NAME
	Var Status_SecGrpSetConfig
	Var MAJOR_D
	Var MINOR_D
	Var PATCH_D
	Var PATCH_ND
	Var LM_VERSION
	Var LM_VERSION_INST
	Var LM_VERSION_UNINST
	Var latest_version
	Var latest_pathexe
	Var BU_X
	Var BU_Y
	Var UAT
	Var OUAT
	Var USERS_APPDATA
	Var ADMIN_APPDATA
	Var USERS_NAME
	Var counter_tmp
	Var CurrentDirVar
	Var CurrentFileVar
	Var CONTEXT
	Var REG_CHARTDIRS
	Var USERNAME
	Var IS_ADMIN
	Var Compare_Version_Result
	Var Inst_Or_Uninst
	Var Marquee_Handle
	Var Banner_Text_Blink
	Var error_tmp
# onSelChange
	Var ConfigSetLang
	Var ConfigSetChartDir
	Var SetConfig
# Installer Pages
	Var Skip_Page_CleanUp
	Var Skip_Page_TypeInst
	Var Skip_Page_SetConfig
	Var Skip_Page_Directory
	Var Skip_Page_Startmenu
	Var Skip_Page_Confirm
# Page_TypeInst
	Var Label_TypeInst_Reinstall
	Var RB_Reinstall
	Var Label_TypeInst_Upgrade
	Var RB_Upgrade
	Var Label_TypeInst_Downgrade
	Var RB_Downgrade
	Var Label_TypeInst_Parallel
	Var GroupBox_TypeInst
	Var RB_Parallel
	Var TI_REINSTALL
	Var TI_UPGRADE
	Var TI_DOWNGRADE
	Var TI_PARALLEL
	Var GroupBox_Size
	Var INSTALL_TYPE
# Page_SetConfig
	Var Label_SetConfig
	Var GroupBox_Language_SetConfig
	Var CheckBox_Language_SetConfig
	Var GroupBox_ChartDir_SetConfig
	Var DirRequest_SetConfig
	Var Button_Delete_SetConfig
	Var Button_DeleteAll_SetConfig
	Var Button_Add_SetConfig
	Var ListBox_SetConfig
;# Page_SetConfig_Leave
	Var CHART_DIR_TMP_FILE
	Var CHART_DIR_EMPTY
	Var CONFIG_SET_LANG

# Uninstaller Pages
	Var Skip_UnPage_Components
;--------------------------------
;# Execution Level
	RequestExecutionLevel highest

;--------------------------------
;# Includes
	!addincludedir "@CPACK_NSIS_DIR@/Include"
	!addplugindir "@CPACK_NSIS_DIR@/Plugins"

	!include MUI2.nsh
	!include LogicLib.nsh
	!include nsDialogs.nsh
	!include Sections.nsh
	!include StrFunc.nsh
	!include WordFunc.nsh
	!include TextFunc.nsh
	!include FileFunc.nsh
	!include WinVer.nsh

	!include UAC.nsh

	!define MUI_UI "@CPACK_NSIS_DIR@/UI/opencpn_ui.exe"

;--------------------------------
;# General
  ;# Name and file
  Name "@CPACK_NSIS_PACKAGE_NAME@"
  OutFile "@CPACK_TOPLEVEL_DIRECTORY@/${OUTPUT_FILE_NAME}"

  ;# Default installation folder
  InstallDir "$PROGRAMFILES\s63_pi"

  BrandingText /TRIMLEFT "s63_pi $(Installer) v${OCPN_INSTALLER_VERSION}"
;--------------------------------
;# Interface Settings
  !define MUI_CUSTOMFUNCTION_GUIINIT myGuiInit
  !define MUI_CUSTOMFUNCTION_UNGUIINIT un.myGuiInit

  !define MUI_ABORTWARNING

  ;# MUI Settings / Header
	!define MUI_ICON "@CPACK_PACKAGE_ICON@"
    !define MUI_HEADERIMAGE
    !define MUI_HEADERIMAGE_LEFT
    !define MUI_HEADERIMAGE_BITMAP "@CPACK_NSIS_DIR@\Bitmaps\header-install.bmp"
    !define MUI_HEADERIMAGE_UNBITMAP "@CPACK_NSIS_DIR@\Bitmaps\header-uninstall.bmp"

  ;# MUI Settings / Wizard
    !define MUI_WELCOMEFINISHPAGE_BITMAP "@CPACK_NSIS_DIR@\Bitmaps\wizard-install.bmp"
    !define MUI_UNWELCOMEFINISHPAGE_BITMAP "@CPACK_NSIS_DIR@\Bitmaps\wizard-uninstall.bmp"

  ;# Set Multi-Language settings
	;# Language Selection Dialog Settings
	;# Show all languages, despite user's codepage
	!define MUI_LANGDLL_ALLLANGUAGES
/*
	;# Remember the installer language
	!define MUI_LANGDLL_REGISTRY_ROOT "HKLM"
	!define MUI_LANGDLL_REGISTRY_KEY "${REG_KEY_UN}"
	!define MUI_LANGDLL_REGISTRY_VALUENAME "SetupLanguage"
	!define MUI_LANGDLL_WINDOWTITLE "$(LangDialog_Title)"
	!define MUI_LANGDLL_INFO "$(LangDialog_Text)"
	*/
;--------------------------------
;# Calls for making respective functions available
	${StrLoc}

;--------------------------------
;##################################################################################################
;#                                             Macros                                             #
;##################################################################################################

!ifndef ___EnumHKU___
	!define ___EnumHKU___

	!include LogicLib.nsh
	!include WordFunc.nsh

	!define TOKEN_QUERY             0x0008
	!define TOKEN_ADJUST_PRIVILEGES 0x0020

	!define SE_RESTORE_NAME         SeRestorePrivilege

	!define SE_PRIVILEGE_ENABLED    0x00000002

	!define HKEY_USERS              0x80000003

	Var key
	Var logged
	Var EnumHKU_counter
	Var SID
	Var USERPROFILE

	!macro _EnumHKU_AdjustTokens
		StrCpy $R1 0

		System::Call "kernel32::GetCurrentProcess() i .R0"
		System::Call "advapi32::OpenProcessToken(i R0, i ${TOKEN_QUERY}|${TOKEN_ADJUST_PRIVILEGES}, *i R1R1) i .R0"

		${If} $R0 != 0
		  System::Call "advapi32::LookupPrivilegeValue(t n, t '${SE_RESTORE_NAME}', *l .R2) i .R0"

		  ${If} $R0 != 0
			System::Call "*(i 1, l R2, i ${SE_PRIVILEGE_ENABLED}) i .R0"
			System::Call "advapi32::AdjustTokenPrivileges(i R1, i 0, i R0, i 0, i 0, i 0)"
			System::Free $R0
		  ${EndIf}

		  System::Call "kernel32::CloseHandle(i R1)"
		${EndIf}
	!macroend

	!macro _EnumHKU_InvokeCallback CALLBACK SUBKEY
		Push $0
		Push $1
		Push $R0
		Push $R1
		Push $R2
		Push $R3
		Push $R4
		Push $R5
		Push $R6

		Push "${SUBKEY}"
		Call "${CALLBACK}"

		Pop $R6
		Pop $R5
		Pop $R4
		Pop $R3
		Pop $R2
		Pop $R1
		Pop $R0
		Pop $1
		Pop $0
	!macroend

	!macro _EnumHKU_Load FILE CALLBACK SUBKEY
		GetFullPathName /SHORT $R2 ${FILE}
		System::Call "advapi32::RegLoadKeyW(i ${HKEY_USERS}, t '${SUBKEY}', t R2) i .R3"
		${If} $R3 == 0
		  !insertmacro _EnumHKU_InvokeCallback ${CALLBACK} "${SUBKEY}"
		  ;System::Call "advapi32::RegUnLoadKeyW(i ${HKEY_USERS}, t '${SUBKEY}')"
		  IntOp $EnumHKU_counter $EnumHKU_counter + 1
		${EndIf}
	!macroend

	!macro EnumHKU UN CALLBACK SUBKEY
		Push $0
		Push $1
		StrCpy $EnumHKU_counter 0
		GetFunctionAddress $0 "${CALLBACK}"
		StrCpy $1 "${SUBKEY}_$EnumHKU_counter"
		StrCpy $key ${SUBKEY}
		Call ${UN}_EnumHKU
		Pop $1
		Pop $0
	!macroend

	!define EnumHKU '!insertmacro EnumHKU ""'
	!define un.EnumHKU '!insertmacro EnumHKU "un."'

	!macro _EnumHKU UN
		Function ${UN}_EnumHKU
			Push $R0
			Push $R1
			Push $R2
			Push $R3
			Push $R4
			Push $R5
			Push $R6

			# enumerate logged on users
			StrCpy $R0 0
			${Do}
			  EnumRegKey $R1 HKU "" $R0
			  ${If} $R1 != ""
				StrLen $R4 $R1
				${If} $R4 > 8
					StrCpy $R6 0
					${WordFind} "$R1" "_Classes" "E*" $R6
					IfErrors 0 cont

					ReadRegStr $R5 HKU "$R1\Volatile Environment" USERPROFILE
					ExpandEnvStrings $R5 $R5
					StrCpy $USERPROFILE $R5
					StrCpy $logged "on"
					!insertmacro _EnumHKU_InvokeCallback $0 $R1
					StrCpy $USERPROFILE ""
					StrCpy $logged ""
				${EndIf}
				cont:
				IntOp $R0 $R0 + 1
			  ${EndIf}
			${LoopUntil} $R1 == ""

			# enumerate logged off users
			System::Call "kernel32::GetVersion() i .R0"
			IntOp $R0 $R0 & 0x80000000
			${If} $R0 == 0
				# nt
				!insertmacro _EnumHKU_AdjustTokens
				StrCpy $R0 0
				${Do}
					EnumRegKey $R1 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" $R0
					${If} $R1 != ""
						StrLen $R4 $R1
						${If} $R4 > 8
							ClearErrors
							ReadRegStr $R5 HKU "$R1\Volatile Environment" HOMEPATH
							IfErrors 0 cont1
							ReadRegStr $R5 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\$R1" ProfileImagePath
							ExpandEnvStrings $R5 $R5
							StrCpy $USERPROFILE $R5
							StrCpy $logged "off"
							!insertmacro _EnumHKU_Load "$R5\NTUSER.DAT" $0 $1
							StrCpy $1 "$key_$EnumHKU_counter"
							StrCpy $USERPROFILE ""
							StrCpy $logged ""
						${EndIf}

						cont1:
						IntOp $R0 $R0 + 1
					${EndIf}
				${LoopUntil} $R1 == ""
			${Else}
				# 9x
				ClearErrors
				FindFirst $R1 $R2 "$WINDIR\Profiles\*.*"
				${Unless} ${Errors}
					${Do}
						${If} $R2 != "."
						${AndIf} $R2 != ".."
							${If} ${FileExists} "$WINDIR\Profiles\$R2\USER.DAT"
								!insertmacro _EnumHKU_Load "$WINDIR\Profiles\$R2\USER.DAT" $0 $1
							${EndIf}
						${EndIf}
						ClearErrors
						FindNext $R1 $R2
					${LoopUntil} ${Errors}
					FindClose $R1
				${EndUnless}
			${Endif}

			Pop $R6
			Pop $R5
			Pop $R4
			Pop $R3
			Pop $R2
			Pop $R1
			Pop $R0
		FunctionEnd
	!macroend

	!insertmacro _EnumHKU ""
	!insertmacro _EnumHKU "un."
!endif

!macro IndexOf Var Str Char
	Push "${Char}"
	Push "${Str}"
	Call IndexOf
	Pop "${Var}"
!macroend
!define IndexOf "!insertmacro IndexOf"

!macro RIndexOf Var Str Char
	Push "${Char}"
	Push "${Str}"
	Call RIndexOf
	Pop "${Var}"
!macroend
!define RIndexOf "!insertmacro RIndexOf"


!macro  Explode Length  Separator   String
    Push    `${Separator}`
    Push    `${String}`
    Call    Explode
    Pop     `${Length}`
!macroend

!macro  unExplode Length  Separator   String
    Push    `${Separator}`
    Push    `${String}`
    Call    un.Explode
    Pop     `${Length}`
!macroend

!ifndef _RecFind_Included
	!define _RecFind_Included

	Var _RecFindVar1
	Var _RecFindVar2

	!macro _RecFindOpen Dir CurrentDirVar CurrentFileVar
		!define _Local          `${__LINE__}`
		!define _Dir            `${Dir}`
		!define _CurrentDirVar  `${CurrentDirVar}`
		!define _CurrentFileVar `${CurrentFileVar}`

		!define _RecFindOpenSet

		StrCpy $_RecFindVar2 1
		Push ``

		`nextDir${_Local}:`
		Pop `${_CurrentDirVar}`
		IntOp $_RecFindVar2 $_RecFindVar2 - 1
	!macroend
	!define RecFindOpen `!insertmacro _RecFindOpen`

	!macro _RecFindFirst
		!ifndef _RecFindOpenSet
			!error `Incorrect use of RecFind commands!`
		!else
			!define _RecFindFirstSet
		!endif

		ClearErrors
		FindFirst $_RecFindVar1 `${_CurrentFileVar}` `${_Dir}${_CurrentDirVar}\*.*`
		IfErrors `Done${_Local}`

		`checkFile${_Local}:`
		StrCmp ${_CurrentFileVar} .  `nextFile${_Local}`
		StrCmp ${_CurrentFileVar} .. `nextFile${_Local}`

		IfFileExists `${_Dir}${_CurrentDirVar}\${_CurrentFileVar}\*.*` 0 +4
		Push `${_CurrentDirVar}\${_CurrentFileVar}`
		IntOp $_RecFindVar2 $_RecFindVar2 + 1
		Goto `nextFile${_Local}`
	!macroend
	!define RecFindFirst `!insertmacro _RecFindFirst`

	!macro _RecFindNext
		!ifndef _RecFindOpenSet | _RecFindFirstSet
			!error `Incorrect use of RecFind commands!`
		!else
			!define _RecFindNextSet
		!endif

		`nextFile${_Local}:`

		ClearErrors
		FindNext $_RecFindVar1 `${_CurrentFileVar}`
		IfErrors 0 `checkFile${_Local}`

		StrCmp $_RecFindVar2 0 +3
		FindClose $_RecFindVar1
		Goto `nextDir${_Local}`
	!macroend
	!define RecFindNext `!insertmacro _RecFindNext`

	!macro _RecFindClose
		!ifndef _RecFindOpenSet | _RecFindFirstSet | _RecFindNextSet
			!error `Incorrect use of RecFind commands!`
		!else
			!undef _RecFindOpenSet
			!undef _RecFindFirstSet
			!undef _RecFindNextSet
		!endif

		`Done${_Local}:`
		FindClose $_RecFindVar1

		StrCmp $_RecFindVar2 0 +4
		Pop $_RecFindVar1
		IntOp $_RecFindVar2 $_RecFindVar2 - 1
		Goto -3

		!undef _CurrentFileVar
		!undef _CurrentDirVar
		!undef _Dir
		!undef _Local
	!macroend
	!define RecFindClose `!insertmacro _RecFindClose`
!endif

;--------------------------------------------------------------------------------------------------
;##################################################################################################
;#                                            FUNCTIONS                                           #
;##################################################################################################

; StrContains
; This function does a case sensitive searches for an occurrence of a substring in a string.
; It returns the substring if it is found.
; Otherwise it returns null("").
; Written by kenglish_hi
; Adapted from StrReplace written by dandaman32


Var STR_HAYSTACK
Var STR_NEEDLE
Var STR_CONTAINS_VAR_1
Var STR_CONTAINS_VAR_2
Var STR_CONTAINS_VAR_3
Var STR_CONTAINS_VAR_4
Var STR_RETURN_VAR

Function StrContains
  Exch $STR_NEEDLE
  Exch 1
  Exch $STR_HAYSTACK
  ; Uncomment to debug
  ;MessageBox MB_OK 'STR_NEEDLE = $STR_NEEDLE STR_HAYSTACK = $STR_HAYSTACK '
    StrCpy $STR_RETURN_VAR ""
    StrCpy $STR_CONTAINS_VAR_1 -1
    StrLen $STR_CONTAINS_VAR_2 $STR_NEEDLE
    StrLen $STR_CONTAINS_VAR_4 $STR_HAYSTACK
    loop:
      IntOp $STR_CONTAINS_VAR_1 $STR_CONTAINS_VAR_1 + 1
      StrCpy $STR_CONTAINS_VAR_3 $STR_HAYSTACK $STR_CONTAINS_VAR_2 $STR_CONTAINS_VAR_1
      StrCmp $STR_CONTAINS_VAR_3 $STR_NEEDLE found
      StrCmp $STR_CONTAINS_VAR_1 $STR_CONTAINS_VAR_4 done
      Goto loop
    found:
      StrCpy $STR_RETURN_VAR $STR_NEEDLE
      Goto done
    done:
   Pop $STR_NEEDLE ;Prevent "invalid opcode" errors and keep the
   Exch $STR_RETURN_VAR
FunctionEnd

!macro _StrContainsConstructor OUT NEEDLE HAYSTACK
  Push `${HAYSTACK}`
  Push `${NEEDLE}`
  Call StrContains
  Pop `${OUT}`
!macroend

!define StrContains '!insertmacro "_StrContainsConstructor"'






;--------------------------------------------------------------------------------------------------
;##################################################################################################
;#                                            PAGES                                               #
;##################################################################################################
;#                                       Installer Pages                                          #
;##################################################################################################
/*  Var Skip_Page_CleanUp
	Var Skip_Page_TypeInst
	Var Skip_Page_SetConfig
	Var Skip_Page_Directory
	Var Skip_Page_Startmenu
	Var Skip_Page_Confirm
*/
	;# Welcome page
	!define MUI_WELCOMEPAGE_TITLE_3LINES
	!insertmacro MUI_PAGE_WELCOME

	;# License page
	!define MUI_PAGE_CUSTOMFUNCTION_LEAVE Page_License_Leave
	;!insertmacro MUI_PAGE_LICENSE "@CPACK_RESOURCE_FILE_LICENSE@"

        !define MUI_LICENSEPAGE_BUTTON "$(^NextBtn)"
        !define MUI_LICENSEPAGE_TEXT_BOTTOM $(License_Message)

	!insertmacro MUI_PAGE_LICENSE $(license)

/*
	;# Clean up page - only shown if previous installation(s) <= 2.2.823 were found - checked in .onInit function
;	Page custom Page_CleanUp Page_CleanUp_Leave
*/
	;# Install type page - only shown if previous installation(s) > 2.2.823 were found - checked in .onInit function
	Page custom Page_TypeInst Page_TypeInst_Leave

/*
	;# Components page
	!define MUI_COMPONENTSPAGE_SMALLDESC
	!define MUI_PAGE_HEADER_TEXT $(CP_HEADER_TEXT)
	!define MUI_PAGE_HEADER_SUBTEXT $(CP_HEADER_SUBTEXT)
	!define MUI_COMPONENTSPAGE_TEXT_TOP $(CP_TOP)
	!define MUI_COMPONENTSPAGE_TEXT_COMPLIST $(CP_COMPLIST)
	!define MUI_COMPONENTSPAGE_TEXT_INSTTYPE "" ;#CHANGE $(CP_INSTTYPE)
	;!define MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE $(CP_DESCRIPTION_TITLE) ;# for this we can use the default text
	;!define MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO $(CP_DESCRIPTION_INFO) ;# for this we can use the default text
	!define MUI_PAGE_CUSTOMFUNCTION_PRE Page_Components_Pre
	!define MUI_PAGE_CUSTOMFUNCTION_SHOW Page_Components_Show
	!define MUI_PAGE_CUSTOMFUNCTION_LEAVE Page_Components_Leave
	!insertmacro MUI_PAGE_COMPONENTS
*/
	;# Directory page - allows for changing/ selecting the install directory
	!define MUI_DIRECTORYPAGE_VERIFYONLEAVE
	!define MUI_PAGE_CUSTOMFUNCTION_PRE Page_Directory_Pre
	!define MUI_PAGE_CUSTOMFUNCTION_LEAVE Page_Directory_Leave
	!insertmacro MUI_PAGE_DIRECTORY

/*
	;# Start Menu Folder page - allows for changing/ selecting the Start Menu Folder (if Shortcuts get installed is configured on the Components page)
	!define MUI_STARTMENUPAGE_NODISABLE
	!define MUI_STARTMENUPAGE_REGISTRY_ROOT "SHCTX"
	!define MUI_STARTMENUPAGE_REGISTRY_KEY "${REG_KEY_UN}"
	!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "StartMenuFolder"
	!define MUI_STARTMENUPAGE_DEFAULTFOLDER "OpenCPN"
	!define MUI_PAGE_CUSTOMFUNCTION_PRE Page_Startmenu_Pre
	!insertmacro MUI_PAGE_STARTMENU "Application" $STARTMENU_FOLDER

	;# Set Config page - selecting chart director[y|ies] and setting the language in opencpn.ini - only available if opencpn.ini does not exist (or is being deleted)
	Page custom Page_SetConfig Page_SetConfig_Leave
*/
	;# Confirm page - shows all settings for the installation (is mainly needed to always have the 'Install' button on the right page, ie. if Start Menu page is skipped)
	Page custom Page_Confirm

	;# Install page
	!define MUI_PAGE_CUSTOMFUNCTION_SHOW Page_Instfiles_Show
	!insertmacro MUI_PAGE_INSTFILES

	;# Finish page

	#!define MUI_FINISHPAGE_RUN opencpn.exe
#	!define MUI_FINISHPAGE_RUN
#	!define MUI_FINISHPAGE_RUN_FUNCTION ExecAppFile

	!define MUI_FINISHPAGE_SHOWREADME install.log
	!define MUI_FINISHPAGE_SHOWREADME_TEXT $(Show_Readme_Text)
	!define MUI_FINISHPAGE_SHOWREADME_NOTCHECKED
	!define MUI_FINISHPAGE_LINK $(Finish_Link_Text)
	!define MUI_FINISHPAGE_LINK_LOCATION $(Finish_Link_URL)
	!define MUI_FINISHPAGE_LINK_COLOR 000080
	!define MUI_FINISHPAGE_NOREBOOTSUPPORT
	!define MUI_FINISHPAGE_TITLE_3LINES
	!insertmacro MUI_PAGE_FINISH

;--------------------------------
;##################################################################################################
;#                                     Uninstaller Pages                                          #
;##################################################################################################
	;# Welcome page
	!define MUI_WELCOMEPAGE_TITLE_3LINES
	!insertmacro MUI_UNPAGE_WELCOME

/*
	;# Components page
	!define MUI_PAGE_CUSTOMFUNCTION_PRE un.Page_Components_Pre
	!insertmacro MUI_UNPAGE_COMPONENTS
*/
	;# Confirm page
	!insertmacro MUI_UNPAGE_CONFIRM
	;# Uninstall page
	!insertmacro MUI_UNPAGE_INSTFILES

	;# Finish page
	!define MUI_FINISHPAGE_TITLE_3LINES
	!insertmacro MUI_UNPAGE_FINISH

;--------------------------------------------------------------------------------------------------
;##################################################################################################
;#                                        Languages                                               #
;##################################################################################################
;# Languages
	!insertmacro MUI_LANGUAGE "English" ;# first language is the default language
	!insertmacro MUI_LANGUAGE "German"
	!include /NONFATAL "Langstrings_GERMAN.nsh"
	!insertmacro MUI_LANGUAGE "French"
	!include /NONFATAL "Langstrings_FRENCH.nsh"
	!insertmacro MUI_LANGUAGE "Czech"
	!include /NONFATAL "Langstrings_CZECH.nsh"
	!insertmacro MUI_LANGUAGE "Danish"
	!include /NONFATAL "Langstrings_DANISH.nsh"
	!insertmacro MUI_LANGUAGE "Spanish"
	!include /NONFATAL "Langstrings_SPANISH.nsh"
	!insertmacro MUI_LANGUAGE "Italian"
	!include /NONFATAL "Langstrings_ITALIAN.nsh"
	!insertmacro MUI_LANGUAGE "Dutch"
	!include /NONFATAL "Langstrings_DUTCH.nsh"
	!insertmacro MUI_LANGUAGE "Polish"
	!include /NONFATAL "Langstrings_POLISH.nsh"
	!insertmacro MUI_LANGUAGE "PortugueseBR"
	!include /NONFATAL "Langstrings_PORTUGUESEBR.nsh"
	!insertmacro MUI_LANGUAGE "Portuguese"
	!include /NONFATAL "Langstrings_PORTUGUESE.nsh"
	!insertmacro MUI_LANGUAGE "Russian"
	!include /NONFATAL "Langstrings_RUSSIAN.nsh"
	!insertmacro MUI_LANGUAGE "Swedish"
	!include /NONFATAL "Langstrings_SWEDISH.nsh"
	!insertmacro MUI_LANGUAGE "Finnish"
	!include /NONFATAL "Langstrings_FINNISH.nsh"
	!insertmacro MUI_LANGUAGE "Norwegian"
	!include /NONFATAL "Langstrings_NORWEGIAN.nsh"
	!insertmacro MUI_LANGUAGE "TradChinese"
	!include /NONFATAL "Langstrings_CHINESETW.nsh"
	!insertmacro MUI_LANGUAGE "Turkish"
	!include /NONFATAL "Langstrings_TURKISH.nsh"
	;!insertmacro MUI_LANGUAGE "Hungarian"
	;!include /NONFATAL "Langstrings_HUNGARIAN.nsh"

;--------------------------------
;# Reserve Files
	;# If you are using solid compression, files that are required before
	;# the actual installation should be stored first in the data block,
	;# because this will make your installer start faster.
	!insertmacro MUI_RESERVEFILE_LANGDLL

;# Remember the installer language
	!define MUI_LANGDLL_REGISTRY_ROOT "HKLM"
	!define MUI_LANGDLL_REGISTRY_KEY "${REG_KEY_UN}"
	!define MUI_LANGDLL_REGISTRY_VALUENAME "SetupLanguage"
	!define MUI_LANGDLL_WINDOWTITLE $(LangDialog_Title)
	!define MUI_LANGDLL_INFO $(LangDialog_Text)

;--------------------------------------------------------------------------------------------------
;##################################################################################################
;#                                     S E C T I O N S                                            #
;##################################################################################################
;#                                    Installer Sections                                          #
;##################################################################################################
Section "-Topmost Section" SecTopmost ;# this needs to be always the first section to be executed!
	SetShellVarContext all
	SetOutPath $INSTDIR

	${If} $INSTALL_TYPE == 1
	${OrIf} $INSTALL_TYPE == 2
	${OrIf} $INSTALL_TYPE == 3
		ReadRegStr $0 HKLM "$Prev_Install_RegKey" "UninstallString"
		${StrFilter} "$0" "" "" "$\"" $0
		ClearErrors
		ExecWait '"$0" /S /type=1 _?=$INSTDIR'
		IfErrors 0 +2
		DetailPrint "Error on uninstalling"
		Sleep 100
		Delete $0
	${EndIf}
SectionEnd


;# Install Section /hidden
Section "-Install Section" SecInstall
	@CPACK_NSIS_FULL_INSTALL@

	@CPACK_NSIS_EXTRA_INSTALL_COMMANDS@

	;# Create uninstaller
	WriteUninstaller "$INSTDIR\Uninstall @CPACK_PACKAGE_VERSION@.exe"

	;# Registry Entries
	SetShellVarContext all ;# make sure that we write to HKLM
	;# HKLM Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenCPN <DisplayVersion>
	WriteRegStr SHCTX "${REG_KEY_UN}" "DisplayName" "@CPACK_PACKAGE_NAME@ @CPACK_PACKAGE_VERSION@"
	WriteRegStr SHCTX "${REG_KEY_UN}" "DisplayVersion" "@CPACK_PACKAGE_VERSION@"
	WriteRegStr SHCTX "${REG_KEY_UN}" "CompareVersion" "$VERSION_DATE"
	WriteRegStr SHCTX "${REG_KEY_UN}" "StartMenuPath" "$SMPROGRAMS\$STARTMENU_FOLDER"
	WriteRegStr SHCTX "${REG_KEY_UN}" "InstallLocation" "$INSTDIR"
	WriteRegStr SHCTX "${REG_KEY_UN}" "UninstallString" "$\"$INSTDIR\Uninstall @CPACK_PACKAGE_VERSION@.exe$\""
	WriteRegStr SHCTX "${REG_KEY_UN}" "QuietUninstallString" "$\"$INSTDIR\Uninstall @CPACK_PACKAGE_VERSION@.exe /S$\""
	WriteRegStr SHCTX "${REG_KEY_UN}" "ConfigLocation" "$APPDATA\@CPACK_NSIS_PACKAGE_NAME_LC@"
	WriteRegStr SHCTX "${REG_KEY_UN}" "DisplayIcon" "$INSTDIR\@CPACK_NSIS_INSTALLED_ICON_NAME@"
	WriteRegStr SHCTX "${REG_KEY_UN}" "Publisher" "@CPACK_PACKAGE_VENDOR@"
	WriteRegDWORD SHCTX "${REG_KEY_UN}" "VersionMajor" $MAJOR_D
	WriteRegDWORD SHCTX "${REG_KEY_UN}" "VersionMinor" $MINOR_D
	WriteRegDWORD SHCTX "${REG_KEY_UN}" "VersionPatch" $PATCH_D
	WriteRegDWORD SHCTX "${REG_KEY_UN}" "NoModify" 1
	WriteRegDWORD SHCTX "${REG_KEY_UN}" "NoRepair" 1
	WriteRegStr SHCTX "${REG_KEY_UN}" "HelpLink" "http://opencpn.org/"
	WriteRegStr SHCTX "${REG_KEY_UN}" "URLInfoAbout" "http://opencpn.org/"
	WriteRegStr SHCTX "${REG_KEY_UN}" "Contact" "http://opencpn.org/"
	WriteRegStr SHCTX "${REG_KEY_UN}" "InstallUser" "$USERS_NAME"
	${If} ${UAC_IsInnerInstance}
		WriteRegStr SHCTX "${REG_KEY_UN}" "InstallAdminUser" "$USERNAME"
	${EndIf}

	;# Create the config folder if it does not exist and set full access rights to it
;	${IfNot} ${FileExists} "$APPDATA\@CPACK_NSIS_PACKAGE_NAME_LC@\*.*"
;		CreateDirectory "$APPDATA\@CPACK_NSIS_PACKAGE_NAME_LC@"
;		Sleep 250
;	${EndIf}
;	AccessControlW::GrantOnFile "$APPDATA\@CPACK_NSIS_PACKAGE_NAME_LC@" "(BU)" "GenericRead + GenericExecute + GenericWrite + Delete + FullAccess"

	;# Save the log file
	StrCpy $0 "$INSTDIR\install.log"
	Push $0
	Call DumpLog
SectionEnd

;--------------------------------
;##################################################################################################
;#                                   Uninstaller Sections                                         #
;##################################################################################################

Section "-un.Delete Config RegKey" UnSecDeleteConfigRegKey
	DeleteRegKey HKLM "${REG_KEY}"
SectionEnd

Section /o "-un.Backup Config to RegKey" UnSecBackupConfigToRegKey
	SetShellVarContext all
/*
	${If} ${FileExists} "$APPDATA\@CPACK_NSIS_PACKAGE_NAME_LC@\opencpn.ini"
		ClearErrors
		StrCpy $0 ""
		StrCpy $2 0
		loop:
			IntOp $2 $2 + 1
			ReadINIStr $1 "$APPDATA\@CPACK_NSIS_PACKAGE_NAME_LC@\opencpn.ini" "ChartDirectories" "ChartDir$2"
			StrCmp $1 "" cont
			${WordReplace} "$1" "\\" "\" "+" $3
			${unExplode} $4 "^" "$3"
			Pop $5
			StrCmp $5 "" cont
			StrCmp $0 "" 0 +2
			StrCpy $0 $5
			StrCpy $0 "$0;$5"
			Goto loop
		cont:
		WriteRegStr HKLM "${REG_KEY}" "ChartDirs" "$0"

		ReadINIStr $0 "$APPDATA\@CPACK_NSIS_PACKAGE_NAME_LC@\opencpn.ini" "Settings" "Locale"
		StrCmp $0 "" +2 0
		WriteRegStr HKLM "${REG_KEY}" "InstallerLanguage" "$0"
	${EndIf}
*/
SectionEnd

Section "un.Delete Config Folder" UnSecDeleteConfigFolder
	SetShellVarContext all
/*
	${If} ${FileExists} "$APPDATA\@CPACK_NSIS_PACKAGE_NAME_LC@\*.*"
		RMDir /r "$APPDATA\@CPACK_NSIS_PACKAGE_NAME_LC@"
		ClearErrors
	${EndIf}
*/
SectionEnd

Section "-un.Uninstall" UnSecUninstall

/*
	;# Delete all Shortcuts
		Push $INSTDIR
		Call un.Delete_Desktop_Shortcuts
		Push $INSTDIR
		Call un.Delete_Start_Menu_Shortcuts
*/
	;# Delete subdirs and files in INSTDIR
		;# Remove the uninstaller itself
		ReadRegStr $0 HKLM "${REG_KEY_UN}" "UninstallString"
		${StrFilter} "$0" "" "" "$\"" $0
		Delete $0
		;# Remove the installation log file
		Delete "$INSTDIR\install.log"
		@CPACK_NSIS_DELETE_FILES@
		@CPACK_NSIS_DELETE_DIRECTORIES@

	;# Remove the installation directory INSTDIR if it is empty
		ClearErrors
		RMDir "$INSTDIR"
		IfErrors 0 cont
		IfSilent cont
		MessageBox MB_OK|MB_ICONEXCLAMATION "$(Msg_Error_Remove_InstDir)"

		cont:
	;# Remove RegKey
		DeleteRegKey HKLM "${REG_KEY_UN}"
SectionEnd

;--------------------------------------------------------------------------------------------------
;##################################################################################################
;#                                      F U N C T I O N S                                         #
;##################################################################################################
;#                                     Installer Functions                                        #
;##################################################################################################
;#  .onInit Function
Function .onInit
	;# Check if Windows version is at least XP (not Win 98, Win 2000 or older)
	${IfNot} ${AtLeastWinXP}
		MessageBox MB_OK|MB_ICONEXCLAMATION "$(Installer_Unsupported_Windows_Version)"
		Abort
	${Else}
		${If} ${IsWinXP}
		${AndIf} ${AtMostServicePack} 2
		MessageBox MB_OK|MB_ICONEXCLAMATION "$(Installer_Unsupported_XP_SP_Version)"
		Abort
		${EndIf}
	${EndIf}

	;Prevent multiple instances of the installer
	${IfNot} ${UAC_IsInnerInstance}
		System::Call 'kernel32::CreateMutexW(i 0, i 0, t "ocpn_inst_@CPACK_PACKAGE_VERSION@") i .r1 ?e'
		Pop $R0
		StrCmp $R0 0 +3
		MessageBox MB_OK|MB_ICONEXCLAMATION "$(Installer_Running)"
		Abort
	${EndIf}

	Call GetUserInfo
	StrCpy $USERS_NAME $USERNAME

	;# Macros to be inserted
	${If} $IS_ADMIN == 1
		!insertmacro MUI_LANGDLL_DISPLAY
	${EndIf}

	SetShellVarContext current
	StrCpy $USERS_APPDATA $APPDATA
	StrCpy $ADMIN_APPDATA $APPDATA

	;# UAC check if user has Admin privileges and prompt for elevation if not
	uac_tryagain:
	!insertmacro UAC_RunElevated
	StrCpy $Inst_Or_Uninst "$(Installer)"
	${Switch} $0
	${Case} 0
		${IfThen} $1 = 1 ${|} Quit ${|} ;# we are the outer process, the inner process has done its work, we are done
		${IfThen} $3 <> 0 ${|} ${Break} ${|} ;# we are admin, let the show go on
		${If} $1 = 3 ;# RunAs completed successfully, but with a non-admin user
			MessageBox mb_IconExclamation|mb_TopMost|mb_SetForeground "$(Msg_UAC_Admin_Retry)" /SD IDNO IDOK uac_tryagain IDNO 0
		${EndIf}
		;# fall-through and die
	${Case} 1223
		MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "$(Msg_UAC_Admin_Abort)"
		Quit
	${Case} 1062
		MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "$(Msg_UAC_Logon_Abort)"
		Quit
	${Default}
		MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "$(Msg_UAC_No_Elevation)"
		Quit
	${EndSwitch}

##########  from here we can be sure to run with admin privileges  ##########

	;# Delete all temporary files created during the installation
	Delete "$TEMP\opencpn_*.tmp"

	;# Check for unloaded Registry hive from previous installation attempt e.g. when installer crashed
	StrCpy $0 0
	!insertmacro _EnumHKU_AdjustTokens
	${Do}
		EnumRegKey $1 HKU "" $0
		StrCmp $1 "" done
		IntOp $0 $0 + 1
		ClearErrors
		${WordFind} "$1" "opencpn-inst-tmp-sid" "E*" $2
		IfErrors +2 0
		System::Call "advapi32::RegUnLoadKeyW(i ${HKEY_USERS}, t '$1') i .r3"
	${Loop}
	done:
	${If} ${UAC_IsInnerInstance}
		!insertmacro UAC_AsUser_GetGlobalVar $USERS_APPDATA
		!insertmacro UAC_AsUser_GetGlobalVar $USERS_NAME
	${EndIf}

	ClearErrors
	Var /GLOBAL INST_PARAMS
	Var /GLOBAL FORCE_SCAN
	${GetParameters} $INST_PARAMS
	${GetOptions} "$INST_PARAMS" "/scan" $FORCE_SCAN
	IfErrors +2

	# Get the user's SID from the username
	ReadRegStr $0 HKCU "Volatile Environment" "USERNAME"
	System::Call /NOUNLOAD '*(&w${NSIS_MAX_STRLEN})i.R9'
	System::Call /NOUNLOAD 'advapi32::LookupAccountNameW(,t "$0",i R9,*i ${NSIS_MAX_STRLEN},w .R8,*i ${NSIS_MAX_STRLEN},*i .r4)i.r5'
	System::Call /NOUNLOAD 'advapi32::ConvertSidToStringSidW(i R9,*t .R8)i.r5'
	StrCpy $INST_USER_SID $R8

	Call VersionDate

	;# check for previous installed versions conforming to this installer
	Call Check_Prev_Installs

	;# check for old installed versions prior to the ones that uses this installer
	StrCpy $OLD_INSTALLS 0

	Call Reg_Scan_Old_Versions_HKLM

	Call EnumProfileList

	Call Get_Users_Values

	${If} $OLD_INSTALLS == 0
		StrCpy $Skip_Page_CleanUp 1
	${EndIf}


	;# make sure that the DWORD values for the Registry only contain digits
	${StrFilter} "@CPACK_PACKAGE_VERSION_MAJOR@" "1" "" "" $MAJOR_D
	${StrFilter} "@CPACK_PACKAGE_VERSION_MINOR@" "1" "" "" $MINOR_D
	${StrFilter} "@CPACK_PACKAGE_VERSION_PATCH@" "1" "" "" $PATCH_D

        StrCpy $INSTDIR "$PROGRAMFILES\OpenCPN\plugins\s63_pi"

	;Call GetAllUsers
FunctionEnd

;--------------------------------
;#  myGuiInit Function
/*
Var CONFIG_EMPTY
Var INI_EXISTS
Var CHARTDB_EXISTS
Var SENC_EXISTS
Var CM93_EXISTS
Var NAVOBJ_EXISTS
Var LOG_EXISTS
Var REG_LANG
Var Count_SecGrpResetConfig
Var SecGrpEndSetConfig_Text
*/
Function myGuiInit
	;Get chosen installer language
	${Switch} $LANGUAGE
		${Case} ${LANG_CZECH}
			StrCpy $LANG_NAME "Čeština"
			StrCpy $REG_LANG "cs_CZ"
			${Break}
		${Case} ${LANG_DANISH}
			StrCpy $LANG_NAME "Dansk"
			StrCpy $REG_LANG "da_DK"
			${Break}
		${Case} ${LANG_GERMAN}
			StrCpy $LANG_NAME "Deutsch"
			StrCpy $REG_LANG "de_DE"
			${Break}
		${Case} ${LANG_ENGLISH}
			StrCpy $LANG_NAME "English"
			StrCpy $REG_LANG "en_US"
			${Break}
		${Case} ${LANG_SPANISH}
			StrCpy $LANG_NAME "Español"
			StrCpy $REG_LANG "es_ES"
			${Break}
		${Case} ${LANG_FRENCH}
			StrCpy $LANG_NAME "Français"
			StrCpy $REG_LANG "fr_FR"
			${Break}
		${Case} ${LANG_ITALIAN}
			StrCpy $LANG_NAME "Italiano"
			StrCpy $REG_LANG "it_IT"
			${Break}
		${Case} ${LANG_DUTCH}
			StrCpy $LANG_NAME "Nederlandse"
			StrCpy $REG_LANG "nl_NL"
			${Break}
		${Case} ${LANG_POLISH}
			StrCpy $LANG_NAME "Polski"
			StrCpy $REG_LANG "pl_PL"
			${Break}
		${Case} ${LANG_PORTUGUESE}
			StrCpy $LANG_NAME "Português"
			StrCpy $REG_LANG "pt_PT"
			${Break}
		${Case} ${LANG_PORTUGUESEBR}
			StrCpy $LANG_NAME "Português Brasileiro"
			StrCpy $REG_LANG "pt_BR"
			${Break}
		${Case} ${LANG_SWEDISH}
			StrCpy $LANG_NAME "Svenska"
			StrCpy $REG_LANG "sv_SE"
			${Break}
		${Case} ${LANG_RUSSIAN}
			StrCpy $LANG_NAME "Русский"
			StrCpy $REG_LANG "ru_RU"
			${Break}
		${Case} ${LANG_NORWEGIAN}
			StrCpy $LANG_NAME "Norsk"
			StrCpy $REG_LANG "nb_NO"
			${Break}
		${Case} ${LANG_FINNISH}
			StrCpy $LANG_NAME "Suomalainen"
			StrCpy $REG_LANG "fi_FI"
			${Break}
        	${Case} ${LANG_TRADCHINESE}
            		StrCpy $LANG_NAME "正體中文"
            		StrCpy $REG_LANG "zh_TW"
            		${Break}
		${Case} ${LANG_Turkish}
            		StrCpy $LANG_NAME "Türkçe"
            		StrCpy $REG_LANG "tr_TR"
            		${Break}
		${Default}
			${Break}
	${EndSwitch}

	;# Set Sections Text
	SectionSetText ${SecGrpShortcuts} $(SecGrpShortcuts_Text)
	SectionSetText ${SecShortcutStartmenu} $(SecShortcutStartmenu_Text)
	SectionSetText ${SecShortcutDesktop} $(SecShortcutDesktop_Text)
	SectionSetText ${SecSetConfig} $(SecSetConfig_Text)

/*
	;# Look for config dir ("%APPDATA%\opencpn) and the several config files
	Call Check_Config_Exists

	${If} $CONFIG_EXISTS != 1
	${OrIf} $CONFIG_EMPTY == 1
		Call Hide_SecGrpResetConfig
		IntOp $0 ${SF_SELECTED} | ${SF_BOLD}
		SectionSetFlags ${SecSetConfig} $0
		StrCpy $SetConfig 1
	${EndIf}
*/
	SetShellVarContext all ;# switch SetShellVarContext back to ALL
FunctionEnd

/*
;--------------------------------
;# onSelChange
;Var ConfigSetLang
;Var ConfigSetChartDir
;Var SetConfig
Function .onSelChange
	;# Check if all available Sections in SecGrpResetConfig are selected => set SecGrpResetConfig to selected instead of partially selected
	Push $0
	Push $1
	Push $2
	Push $3
	Push $R0
	Push $R1
	StrCpy $0 ${SecGrpResetConfig}
	StrCpy $1 0
	StrCpy $2 0
	${Do}
		IntOp $0 $0 + 1
		${If} ${SectionIsSectionGroupEnd} $0
			Goto end
		${EndIf}
		SectionGetText $0 $R0
		${If} $R0 != ""
		${AndIf} ${SectionIsSelected} $0
			Goto found_selected
		${ElseIf} $R0 != ""
		${AndIfNot} ${SectionIsSelected} $0
			Goto found_unselected
		${EndIf}
	${Loop}

	found_selected:
		StrCpy $0 ${SecGrpResetConfig}
		${Do}
			IntOp $0 $0 + 1
			${If} ${SectionIsSectionGroupEnd} $0
				Goto end
			${EndIf}
			SectionGetText $0 $R0
			${If} $R0 == ""
			${AndIfNot} ${SectionIsSelected} $0
				SectionSetFlags $0 ${SF_SELECTED}
			${EndIf}
		${Loop}

	found_unselected:
		StrCpy $0 ${SecGrpResetConfig}
		${Do}
			IntOp $0 $0 + 1
			${If} ${SectionIsSectionGroupEnd} $0
				Goto end
			${EndIf}
			SectionGetText $0 $R0
			${If} $R0 == ""
			${AndIf} ${SectionIsSelected} $0
				!insertmacro ClearSectionFlag $0 ${SF_SELECTED}
			${EndIf}
		${Loop}

	end:
	SectionGetText ${SecDeleteConfigFile} $R1
	${If} $R1 != ""
		${IfNot} ${SectionIsReadOnly} ${SecSetConfig}
		${AndIfNot} ${SectionIsSelected} ${SecSetConfig}
		${AndIf} $SetConfig == 1
			StrCpy $SetConfig 0
		${EndIf}

		${IfNot} ${SectionIsSelected} ${SecDeleteConfigFile}
		${AndIf} ${SectionIsSelected} ${SecSetConfig}
			!insertmacro ClearSectionFlag ${SecSetConfig} ${SF_SELECTED}
			IntOp $0 ${SF_RO} | ${SF_BOLD}
			SectionSetFlags ${SecSetConfig} $0
			;SectionSetFlags ${SecSetConfig} ${SF_RO}
			StrCpy $SetConfig 1
		${ElseIfNot} ${SectionIsSelected} ${SecDeleteConfigFile}
		${AndIfNot} ${SectionIsSelected} ${SecSetConfig}
			IntOp $0 ${SF_RO} | ${SF_BOLD}
			SectionSetFlags ${SecSetConfig} $0
			;SectionSetFlags ${SecSetConfig} ${SF_RO}
			StrCpy $SetConfig 0
		${ElseIf} ${SectionIsSelected} ${SecDeleteConfigFile}
		${AndIfNot} ${SectionIsSelected} ${SecSetConfig}
		${AndIf} $SetConfig == 1
			!insertmacro ClearSectionFlag ${SecSetConfig} ${SF_RO}
			IntOp $0 ${SF_SELECTED} | ${SF_BOLD}
			SectionSetFlags ${SecSetConfig} $0
			;SectionSetFlags ${SecSetConfig} ${SF_SELECTED}
		${ElseIf} ${SectionIsSelected} ${SecDeleteConfigFile}
		${AndIf} $SetConfig == 0
			!insertmacro ClearSectionFlag ${SecSetConfig} ${SF_RO}
			StrCpy $SetConfig 0
		${EndIf}
	${EndIf}

	Pop $R1
	Pop $R0
	Pop $3
	Pop $2
	Pop $1
	Pop $0
FunctionEnd

*/
Function .OnInstFailed
	Call InstallerEnd
FunctionEnd


Function .OnInstSuccess
	Call InstallerEnd
FunctionEnd


Function .onGUIEnd
	Call InstallerEnd
FunctionEnd


Function InstallerEnd
	;# Delete all temporary files created during the installation
	Delete "$TEMP\opencpn_*.tmp"
	${If} $EnumHKU_counter > 0
		${ForEach} $1 $EnumHKU_counter 0 - 1
			System::Call "advapi32::RegUnLoadKeyW(i ${HKEY_USERS}, t '$key_$1')"
		${Next}
	${Endif}
FunctionEnd

;--------------------------------
;##################################################################################################
;#                                   Installer Page Functions                                     #
;##################################################################################################
;# Page_License_Leave
	Function Page_License_Leave
/*
		FindWindow $mui.ComponentsPage "#32770" "" $HWNDPARENT
		System::Call "*(i 0, i 0, i 4, i 8) i .r1"
		System::Call "User32::MapDialogRect(i $mui.ComponentsPage, i r1) i .r2"
		System::Call "*$1(i .r2, i.r3, i.r4, i.r5)"
		System::Free $1
		StrCpy $BU_X $4
		StrCpy $BU_Y $5
*/
	FunctionEnd

/*
;--------------------------------
;# Page_CleanUp
	Var Label_CleanUp
	Var Label_FullScan_CleanUp
	Var GroupBox_CleanUp
	Var ListBox_CleanUp
	Var Button_FullScan_CleanUp
	Var Button_UnselectAll_CleanUp
	Var Button_SelectAll_CleanUp
	Var Button_Uninstall_Selected_CleanUp
	Var Banner_Handle
	Var MSG_Box_Uninstall_Shown
	Function Page_CleanUp
		${If} $Skip_Page_CleanUp == 1
			Abort
		${EndIf}

		!ifndef PBS_MARQUEE
			!define PBS_MARQUEE 0x08
		!endif
		!ifndef PBM_SETMARQUEE
			!define PBM_SETMARQUEE 0x040A
		!endif
		!ifndef GWL_STYLE
			!define GWL_STYLE -16
		!endif

		${IfNot} $MSG_Box_Uninstall_Shown == 1
			MessageBox MB_YESNO|MB_ICONQUESTION "$(Msg_Uninstall_Old_Versions)" IDYES cont IDNO skip
		${Else}
			Goto cont
		${EndIf}

		skip:
		Abort

		cont:
		StrCpy $MSG_Box_Uninstall_Shown 1
		!insertmacro MUI_HEADER_TEXT "$(Page_CleanUp_Title)" "$(Page_CleanUp_Subtitle)"

		nsDialogs::Create /NOUNLOAD 1018
		Pop $0
		${If} $0 == error
			Abort
		${EndIf}

		${NSD_CreateLabel} 0 0 200u 16u "$(LAB_FullScan_CleanUp)"
		Pop $Label_FullScan_CleanUp

		${NSD_CreateButton} 220u 0 70u 15u "$(BT_FullScan_CleanUp)"
		Pop $Button_FullScan_CleanUp
		GetFunctionAddress $0 Button_FullScan_CleanUp_Click
		nsDialogs::OnClick /NOUNLOAD $Button_FullScan_CleanUp $0

		${NSD_CreateLabel} 0 22u 100% 24u "$(Label_CleanUp_Text)"
		Pop $Label_CleanUp

		${NSD_CreateGroupBox} 0 55u 100% 85u "$(Install_Location_Default)"
		Pop $GroupBox_CleanUp

		!define __NSD_ListBoxMultiselect_CLASS LISTBOX
		!define __NSD_ListBoxMultiselect_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${WS_VSCROLL}|${LBS_DISABLENOSCROLL}|${LBS_HASSTRINGS}|${LBS_NOINTEGRALHEIGHT}|${LBS_NOTIFY}|${LBS_MULTIPLESEL}
		!define __NSD_ListBoxMultiselect_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE}
		!insertmacro __NSD_DefineControl ListBoxMultiselect
		${NSD_CreateListboxMultiselect} 10u 70u 200u 65u "$(LB_CleanUp)"
		Pop $ListBox_CleanUp
		GetFunctionAddress $0 ListBox_CleanUp_Change
		nsDialogs::OnChange /NOUNLOAD $ListBox_CleanUp $0

		${NSD_CreateButton} 220u 70u 70u 15u "$(BT_UnselectAll_CleanUp)"
		Pop $Button_UnselectAll_CleanUp
		GetFunctionAddress $0 Button_UnselectAll_CleanUp_Click
		nsDialogs::OnClick /NOUNLOAD $Button_UnselectAll_CleanUp $0

		${NSD_CreateButton} 220u 100u 70u 15u "$(BT_SelectAll_CleanUp)"
		Pop $Button_SelectAll_CleanUp
		GetFunctionAddress $0 Button_SelectAll_CleanUp_Click
		nsDialogs::OnClick /NOUNLOAD $Button_SelectAll_CleanUp $0

		${NSD_CreateButton} 220u 120u 70u 15u "$(BT_Uninstall_Selected_CleanUp)"
		Pop $Button_Uninstall_Selected_CleanUp
		GetFunctionAddress $0 Button_Uninstall_Selected_CleanUp_Click
		nsDialogs::OnClick /NOUNLOAD $Button_Uninstall_Selected_CleanUp $0


		;# First check if HDD scan was already done
		${If} ${FileExists} "$TEMP\opencpn_hdd_full_scan.tmp"
			EnableWindow $Button_FullScan_CleanUp 0
			EnableWindow $Label_FullScan_CleanUp 0
			SendMessage $GroupBox_CleanUp ${WM_SETTEXT} 0 "STR:$(Install_Location_HDD_Scan)"
			ClearErrors
			FileOpen $R0 "$TEMP\opencpn_hdd_full_scan.tmp" r
			IfErrors done1
			${Do}
				FileReadUTF16LE $R0 $R1
				${If} $R1 == ""
					Goto done1
				${Else}
					${TrimNewLines} $R1 $R1
					SendMessage $ListBox_CleanUp ${LB_ADDSTRING} 0 "STR:$R1"
				${EndIf}
			${Loop}
			done1:
			FileClose $R0
		;# if not get values from LM_VERSION and opencpn_old_installs.tmp file
		${Else}
			${IfNot} ${FileExists} "$TEMP\opencpn_hdd_quick_scan.tmp"
				;# Scan the default locations for program installations on a per-user and all-users basis
				Banner::show /NOUNLOAD /set 76 "$(Search_old_installations)"
				Banner::getWindow /NOUNLOAD
				Pop $Banner_Handle
				ShowWindow $Banner_Handle ${SW_HIDE}
				${NSD_AddExStyle} $Banner_Handle ${WS_EX_APPWINDOW}
				ShowWindow $Banner_Handle ${SW_SHOW}
				GetDlgItem $2 $Banner_Handle 1030
				SendMessage $2 ${WM_SETTEXT} 0 "STR:$(text_please_wait_1)"

				; Get progress bar handle.
				GetDlgItem $Marquee_Handle $Banner_Handle 1004

				; Set PBS_MARQUEE style for the progress bar control.
				System::Call "user32::GetWindowLong(i $Marquee_Handle, i ${GWL_STYLE}) i .r1"
				System::Call "user32::SetWindowLong(i $Marquee_Handle, i ${GWL_STYLE}, i $1|${PBS_MARQUEE})"

				; Send PBM_SETMARQUEE message to start the marquee.
				; lParam is time in milliseconds between marquee animation updates.
				SendMessage $Marquee_Handle ${PBM_SETMARQUEE} 1 50

				System::Call "User32::SetWindowPos(i $Banner_Handle, i -1, i 0, i 0, i 0, i 0, i 83)"

				HideWindow

				Call Quick_Scan_Old_Versions

				ShowWindow $HWNDPARENT ${SW_SHOW}
				BringToFront
				SendMessage $Marquee_Handle ${PBM_SETMARQUEE} 0 0
				System::Call "user32::SetWindowLong(i $Marquee_Handle, i ${GWL_STYLE}, i $1)"
				Banner::destroy
			${EndIf}

			ClearErrors
			FileOpen $R0 "$TEMP\opencpn_hdd_quick_scan.tmp" r
			IfErrors done2
			${Do}
				FileReadUTF16LE $R0 $R1
				${If} $R1 == ""
					Goto done2
				${Else}
					${TrimNewLines} $R1 $R1
					SendMessage $ListBox_CleanUp ${LB_ADDSTRING} 0 "STR:$R1"
				${EndIf}
			${Loop}

			done2:
			FileClose $R0
		${EndIf}
		;# Pre-select all listbox-items
		${NSD_LB_GetCount} $ListBox_CleanUp $1
		IntOp $1 $1 - 1
		SendMessage $ListBox_CleanUp ${LB_SELITEMRANGEEX} 0 $1
		Call ListBox_CleanUp_Change

		nsDialogs::Show
	FunctionEnd
*/

/*
	Function Button_FullScan_CleanUp_Click
		SendMessage $ListBox_CleanUp ${LB_RESETCONTENT} 0 0

		Banner::show /NOUNLOAD /set 76 "$(Scanning_HDD)"
		Banner::getWindow /NOUNLOAD
		Pop $Banner_Handle
		ShowWindow $Banner_Handle ${SW_HIDE}
		SendMessage $Banner_Handle ${WM_SETTEXT} 0 "STR:$(OCPN_Scanning_HDD)"
		${NSD_AddExStyle} $Banner_Handle ${WS_EX_APPWINDOW}
		ShowWindow $Banner_Handle ${SW_SHOW}
		GetDlgItem $2 $Banner_Handle 1030
		SendMessage $2 ${WM_SETTEXT} 0 "STR:$(text_please_wait_1)"

		; Get progress bar handle.
		GetDlgItem $Marquee_Handle $Banner_Handle 1004

		; Set PBS_MARQUEE style for the progress bar control.
		System::Call "user32::GetWindowLong(i $Marquee_Handle, i ${GWL_STYLE}) i .r1"
		System::Call "user32::SetWindowLong(i $Marquee_Handle, i ${GWL_STYLE}, i $1|${PBS_MARQUEE})"

		; Send PBM_SETMARQUEE message to start the marquee.
		; lParam is time in milliseconds between marquee animation updates.
		SendMessage $Marquee_Handle ${PBM_SETMARQUEE} 1 50

		System::Call "User32::SetWindowPos(i $Banner_Handle, i -1, i 0, i 0, i 0, i 0, i 83)"

		HideWindow

		Call Full_Scan_Old_Versions

		${If} ${FileExists} "$TEMP\opencpn_hdd_full_scan.tmp"
			Delete "$TEMP\opencpn_hdd_quick_scan.tmp"
		${EndIf}

		;# If install locations were found compare with Registry keys
		${If} $counter_tmp > 0
			${If} $LM_VERSION_INST != ""
				ClearErrors
				FileOpen $R0 "$TEMP\opencpn_hdd_full_scan.tmp" r
				IfErrors done1
				${Do}
					FileReadUTF16LE $R0 $R1
					${If} $R1 == ""
						Goto done1
					${Else}
						${TrimNewLines} $R1 $R1
						StrCmp $R1 $R2 done1
					${EndIf}
				${Loop}
				;# Path from Registry key wasn't found => delete RegKey
				DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenCPN_is1"
				StrCpy $LM_VERSION_INST ""

				done1:
				FileClose $R0
			${EndIf}

			${If} ${FileExists} "$TEMP\opencpn_old_installs.tmp"
				;# Clear the stack
				ClearErrors
				${Do}
					Pop $0
					IfErrors empty
				${Loop}
				empty:

				ClearErrors
				FileOpen $R0 "$TEMP\opencpn_old_installs.tmp" r

				IfErrors done3
				${Do}
					FileReadUTF16LE $R0 $R3
					FileReadUTF16LE $R0 $R2
					${If} $R3 == ""
						Goto done3
					${Else}
						${TrimNewLines} $R3 $R3
						${TrimNewLines} $R2 $R2
						FileReadUTF16LE $R0 $R1
						${TrimNewLines} $R1 $R1
						ClearErrors
						FileOpen $0 "$TEMP\opencpn_hdd_full_scan.tmp" r
						IfErrors next
						${Do}
							FileReadUTF16LE $0 $1
							${If} $1 == ""
								Goto next
							${Else}
								${TrimNewLines} $1 $1
								StrCmp $1 $R1 done2
							${EndIf}
						${Loop}
						;# Path from Registry key wasn't found => delete RegKey
						DeleteRegKey HKU $R3
						Goto next

						done2:
						Push $R1
						Push $R2
						Push $R3
						next:
						FileClose $0
					${EndIf}
				${Loop}
				done3:
				FileClose $R0

				ClearErrors
				FileOpen $R0 "$TEMP\opencpn_old_installs.tmp" w
				IfErrors done4
				${Do}
					Pop $R1
					IfErrors done4
					FileWriteUTF16LE $R0 $R1
					FileWriteUTF16LE $R0 "$\r$\n"
				${Loop}
				done4:
				FileClose $R0
			${EndIf}
		${EndIf}

		EnableWindow $Button_FullScan_CleanUp 0 ;# Disable the Scan HDD button after scan was done
		EnableWindow $Label_FullScan_CleanUp 0 ;# Disable the Scan HDD label after scan was done
		SendMessage $GroupBox_CleanUp ${WM_SETTEXT} 0 "STR:$(Install_Location_HDD_Scan)"

		ShowWindow $HWNDPARENT ${SW_SHOW}
		BringToFront

		; Stop the marquee and set the old styles back for the progress bar control.
		SendMessage $Marquee_Handle ${PBM_SETMARQUEE} 0 0
		System::Call "user32::SetWindowLong(i $Marquee_Handle, i ${GWL_STYLE}, i $1)"

		Banner::destroy
	FunctionEnd
*/

	Function Button_UnselectAll_CleanUp_Click
		SendMessage $ListBox_CleanUp ${LB_SETSEL} FALSE -1
		Call ListBox_CleanUp_Change
	FunctionEnd

	Function Button_SelectAll_CleanUp_Click
		${NSD_LB_GetCount} $ListBox_CleanUp $1
		IntOp $1 $1 - 1
		${If} $1 == 0
			IntOp $1 $1 + 1
		${EndIf}
		SendMessage $ListBox_CleanUp ${LB_SELITEMRANGEEX} 0 $1
		Call ListBox_CleanUp_Change
	FunctionEnd

	Function ListBox_CleanUp_Change
		SendMessage $ListBox_CleanUp ${LB_GETSELCOUNT} 0 0 $1
		${NSD_LB_GetCount} $ListBox_CleanUp $2
		${If} $2 > 0
			${If} $1 == 0
				EnableWindow $Button_Uninstall_Selected_CleanUp 0
				EnableWindow $Button_UnselectAll_CleanUp 0
				EnableWindow $Button_SelectAll_CleanUp 1
			${ElseIf} $1 > 0
			${AndIf} $1 == $2
				EnableWindow $Button_Uninstall_Selected_CleanUp 1
				EnableWindow $Button_UnselectAll_CleanUp 1
				EnableWindow $Button_SelectAll_CleanUp 0
			${Else}
				EnableWindow $Button_Uninstall_Selected_CleanUp 1
				EnableWindow $Button_UnselectAll_CleanUp 1
				EnableWindow $Button_SelectAll_CleanUp 1
			${EndIf}
		${Else}
			EnableWindow $Button_Uninstall_Selected_CleanUp 0
			EnableWindow $Button_UnselectAll_CleanUp 0
			EnableWindow $Button_SelectAll_CleanUp 0
		${EndIf}
	FunctionEnd

/*
	Var Uninstall_Path_Tmp
	Function Button_Uninstall_Selected_CleanUp_Click
		EnableWindow $Button_Uninstall_Selected_CleanUp 0
		SendMessage $ListBox_CleanUp ${LB_GETSELCOUNT} 0 0 $1
		${NSD_LB_GetCount} $ListBox_CleanUp $2
		ClearErrors
		FileOpen $R0 "$TEMP\opencpn_uninstall.tmp" w
		IfErrors done
		IntOp $2 $2 - 1
		${ForEach} $3 $2 0 - 1
			SendMessage $ListBox_CleanUp ${LB_GETSEL} $3 0 $4
			${If} $4 > 0
				System::Call "User32::SendMessage(i $ListBox_CleanUp, i ${LB_GETTEXT}, i $3, t .r5)"
				FileWriteUTF16LE $R0 "$5"
				FileWriteUTF16LE $R0 "$\r$\n"
				SendMessage $ListBox_CleanUp ${LB_DELETESTRING} $3 0
			${EndIf}
		${Next}
		done:
		FileClose $R0

		Call ListBox_CleanUp_Change

		StrCpy $R8 ""
		StrCpy $R7 ""
		StrCpy $R6 ""
		StrCpy $R5 ""
		${If} ${FileExists} "$TEMP\opencpn_uninstall.tmp"
			${If} ${FileExists} "$TEMP\opencpn_hdd_full_scan.tmp"
				StrCpy $R8 "opencpn_hdd_full_scan.tmp"
			${ElseIf} ${FileExists} "$TEMP\opencpn_hdd_quick_scan.tmp"
				StrCpy $R8 "opencpn_hdd_quick_scan.tmp"
			${EndIf}

			${If} ${FileExists} "$TEMP\opencpn_old_installs.tmp"
				StrCpy $R7 1
			${EndIf}

			${If} ${FileExists} "$TEMP\opencpn_old_uninstall_regkeys.tmp"
				StrCpy $R6 1
			${EndIf}

			${If} ${FileExists} "$TEMP\opencpn_appdata.tmp"
				StrCpy $R5 1
			${EndIf}

			ClearErrors
			FileOpen $R4 "$TEMP\opencpn_uninstall.tmp" r
			IfErrors end
			loop:
				ClearErrors
				FileReadUTF16LE $R4 $0
				IfErrors end
				StrCmp $0 "" loop
				StrCmp $0 "$\r$\n" loop

				${TrimNewLines} $0 $0
				StrCpy $Uninstall_Path_Tmp $0

				;# Delete installation directory
				ClearErrors
				Call Delete_Installation_Dir
				IfErrors 0 +2
				MessageBox MB_OK|MB_ICONEXCLAMATION "Error RMDir: $0" ;#ON ERROR

				;# If deleted installation was the one in the HKLM ...\OpenCPN_is1 subkey => delete RegKey
				${If} $LM_VERSION_INST != ""
					StrCmp $0 $LM_VERSION_INST 0 cont
					ClearErrors
					DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenCPN_is1"
					IfErrors 0 +2
					MessageBox MB_OK|MB_ICONEXCLAMATION "Error DeleteRegKey HKLM Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenCPN_is1" ;#ON ERROR
					StrCpy $LM_VERSION ""
					StrCpy $LM_VERSION_INST ""
					StrCpy $LM_VERSION_UNINST ""
				${EndIf}

				cont:
				;# Delete Start Menu shortcuts
				Push $Uninstall_Path_Tmp
				Call Delete_Start_Menu_Shortcuts

				;# Delete Desktop shortcuts
				Push $Uninstall_Path_Tmp
				Call Delete_Desktop_Shortcuts

				;# Delete RegKeys in HKU Software\opencpn.org\...
				${If} $R7 == 1
					Call Update_Old_Installs
				${EndIf}

				;# Delete RegKeys in HKU Software\...\Uninstall\OpenCPN
				${If} $R6 == 1
					Call Update_Old_Uninstalls
				${EndIf}

				;# Delete %APPDATA\opencpn folder
				${If} $R5 == 1
					Call Update_Appdata
				${EndIf}

				${IfNot} $R8 == ""
					Call Update_HDD_Scan
				${EndIf}

				Goto loop
			end:
			FileClose $R4
			Delete "$TEMP\opencpn_uninstall.tmp"
			StrCpy $Uninstall_Path_Tmp ""
		${EndIf}

		${NSD_LB_GetCount} $ListBox_CleanUp $2
		${If} $2 == 0 ;# listbox is empty - all were uninstalled
			StrCpy $Skip_Page_CleanUp 1
			GetDlgItem $0 $HWNDPARENT 1
			SendMessage $0 ${BM_CLICK} 0 0
		${EndIf}
	FunctionEnd
*/

/*
	Function Update_HDD_Scan
		Push $0
		Push $1
		Push $2
		Push $3
		Push $4
		Push $R0
		Push $R8
		ClearErrors
		FileOpen $0 "$TEMP\$R8" r          			;# open target file for reading
		GetTempFileName $R0                        	;# get new temp file name
		FileOpen $1 $R0 w                           ;# open temp file for writing
		IfErrors end
		loop:
			FileReadUTF16LE $0 $2                   ;# read line from target file
			IfErrors done                           ;# check if end of file reached
			${TrimNewLines} $2 $2
			StrCmp $2 "$Uninstall_Path_Tmp" +2      ;# compare line with search string with CR/LF
			FileWriteUTF16LE $1 "$2$\r$\n"          ;# write line to temp file
			Goto loop
		done:
			FileClose $0                            ;# close target file
			FileClose $1                            ;# close temp file
			Delete "$TEMP\$R8"             			;# delete target file
			CopyFiles /SILENT $R0 "$TEMP\$R8"		;# copy temp file to target file
			Delete $R0                              ;# delete temp file
		end:
		Pop $R8
		Pop $R0
		Pop $4
		Pop $3
		Pop $2
		Pop $1
		Pop $0
	FunctionEnd
*/

/*
	Function Update_Old_Installs
		Push $0
		Push $1
		Push $2
		Push $3
		Push $4
		Push $R0
		Push $R1
		ClearErrors
		FileOpen $0 "$TEMP\opencpn_old_installs.tmp" r          	;# open target file for reading
		GetTempFileName $R0                        					;# get new temp file name
		FileOpen $1 $R0 w                              				;# open temp file for writing
		IfErrors end
		loop:
			FileReadUTF16LE $0 $4                              		;# read line from target file
			FileReadUTF16LE $0 $3                              		;# read line from target file
			FileReadUTF16LE $0 $2                              		;# read line from target file
			IfErrors done                               			;# check if end of file reached
			${TrimNewLines} $2 $2
			StrCmp $2 "$Uninstall_Path_Tmp" +5         				;# compare line with search string with CR/LF
			FileWriteUTF16LE $1 $4                             		;# write line to temp file
			FileWriteUTF16LE $1 $3                             		;# write line to temp file
			FileWriteUTF16LE $1 "$2$\r$\n"                          ;# write line to temp file
			Goto loop
			${TrimNewLines} $4 $4
			DeleteRegKey HKU "$4"
			${WordFind} "$4" "\" "-2{*" $4
			DeleteRegKey /ifempty HKU "$4"
			ClearErrors
			Goto loop
		done:
			FileClose $0                                			;# close target file
			FileClose $1                                			;# close temp file
			Delete "$TEMP\opencpn_old_installs.tmp"             	;# delete target file
			CopyFiles /SILENT $R0 "$TEMP\opencpn_old_installs.tmp"	;# copy temp file to target file
			Delete $R0                                				;# delete temp file
		end:
		Pop $R1
		Pop $R0
		Pop $4
		Pop $3
		Pop $2
		Pop $1
		Pop $0
	FunctionEnd
*/

/*
	Function Update_Old_Uninstalls
		Push $0
		Push $1
		Push $2
		Push $3
		Push $4
		Push $R0
		Push $R1
		ClearErrors
		FileOpen $0 "$TEMP\opencpn_old_uninstall_regkeys.tmp" r     ;# open target file for reading
		GetTempFileName $R0                        					;# get new temp file name
		FileOpen $1 $R0 w                              				;# open temp file for writing
		IfErrors end
		loop:
			FileReadUTF16LE $0 $4                              		;# read line from target file
			FileReadUTF16LE $0 $3                              		;# read line from target file
			FileReadUTF16LE $0 $2                              		;# read line from target file
			IfErrors done                               			;# check if end of file reached
			${TrimNewLines} $2 $2
			StrCmp $2 "$Uninstall_Path_Tmp" +5         				;# compare line with search string with CR/LF
			FileWriteUTF16LE $1 $4                             		;# write line to temp file
			FileWriteUTF16LE $1 $3                             		;# write line to temp file
			FileWriteUTF16LE $1 "$2$\r$\n"                          ;# write line to temp file
			Goto loop
			${TrimNewLines} $3 $3
			DeleteRegKey HKU "$3"
			ClearErrors
			Goto loop
		done:
			FileClose $0                                					;# close target file
			FileClose $1                                					;# close temp file
			Delete "$TEMP\opencpn_old_uninstall_regkeys.tmp"             	;# delete target file
			CopyFiles /SILENT $R0 "$TEMP\opencpn_old_uninstall_regkeys.tmp"	;# copy temp file to target file
			Delete $R0                                						;# delete temp file
		end:
		Pop $R1
		Pop $R0
		Pop $4
		Pop $3
		Pop $2
		Pop $1
		Pop $0
	FunctionEnd
*/

/*
	Function Update_Appdata
		Push $0
		Push $1
		Push $2
		Push $3
		Push $4
		Push $R0
		Push $R1
		ClearErrors
		FileOpen $0 "$TEMP\opencpn_appdata.tmp" r          			;# open target file for reading
		GetTempFileName $R0                        					;# get new temp file name
		FileOpen $1 $R0 w                              				;# open temp file for writing
		IfErrors end
		loop:
			FileReadUTF16LE $0 $4                              		;# read line from target file
			FileReadUTF16LE $0 $3                              		;# read line from target file
			FileReadUTF16LE $0 $2                              		;# read line from target file
			IfErrors done                               			;# check if end of file reached
			${TrimNewLines} $2 $2
			StrCmp $2 "$Uninstall_Path_Tmp" +5         				;# compare line with search string with CR/LF
			FileWriteUTF16LE $1 $4                             		;# write line to temp file
			FileWriteUTF16LE $1 $3                             		;# write line to temp file
			FileWriteUTF16LE $1 "$2$\r$\n"                          ;# write line to temp file
			Goto loop
			${TrimNewLines} $3 $3
			RMDir /r "$3\opencpn"
			ClearErrors
			Goto loop
		done:
			FileClose $0                                			;# close target file
			FileClose $1                                			;# close temp file
			Delete "$TEMP\opencpn_appdata.tmp"             			;# delete target file
			CopyFiles /SILENT $R0 "$TEMP\opencpn_appdata.tmp"		;# copy temp file to target file
			Delete $R0                                				;# delete temp file
		end:
		Pop $R1
		Pop $R0
		Pop $4
		Pop $3
		Pop $2
		Pop $1
		Pop $0
	FunctionEnd
*/

/*
;--------------------------------
;# Page_CleanUp_Leave
	Function Page_CleanUp_Leave
		${NSD_LB_GetCount} $ListBox_CleanUp $2
		${If} $2 > 0 ;# listbox is not empty - not all old versions were uninstalled
			MessageBox MB_YESNO|MB_ICONQUESTION "$(Msg_Not_All_Old_Uninstalled)" IDYES leaving
			Abort
		${EndIf}
		leaving:
		SendMessage $ListBox_CleanUp ${LB_RESETCONTENT} 0 0
	FunctionEnd

*/

;--------------------------------
;# Page_TypeInst
/*	Var Label_TypeInst_Reinstall
	Var RB_Reinstall
	Var Label_TypeInst_Upgrade
	Var RB_Upgrade
	Var Label_TypeInst_Downgrade
	Var RB_Downgrade
	Var Label_TypeInst_Parallel
	Var GroupBox_TypeInst
	Var RB_Parallel
	Var TI_REINSTALL
	Var TI_UPGRADE
	Var TI_DOWNGRADE
	Var TI_PARALLEL
	Var GroupBox_Size
	Var INSTALL_TYPE
	*/
	Function Page_TypeInst
		${If} $Skip_Page_TypeInst == 1
			Abort
		${EndIf}
		${If} $VERSION_EXISTS == 1
			!insertmacro MUI_HEADER_TEXT $(Page_TypeInst_Title_Exists) $(Page_TypeInst_Subtitle_Exists)
		${ElseIf} $MULTIPLE_INSTALLS == 1
			!insertmacro MUI_HEADER_TEXT $(Page_TypeInst_Title_1) $(Page_TypeInst_Subtitle_1)
		${ElseIf} $MULTIPLE_INSTALLS > 1
			!insertmacro MUI_HEADER_TEXT $(Page_TypeInst_Title) $(Page_TypeInst_Subtitle)
		${EndIf}

		nsDialogs::Create /NOUNLOAD 1018
		Pop $0

		${If} $0 == error
			Abort
		${EndIf}

		;Case 1: same version already installed => Option 1: Reinstall
		${If} $VERSION_EXISTS == 1
			${NSD_CreateLabel} 0 0 100% 40u "$(Label_TypeInst_Reinstall_Text)"
			Pop $Label_TypeInst_Reinstall

			${NSD_CreateRadioButton} 10u 65u 100% 10u "$(RB_Reinstall_TypeInst_Text)"
			Pop $RB_Reinstall
			${NSD_AddStyle} $RB_Reinstall ${WS_GROUP}
			${NSD_SetState} $RB_Reinstall ${BST_CHECKED}

			StrCpy $GroupBox_Size 1
		;Case 2: one older previous installation => Option 1: Upgrade Option 2: Parallel Installation
		${ElseIf} $MULTIPLE_INSTALLS == 1
		${AndIf} $VERSION_NEWER == 1
			${NSD_CreateLabel} 0 0 100% 32u "$(Label_TypeInst_Upgrade_Text)"
			Pop $Label_TypeInst_Upgrade

			${NSD_CreateRadioButton} 10u 65u 100% 10u "$(RB_Upgrade_TypeInst_Text)"
			Pop $RB_Upgrade
			${NSD_AddStyle} $RB_Upgrade ${WS_GROUP}
			${If} $TI_UPGRADE != ""
				${NSD_SetState} $RB_Upgrade $TI_UPGRADE
			${ElseIf} $TI_UPGRADE == ""
			${AndIf} $TI_PARALLEL == ""
				${NSD_SetState} $RB_Upgrade ${BST_CHECKED}
			${EndIf}
/*
			${NSD_CreateRadioButton} 10u 85u 100% 10u "$(RB_Parallel_TypeInst_Text)"
			Pop $RB_Parallel
			${If} $TI_PARALLEL != ""
				${NSD_SetState} $RB_Parallel $TI_PARALLEL
			${EndIf}
*/
			StrCpy $GroupBox_Size 1
		;Case 3: one newer previous installation => Option 1: Downgrade Option 2: Parallel Installation
		${ElseIf} $MULTIPLE_INSTALLS == 1
		${AndIf} $VERSION_OLDER == 1
			${NSD_CreateLabel} 0 0 100% 32u "$(Label_TypeInst_Downgrade_Text)"
			Pop $Label_TypeInst_Downgrade

			${NSD_CreateRadioButton} 10u 65u 100% 10u "$(RB_Downgrade_TypeInst_Text)"
			Pop $RB_Downgrade
			${NSD_AddStyle} $RB_Downgrade ${WS_GROUP}
			${If} $TI_DOWNGRADE != ""
				${NSD_SetState} $RB_Upgrade $TI_DOWNGRADE
			${ElseIf} $TI_DOWNGRADE == ""
			${AndIf} $TI_PARALLEL == ""
				${NSD_SetState} $RB_Downgrade ${BST_CHECKED}
			${EndIf}
/*
			${NSD_CreateRadioButton} 10u 85u 100% 10u "$(RB_Parallel_TypeInst_Text)"
			Pop $RB_Parallel
			${If} $TI_PARALLEL != ""
				${NSD_SetState} $RB_Parallel $TI_PARALLEL
			${EndIf}
*/
			StrCpy $GroupBox_Size 1
/*
		;Case 4: more than one previous installation => Option 1: Parallel Installation
		${ElseIf} $MULTIPLE_INSTALLS > 1
			${NSD_CreateLabel} 0 0 100% 32u "$(Label_TypeInst_Parallel_Text)"
			Pop $Label_TypeInst_Parallel

			${NSD_CreateRadioButton} 10u 65u 100% 10u "$(RB_Parallel_TypeInst_Text)"
			Pop $RB_Parallel
			${NSD_AddStyle} $RB_Parallel ${WS_GROUP}
			${NSD_SetState} $RB_Parallel ${BST_CHECKED}

			StrCpy $GroupBox_Size 1
*/
		${EndIf}

		${If} $GroupBox_Size == 1
			${NSD_CreateGroupBox} 0 50u 100% 35u "Install Type"
			Pop $GroupBox_TypeInst
		${ElseIf} $GroupBox_Size == 2
			${NSD_CreateGroupBox} 0 50u 100% 55u "Install Type"
			Pop $GroupBox_TypeInst
		${EndIf}

		nsDialogs::Show
	FunctionEnd

;--------------------------------
;# Page_TypeInst_Leave
	Function Page_TypeInst_Leave
		${If} $RB_Reinstall != ""
			${NSD_GetState} $RB_Reinstall $TI_REINSTALL
		${EndIf}
		${If} $RB_Upgrade != ""
			${NSD_GetState} $RB_Upgrade $TI_UPGRADE
		${EndIf}
		${If} $RB_Downgrade != ""
			${NSD_GetState} $RB_Downgrade $TI_DOWNGRADE
		${EndIf}
		${If} $RB_Parallel != ""
			${NSD_GetState} $RB_Parallel $TI_PARALLEL
		${EndIf}

		StrCpy $Skip_Page_Directory ""
		${If} $TI_REINSTALL == 1
			StrCpy $INSTALL_TYPE 1
		${ElseIf} $TI_UPGRADE == 1
			StrCpy $INSTALL_TYPE 2
		${ElseIf} $TI_DOWNGRADE == 1
			StrCpy $INSTALL_TYPE 3
		${ElseIf} $TI_PARALLEL == 1
			StrCpy $INSTALL_TYPE 4
		${EndIf}

		${If} $INSTALL_TYPE == 1
		${OrIf} $INSTALL_TYPE == 2
		${OrIf} $INSTALL_TYPE == 3
			StrCpy $Skip_Page_Directory 1
			ReadRegStr $0 HKLM "$Prev_Install_RegKey" "InstallLocation"
			StrCpy $INSTDIR $0
		${EndIf}

		; On Upgrade or Downgrade, tentatively trim any Package Version trailer from install location
                ${If} $INSTALL_TYPE == 2
                ${OrIf} $INSTALL_TYPE == 3
                    StrCpy $R1 0
                     Push $INSTDIR
                     Push "OpenCPN\plugins\s63_pi"
                     Push ">"
                     Call StrLoc
                     Pop $0

                    StrCpy $R1 $INSTDIR $0
                    StrCpy $R1 "$R1OpenCPN\plugins\s63_pi"
                    StrLen $R2 $INSTDIR
                    StrLen $R3 $R1

/*
                    ;   If Previous install dir was a parallel, make the upgrade also parallel.
                    ${If} $R2 > $R3
                        StrCpy $INSTDIR "$R1 @CPACK_PACKAGE_VERSION@"
                    ${Else}
                        StrCpy $INSTDIR $R1
                    ${Endif}
*/
                ${Endif}

		${If} $INSTALL_TYPE == 4
			StrCpy $INSTDIR "$PROGRAMFILES\OpenCPN\plugins\s63_pi @CPACK_PACKAGE_VERSION@"
		${EndIf}
	FunctionEnd

/*
;--------------------------------
;# Page_Components_Pre
	Function Page_Components_Pre

	FunctionEnd

;--------------------------------
;# Page_Components_Show
	Function Page_Components_Show
	  ;# change controls size and position on the Components Page
		Push $0
		Push $1
		Push $2
		Push $3
		Push $4
		Push $5
		Push $6
		Push $7

		FindWindow $mui.ComponentsPage "#32770" "" $HWNDPARENT

		;GetDlgItem $mui.ComponentsPage.Text             $mui.ComponentsPage 1006
		GetDlgItem $mui.ComponentsPage.InstTypesText    $mui.ComponentsPage 1021
		ShowWindow $mui.ComponentsPage.InstTypesText ${SW_HIDE}

		GetDlgItem $mui.ComponentsPage.ComponentsText   $mui.ComponentsPage 1022
		GetDlgItem $mui.ComponentsPage.InstTypes        $mui.ComponentsPage 1017
		ShowWindow $mui.ComponentsPage.InstTypes ${SW_HIDE}

		GetDlgItem $mui.ComponentsPage.Components       $mui.ComponentsPage 1032
		GetDlgItem $mui.ComponentsPage.DescriptionTitle $mui.ComponentsPage 1042
		GetDlgItem $mui.ComponentsPage.DescriptionText  $mui.ComponentsPage 1043
		GetDlgItem $mui.ComponentsPage.SpaceRequired    $mui.ComponentsPage 1023
		ShowWindow $mui.ComponentsPage.SpaceRequired ${SW_HIDE}

		Push "198"
		Push "40"
		Push "100"
		Push "100"
		Call DU2Pix
		System::Call "User32::SetWindowPos(i $mui.ComponentsPage.DescriptionTitle, i 0, i $1, i $2, i $3, i $4, i 64)" ;# 1042

		Push "203"
		Push "50"
		Push "90"
		Push "85"
		Call DU2Pix
		System::Call "User32::SetWindowPos(i $mui.ComponentsPage.DescriptionText, i 0, i $1, i $2, i $3, i $4, i 64)" ;# 1043

		Push "0"
		Push "25"
		Push "300"
		Push "15"
		Call DU2Pix
		System::Call "User32::SetWindowPos(i $mui.ComponentsPage.ComponentsText, i 0, i $1, i $2, i $3, i $4, i 64)" ;# 1022

		Push "0"
		Push "40"
		Push "195"
		Push "100"
		Call DU2Pix
		System::Call "User32::SetWindowPos(i $mui.ComponentsPage.Components, i 0, i $1, i $2, i $3, i $4, i 64)" ;# 1032

		Pop $7
		Pop $6
		Pop $5
		Pop $4
		Pop $3
		Pop $2
		Pop $1
		Pop $0
	FunctionEnd

;--------------------------------
;# Page_Components_Leave
	Function Page_Components_Leave
		${IfNot} ${SectionIsSelected} ${SecSetConfig}
			StrCpy $Skip_Page_SetConfig 1
		${Else}
			StrCpy $Skip_Page_SetConfig 0
		${EndIf}

		${IfNot} ${SectionIsSelected} ${SecShortcutStartmenu}
			StrCpy $Skip_Page_Startmenu 1
		${Else}
			StrCpy $Skip_Page_Startmenu 0
		${EndIf}
	FunctionEnd
*/
;--------------------------------
;# Page_Directory_Pre
	Function Page_Directory_Pre
		${If} $Skip_Page_Directory == 1
			Abort
		${EndIf}
	FunctionEnd

;--------------------------------
;# Page_Directory_Leave
	Function Page_Directory_Leave
		GetInstDirError $R0
		${If} $R0 > 0 ;# Invalid path entered
			MessageBox MB_OK|MB_ICONSTOP "$(Msg_Path_Invalid)"
			Abort
		${EndIf}

                ${If} $INSTALL_TYPE == 4
		${AndIf} ${FileExists} "$INSTDIR\opencpn.exe"
			MessageBox MB_OK|MB_ICONSTOP "$(Msg_Path_Installation_Exists)"
			Abort
		${EndIf}
	FunctionEnd





/*
;--------------------------------
;# Page_Startmenu_Pre
	Function Page_Startmenu_Pre
		${If} $Skip_Page_Startmenu == 1
			Abort
		${EndIf}

		${If} $INSTALL_TYPE == 1
		${OrIf} $INSTALL_TYPE == 2
		${OrIf} $INSTALL_TYPE == 3
			ReadRegStr $0 HKLM "$Prev_Install_RegKey" "StartMenuFolder"
			StrCpy $STARTMENU_FOLDER $0
		${EndIf}
	FunctionEnd
*/
;--------------------------------
/*# Page_SetConfig
	Var Label_SetConfig
	Var GroupBox_Language_SetConfig
	Var CheckBox_Language_SetConfig
	Var GroupBox_ChartDir_SetConfig
	Var DirRequest_SetConfig
	Var Button_Delete_SetConfig
	Var Button_DeleteAll_SetConfig
	Var Button_Add_SetConfig
	Var ListBox_SetConfig
*/

/*
	Function Page_SetConfig
		${If} $Skip_Page_SetConfig == 1
			Abort
		${EndIf}
		!insertmacro MUI_HEADER_TEXT $(Page_SetConfig_Title) $(Page_SetConfig_Subtitle)
		nsDialogs::Create /NOUNLOAD 1018
		Pop $0
		${If} $0 == error
			Abort
		${EndIf}

		${NSD_CreateLabel} 0 0 100% 16u "$(Label_SetConfig_Text)"
		Pop $Label_SetConfig

		${NSD_CreateGroupBox} 0 20u 100% 30u "$(GB_Language_SetConfig_Text)"
		Pop $GroupBox_Language_SetConfig

		${NSD_CreateCheckBox} 10u 35u 100% 10u "$(CB_Language_SetConfig_Text)"
		Pop $CheckBox_Language_SetConfig
		;StrCmp $CONFIG_SET_LANG "" cont
		${If} $CONFIG_SET_LANG == ""
			${NSD_SetState} $CheckBox_Language_SetConfig ${BST_CHECKED}
			Goto cont
		${EndIf}

		StrCmp $CONFIG_SET_LANG 0 0 +2
		${NSD_SetState} $CheckBox_Language_SetConfig ${BST_UNCHECKED}
		StrCmp $CONFIG_SET_LANG 1 0 +2
		${NSD_SetState} $CheckBox_Language_SetConfig ${BST_CHECKED}

		cont:
		${NSD_CreateGroupBox} 0 55u 100% 85u "$(GB_ChartDir_SetConfig_Text)"
		Pop $GroupBox_ChartDir_SetConfig

		${NSD_CreateButton} 220u 70u 60u 15u "$(BT_Delete_SetConfig_Text)"
		Pop $Button_Delete_SetConfig
		GetFunctionAddress $0 Button_Delete_SetConfig_Click
		nsDialogs::OnClick /NOUNLOAD $Button_Delete_SetConfig $0

		${NSD_CreateButton} 220u 88u 60u 15u "$(BT_DeleteAll_SetConfig_Text)"
		Pop $Button_DeleteAll_SetConfig
		GetFunctionAddress $0 Button_DeleteAll_SetConfig_Click
		nsDialogs::OnClick /NOUNLOAD $Button_DeleteAll_SetConfig $0

		${NSD_CreateButton} 220u 115u 60u 15u "$(BT_Browse_SetConfig_Text)"
		Pop $Button_Add_SetConfig
		GetFunctionAddress $0 Button_Add_SetConfig_Click
		nsDialogs::OnClick /NOUNLOAD $Button_Add_SetConfig $0

		${NSD_CreateListBox} 10u 70u 200u 60u $(LB_SetConfig)
		Pop $ListBox_SetConfig
		GetFunctionAddress $0 ListBox_SetConfig_Change
		nsDialogs::OnChange /NOUNLOAD $ListBox_SetConfig $0
		${IfNot} $CHART_DIR_EMPTY == 1
			SetShellVarContext all
			${If} ${FileExists} "$TEMP\opencpn_chart_dirs.tmp"
				ClearErrors
				FileOpen $R0 "$TEMP\opencpn_chart_dirs.tmp" r
				IfErrors end
				loop:
					ClearErrors
					FileReadUTF16LE $R0 $1
					IfErrors end
					${TrimNewLines} $1 $1
					SendMessage $ListBox_SetConfig ${LB_ADDSTRING} 0 "STR:$1"
					Goto loop
				end:
					FileClose $R0
			${ElseIf} $INI_EXISTS == 1
				StrCpy $R2 0
				loop2:
					IntOp $R2 $R2 + 1
					ReadINIStr $R1 "$APPDATA\@CPACK_NSIS_PACKAGE_NAME_LC@\opencpn.ini" "ChartDirectories" "ChartDir$R2"
					StrCmp $R1 "" cont2
					${WordReplace} "$R1" "\\" "\" "+" $R3
					${Explode} $R4 "^" "$R3"
					Pop $R5
					StrCmp $R5 "" cont2
					SendMessage $ListBox_SetConfig ${LB_ADDSTRING} 0 "STR:$R5"
					Goto loop2
			${Else}
				ReadRegStr $0 HKLM "Software\OpenCPN" "ChartDirs"
				StrCmp $0 "" cont2
				${Explode} $3 ";" "$0"
				${For} $1 1 $3
					Pop $2
					${TrimNewLines} $2 $2
					SendMessage $ListBox_SetConfig ${LB_ADDSTRING} 0 "STR:$2"
				${Next}
			${EndIf}
		${EndIf}

		cont2:
			Call ListBox_SetConfig_Change
			nsDialogs::Show
	FunctionEnd

	Function Button_Delete_SetConfig_Click
		SendMessage $ListBox_SetConfig ${LB_GETCURSEL} 0 0 $0
		SendMessage $ListBox_SetConfig ${LB_DELETESTRING} $0 0
		Call ListBox_SetConfig_Change
	FunctionEnd

	Function Button_DeleteAll_SetConfig_Click
		SendMessage $ListBox_SetConfig ${LB_RESETCONTENT} 0 0
		Call ListBox_SetConfig_Change
	FunctionEnd

	Function Button_Add_SetConfig_Click
		Var /GLOBAL Initial_Dir
		StrCmp $Initial_Dir "" 0 +3
		SetShellVarContext all
		StrCpy $Initial_Dir "$DOCUMENTS"
		nsDialogs::SelectFolderDialog /NOUNLOAD "$(Select_Chart_Directory)" "$Initial_Dir"
		Pop $0
		${If} $0 == error
			Abort
		${EndIf}
		StrCpy $Initial_Dir $0
		${NSD_LB_GetCount} $ListBox_SetConfig $2
		${If} $2 > 0
			SendMessage $ListBox_SetConfig ${LB_FINDSTRINGEXACT} -1 "STR:$0" $6
			${IfNot} $6 < 0
				Goto end
			${EndIf}
		${EndIf}
		SendMessage $ListBox_SetConfig ${LB_ADDSTRING} 0 "STR:$0"
		end:
		Call ListBox_SetConfig_Change
	FunctionEnd

	Function ListBox_SetConfig_Change
		${NSD_LB_GetCount} $ListBox_SetConfig $0
		${If} $0 > 0
			StrCpy $CHART_DIR_EMPTY 0
			${NSD_LB_GetSelection} $ListBox_SetConfig $1
			${If} $1 != ""
				EnableWindow $Button_Delete_SetConfig 1
			${Else}
				EnableWindow $Button_Delete_SetConfig 0
			${EndIf}
			EnableWindow $Button_DeleteAll_SetConfig 1
		${Else}
			EnableWindow $Button_Delete_SetConfig 0
			EnableWindow $Button_DeleteAll_SetConfig 0
			StrCpy $CHART_DIR_EMPTY 1
		${EndIf}
	FunctionEnd

*/
/*
;--------------------------------
# Page_SetConfig_Leave
#	Var CHART_DIR_TMP_FILE

	Function Page_SetConfig_Leave
		${NSD_LB_GetCount} $ListBox_SetConfig $0
		${If} $0 > 0
			ClearErrors
			FileOpen $R0 "$TEMP\opencpn_chart_dirs.tmp" w
			IfErrors done
			IntOp $0 $0 - 1
			${For} $1 0 $0
				SendMessage $ListBox_SetConfig ${LB_SETCURSEL} $1 0
				System::Call "User32::SendMessage(i $ListBox_SetConfig, i ${LB_GETTEXT}, i $1, t .r2)"
				FileWriteUTF16LE $R0 $2
				FileWriteUTF16LE $R0 "$\r$\n"
			${Next}
			FileClose $R0
			StrCpy $CHART_DIR_TMP_FILE 1
		${Else}
			StrCpy $CHART_DIR_EMPTY 1
		${EndIf}

		done:
		${NSD_GetState} $CheckBox_Language_SetConfig $0
		${If} $0 == ${BST_CHECKED}
			StrCpy $CONFIG_SET_LANG 1
		${Else}
			StrCpy $CONFIG_SET_LANG 0
		${EndIf}
	FunctionEnd
*/
;--------------------------------
;# Page_Confirm
	Var Install_Options
	Var TEXT_INSTALL_OPTIONS
	Function Page_Confirm
		!insertmacro MUI_HEADER_TEXT $(Page_Confirm_Title) $(Page_Confirm_Subtitle)
		;# gather all installation settings and prepare (string) variable '$Install_Options' to display
		;# add the installation type to '$Install_Options'
		StrCpy $Install_Options "$(Installation_Type):$\r$\n"
		${If} $Skip_Page_TypeInst != 1
			${Switch} $INSTALL_TYPE
				${Case} 1
					StrCpy $Install_Options "$Install_Options$\t$(Type_Reinstall)"
					${Break}
				${Case} 2
					StrCpy $Install_Options "$Install_Options$\t$(Type_Upgrade)"
					${Break}
				${Case} 3
					StrCpy $Install_Options "$Install_Options$\t$(Type_Downgrade)"
					${Break}
				${Case} 4
					StrCpy $Install_Options "$Install_Options$\t$(Type_Parallel_Installation)"
					${Break}
				${Default}
					${Break}
			${EndSwitch}
		${Else}
			StrCpy $Install_Options "$Install_Options$\t$(Type_Fresh_Installation)"
		${EndIf}

		;# add the installation directory to '$Install_Options'
		StrCpy $Install_Options "$Install_Options$\r$\n$\r$\n$(Installation_Directory):$\r$\n$\t$INSTDIR"

/*
		;# add the delete config settings to '$Install_Options'
		${If} $CONFIG_EXISTS == 1
		${AndIf} $CONFIG_EMPTY != 1
			StrCpy $Install_Options "$Install_Options$\r$\n$\r$\n$(Installation_Delete_Config):"
			SectionGetFlags ${SecGrpResetConfig} $0
			SectionGetFlags ${SecGrpResetConfig} $1
			IntOp $0 $0 & ${SF_SELECTED}
			IntOp $1 $1 & ${SF_PSELECTED}
			StrCmp $0 0 +3 0
			StrCpy $Install_Options "$Install_Options$\r$\n$\t$(SecGrpResetConfig_Text)"
			Goto cont

			StrCmp $1 0 none_selected 0
			SectionGetFlags ${SecDeleteConfigFile} $0
			IntOp $0 $0 & ${SF_SELECTED}
			StrCmp $0 0 +2 0
			StrCpy $Install_Options "$Install_Options$\r$\n$\t$(SecDeleteConfigFile_Text)"
			SectionGetFlags ${SecDeleteChartDB} $0
			IntOp $0 $0 & ${SF_SELECTED}
			StrCmp $0 0 +2 0
			StrCpy $Install_Options "$Install_Options$\r$\n$\t$(SecDeleteChartDB_Text)"
			SectionGetFlags ${SecDeleteSENC} $0
			IntOp $0 $0 & ${SF_SELECTED}
			StrCmp $0 0 +2 0
			StrCpy $Install_Options "$Install_Options$\r$\n$\t$(SecDeleteSENC_Text)"
			SectionGetFlags ${SecDeleteCM93} $0
			IntOp $0 $0 & ${SF_SELECTED}
			StrCmp $0 0 +2 0
			StrCpy $Install_Options "$Install_Options$\r$\n$\t$(SecDeleteCM93_Text)"
			SectionGetFlags ${SecDeleteNavobjFile} $0
			IntOp $0 $0 & ${SF_SELECTED}
			StrCmp $0 0 +2 0
			StrCpy $Install_Options "$Install_Options$\r$\n$\t$(SecDeleteNavobjFile_Text)"
			SectionGetFlags ${SecDeleteLogFile} $0
			IntOp $0 $0 & ${SF_SELECTED}
			StrCmp $0 0 +2 0
			StrCpy $Install_Options "$Install_Options$\r$\n$\t$(SecDeleteLogFile_Text)"
			Goto cont

			none_selected:
			StrCpy $Install_Options "$Install_Options$\r$\n$\t$(text_none)"

			cont:
		${EndIf}
*/

/*
		;# add the shortcut settings to '$Install_Options'
		StrCpy $Install_Options "$Install_Options$\r$\n$\r$\n$(Create_Shortcuts):"
		SectionGetFlags ${SecShortcutStartmenu} $0
		IntOp $0 $0 & ${SF_SELECTED}
		${If} $0 != 0
			StrCpy $Install_Options "$Install_Options$\r$\n$\t$(Create_Shortcut_Start_Menu): $STARTMENU_FOLDER"
			StrCpy $2 1
		${Else}
			StrCpy $2 0
		${EndIf}

		SectionGetFlags ${SecShortcutDesktop} $0
		IntOp $0 $0 & ${SF_SELECTED}
		${If} $0 != 0
			StrCpy $Install_Options "$Install_Options$\r$\n$\t$(Create_Shortcut_Desktop): $DESKTOP"
		${Else}
			StrCmp $2 0 0 +2
			StrCpy $Install_Options "$Install_Options$\r$\n$\t$(text_none)"
		${EndIf}
*/

/*
		;# add the pre-config settings to '$Install_Options'
		${IfNot} ${SectionIsReadOnly} ${SecSetConfig}
		${AndIf} ${SectionIsSelected} ${SecSetConfig}
			StrCpy $Install_Options "$Install_Options$\r$\n$\r$\n$(SecSetConfig_Text):"
			StrCmp $CONFIG_SET_LANG 1 0 +2
			StrCpy $Install_Options "$Install_Options$\r$\n$\t$(CB_Language_SetConfig_Text)"
			StrCmp $CHART_DIR_TMP_FILE 1 0 end
			IfFileExists "$TEMP\opencpn_chart_dirs.tmp" 0 end
			StrCpy $Install_Options "$Install_Options$\r$\n$\t$(GB_ChartDir_SetConfig_Text)"
			ClearErrors
			FileOpen $0 "$TEMP\opencpn_chart_dirs.tmp" r
			IfErrors end
			${Do}
				FileReadUTF16LE $0 $1
				IfErrors done
				${TrimNewLines} $1 $1
				StrCmp $1 "" +2
				StrCpy $Install_Options "$Install_Options$\r$\n$\t - $1"
			${Loop}
			done:
			FileClose $0
			end:
		${EndIf}
		;# end '$Install_Options'
*/
		nsDialogs::Create /NOUNLOAD 1018
		Pop $0
		${If} $0 == error
			Abort
		${EndIf}

		nsDialogs::CreateControl EDIT "${__NSD_Text_STYLE}|${WS_VSCROLL}|${WS_HSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN}|${ES_READONLY}" "${__NSD_Text_EXSTYLE}" 0 0 100% 100% "$Install_Options"
		Pop $TEXT_INSTALL_OPTIONS

		nsDialogs::Show
	FunctionEnd

;# Page_Instfiles_Show
	Function Page_Instfiles_Show
		w7tbp::Start
	FunctionEnd

;--------------------------------
;##################################################################################################
;#                                  General Installer Functions                                   #
;##################################################################################################
Function GetAllUsers
	ReadRegStr $0 HKLM "System\CurrentControlSet\Control\ComputerName\ActiveComputerName" "ComputerName"
	System::Call 'netapi32::NetUserEnum(w "\\$0",i 0,i 2,*i .R0,i ${NSIS_MAX_STRLEN}, *i .R1,*i .R2,*i .r1)i .r2'
	StrCpy $R8 $R0
	IntOp $R2 $R2 - 1
	${ForEach} $9 0 $R2 + 1
		System::Call "*$R0(w.R9)"
		MessageBox MB_OK "[$R9]"
		IntOp $R0 $R0 + 4
	${Next}
	System::Call 'netapi32.dll::NetApiBufferFree(i R8)i .R1'
FunctionEnd


Function Hide_SecGrpResetConfig
	Push $0
	!insertmacro ClearSectionFlag ${SecDeleteConfigFile} ${SF_SELECTED}
	SectionSetText ${SecDeleteConfigFile} ""
	!insertmacro ClearSectionFlag ${SecDeleteChartDB} ${SF_SELECTED}
	SectionSetText ${SecDeleteChartDB} ""
	!insertmacro ClearSectionFlag ${SecDeleteSENC} ${SF_SELECTED}
	SectionSetText ${SecDeleteSENC} ""
	!insertmacro ClearSectionFlag ${SecDeleteCM93} ${SF_SELECTED}
	SectionSetText ${SecDeleteCM93} ""
	!insertmacro ClearSectionFlag ${SecDeleteNavobjFile} ${SF_SELECTED}
	SectionSetText ${SecDeleteNavobjFile} ""
	!insertmacro ClearSectionFlag ${SecDeleteLogFile} ${SF_SELECTED}
	SectionSetText ${SecDeleteLogFile} ""
	!insertmacro ClearSectionFlag ${SecGrpResetConfig} ${SF_SECGRP}
	!insertmacro ClearSectionFlag ${SecGrpResetConfig} ${SF_SELECTED}
	SectionSetFlags ${SecGrpResetConfig} 0
	SectionSetText ${SecGrpResetConfig} ""
	IntOp $0 ${SecDeleteLogFile} + 1
	!insertmacro ClearSectionFlag $0 ${SF_SECGRPEND}
	SectionSetText $0 ""
	Pop $0
FunctionEnd


Function Check_Config_Exists
	;# Look for config dir ("%APPDATA%\opencpn) and the several config files
	SetShellVarContext all

	${IfNot} ${FileExists} "$APPDATA\@CPACK_NSIS_PACKAGE_NAME_LC@\*.*"
		${If} ${FileExists} "$USERS_APPDATA\@CPACK_NSIS_PACKAGE_NAME_LC@\*.*"
			CreateDirectory "$APPDATA\@CPACK_NSIS_PACKAGE_NAME_LC@"
			Sleep 250
			AccessControlW::GrantOnFile "$APPDATA\@CPACK_NSIS_PACKAGE_NAME_LC@" "(BU)" "GenericRead + GenericExecute + GenericWrite + Delete + FullAccess"
			CopyFiles /SILENT "$USERS_APPDATA\@CPACK_NSIS_PACKAGE_NAME_LC@\*.*" "$APPDATA\@CPACK_NSIS_PACKAGE_NAME_LC@"
		${ElseIf} ${FileExists} "$ADMIN_APPDATA\@CPACK_NSIS_PACKAGE_NAME_LC@\*.*"
			CreateDirectory "$APPDATA\@CPACK_NSIS_PACKAGE_NAME_LC@"
			Sleep 250
			AccessControlW::GrantOnFile "$APPDATA\@CPACK_NSIS_PACKAGE_NAME_LC@" "(BU)" "GenericRead + GenericExecute + GenericWrite + Delete + FullAccess"
			CopyFiles /SILENT "$ADMIN_APPDATA\@CPACK_NSIS_PACKAGE_NAME_LC@\*.*" "$APPDATA\@CPACK_NSIS_PACKAGE_NAME_LC@"
		${EndIf}

		${If} ${FileExists} "$APPDATA\@CPACK_NSIS_PACKAGE_NAME_LC@\opencpn.ini"
			DeleteINISec "$APPDATA\@CPACK_NSIS_PACKAGE_NAME_LC@\opencpn.ini" Directories
		${EndIf}
	${EndIf}

	${If} ${FileExists} "$APPDATA\@CPACK_NSIS_PACKAGE_NAME_LC@\*.*"
		StrCpy $CONFIG_EXISTS 1
		SectionSetText ${SecGrpResetConfig} $(SecGrpResetConfig_Text)
	${EndIf}
	StrCpy $Count_SecGrpResetConfig 0
	${If} $CONFIG_EXISTS == 1
		${If} ${FileExists} "$APPDATA\@CPACK_NSIS_PACKAGE_NAME_LC@\opencpn.ini"
			StrCpy $INI_EXISTS 1
			IntOp $Count_SecGrpResetConfig $Count_SecGrpResetConfig + 1
			SectionSetText ${SecDeleteConfigFile} $(SecDeleteConfigFile_Text)
		${Else}
			!insertmacro ClearSectionFlag ${SecDeleteConfigFile} ${SF_SELECTED}
			SectionSetText ${SecDeleteConfigFile} ""
		${EndIf}

		${If} ${FileExists} "$APPDATA\@CPACK_NSIS_PACKAGE_NAME_LC@\CHRTLIST.DAT"
			StrCpy $CHARTDB_EXISTS 1
			IntOp $Count_SecGrpResetConfig $Count_SecGrpResetConfig + 1
			SectionSetText ${SecDeleteChartDB} $(SecDeleteChartDB_Text)
		${Else}
			!insertmacro ClearSectionFlag ${SecDeleteChartDB} ${SF_SELECTED}
			SectionSetText ${SecDeleteChartDB} ""
		${EndIf}

		${If} ${FileExists} "$APPDATA\@CPACK_NSIS_PACKAGE_NAME_LC@\SENC\*.*"
			StrCpy $SENC_EXISTS 1
			IntOp $Count_SecGrpResetConfig $Count_SecGrpResetConfig + 1
			SectionSetText ${SecDeleteSENC} $(SecDeleteSENC_Text)
		${Else}
			!insertmacro ClearSectionFlag ${SecDeleteSENC} ${SF_SELECTED}
			SectionSetText ${SecDeleteSENC} ""
		${EndIf}

		${If} ${FileExists} "$APPDATA\@CPACK_NSIS_PACKAGE_NAME_LC@\cm93\*.*"
			StrCpy $CM93_EXISTS 1
			IntOp $Count_SecGrpResetConfig $Count_SecGrpResetConfig + 1
			SectionSetText ${SecDeleteCM93} $(SecDeleteCM93_Text)
		${Else}
			!insertmacro ClearSectionFlag ${SecDeleteCM93} ${SF_SELECTED}
			SectionSetText ${SecDeleteCM93} ""
		${EndIf}

		${If} ${FileExists} "$APPDATA\@CPACK_NSIS_PACKAGE_NAME_LC@\navobj.xml"
			StrCpy $NAVOBJ_EXISTS 1
			IntOp $Count_SecGrpResetConfig $Count_SecGrpResetConfig + 1
			SectionSetText ${SecDeleteNavobjFile} $(SecDeleteNavobjFile_Text)
		${Else}
			!insertmacro ClearSectionFlag ${SecDeleteNavobjFile} ${SF_SELECTED}
			SectionSetText ${SecDeleteNavobjFile} ""
		${EndIf}

		${If} ${FileExists} "$APPDATA\@CPACK_NSIS_PACKAGE_NAME_LC@\opencpn.log"
			StrCpy $LOG_EXISTS 1
			IntOp $Count_SecGrpResetConfig $Count_SecGrpResetConfig + 1
			SectionSetText ${SecDeleteLogFile} $(SecDeleteLogFile_Text)
		${Else}
			!insertmacro ClearSectionFlag ${SecDeleteLogFile} ${SF_SELECTED}
			SectionSetText ${SecDeleteLogFile} ""
		${EndIf}

		${If} $Count_SecGrpResetConfig == 0
			StrCpy $CONFIG_EMPTY 1
		${EndIf}

		!insertmacro ClearSectionFlag ${SecSetConfig} ${SF_SELECTED}
		IntOp $0 ${SF_RO} | ${SF_BOLD}
		SectionSetFlags ${SecSetConfig} $0
		;SectionSetFlags ${SecSetConfig} ${SF_RO}
		StrCpy $SetConfig 0
	${EndIf}
FunctionEnd


Function Reg_Scan_Old_Versions_HKLM
	;# Registry look-up
	;# Versions prior to 2.2.727 write RegKey "OpenCPN_is1" to "HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall"
	ReadRegStr $0 HKLM Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenCPN_is1 "DisplayName"
	${If} $0 != ""
		${StrFilter} "$0" "31" "." " " $1
		StrCpy $LM_VERSION "$1"
		ReadRegStr $0 HKLM Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenCPN_is1 "UninstallString"
		${StrFilter} "$0" "" "" "$\"" $2
		${If} ${FileExists} "$2"
			ReadRegStr $0 HKLM Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenCPN_is1 "QuietUninstallString"
			${StrFilter} "$0" "" "" "$\"" $3
			StrCpy $LM_VERSION_UNINST $3
			ReadRegStr $4 HKLM Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenCPN_is1 "InstallLocation"
			${TrimNewLines} $4 $4
			${If} ${FileExists} "$4opencpn.exe"
			${AndIf} ${FileExists} "$4unins*.exe"
				;# check if last character of $4 is a "\" and if so remove it
				${RIndexOf} $6 "$4" "\"
				${If} $6 == 1
					${WordReplace} "$4" "\" "" "-1" $4
				${EndIf}

				StrCpy $LM_VERSION_INST $4
				IntOp $OLD_INSTALLS $OLD_INSTALLS + 1
				;StrCpy $VERSION_NEWER 1
			${Else}
				DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenCPN_is1"
				StrCpy $LM_VERSION ""
				StrCpy $LM_VERSION_UNINST ""
			${EndIf}
		${EndIf}
	${EndIf}
FunctionEnd


Function EnumProfileList
	${EnumHKU} Callback_EnumProfileList opencpn-inst-tmp-sid
FunctionEnd


Function Callback_EnumProfileList
	;# Get the SID or tmpkey from the stack
	Pop $SID
	ClearErrors
	${If} ${FileExists} "$TEMP\opencpn_users_sid.tmp"
		FileOpen $R0 "$TEMP\opencpn_users_sid.tmp" a
		FileSeek $R0 0 END
	${Else}
		FileOpen $R0 "$TEMP\opencpn_users_sid.tmp" w
	${EndIf}

	IfErrors done
	FileWriteUTF16LE $R0 "$SID"
	FileWriteUTF16LE $R0 "$\r$\n"
	FileWriteUTF16LE $R0 "$USERPROFILE"
	FileWriteUTF16LE $R0 "$\r$\n"
	FileClose $R0
	done:
FunctionEnd


Function Get_Users_Values
	Var /GLOBAL tmp_file_handle
	StrCpy $SID ""
	ClearErrors
	${If} ${FileExists} "$TEMP\opencpn_users_sid.tmp"
		FileOpen $tmp_file_handle "$TEMP\opencpn_users_sid.tmp" r
		IfErrors end
		${Do}
			FileReadUTF16LE $tmp_file_handle $SID
			FileReadUTF16LE $tmp_file_handle $USERPROFILE
			StrCmp $SID "" done
			${TrimNewLines} $SID $SID
			${TrimNewLines} $USERPROFILE $USERPROFILE
			;# List of functions to call
			Call Users_Appdata_Paths
			Call Users_StartMenu_Paths
			Call Users_Desktop_Paths
			Call Users_Personal_Paths
			Call Reg_Scan_Old_Versions_HKCU
		${Loop}
		done:
		FileClose $tmp_file_handle
		StrCpy $SID ""
		StrCpy $USERPROFILE ""
	${EndIf}
	end:
FunctionEnd


Function Users_Appdata_Paths
	ReadRegStr $1 HKU "$SID\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" AppData
	${WordReplace} "$1" "%USERPROFILE%" "$USERPROFILE" "+" $2
	ExpandEnvStrings $2 $2
	StrCmp $2 "" done

	StrCpy $5 "none"
	;# check if an OpenCPN config folder exists in the given path
	${If} ${FileExists} "$2\@CPACK_NSIS_PACKAGE_NAME_LC@\opencpn.ini"
		ReadINIStr $3 "$2\@CPACK_NSIS_PACKAGE_NAME_LC@\opencpn.ini" Directories S57DataLocation
		${WordReplace} "$3" "\\" "\" "+" $4
		${WordFind} "$4" "\" "-2{*" $5
		StrCmp $5 "" 0 +2
		StrCpy $5 "none"
	${EndIf}

	ClearErrors
	${If} ${FileExists} "$TEMP\opencpn_appdata.tmp"
		FileOpen $R0 "$TEMP\opencpn_appdata.tmp" a
		FileSeek $R0 0 END
	${Else}
		FileOpen $R0 "$TEMP\opencpn_appdata.tmp" w
	${EndIf}
	IfErrors done
	FileWriteUTF16LE $R0 "$SID"
	FileWriteUTF16LE $R0 "$\r$\n"
	FileWriteUTF16LE $R0 "$2"
	FileWriteUTF16LE $R0 "$\r$\n"
	FileWriteUTF16LE $R0 "$5"
	FileWriteUTF16LE $R0 "$\r$\n"
	FileClose $R0
	done:
FunctionEnd


Function Users_Personal_Paths
	ReadRegStr $1 HKU "$SID\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" Personal
	${WordReplace} "$1" "%USERPROFILE%" "$USERPROFILE" "+" $2
	ExpandEnvStrings $2 $2

	ClearErrors
	${If} ${FileExists} "$TEMP\opencpn_personal.tmp"
		FileOpen $R0 "$TEMP\opencpn_personal.tmp" a
		IfErrors done
		FileSeek $R0 0 END
	${Else}
		FileOpen $R0 "$TEMP\opencpn_personal.tmp" w
		IfErrors done
	${EndIf}

	FileWriteUTF16LE $R0 "$SID"
	FileWriteUTF16LE $R0 "$\r$\n"
	FileWriteUTF16LE $R0 "$2"
	FileWriteUTF16LE $R0 "$\r$\n"
	FileClose $R0
	done:
FunctionEnd


Function Users_StartMenu_Paths
	ReadRegStr $1 HKU "$SID\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" "Start Menu"
	${WordReplace} "$1" "%USERPROFILE%" "$USERPROFILE" "+" $2
	ExpandEnvStrings $2 $2

	ClearErrors
	${If} ${FileExists} "$TEMP\opencpn_startmenu.tmp"
		FileOpen $R0 "$TEMP\opencpn_startmenu.tmp" a
		FileSeek $R0 0 END
	${Else}
		FileOpen $R0 "$TEMP\opencpn_startmenu.tmp" w
	${EndIf}
	IfErrors done
	FileWriteUTF16LE $R0 "$SID"
	FileWriteUTF16LE $R0 "$\r$\n"
	FileWriteUTF16LE $R0 "$2"
	FileWriteUTF16LE $R0 "$\r$\n"
	FileClose $R0
	done:
FunctionEnd


Function Users_Desktop_Paths
	ReadRegStr $1 HKU "$SID\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" Desktop
	${WordReplace} "$1" "%USERPROFILE%" "$USERPROFILE" "+" $2
	ExpandEnvStrings $2 $2

	ClearErrors
	${If} ${FileExists} "$TEMP\opencpn_desktop.tmp"
		FileOpen $R0 "$TEMP\opencpn_desktop.tmp" a
		FileSeek $R0 0 END
	${Else}
		FileOpen $R0 "$TEMP\opencpn_desktop.tmp" w
	${EndIf}
	IfErrors done
	FileWriteUTF16LE $R0 "$SID"
	FileWriteUTF16LE $R0 "$\r$\n"
	FileWriteUTF16LE $R0 "$2"
	FileWriteUTF16LE $R0 "$\r$\n"
	FileClose $R0
	done:
FunctionEnd


;Var latest_version
;Var latest_pathexe
Function Reg_Scan_Old_Versions_HKCU
	;# Versions from 2.2.727 up to 2.2.xxxx write RegKey "OpenCPN" to "HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall\"
	;# and also RegKey "OpenCPN <version>" to "HKCU\Software\opencpn.org\"
	;# Find latest installed version => it's the one found in "HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenCPN"

	ReadRegStr $0 HKU "$SID\Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenCPN" "DisplayVersion"
	${If} $0 != ""
		StrCpy $latest_version $0
		ReadRegStr $0 HKU "$SID\Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenCPN" "DisplayIcon"
		StrCpy $latest_pathexe $0
		ReadRegStr $0 HKU "$SID\Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenCPN" "UninstallString"
		;StrCpy $CU_VERSION_UNINST $0
		${WordFind} "$0" "\" "-2{*" $1
		${If} ${FileExists} "$1\opencpn.exe"
		${AndIf} ${FileExists} "$1\unins*.exe"
			ClearErrors
			${If} ${FileExists} "$TEMP\opencpn_old_uninstall_regkeys.tmp"
				FileOpen $R0 "$TEMP\opencpn_old_uninstall_regkeys.tmp" a
				FileSeek $R0 0 END
			${Else}
				FileOpen $R0 "$TEMP\opencpn_old_uninstall_regkeys.tmp" w
			${EndIf}

			IfErrors done
			FileWriteUTF16LE $R0 "$SID$\r$\n"
			FileWriteUTF16LE $R0 "$SID\Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenCPN$\r$\n"
			FileWriteUTF16LE $R0 "$1$\r$\n"
			FileClose $R0
		${Else}
			DeleteRegKey HKU "$SID\Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenCPN"
		${EndIf}
	${EndIf}

	done:
	ClearErrors
	${Do}
		Pop $0
		IfErrors empty
	${Loop}
	empty:
	StrCpy $0 0
	StrCpy $1 ""
	${Do}
		EnumRegKey $1 HKU "$SID\Software\opencpn.org" $0
		StrCmp $1 "" done1
		IntOp $0 $0 + 1
		Push $1
	${Loop}
	done1:
	${If} $0 > 0
		ClearErrors
		${If} ${FileExists} "$TEMP\opencpn_old_installs.tmp"
			FileOpen $R0 "$TEMP\opencpn_old_installs.tmp" a
			FileSeek $R0 0 END
		${Else}
			FileOpen $R0 "$TEMP\opencpn_old_installs.tmp" w
		${EndIf}
		IfErrors done2
		${Do}
			Pop $R1
			IfErrors finished
			${StrFilter} "$R1" "31" "." " " $R2 ;# R2 = version
			;StrCpy $CU_VERSION $R2
			ReadRegStr $R3 HKU "$SID\Software\opencpn.org\$R1" "" ;# R3 = install path
			ReadRegStr $R4 HKU "$SID\Software\opencpn.org\$R1" "Start Menu Folder" ;# R4 = Start Menu Folder
			ReadRegStr $R5 HKU "$SID\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" "Start Menu" ;# R5 = Start Menu Path
			${WordReplace} "$R5" "%USERPROFILE%" "$USERPROFILE" "+" $R5
			ExpandEnvStrings $R5 $R5
			;StrCpy $CU_VERSION_INST "$R3\"
			${If} "$R3\opencpn.exe" == $latest_pathexe
			${AndIf} $R2 != $latest_version
				DeleteRegKey HKU "$SID\Software\opencpn.org\$R1"
			${ElseIf} ${FileExists} "$R3\opencpn.exe"
			${AndIf} ${FileExists} "$R3\unins*.exe"
				FileWriteUTF16LE $R0 "$SID\Software\opencpn.org\$R1"
				FileWriteUTF16LE $R0 "$\r$\n"
				FileWriteUTF16LE $R0 "$R5\$R4"
				FileWriteUTF16LE $R0 "$\r$\n"
				FileWriteUTF16LE $R0 "$R3"
				FileWriteUTF16LE $R0 "$\r$\n"
				IntOp $OLD_INSTALLS $OLD_INSTALLS + 1
				;StrCpy $VERSION_NEWER 1
			${Else}
				DeleteRegKey HKU "$SID\Software\opencpn.org\$R1"
				DeleteRegKey /ifempty HKU "$SID\Software\opencpn.org"
			${EndIf}
		${Loop}
		finished:
		FileClose $R0
	${Else}
		DeleteRegKey HKU "$SID\Software\opencpn.org"
	${EndIf}

	done2:
	StrCpy $latest_version ""
	StrCpy $latest_pathexe ""
FunctionEnd


Function Quick_Scan_Old_Versions
  ;# Scan the given Drive for file "opencpn.exe"
	${If} ${FileExists} "$TEMP\opencpn_personal.tmp"
		ClearErrors
		FileOpen $R0 "$TEMP\opencpn_personal.tmp" r
		IfErrors end
		${Do}
			FileReadUTF16LE $R0 $R1
			FileReadUTF16LE $R0 $R2
			IfErrors done
			StrCmp $R2 "" done
			${TrimNewLines} $R2 $R2
			${Locate} "$R2" "/L=F /M=opencpn.exe" "Found_OpenCPN_Installation"
		${Loop}
		done:
		FileClose $R0
	${EndIf}

	end:
	${Locate} "$PROGRAMFILES" "/L=F /M=opencpn.exe" "Found_OpenCPN_Installation"
FunctionEnd


Function Found_OpenCPN_Installation
	Push $R0
	Push $R1
	${If} ${FileExists} "$R8\unins*.exe"
		${If} ${FileExists} "$TEMP\opencpn_prev_installs.tmp"
			ClearErrors
			FileOpen $R1 "$TEMP\opencpn_prev_installs.tmp" r
			IfErrors cont
			${Do}
				FileReadUTF16LE $R1 $R2
				FileReadUTF16LE $R1 $R3
				StrCmp $R2 "" done
				${TrimNewLines} $R2 $R2
				${TrimNewLines} $R3 $R3
				StrCmp $R3 $R8 found
			${LoopUntil} $R2 == ""
			done:
			FileClose $R1
			Goto cont

			found:
			FileClose $R1
			Goto end
		${EndIf}

		cont:
		IntOp $counter_tmp $counter_tmp + 1
		ClearErrors
		${IfNot} ${FileExists} "$TEMP\opencpn_hdd_quick_scan.tmp"
			FileOpen $R0 "$TEMP\opencpn_hdd_quick_scan.tmp" w
			IfErrors end
		${Else}
			FileOpen $R0 "$TEMP\opencpn_hdd_quick_scan.tmp" a
			IfErrors end
			FileSeek $R0 0 END
		${EndIf}

		FileWriteUTF16LE $R0 "$R8"
		FileWriteUTF16LE $R0 "$\r$\n"
		FileClose $R0
	${EndIf}

	end:
	Pop $R1
	Pop $R0
	Push $0
FunctionEnd


;Var counter_tmp
Function Full_Scan_Old_Versions
  ;# Get all HDD Drive Letters on the system
	StrCpy $counter_tmp 0
	${GetDrives} "HDD" "Scan_Drive"
FunctionEnd


Function Scan_Drive
  ;# Scan the given Drive for file "opencpn.exe"
	/*;#DEBUG - scan only crtain drives
	${IfNot} $9 == "D:\"
	;${AndIfNot} $9 == "F:\"
		Goto end
	${EndIf}
	;#DEBUG End */
	StrCpy $3 "$(Banner_Scan_Drive)"
	GetDlgItem $2 $Banner_Handle 76
	SendMessage $2 ${WM_SETTEXT} 0 "STR:$3"
	${Locate} "$9" "/L=F /M=opencpn.exe" "Found_OCPN_Exe"
	end:
	Push $0
FunctionEnd


Function Found_OCPN_Exe
	Push $1
	ClearErrors
	StrCpy $1 0
	StrCpy $2 0
	${WordFind} "$R8" "\RECYCLER\" "E*" $1
	${WordFind} "$R8" "\$$Recycle.Bin" "E*" $2
	IfErrors 0 cont1
	${If} $1 == 1
	${AndIf} $2 == 1
		Goto cont2
	${EndIf}

	cont1:
	${If} $1 > 0
	${OrIf} $2 > 0
		Goto end
	${EndIf}

	cont2:
	${If} ${FileExists} "$R8\unins*.exe"
		${If} ${FileExists} "$TEMP\opencpn_prev_installs.tmp"
			ClearErrors
			FileOpen $R1 "$TEMP\opencpn_prev_installs.tmp" r
			IfErrors cont3
			${Do}
				FileReadUTF16LE $R1 $R2
				FileReadUTF16LE $R1 $R3
				StrCmp $R2 "" done
				${TrimNewLines} $R2 $R2
				${TrimNewLines} $R3 $R3
				StrCmp $R3 $R8 found
			${LoopUntil} $R2 == ""
			done:
			FileClose $R1
			Goto cont3

			found:
			FileClose $R1
			Goto end
		${EndIf}

		cont3:
		IntOp $counter_tmp $counter_tmp + 1
		GetDlgItem $2 $Banner_Handle 1030
		StrCmp $counter_tmp 1 0 +3
		StrCpy $R4 "$(Banner_Installation_Found_Singular)"
		Goto +2
		StrCpy $R4 "$(Banner_Installation_Found_Plural)"
		SendMessage $2 ${WM_SETTEXT} 0 "STR:$R4"
		SendMessage $ListBox_CleanUp ${LB_ADDSTRING} 0 "STR:$R8"
		ClearErrors
		${IfNot} ${FileExists} "$TEMP\opencpn_hdd_full_scan.tmp"
			FileOpen $R0 "$TEMP\opencpn_hdd_full_scan.tmp" w
			IfErrors end
		${Else}
			FileOpen $R0 "$TEMP\opencpn_hdd_full_scan.tmp" a
			IfErrors end
			FileSeek $R0 0 END
		${EndIf}

		FileWriteUTF16LE $R0 "$R8"
		FileWriteUTF16LE $R0 "$\r$\n"
		FileClose $R0
		end:
	${EndIf}
	Pop $1
	Push $0
FunctionEnd


Function Delete_Installation_Dir
	StrCmp $Uninstall_Path_Tmp "" end
	;# Check subdirs and remove them recursive ...
	${If} ${FileExists} "$Uninstall_Path_Tmp\doc\*.*"
		RMDir /r "$Uninstall_Path_Tmp\doc"
	${EndIf}

	${If} ${FileExists} "$Uninstall_Path_Tmp\lang\*.*"
		RMDir /r "$Uninstall_Path_Tmp\lang"
	${EndIf}

	${If} ${FileExists} "$Uninstall_Path_Tmp\Microsoft.VC80.CRT\*.*"
		RMDir /r "$Uninstall_Path_Tmp\Microsoft.VC80.CRT"
	${EndIf}

	${If} ${FileExists} "$Uninstall_Path_Tmp\s57data\*.*"
		RMDir /r "$Uninstall_Path_Tmp\s57data"
	${EndIf}

	${If} ${FileExists} "$Uninstall_Path_Tmp\sounds\*.*"
		RMDir /r "$Uninstall_Path_Tmp\sounds"
	${EndIf}

	${If} ${FileExists} "$Uninstall_Path_Tmp\TCDATA\*.*"
		RMDir /r "$Uninstall_Path_Tmp\TCDATA"
	${EndIf}

	${If} ${FileExists} "$Uninstall_Path_Tmp\gshhs\*.*"
		RMDir /r "$Uninstall_Path_Tmp\gshhs"
	${EndIf}

	${If} ${FileExists} "$Uninstall_Path_Tmp\plugins\*.*"
		RMDir /r "$Uninstall_Path_Tmp\plugins"
	${EndIf}

	${If} ${FileExists} "$Uninstall_Path_Tmp\share\*.*"
		RMDir /r "$Uninstall_Path_Tmp\share"
	${EndIf}

	;# Check files and delete them ...
	${If} ${FileExists} "$Uninstall_Path_Tmp\opencpn.exe"
		Delete "$Uninstall_Path_Tmp\opencpn.exe"
	${EndIf}

	${If} ${FileExists} "$Uninstall_Path_Tmp\license.txt"
		Delete "$Uninstall_Path_Tmp\license.txt"
	${EndIf}

	${If} ${FileExists} "$Uninstall_Path_Tmp\unins000.dat"
		Delete "$Uninstall_Path_Tmp\unins000.dat"
	${EndIf}

	${If} ${FileExists} "$Uninstall_Path_Tmp\unins000.exe"
		Delete "$Uninstall_Path_Tmp\unins000.exe"
	${EndIf}

	${If} ${FileExists} "$Uninstall_Path_Tmp\install.log"
		Delete "$Uninstall_Path_Tmp\install.log"
	${EndIf}

	${If} ${FileExists} "$Uninstall_Path_Tmp\install.log"
		Delete "$Uninstall_Path_Tmp\install.log"
	${EndIf}

	Push $0
	Push $1
	Push $2
	Push $R9
	Push $R8
	Push $R7
	Push $R6
	;# Find the Uninstall file
	${Locate} "$Uninstall_Path_Tmp" "/L=F /M=Uninstall*.exe /G=0" "Delete_Located_File_Single"
	;# Find the wx.. DLLs
	${Locate} "$Uninstall_Path_Tmp" "/L=F /M=wx*.dll /G=0" "Delete_Located_File_Multi"
	;# Dummy call of Locate as it does not properly close its handle and so the dir cannot be deleted though it might be empty
	${Locate} "C:\" "/L=DE /M=*.* /G=0" "Dummy_Function"

	;# Remove the installation dir ($Uninstall_Path_Tmp) if empty
	RMDir "$Uninstall_Path_Tmp"
	${If} ${FileExists} "$Uninstall_Path_Tmp\*.*"
		Sleep 250
		RMDir "$Uninstall_Path_Tmp"
	${EndIf}

	Pop $R6
	Pop $R7
	Pop $R8
	Pop $R9
	Pop $2
	Pop $1
	Pop $0
	end:
FunctionEnd
	;# Helper-Functions for Delete_Installation_Dir
	Function Delete_Located_File_Single
		Delete "$R9"
		StrCpy $0 StopLocate
		Push $0
	FunctionEnd

	Function Delete_Located_File_Multi
		Delete "$R9"
		Push $0
	FunctionEnd

	Function Dummy_Function
		StrCpy $0 StopLocate
		Push $0
	FunctionEnd
	;# End Helper-Functions


Function ExecAppFile
    !insertmacro UAC_AsUser_ExecShell 'open' '$INSTDIR\opencpn.exe' '' '$INSTDIR' ''
	loop:
    System::Call user32::GetForegroundWindow()i.r0
    Sleep 200
    IntCmpU $0 $hwndparent loop
FunctionEnd


Function DU2Pix
	Pop $4
	Pop $3
	Pop $2
	Pop $1
	IntOp $1 $1 * $BU_X
	IntOp $1 $1 / 4
	IntOp $2 $2 * $BU_Y
	IntOp $2 $2 / 8
	IntOp $3 $3 * $BU_X
	IntOp $3 $3 / 4
	IntOp $4 $4 * $BU_Y
	IntOp $4 $4 / 8
FunctionEnd


;!define LVM_GETITEMCOUNT 0x1004 ;# ANSI
;!define LVM_GETITEMTEXT 0x102D ;# ANSI
!define LVM_GETITEMCOUNT 0x1004
!define LVM_GETITEMTEXT 0x1073

Function DumpLog
  Exch $5
  Push $0
  Push $1
  Push $2
  Push $3
  Push $4
  Push $6

  FindWindow $0 "#32770" "" $HWNDPARENT
  GetDlgItem $0 $0 1016
  StrCmp $0 0 error
  FileOpen $5 $5 "w"
  FileWriteWord $5 0xfeff ; Write the BOM
  StrCmp $5 0 error
    SendMessage $0 ${LVM_GETITEMCOUNT} 0 0 $6
    System::StrAlloc ${NSIS_MAX_STRLEN}
    Pop $3
    StrCpy $2 0
    System::Call "*(i, i, i, i, i, i, i, i, i) i \
      (0, 0, 0, 0, 0, r3, ${NSIS_MAX_STRLEN}) .r1"
    loop: StrCmp $2 $6 done
      System::Call "User32::SendMessageW(i, i, i, i) i \
        ($0, ${LVM_GETITEMTEXT}, $2, r1)"
      System::Call "*$3(&t${NSIS_MAX_STRLEN} .r4)"
      FileWriteUTF16LE $5 "$4$\r$\n"
      IntOp $2 $2 + 1
      Goto loop
    done:
      FileClose $5
      System::Free $1
      System::Free $3
      Goto exit
  error:
    MessageBox MB_OK error
  exit:
    Pop $6
    Pop $4
    Pop $3
    Pop $2
    Pop $1
    Pop $0
    Exch $5
FunctionEnd


Function Write_Reg_ChartDirs
	ClearErrors
	FileOpen $R0 "$TEMP\opencpn_chart_dirs.tmp" r
	IfErrors end
	loop:
		FileReadUTF16LE $R0 $R1
		IfErrors done
		${TrimNewLines} $R1 $R1
		${If} $REG_CHARTDIRS == ""
			StrCpy $REG_CHARTDIRS "$R1"
		${Else}
			StrCpy $REG_CHARTDIRS "$REG_CHARTDIRS;$R1"
		${EndIf}
		Goto loop
	done:
		FileClose $R0
		WriteRegStr HKLM "Software\OpenCPN" "ChartDirs" $REG_CHARTDIRS
	end:
FunctionEnd


Function IndexOf
	Exch $R0
	Exch
	Exch $R1
	Push $R2
	Push $R3

	StrCpy $R3 $R0
	StrCpy $R0 -1
	IntOp $R0 $R0 + 1
	StrCpy $R2 $R3 1 $R0
	StrCmp $R2 "" +2
	StrCmp $R2 $R1 +2 -3

	StrCpy $R0 -1

	Pop $R3
	Pop $R2
	Pop $R1
	Exch $R0
FunctionEnd


Function RIndexOf
	Exch $R0
	Exch
	Exch $R1
	Push $R2
	Push $R3

	StrCpy $R3 $R0
	StrCpy $R0 0
	IntOp $R0 $R0 + 1
	StrCpy $R2 $R3 1 -$R0
	StrCmp $R2 "" +2
	StrCmp $R2 $R1 +2 -3

	StrCpy $R0 -1

	Pop $R3
	Pop $R2
	Pop $R1
	Exch $R0
FunctionEnd

;##################################################################################################
;#                                   Uninstaller Functions                                        #
;##################################################################################################
;#  un.onInit Function
Function un.onInit
	;Prevent multiple instances of the uninstaller
	${IfNot} ${UAC_IsInnerInstance}
		System::Call 'kernel32::CreateMutexW(i 0, i 0, t "ocpn_uninst_@CPACK_PACKAGE_VERSION@") i .r1 ?e'
		Pop $R0
		StrCmp $R0 0 +3
		MessageBox MB_OK|MB_ICONEXCLAMATION "$(Uninstaller_Running)"
		Abort
	${EndIf}

	Call un.GetUserInfo
	StrCpy $USERS_NAME $USERNAME

	;# Macros to be inserted
	${If} $IS_ADMIN == 1
		!insertmacro MUI_UNGETLANGUAGE
	${EndIf}

	StrCpy $USERS_APPDATA $APPDATA

	;# UAC check if user has Admin privileges and prompt for elevation if not
	uac_tryagain:
	!insertmacro UAC_RunElevated
	StrCpy $Inst_Or_Uninst "$(Uninstaller)"
	${Switch} $0
	${Case} 0
		${IfThen} $1 = 1 ${|} Quit ${|} ;# we are the outer process, the inner process has done its work, we are done
		${IfThen} $3 <> 0 ${|} ${Break} ${|} ;# we are admin, let the show go on
		${If} $1 = 3 ;# RunAs completed successfully, but with a non-admin user
			MessageBox mb_IconExclamation|mb_TopMost|mb_SetForeground "$(Msg_UAC_Admin_Retry)" /SD IDNO IDOK uac_tryagain IDNO 0
		${EndIf}
		;# fall-through and die
	${Case} 1223
		MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "$(Msg_UAC_Admin_Abort)"
		Quit
	${Case} 1062
		MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "$(Msg_UAC_Logon_Abort)"
		Quit
	${Default}
		MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "$(Msg_UAC_No_Elevation)"
		Quit
	${EndSwitch}

##########  from here we can be sure to run with admin privileges  ##########

    SectionSetText ${UnSecDeleteConfigFolder} $(UnSecDeleteConfigFolder_Text)

	ClearErrors
	Var /GLOBAL UN_INST_PARAMS
	Var /GLOBAL UN_INST_HELP
	Var /GLOBAL UN_INST_TYPE
	StrCpy $UN_INST_TYPE ""
	${GetParameters} $UN_INST_PARAMS
	StrCmp $UN_INST_PARAMS "" no_params

	${GetOptions} "$UN_INST_PARAMS" "/?" $UN_INST_HELP
	IfErrors +3
	StrCpy $UN_INST_HELP "help"
	Goto end

	ClearErrors
	${GetOptions} "$UN_INST_PARAMS" "/type" $UN_INST_TYPE
	IfErrors no_type_param
	${Switch} $UN_INST_TYPE
		${Case} "=1" ;# 1 = Program Files only (Remove/ Delete: Program Files)
			StrCpy $UN_INST_TYPE 1
			!insertmacro ClearSectionFlag ${UnSecDeleteConfigFolder} ${SF_SELECTED}
			!insertmacro ClearSectionFlag ${UnSecDeleteConfigRegKey} ${SF_SELECTED}
			${Break}
		${Case} "=2" ;# 2 = Preserve Config folder (Remove/ Delete: Program Files + RegKey)
			StrCpy $UN_INST_TYPE 2
			!insertmacro ClearSectionFlag ${UnSecDeleteConfigFolder} ${SF_SELECTED}
			${Break}
		${Case} "=3" ;# 3 = Preserve RegKey (Remove/ Delete: Program Files + Config folder)
			StrCpy $UN_INST_TYPE 3
			!insertmacro ClearSectionFlag ${UnSecDeleteConfigRegKey} ${SF_SELECTED}
			SectionSetFlags ${UnSecBackupConfigToRegKey} ${SF_SELECTED}
			${Break}
		${Case} "=4" ;# 4 = Delete Config folder (Remove/ Delete: Config folder)
			StrCpy $UN_INST_TYPE 4
			!insertmacro ClearSectionFlag ${UnSecUninstall} ${SF_SELECTED}
			!insertmacro ClearSectionFlag ${UnSecDeleteConfigRegKey} ${SF_SELECTED}
			SectionSetFlags ${UnSecBackupConfigToRegKey} ${SF_SELECTED}
			${Break}
		${Case} "=5" ;# 5 = Delete RegKey (Remove/ Delete: RegKey)
			StrCpy $UN_INST_TYPE 5
			!insertmacro ClearSectionFlag ${UnSecUninstall} ${SF_SELECTED}
			!insertmacro ClearSectionFlag ${UnSecDeleteConfigFolder} ${SF_SELECTED}
			${Break}
		${Default}
			StrCpy $9 $UN_INST_TYPE
			StrCpy $UN_INST_TYPE "error_type" ;# unknown value given for the type parameter => MsgBox => Quit
			${Break}
	${EndSwitch}

	StrCmp $UN_INST_TYPE "error_type" 0 cont
	MessageBox MB_OK|MB_ICONEXCLAMATION "$(Msg_Unknown_Type_Param)"
	Quit

	no_type_param:
	;# If no parameter 'type' is given assume full uninstall
	StrCpy $UN_INST_TYPE 0 ;# 0 = Full Uninstall (Remove/ Delete: Program Files + Config folder + RegKey)
	Goto cont

	no_params:
	;# If no parameters are given assume full uninstall
	StrCpy $UN_INST_TYPE 0 ;# 0 = Full Uninstall (Remove/ Delete: Program Files + Config folder + RegKey)

	cont:
	;# Delete all temporary files created during the installation
	Delete "$TEMP\opencpn_*.tmp"

	Call un.VersionDate

	Call un.Check_Prev_Installs

	;# If there are other installations of OCPN do not remove the config folder!
	${If} $UN_INST_TYPE == 0
	${AndIf} $VERSION_EXISTS == 1
	${AndIf} $MULTIPLE_INSTALLS > 1
		StrCpy $Skip_UnPage_Components 1
		!insertmacro ClearSectionFlag ${UnSecDeleteConfigFolder} ${SF_SELECTED}
	${EndIf}

	ReadRegStr $0 HKLM "${REG_KEY_UN}" "CompareVersion"

	end:
FunctionEnd


Function un.myGuiInit
	${If} $UN_INST_HELP == "help"
		MessageBox MB_OK|MB_ICONINFORMATION "$(Msg_Uninstaller_Param_Help)"
		Quit
	${EndIf}
FunctionEnd

;--------------------------------
;##################################################################################################
;#                                 Uninstaller Page Functions                                     #
;##################################################################################################
/*
 ;# UnPage_Components_Pre
	Function un.Page_Components_Pre
		${If} $Skip_UnPage_Components == 1
			Abort
		${EndIf}
	FunctionEnd
*/
;--------------------------------
;##################################################################################################
;#                                 General Uninstaller Functions                                  #
;##################################################################################################



;--------------------------------
;##################################################################################################
;#                                       Shared Functions                                         #
;##################################################################################################
!macro GetUserInfo_Macro un
	Function ${un}GetUserInfo
		ClearErrors
		UserInfo::GetName
		${If} ${Errors}
			StrCpy $IS_ADMIN 1
			Return
		${EndIf}
		Pop $USERNAME

		UserInfo::GetAccountType
		Pop $R0
		StrCpy $UAT $R0
		${If} ${IsNT}
		${AndIf} ${IsWinNT4}
			${If} $R0 == "Admin"
				StrCpy $IS_ADMIN 1
			${Else}
				StrCpy $IS_ADMIN 0
			${EndIf}
			Goto end
		${EndIf}

		${Switch} $R0
			${Case} "Admin"
			${Case} "Power"
				StrCpy $IS_ADMIN 1
				${Break}
			${Default}
				StrCpy $IS_ADMIN 0
			${Break}
		${EndSwitch}

		UserInfo::GetOriginalAccountType
		Pop $OUAT

		end:
	FunctionEnd
!macroend
!insertmacro GetUserInfo_Macro ""
!insertmacro GetUserInfo_Macro "un."


!macro Check_Prev_Installs_Macro un
	Function ${un}Check_Prev_Installs
		StrCpy $R0 0
		StrCpy $R1 ""
		StrCpy $R5 0
		StrCpy $VERSION_EXISTS 0
		SetShellVarContext all
		${Do}
			EnumRegKey $R1 SHCTX "${REG_ROOT_KEY_UN}" $R0
			${If} $R1 != ""
				StrLen $R2 $R1
				${WordFind} "$R1" " " "+1" $R3
				IntOp $R0 $R0 + 1
				${If} $R3 == "s63_pi"
				${AndIf} $R2 > 7
					ReadRegStr $R4 SHCTX "${REG_ROOT_KEY_UN}\$R1" "CompareVersion"
					ReadRegStr $R6 SHCTX "${REG_ROOT_KEY_UN}\$R1" "InstallLocation"
					${If} $R4 != ""
						${VersionCompare} $VERSION_DATE $R4 $Compare_Version_Result
						${Switch} $Compare_Version_Result
							${Case} 0 ;equal
								StrCpy $VERSION_EXISTS 1
								${Break}
							${Case} 1 ;version to install is newer
								StrCpy $VERSION_NEWER 1
								${Break}
							${Case} 2 ;version to install is older
								StrCpy $VERSION_OLDER 1
								${Break}
							${Default}
								${Break}
						${EndSwitch}
						IntOp $R5 $R5 + 1
						StrCpy $Prev_Install_RegKey "${REG_ROOT_KEY_UN}\$R1"
					${EndIf}
					StrCmp ${un} "" 0 uninst ;# only execute when it is the Installer function
					${If} $R6 != ""
						ClearErrors
						${If} ${FileExists} "$TEMP\opencpn_prev_installs.tmp"
							FileOpen $0 "$TEMP\opencpn_prev_installs.tmp" a
							FileSeek $0 0 END
						${Else}
							FileOpen $0 "$TEMP\opencpn_prev_installs.tmp" w
						${EndIf}
						IfErrors done
						FileWriteUTF16LE $0 "$R1$\r$\n"
						FileWriteUTF16LE $0 "$R6$\r$\n"
						FileClose $0
						done:
					${EndIf}

					${If} $VERSION_EXISTS == 1
						${Break}
					${EndIf}

					uninst:
				${EndIf}
			${Else}
				Goto done2
			${EndIf}
		${Loop}
		done2:
		${If} $R5 > 0
			StrCpy $MULTIPLE_INSTALLS $R5
		${Else}
			StrCpy $MULTIPLE_INSTALLS 0
		${EndIf}
		${If} $MULTIPLE_INSTALLS == 0
			StrCpy $Skip_Page_TypeInst 1
		${Else}
			StrCpy $Skip_Page_TypeInst 0
		${EndIf}
	FunctionEnd
!macroend
!insertmacro Check_Prev_Installs_Macro ""
!insertmacro Check_Prev_Installs_Macro "un."


/*  VersionDate
	normalizes the CPACK_PACKAGE_VERSION_PATCH to a comparable format 'yyyy.[02|19].mmdd.00'
	02 = Beta version
	19 = Stable release
	IN: CPACK_PACKAGE_VERSION_PATCH
	OUT: $VERSION_DATE
*/
Var Patch_Version
Var Version_Digits_Only
Var Version_Unified
Var Patch_Date
!macro VersionDate_Macro un
	Function ${un}VersionDate
		StrCpy $Patch_Version "@CPACK_PACKAGE_VERSION_PATCH@"
		${If} $Patch_Version == ""
			StrCpy $Patch_Version "0000"
		${EndIf}
		StrLen $0 "$Patch_Version"
		${StrFilter} "$Patch_Version" "1" "" "" $Version_Digits_Only
		StrLen $1 $Version_Digits_Only
		;# Patch version contains non-digit characters
		${If} $0 != $1
			${StrFilter} "$Patch_Version" "-2" "" "" $PATCH_ND
			${If} $1 == 3
				StrCpy $Version_Unified "b${YEAR}0$Patch_Version"
			${ElseIf} $1 == 2
				StrCpy $Version_Unified "s${YEAR}00$Patch_Version"
			${ElseIf} $1 == 1
				StrCpy $Version_Unified "s${YEAR}000$Patch_Version"
			${Else}
				StrCpy $Version_Unified "b${YEAR}$Patch_Version"
			${EndIf}
			${VersionConvert} $Version_Unified "" $Patch_Date
			StrCpy $VERSION_DATE "@CPACK_PACKAGE_VERSION_MAJOR@.@CPACK_PACKAGE_VERSION_MINOR@.$Patch_Date"
		;# Patch version contains only digits
		${Else}
			${If} $0 == 3
				StrCpy $Version_Unified "b${YEAR}0$Patch_Version"
			${ElseIf} $0 == 2
				StrCpy $Version_Unified "s${YEAR}00$Patch_Version"
			${ElseIf} $0 == 1
				StrCpy $Version_Unified "s${YEAR}000$Patch_Version"
			${Else}
				StrCpy $Version_Unified "b${YEAR}$Patch_Version"
			${EndIf}
			${VersionConvert} $Version_Unified "" $Patch_Date
			StrCpy $VERSION_DATE "@CPACK_PACKAGE_VERSION_MAJOR@.@CPACK_PACKAGE_VERSION_MINOR@.$Patch_Date.00"
		${EndIf}
	FunctionEnd
!macroend
!insertmacro VersionDate_Macro ""
!insertmacro VersionDate_Macro "un."


!macro Delete_Start_Menu_Shortcuts_Macro un
	Function ${un}Delete_Start_Menu_Shortcuts
		Pop $9
		Push $R0
		Push $R1
		Push $R2
		Push $R3
		Push $R4
		${TrimNewLines} $9 $9
		SetShellVarContext all
		${RecFindOpen} "$STARTMENU" $CurrentDirVar $CurrentFileVar
			${RecFindFirst}
			ClearErrors
			${WordFind} "$CurrentFileVar" ".lnk" "E*" $8
			IfErrors next
			IntCmp $8 1 0 next 0
			ShellLink::GetShortCutWorkingDirectory "$STARTMENU$CurrentDirVar\$CurrentFileVar"
			Pop $0
			StrCmp "$0" "" +2
			StrCmp "$0" "$9" 0 next
			ShellLink::GetShortCutTarget "$STARTMENU$CurrentDirVar\$CurrentFileVar"
			Pop $1
			${WordFind2X} "$1" "\" ".exe" "-1" $7
			ClearErrors
			${WordFind} "$7" "uninstall" "E*" $6
			IfErrors 0 +2
			StrCpy $6 0
			;#NON-DEBUG
			${If} $7 == "opencpn"
			${OrIf} $7 == "Uninstall"
			${OrIf} $7 == "unins000"
			${OrIf} $6 == 1
				Delete "$STARTMENU$CurrentDirVar\$CurrentFileVar"
				StrCmp $CurrentDirVar "" next
				ClearErrors
				RMDir "$STARTMENU$CurrentDirVar"
				Sleep 250
				IfErrors 0 check_parent
				${If} ${FileExists} "$STARTMENU$CurrentDirVar\*.*"
					ClearErrors
					RMDir "$STARTMENU$CurrentDirVar"
					Sleep 250
					IfErrors next check_parent
				${EndIf}

				Goto next

				check_parent:
				StrCpy $R3 "$STARTMENU$CurrentDirVar"
				Push $R3
				Call ${un}Parent_Dirs_Check
			${EndIf}

			next:
			${RecFindNext}
		${RecFindClose}

		${If} ${FileExists} "$TEMP\opencpn_startmenu.tmp"
			FileOpen $R0 "$TEMP\opencpn_startmenu.tmp" r
			IfErrors end
			${Do}
				FileReadUTF16LE $R0 $R1
				FileReadUTF16LE $R0 $R2
				${TrimNewLines} $R1 $R1
				${TrimNewLines} $R2 $R2
				StrCmp $R2 "" 0 +2
				${Break}
				${RecFindOpen} "$R2" $CurrentDirVar $CurrentFileVar
					${RecFindFirst}
					ClearErrors
					${WordFind} "$CurrentFileVar" ".lnk" "E*" $8
					IfErrors next1
					IntCmp $8 1 0 next1 0
					ShellLink::GetShortCutWorkingDirectory "$R2$CurrentDirVar\$CurrentFileVar"
					Pop $0
					StrCmp "$0" "$9" 0 next1
					ShellLink::GetShortCutTarget "$R2$CurrentDirVar\$CurrentFileVar"
					Pop $1
					${WordFind2X} "$1" "\" ".exe" "-1" $7
					;#NON-DEBUG
					${If} $7 == "opencpn"
					${OrIf} $7 == "Uninstall"
					${OrIf} $7 == "unins000"
						Delete "$R2$CurrentDirVar\$CurrentFileVar"
						StrCmp $CurrentDirVar "" next1
						ClearErrors
						RMDir "$R2$CurrentDirVar"
						Sleep 250
						IfErrors 0 check_parent1
						${If} ${FileExists} "$R2$CurrentDirVar\*.*"
							ClearErrors
							RMDir "$R2$CurrentDirVar"
							Sleep 250
							IfErrors next1 check_parent1
						${EndIf}

						Goto next1

						check_parent1:
						StrCpy $R3 "$STARTMENU$CurrentDirVar"
						Push $R3
						Call ${un}Parent_Dirs_Check
					${EndIf}

					next1:
					${RecFindNext}
				${RecFindClose}
			${LoopUntil} $R2 == ""
			FileClose $R0
		${EndIf}

		end:
		Call ${un}Delete_Empty_Parents

		Pop $R4
		Pop $R3
		Pop $R2
		Pop $R1
		Pop $R0
	FunctionEnd
!macroend
!insertmacro Delete_Start_Menu_Shortcuts_Macro ""
!insertmacro Delete_Start_Menu_Shortcuts_Macro "un."


!macro Delete_Desktop_Shortcuts_Macro un
	Function ${un}Delete_Desktop_Shortcuts
		Pop $9
		Push $R0
		Push $R1
		Push $R2
		Push $R3
		${TrimNewLines} $9 $9
		SetShellVarContext all
		${RecFindOpen} "$DESKTOP" $CurrentDirVar $CurrentFileVar
			${RecFindFirst}
			ClearErrors
			${WordFind} "$CurrentFileVar" ".lnk" "E*" $8
			IfErrors next
			IntCmp $8 1 0 next 0
			ShellLink::GetShortCutWorkingDirectory "$DESKTOP$CurrentDirVar\$CurrentFileVar"
			Pop $0
			StrCmp "$0" "" +2
			StrCmp "$0" "$9" 0 next
			ShellLink::GetShortCutTarget "$DESKTOP$CurrentDirVar\$CurrentFileVar"
			Pop $1
			${WordFind2X} "$1" "\" ".exe" "-1" $7
			ClearErrors
			${WordFind} "$7" "uninstall" "E*" $6
			IfErrors 0 +2
			StrCpy $6 0
			;#NON-DEBUG
			${If} $7 == "opencpn"
			${OrIf} $7 == "Uninstall"
			${OrIf} $7 == "unins000"
			${OrIf} $6 == 1
				Delete "$DESKTOP$CurrentDirVar\$CurrentFileVar"
				StrCmp $CurrentDirVar "" next
				RMDir "$DESKTOP$CurrentDirVar"
				Sleep 250
				IfErrors 0 check_parent
				${If} ${FileExists} "$DESKTOP$CurrentDirVar\*.*"
					ClearErrors
					RMDir "$DESKTOP$CurrentDirVar"
					Sleep 250
					IfErrors next check_parent
				${EndIf}

				Goto next

				check_parent:
				StrCpy $R3 "$DESKTOP$CurrentDirVar"
				Push $R3
				Call ${un}Parent_Dirs_Check
			${EndIf}

			next:
			${RecFindNext}
		${RecFindClose}

		${If} ${FileExists} "$TEMP\opencpn_desktop.tmp"
			FileOpen $R0 "$TEMP\opencpn_desktop.tmp" r
			IfErrors end
			${Do}
				FileReadUTF16LE $R0 $R1
				FileReadUTF16LE $R0 $R2
				${TrimNewLines} $R1 $R1
				${TrimNewLines} $R2 $R2
				StrCmp $R2 "" 0 +2
				${Break}
				${RecFindOpen} "$R2" $CurrentDirVar $CurrentFileVar
					${RecFindFirst}
					ClearErrors
					${WordFind} "$CurrentFileVar" ".lnk" "E*" $8
					IfErrors next1
					IntCmp $8 1 0 next1 0
					ShellLink::GetShortCutWorkingDirectory "$R2$CurrentDirVar\$CurrentFileVar"
					Pop $0
					StrCmp "$0" "$9" 0 next1
					ShellLink::GetShortCutTarget "$R2$CurrentDirVar\$CurrentFileVar"
					Pop $1
					${WordFind2X} "$1" "\" ".exe" "-1" $7
					;#NON-DEBUG
					${If} $7 == "opencpn"
					${OrIf} $7 == "Uninstall"
					${OrIf} $7 == "unins000"
						Delete "$R2$CurrentDirVar\$CurrentFileVar"
						StrCmp $CurrentDirVar "" next1
						RMDir "$R2$CurrentDirVar"
						Sleep 250
						IfErrors 0 check_parent1
						${If} ${FileExists} "$R2$CurrentDirVar\*.*"
							ClearErrors
							RMDir "$R2$CurrentDirVar"
							Sleep 250
							IfErrors next1 check_parent1
						${EndIf}

						Goto next1

						check_parent1:
						StrCpy $R3 "$STARTMENU$CurrentDirVar"
						Push $R3
						Call ${un}Parent_Dirs_Check
					${EndIf}

					next1:
					${RecFindNext}
				${RecFindClose}
			${LoopUntil} $R2 == ""
			FileClose $R0
		${EndIf}

		end:
		Call ${un}Delete_Empty_Parents

		Pop $R3
		Pop $R2
		Pop $R1
		Pop $R0
	FunctionEnd
!macroend
!insertmacro Delete_Desktop_Shortcuts_Macro ""
!insertmacro Delete_Desktop_Shortcuts_Macro "un."


!macro Parent_Dirs_Check_Macro un
	Function ${un}Parent_Dirs_Check
		Pop $R3
		Push $R4
		ClearErrors
		${If} ${FileExists} "$TEMP\opencpn_check_parent.tmp"
			FileOpen $R4 "$TEMP\opencpn_check_parent.tmp" a
			IfErrors end
		${Else}
			FileOpen $R4 "$TEMP\opencpn_check_parent.tmp" w
			IfErrors end
		${EndIf}

		${WordFind} "$R3" "\" "E-2{*" $R3
		IfErrors close
		FileWriteUTF16LE $R4 "$R3$\r$\n"

		close:
		FileClose $R4

		end:
		Pop $R4
	FunctionEnd
!macroend
!insertmacro Parent_Dirs_Check_Macro ""
!insertmacro Parent_Dirs_Check_Macro "un."


!macro Delete_Empty_Parents_Macro un
	Function ${un}Delete_Empty_Parents
		Push $R3
		Push $R4
		Push $R5
		ClearErrors
		${If} ${FileExists} "$TEMP\opencpn_check_parent.tmp"
			FileOpen $R4 "$TEMP\opencpn_check_parent.tmp" r
			IfErrors end
			${Do}
				FileReadUTF16LE $R4 $R3
				IfErrors close
				${TrimNewLines} "$R3" $R3
				${DirState} $R3 $R5
				StrCmp $R5 0 0 next
				ClearErrors
				RMDir "$R3"
				Sleep 250
				IfErrors next

				loop:
				${WordFind} "$R3" "\" "E-2{*" $R3
				IfErrors next
				StrCpy $error_tmp 0
				Push $R3
				Call ${un}Delete_Empty_Dir
				StrCmp $error_tmp 1 loop
				next:
			${Loop}
			close:
			FileClose $R4
			Delete "$TEMP\opencpn_check_parent.tmp"
		${EndIf}
		end:
		Pop $R5
		Pop $R4
		Pop $R3
	FunctionEnd
!macroend
!insertmacro Delete_Empty_Parents_Macro ""
!insertmacro Delete_Empty_Parents_Macro "un."


!macro Delete_Empty_Dir_Macro un
	Function ${un}Delete_Empty_Dir
		Push $R3
		Exch
		Pop $R3
		Push $R4
		${DirState} $R3 $R4
		StrCmp $R4 0 0 end
		RMDir "$R3"
		Sleep 100
		StrCpy $error_tmp 1

		end:
		Pop $R4
		Pop $R3
	FunctionEnd
!macroend
!insertmacro Delete_Empty_Dir_Macro ""
!insertmacro Delete_Empty_Dir_Macro "un."


; Initialize variables
Var explString
Var explSeparator
Var explStrLen
Var explSepLen
Var explOffset
Var explTmp
Var explTmp2
Var explTmp3
Var explArrCount
!macro Explodes_Macro un
	Function ${un}Explode
	/*; Initialize variables
	  Var /GLOBAL explString
	  Var /GLOBAL explSeparator
	  Var /GLOBAL explStrLen
	  Var /GLOBAL explSepLen
	  Var /GLOBAL explOffset
	  Var /GLOBAL explTmp
	  Var /GLOBAL explTmp2
	  Var /GLOBAL explTmp3
	  Var /GLOBAL explArrCount
	*/
	  ; Get input from user
	  Pop $explString
	  Pop $explSeparator

	  ; Calculates initial values
	  StrLen $explStrLen $explString
	  StrLen $explSepLen $explSeparator
	  StrCpy $explArrCount 1

	  ${If}   $explStrLen <= 1          ;   If we got a single character
	  ${OrIf} $explSepLen > $explStrLen ;   or separator is larger than the string,
		Push    $explString             ;   then we return initial string with no change
		Push    1                       ;   and set array's length to 1
		Return
	  ${EndIf}

	  ; Set offset to the last symbol of the string
	  StrCpy $explOffset $explStrLen
	  IntOp  $explOffset $explOffset - 1

	  ; Clear temp string to exclude the possibility of appearance of occasional data
	  StrCpy $explTmp   ""
	  StrCpy $explTmp2  ""
	  StrCpy $explTmp3  ""

	  ; Loop until the offset becomes negative
	  ${Do}
		;   If offset becomes negative, it is time to leave the function
		${IfThen} $explOffset == -1 ${|} ${ExitDo} ${|}

		;   Remove everything before and after the searched part ("TempStr")
		StrCpy $explTmp $explString $explSepLen $explOffset

		${If} $explTmp == $explSeparator
			;   Calculating offset to start copy from
			IntOp   $explTmp2 $explOffset + $explSepLen ;   Offset equals to the current offset plus length of separator
			StrCpy  $explTmp3 $explString "" $explTmp2

			Push    $explTmp3                           ;   Throwing array item to the stack
			IntOp   $explArrCount $explArrCount + 1     ;   Increasing array's counter

			StrCpy  $explString $explString $explOffset 0   ;   Cutting all characters beginning with the separator entry
			StrLen  $explStrLen $explString
		${EndIf}

		${If} $explOffset = 0                       ;   If the beginning of the line met and there is no separator,
													;   copying the rest of the string
			${If} $explSeparator == ""              ;   Fix for the empty separator
				IntOp   $explArrCount   $explArrCount - 1
			${Else}
				Push    $explString
			${EndIf}
		${EndIf}

		IntOp   $explOffset $explOffset - 1
	  ${Loop}

	  Push $explArrCount
	FunctionEnd
!macroend
!insertmacro Explodes_Macro ""
!insertmacro Explodes_Macro "un."


!macro isEmptyDir_Macro un
	Function ${un}isEmptyDir
	# Stack ->                    # Stack: <directory>
	Exch $0                       # Stack: $0
	Push $1                       # Stack: $1, $0
	FindFirst $0 $1 "$0\*.*"
	StrCmp $1 "." 0 _notempty
	FindNext $0 $1
	StrCmp $1 ".." 0 _notempty
	ClearErrors
	FindNext $0 $1
	IfErrors 0 _notempty
	FindClose $0
	Pop $1                  # Stack: $0
	StrCpy $0 1
	Exch $0                 # Stack: 1 (true)
	Goto _end
	_notempty:
	FindClose $0
	Pop $1                   # Stack: $0
	StrCpy $0 0
	Exch $0                  # Stack: 0 (false)
	_end:
	FunctionEnd
!macroend
!insertmacro isEmptyDir_Macro ""
!insertmacro isEmptyDir_Macro "un."
;--------------------------------------------------------------------------------------------------
;##################################################################################################
;#                                  D E S C R I P T I O N S                                       #
;##################################################################################################
;#                                  Installer Descriptions                                        #
;##################################################################################################

;# License page
	LicenseLangString license ${LANG_ENGLISH} "@CPACK_RESOURCE_FILE_LICENSE@"
	LicenseLangString license ${LANG_GERMAN} "@CPACK_RESOURCE_FILE_LICENSE@"
	LicenseLangString license ${LANG_FRENCH} "@CPACK_RESOURCE_FILE_LICENSE@"
	LicenseLangString license ${LANG_CZECH} "@CPACK_RESOURCE_FILE_LICENSE@"
	LicenseLangString license ${LANG_DANISH} "@CPACK_RESOURCE_FILE_LICENSE@"
	LicenseLangString license ${LANG_SPANISH} "@CPACK_RESOURCE_FILE_LICENSE@"
	LicenseLangString license ${LANG_ITALIAN} "@CPACK_RESOURCE_FILE_LICENSE@"
	LicenseLangString license ${LANG_DUTCH} "@CPACK_RESOURCE_FILE_LICENSE@"
	LicenseLangString license ${LANG_POLISH} "@CPACK_RESOURCE_FILE_LICENSE@"
	LicenseLangString license ${LANG_PORTUGUESE} "@CPACK_RESOURCE_FILE_LICENSE@"
	LicenseLangString license ${LANG_PORTUGUESEBR} "@CPACK_RESOURCE_FILE_LICENSE@"
	LicenseLangString license ${LANG_RUSSIAN} "@CPACK_RESOURCE_FILE_LICENSE@"
	LicenseLangString license ${LANG_SWEDISH} "@CPACK_RESOURCE_FILE_LICENSE@"
	LicenseLangString license ${LANG_FINNISH} "@CPACK_RESOURCE_FILE_LICENSE@"
	LicenseLangString license ${LANG_NORWEGIAN} "@CPACK_RESOURCE_FILE_LICENSE@"
	LicenseLangString license ${LANG_TRADCHINESE} "@CPACK_RESOURCE_FILE_LICENSE@"
	LicenseLangString license ${LANG_TURKISH} "@CPACK_RESOURCE_FILE_LICENSE@"
        ;LicenseLangString license ${LANG_HUNGARIAN} "@CPACK_RESOURCE_FILE_LICENSE@"

!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
	!insertmacro MUI_DESCRIPTION_TEXT ${SecGrpResetConfig} $(SecGrpResetConfig_Desc)
	!insertmacro MUI_DESCRIPTION_TEXT ${SecDeleteConfigFile} $(SecDeleteConfigFile_Desc)
	!insertmacro MUI_DESCRIPTION_TEXT ${SecDeleteChartDB} $(SecDeleteChartDB_Desc)
	!insertmacro MUI_DESCRIPTION_TEXT ${SecDeleteSENC} $(SecDeleteSENC_Desc)
	!insertmacro MUI_DESCRIPTION_TEXT ${SecDeleteCM93} $(SecDeleteCM93_Desc)
	!insertmacro MUI_DESCRIPTION_TEXT ${SecDeleteNavobjFile} $(SecDeleteNavobjFile_Desc)
	!insertmacro MUI_DESCRIPTION_TEXT ${SecDeleteLogFile} $(SecDeleteLogFile_Desc)
	!insertmacro MUI_DESCRIPTION_TEXT ${SecGrpShortcuts} $(SecGrpShortcuts_Desc)
	!insertmacro MUI_DESCRIPTION_TEXT ${SecShortcutStartmenu} $(SecShortcutStartmenu_Desc)
	!insertmacro MUI_DESCRIPTION_TEXT ${SecShortcutDesktop} $(SecShortcutDesktop_Desc)
	!insertmacro MUI_DESCRIPTION_TEXT ${SecSetConfig} $(SecSetConfig_Desc)
!insertmacro MUI_FUNCTION_DESCRIPTION_END

;--------------------------------
;##################################################################################################
;#                                  Uninstaller Descriptions                                      #
;##################################################################################################
!insertmacro MUI_UNFUNCTION_DESCRIPTION_BEGIN
  !insertmacro MUI_DESCRIPTION_TEXT ${UnSecDeleteConfigFolder} $(UnSecDeleteConfigFolder_Desc)
!insertmacro MUI_UNFUNCTION_DESCRIPTION_END


;--------------------------------------------------------------------------------------------------
;##################################################################################################
;#                                        Language Strings                                        #
;##################################################################################################
;#DO NOT EDIT THE NEXT LINE!!! It is needed for the online generating of the translation files!
;#Language Strings Start as of: 2010-10-10
;#IMPORTANT: Do not end a multi-line with $\"

	LangString Installer ${LANG_ENGLISH} "installer"

	LangString Uninstaller ${LANG_ENGLISH} "uninstaller"

  ;Installer running on unsupported version of Windows
	LangString Installer_Unsupported_Windows_Version ${LANG_ENGLISH} "Your Windows version is not supported (it's too old)!$\r$\nYou need at least Windows XP SP3."

  ;Installer running on Windows XP without SP3
	LangString Installer_Unsupported_XP_SP_Version ${LANG_ENGLISH} "Your Windows XP Service Pack version is not supported (it's too old)!$\r$\nYou need at least Windows XP SP3."

  ;Installer already running
    LangString Installer_Running ${LANG_ENGLISH} "The installer is already running."

  ;Uninstaller already running
    LangString Uninstaller_Running ${LANG_ENGLISH} "The uninstaller is already running."

  ;Language Dialog
	LangString LangDialog_Title ${LANG_ENGLISH} "@CPACK_PACKAGE_NAME@ @CPACK_PACKAGE_VERSION@ Installation"

	LangString LangDialog_Text ${LANG_ENGLISH} "Please select a language:"

   ;License dialog
	LangString License_Message ${LANG_ENGLISH} "OpenCPN is software libre. You are encouraged and legally \
        entitled to copy, reinstall, modify, and redistribute this program \
        for yourself and your friends under the terms of the GPL. $\r$\nSmooth sailing!"

  ;Clean up page
	LangString text_please_wait_1 ${LANG_ENGLISH} "... please wait!"

	LangString Scanning_HDD ${LANG_ENGLISH} "Scanning HDD ..."

	LangString OCPN_Scanning_HDD ${LANG_ENGLISH} "OpenCPN: Scan HDD ..., please wait!"

	LangString Search_old_installations ${LANG_ENGLISH} "Searching for old installations"

	LangString Install_Location_Default ${LANG_ENGLISH} "Install Locations by default paths (may not find all)"

	LangString Install_Location_HDD_Scan ${LANG_ENGLISH} "Install Location by full HDD scan (most reliable)"

	LangString Label_CleanUp_Text ${LANG_ENGLISH} "Click on a list-item to select/ unselect it or Select ALL (recommended) and then Uninstall selected."

	LangString BT_Uninstall_Selected_CleanUp ${LANG_ENGLISH} "Uninstall Selected"

	LangString BT_SelectAll_CleanUp ${LANG_ENGLISH} "Select ALL"

	LangString BT_UnselectAll_CleanUp ${LANG_ENGLISH} "Unselect ALL"

	LangString LB_CleanUp ${LANG_ENGLISH} "Listbox Text"

	LangString BT_FullScan_CleanUp ${LANG_ENGLISH} "Scan HDD ..."

	LangString LAB_FullScan_CleanUp ${LANG_ENGLISH} "Scan the HDD for the most reliable detection.$\r$\nATTENTION: may last several minutes!"

	LangString Page_CleanUp_Title ${LANG_ENGLISH} "Uninstall older Version"

	LangString Page_CleanUp_Subtitle ${LANG_ENGLISH} "Incompatible version detected"

  ;Components Page
	;Header
    LangString CP_HEADER_TEXT ${LANG_ENGLISH} "Installation Settings"

	;Subheader
    LangString CP_HEADER_SUBTEXT ${LANG_ENGLISH} "Choose the settings for the installation"

	;Top
    LangString CP_TOP ${LANG_ENGLISH} "Check or uncheck the options for the installation.$\r$\nClick 'Next' to continue."

	;Installation type
	LangString CP_INSTTYPE ${LANG_ENGLISH} "Installation type:"

	;Components list
	LangString CP_COMPLIST ${LANG_ENGLISH} "Adjust the settings individually:"


  ;Directory page


  ;Set Config page
	LangString Page_SetConfig_Title ${LANG_ENGLISH} "Default configuration settings"

	LangString Page_SetConfig_Subtitle ${LANG_ENGLISH} "Preconfigure settings for OpenCPN"

	LangString Select_Chart_Directory ${LANG_ENGLISH} "Please select a chart directory to add to OpenCPN"

	LangString BT_Browse_SetConfig_Text ${LANG_ENGLISH} "Browse..."

	LangString BT_DeleteAll_SetConfig_Text ${LANG_ENGLISH} "Delete ALL"

	LangString BT_Delete_SetConfig_Text ${LANG_ENGLISH} "Delete"

	LangString GB_ChartDir_SetConfig_Text ${LANG_ENGLISH} "Add Chart Directory"

	LangString CB_Language_SetConfig_Text ${LANG_ENGLISH} "Set OpenCPN program language to $LANG_NAME"

	LangString GB_Language_SetConfig_Text ${LANG_ENGLISH} "Set OpenCPN program language"

	LangString Label_SetConfig_Text ${LANG_ENGLISH} "Configure preconfig settings for the OpenCPN program.$\r$\nThese settings are saved in the file opencpn.ini."

  ;Confirm page
	LangString Page_Confirm_Title ${LANG_ENGLISH} "Ready to Install"

	LangString Page_Confirm_Subtitle ${LANG_ENGLISH} "Check the installation options"

	LangString Installation_Type ${LANG_ENGLISH} "Setup type"

	LangString Installation_Directory ${LANG_ENGLISH} "Destination location"

	LangString Create_Shortcuts ${LANG_ENGLISH} "Create shortcuts"

	LangString Type_Reinstall ${LANG_ENGLISH} "Reinstallation"

	LangString Type_Upgrade ${LANG_ENGLISH} "Upgrade"

	LangString Type_Downgrade ${LANG_ENGLISH} "Downgrade"

	LangString Type_Parallel_Installation ${LANG_ENGLISH} "Parallel installation"

	LangString Type_Fresh_Installation ${LANG_ENGLISH} "New installation"

	LangString Shortcuts ${LANG_ENGLISH} "Shortcuts"

	LangString Create_Shortcut_Start_Menu ${LANG_ENGLISH} "in the Start Menu folder"

	LangString Create_Shortcut_Desktop ${LANG_ENGLISH} "on the Desktop"

	LangString not_selected ${LANG_ENGLISH} "not selected"

	LangString text_none ${LANG_ENGLISH} "none"

  ;Installer Sections
	;Reset config
	LangString SecGrpResetConfig_Text ${LANG_ENGLISH} "Reset ALL OpenCPN configuration files"

	;Delete Config file (opencpn.ini)
	LangString SecDeleteConfigFile_Text ${LANG_ENGLISH} "Delete config file (opencpn.ini)"

	;Delete Chart DB (CHRTLIST.DAT)
	LangString SecDeleteChartDB_Text ${LANG_ENGLISH} "Delete Chart Database file (CHRTLIST.DAT)"

	;Delete SENC directory
	LangString SecDeleteSENC_Text ${LANG_ENGLISH} "Delete SENC directory"

	;Delete CM93 directory
	LangString SecDeleteCM93_Text ${LANG_ENGLISH} "Delete CM93 Directory"

	;Delete Log file (opencpn.log)
	LangString SecDeleteLogFile_Text ${LANG_ENGLISH} "Delete Log file (opencpn.log)"

	;Delete navobj.xml
	LangString SecDeleteNavobjFile_Text ${LANG_ENGLISH} "Delete Navobject file (navobj.xml)"

	;Set config
	LangString SecSetConfig_Text ${LANG_ENGLISH} "OpenCPN Configuration Settings"

	;Set language
	LangString SecSetConfigLang_Text ${LANG_ENGLISH} "Set language to $LANG_NAME"

	;Set chart dir(s)
	LangString SecSetConfigChartDir_Text ${LANG_ENGLISH} "Select Chart Directories"

  ;Uninstaller Sections
	;Reset config
	LangString UnSecDeleteConfigFolder_Text ${LANG_ENGLISH} "Delete Config folder"

  ;Installer Descriptions
	LangString SecGrpResetConfig_Desc ${LANG_ENGLISH} "Deletes ALL files and subdirectories in the configuration folder."

	LangString SecDeleteConfigFile_Desc ${LANG_ENGLISH} "Deletes the configuration file. This file helds also Routes and Waypoints."

	LangString SecDeleteChartDB_Desc ${LANG_ENGLISH} "Deletes the Chart DB file."

	LangString SecDeleteSENC_Desc ${LANG_ENGLISH} "Deletes the SENC subfolder which helds the Bitmaps and S57 chart cache files."

	LangString SecDeleteCM93_Desc ${LANG_ENGLISH} "Deletes the cm93 subfolder which helds the cached cm93 chart outlines."

	LangString SecDeleteNavobjFile_Desc ${LANG_ENGLISH} "Deletes the file 'navobj.xml' in the config folder. This file contains the Tracks."

	LangString SecDeleteLogFile_Desc ${LANG_ENGLISH} "Deletes the OpenCPN log file 'opencpn.log'."

	LangString SecGrpShortcuts_Desc ${LANG_ENGLISH} "Creates shortcuts in both, the Start Menu and on the Desktop."

	LangString SecShortcutStartmenu_Desc ${LANG_ENGLISH} "Creates shortcuts for OpenCPN and the Uninstaller in the Start Menu - configurable on the next page."

	LangString SecShortcutDesktop_Desc ${LANG_ENGLISH} "Creates a shortcut for OpenCPN on the Desktop."

	LangString SecSetConfig_Desc ${LANG_ENGLISH} "Preconfigure the language setting and the chart dir(s) for s63_pi. When selected a separate page is shown for configuration."

  ;Uninstaller Descriptions
	LangString UnSecDeleteConfigFolder_Desc ${LANG_ENGLISH} "Deletes the config folder and all its files and subdirectories."

  ;Un-install Link
	LangString Uninstall_Link ${LANG_ENGLISH} "Uninstall @CPACK_PACKAGE_NAME@ @CPACK_PACKAGE_VERSION@"

  ;Multiple Install > 1
    ;Title
	LangString Page_TypeInst_Title ${LANG_ENGLISH} "Previous Installations"

	;Subtitle
    LangString Page_TypeInst_Subtitle ${LANG_ENGLISH} "$MULTIPLE_INSTALLS installations of s63_pi found.$\r$\nChoose how you want to install s63_pi."

  ;Multiple Install = 1
    ;Title
	LangString Page_TypeInst_Title_1 ${LANG_ENGLISH} "Already Installed"

	;Subtitle
    LangString Page_TypeInst_Subtitle_1 ${LANG_ENGLISH} "Found installed version of s63_pi.$\r$\n"

  ;Version exists
    ;Title
	LangString Page_TypeInst_Title_Exists ${LANG_ENGLISH} "Version Already Installed"

	;Subtitle
    LangString Page_TypeInst_Subtitle_Exists ${LANG_ENGLISH} "s63_pi @CPACK_PACKAGE_VERSION@ is already installed.$\r$\nChoose how you want to install s63_pi."

	;Label
	LangString Label_TypeInst_Reinstall_Text ${LANG_ENGLISH} "s63_pi @CPACK_PACKAGE_VERSION@ is already installed on your system. You can reinstall the version now using the previous settings. If you wish to install the program with different settings, cancel installation and un-install the existing version first. Click Next to continue."

	;Radio button 'Reinstall'
	LangString RB_Reinstall_TypeInst_Text ${LANG_ENGLISH} "Reinstall using previous settings"

  ;Version newer
	;Label
    LangString Label_TypeInst_Upgrade_Text ${LANG_ENGLISH} "An older version of s63_pi is installed on your system. Click Next to continue upgrade."

	;Radio button 'Upgrade'
	LangString RB_Upgrade_TypeInst_Text ${LANG_ENGLISH} "Upgrade s63_pi using previous settings (recommended)"

  ;Version older
	;Label
    LangString Label_TypeInst_Downgrade_Text ${LANG_ENGLISH} "A newer version of s63_pi is installed on your system. It is not recommended to downgrade to an older version. Select the installation type you want to perform and click Next to continue."

	;Radio button 'Downgrade'
	LangString RB_Downgrade_TypeInst_Text ${LANG_ENGLISH} "Downgrade s63_pi using previous settings (recommended)"

  ;Multiple versions
	;Label
	LangString Label_TypeInst_Parallel_Text ${LANG_ENGLISH} "Setup has detected several installed versions of s63_pi on your system. It is recommended to have only one version of s63_pi installed at a time. Select the operation you want to perform and click Next to continue."

	;Radio button 'Parallel Installation'
	LangString RB_Parallel_TypeInst_Text ${LANG_ENGLISH} "Parallel Installation (advanced users)"

  ;Empty string - needed for Components page
	LangString EmptyString ${LANG_ENGLISH} ""

  ;Finish page
	LangString Show_Readme_Text ${LANG_ENGLISH} "Show Install Log file"

	LangString Finish_Link_Text ${LANG_ENGLISH} "OpenCPN website (Internet connection required)"

	LangString Finish_Link_URL ${LANG_ENGLISH} "http://opencpn.info/?ref=installer&user=$USERS_NAME&lang=$REG_LANG&version=@CPACK_PACKAGE_VERSION@"

  ;Message Boxes
	LangString Msg_UAC_Admin_Retry ${LANG_ENGLISH} "This $Inst_Or_Uninst requires admin access!$\r$\nPlease log on as an Administrator and try again."

	LangString Msg_UAC_Admin_Abort ${LANG_ENGLISH} "This $Inst_Or_Uninst requires admin privileges, aborting!"

	LangString Msg_UAC_Logon_Abort ${LANG_ENGLISH} "Logon service not running, aborting!"

	LangString Msg_UAC_No_Elevation ${LANG_ENGLISH} "Unable to elevate , error $0"

	LangString Msg_Error_Remove_InstDir ${LANG_ENGLISH} "The installation directory$\r$\n'$INSTDIR'$\r$\ncould not be removed because it is not empty."

	LangString Msg_Path_Invalid ${LANG_ENGLISH} "The entered path is invalid!$\r$\n$\r$\nPlease check your input."

	LangString Msg_Path_Installation_Exists ${LANG_ENGLISH} "There already exists an installation of s63_pi in the given path.$\r$\nIf you wish to use this path, first uninstall the version. Or select another path for this installation."

	LangString Msg_Uninstall_Old_Versions ${LANG_ENGLISH} "Setup has detected at least one older version of s63_pi which is not compatible with the new version control.$\r$\n\
		It is recommended to first uninstall all of these installations (this does not affect your Config files) and clean-up the Registry.$\r$\n\
		If you click Yes on the next page a listbox with all installation locations will be shown and you will have the possibility to select the installations you wish to uninstall.$\r$\n\
		If you are unsure about possible other previous installations than those shown in the listbox, you can also perform a scan of the entire \
		Harddisk (ATTENTION: This may take several minutes) to find all install locations (recommended).$\r$\n$\r$\n\
		Do you want to uninstall the old version(s)?"

	LangString Msg_Not_All_Old_Uninstalled ${LANG_ENGLISH} "You have not uninstalled all previous installations.$\r$\n$\r$\nDo you want to continue anyway?"

	LangString Msg_Uninstaller_Param_Help ${LANG_ENGLISH} "Uninstaller Help$\r$\n$\r$\nUse the command line or a shortcut to run the uninstaller:$\r$\n$INSTDIR\Uninstall @CPACK_PACKAGE_VERSION@.exe [/?] | [/S], [/type=X]$\r$\n$\r$\nParameters:$\r$\n/?$\tshows this help message box$\r$\n/S$\truns the uninstaller in silent mode$\r$\n$\twill do a full uninstall if called without any type parameter$\r$\n/type=X$\tX must be a digit between 1 and 5$\r$\n$\t1 = Removes only the program files$\r$\n$\t2 = Removes only the program files + preconfig RegKey$\r$\n$\t3 = Removes the program files + config folder$\r$\n$\tpreserves the preconfig RegKey$\r$\n$\t4 = Deletes only the config folder$\r$\n$\t5 = Deletes only the preconfig RegKey$\r$\n$\r$\nEntering any other number or value will quit the uninstaller with a message box without removing or deleting anything."

	LangString Msg_Unknown_Type_Param ${LANG_ENGLISH} "The entered value '$9' for the type parameter is not valid!$\r$\nUse $INSTDIR\Uninstall @CPACK_PACKAGE_VERSION@.exe /?$\r$\nto see a list of valid values."

  ;added on 2010-10-16
	LangString SecGrpShortcuts_Text ${LANG_ENGLISH} "Create Shortcuts"

	LangString SecShortcutStartmenu_Text ${LANG_ENGLISH} "Add Shortcuts to the Start Menu"

	LangString SecShortcutDesktop_Text ${LANG_ENGLISH} "Create Shortcut on the Desktop"

	LangString Installation_Delete_Config ${LANG_ENGLISH} "Delete (existing) Config Subdirectories/ Files"

  ;added on 2010-10-17
	LangString Banner_Scan_Drive ${LANG_ENGLISH} "Scanning Drive $9"

	LangString Banner_Installation_Found_Singular ${LANG_ENGLISH} "Found $counter_tmp installation"

	LangString Banner_Installation_Found_Plural ${LANG_ENGLISH} "Found $counter_tmp installations"

  ;added on 2010-10-21
	LangString Uninstall_Folder_Name ${LANG_ENGLISH} "Uninstall"

  ;added on 2011-06-13
	LangString ^NameDA ${LANG_ENGLISH} "@CPACK_PACKAGE_NAME@ Version @CPACK_PACKAGE_VERSION@"
    LangString Installer ${LANG_ENGLISH} "Installer"

;#EOF
