%% Icon_Num=1
%% Facility=XXXX
##############################################################
### Load language files.
##############################################################
LoadLanguageFile "${NSISDIR}\Contrib\Language files\English.nlf"
LoadLanguageFile "${NSISDIR}\Contrib\Language files\Russian.nlf"

##############################################################
### General product dependent constants.
##############################################################
!define ICON_NUM "%Icon_Num%"
!define FACILITY "%Facility%"
!define DAQ32DIR "Daq32"
!define CRW32EXE "..\..\Crw32exe\Crw32.exe"
!define ShellVarContext "current" # "current" or "all"
Name "${DAQ32DIR}-${FACILITY}"
OutFile "..\Install${DAQ32DIR}-${FACILITY}.Exe"
InstallDir "C:\${DAQ32DIR}\${FACILITY}"
LangString CaptionText ${LANG_ENGLISH} "Install $(^Name) (built ${__DATE__}-${__TIME__})"
LangString CaptionText ${LANG_RUSSIAN} "Установка $(^Name) (сборка ${__DATE__}-${__TIME__})"
Caption "$(CaptionText)"

##############################################################
### General installer options.
##############################################################
SetCompressor /FINAL /SOLID lzma
SetCompress force
CRCCheck force
XPStyle on
SetFont "Tahoma" 12
InstallColors AAAAAA 000000
InstProgressFlags smooth colored
ShowInstDetails show
ShowUninstDetails show

##############################################################
### Compilation time scripts.
##############################################################
!system clear.bat

##############################################################
### License page.
##############################################################
Page License
LicenseLangString LicenseSource ${LANG_ENGLISH} "Help\License\license_eng.txt"
LicenseLangString LicenseSource ${LANG_RUSSIAN} "Help\License\license_rus.txt"
LicenseData $(LicenseSource)

##############################################################
### Components page.
##############################################################
Page Components

##############################################################
### Directory page.
##############################################################
Page Directory

##############################################################
### InstFiles page. Put installation sections there.
##############################################################
Page InstFiles

LangString SectionCheckAccessRights ${LANG_ENGLISH} "Check access rights..."
LangString SectionCheckAccessRights ${LANG_RUSSIAN} "Проверка прав доступа..."
Section "-$(SectionCheckAccessRights)"
  SectionIn RO # Section is read-only
  Call CheckAccessRights
SectionEnd

LangString SectionCheckCrw32 ${LANG_ENGLISH} "Check $INSTDIR\${CRW32EXE} existance..."
LangString SectionCheckCrw32 ${LANG_RUSSIAN} "Проверка наличия $INSTDIR\${CRW32EXE}..."
LangString CheckCrw32Warning ${LANG_ENGLISH} "The CRW32 software is not found! You should install CRW32 before!"
LangString CheckCrw32Warning ${LANG_RUSSIAN} "Пакет CRW32 не найден! Установите (на этот же диск) пакет CRW32!"
Section "-$(SectionCheckCrw32)"
  SectionIn RO # Section is read-only
  IfFileExists "$INSTDIR\${CRW32EXE}" +3
  MessageBox MB_OK "$(CheckCrw32Warning)"
  Abort "$(CheckCrw32Warning)"
SectionEnd

LangString SectionMakeBackup ${LANG_ENGLISH} "Make backup of previouse version..."
LangString SectionMakeBackup ${LANG_RUSSIAN} "Сохранить предыдущую версию..."
Section "-$(SectionMakeBackup)"
  SectionIn RO # Section is read-only
  IfFileExists "$INSTDIR.OLD" 0 +2
  RmDir /r "$INSTDIR.OLD"
  IfFileExists "$INSTDIR" 0 +2
  Rename "$INSTDIR" "$INSTDIR.OLD"
SectionEnd

LangString SectionConfiguration ${LANG_ENGLISH} "${DAQ32DIR}-${FACILITY} сonfiguration"
LangString SectionConfiguration ${LANG_RUSSIAN} "Конфигурация ${DAQ32DIR}-${FACILITY}"
Section "!$(SectionConfiguration)"
  SectionIn RO # Section is read-only
  SetOutPath "$INSTDIR"
  File /r *.*
  WriteUninstaller $INSTDIR\Uninstall.Exe
SectionEnd

LangString SectionDesktopLink ${LANG_ENGLISH} "Link to Desktop"
LangString SectionDesktopLink ${LANG_RUSSIAN} "Ярлык на Рабочем Столе"
Section "!$(SectionDesktopLink)"
  SetShellVarContext ${ShellVarContext}
  CreateShortCut "$DESKTOP\${DAQ32DIR}-${FACILITY}.Lnk" \
                 "$INSTDIR\${CRW32EXE}" \
                 '/icon=${ICON_NUM} "$INSTDIR\Config\!${FACILITY}.cfg"' \
                 "$INSTDIR\${CRW32EXE}" ${ICON_NUM}
SectionEnd

LangString SectionStartMenuLink ${LANG_ENGLISH} "Link to Start menu"
LangString SectionStartMenuLink ${LANG_RUSSIAN} "Пункт в меню Пуск"
LangString StartMenuLaunch ${LANG_ENGLISH} "Launch"
LangString StartMenuLaunch ${LANG_RUSSIAN} "Запуск"
LangString StartMenuUninstall ${LANG_ENGLISH} "Uninstall"
LangString StartMenuUninstall ${LANG_RUSSIAN} "Удаление"
Section "!$(SectionStartMenuLink)"
  SetShellVarContext ${ShellVarContext}
  Var /GLOBAL MENUNAME
  StrCpy $MENUNAME "$SMPROGRAMS\CRW-DAQ - ${DAQ32DIR}-${FACILITY}"
  CreateDirectory $MENUNAME
  CreateShortCut "$MENUNAME\$(StartMenuLaunch) ${DAQ32DIR}-${FACILITY}.Lnk" \
                 "$INSTDIR\${CRW32EXE}" \
                 '/icon=${ICON_NUM} "$INSTDIR\Config\!${FACILITY}.cfg"' \
                 "$INSTDIR\${CRW32EXE}" ${ICON_NUM}
  CreateShortCut "$MENUNAME\$(StartMenuUninstall) ${DAQ32DIR}-${FACILITY}.Lnk" \
                 "$INSTDIR\Uninstall.Exe"
SectionEnd

LangString SectionQuickLaunchLink ${LANG_ENGLISH} "Link to Quick Launch panel"
LangString SectionQuickLaunchLink ${LANG_RUSSIAN} "Ярлык в строке Быстрого Запуска"
Section "!$(SectionQuickLaunchLink)"
  SetShellVarContext ${ShellVarContext}
  CreateShortCut "$QUICKLAUNCH\${DAQ32DIR}-${FACILITY}.Lnk" \
                 "$INSTDIR\${CRW32EXE}" \
                 '/icon=${ICON_NUM} "$INSTDIR\Config\!${FACILITY}.cfg"' \
                 "$INSTDIR\${CRW32EXE}" ${ICON_NUM}
SectionEnd

LangString SectionCopyDataDir ${LANG_ENGLISH} "Copy Data directory"
LangString SectionCopyDataDir ${LANG_RUSSIAN} "Скопировать каталог Data"
Section "!$(SectionCopyDataDir)"
  IfFileExists "$INSTDIR.OLD\Data" 0 +3
   SetOutPath "$INSTDIR\Data"
   CopyFiles "$INSTDIR.OLD\Data\*.*" "$INSTDIR\Data"
SectionEnd

LangString SectionCopyTempDir ${LANG_ENGLISH} "Copy Temp directory"
LangString SectionCopyTempDir ${LANG_RUSSIAN} "Скопировать каталог Temp"
Section /o "$(SectionCopyTempDir)"
  IfFileExists "$INSTDIR.OLD\Temp" 0 +3
   SetOutPath "$INSTDIR\Temp"
   CopyFiles /SILENT "$INSTDIR.OLD\Temp\*.*" "$INSTDIR\Temp"
SectionEnd

LangString SectionCheckErrors ${LANG_ENGLISH} "Check errors..."
LangString SectionCheckErrors ${LANG_RUSSIAN} "Проверить статус..."
LangString CheckErrorsOkMsg ${LANG_ENGLISH} "Ok, no errors found during installation."
LangString CheckErrorsOkMsg ${LANG_RUSSIAN} "Ok, при инсталляции ошибок не найдено."
LangString CheckErrorsFailsMsg ${LANG_ENGLISH} "ATTENTION: some errors found during installation!"
LangString CheckErrorsFailsMsg ${LANG_RUSSIAN} "ВНИМАНИЕ: при инсталляции были найдены ошибки."
Section "-$(SectionCheckErrors)"
  SectionIn RO # Section is read-only
  IfErrors +2 0
  DetailPrint "$(CheckErrorsOkMsg)"
  IfErrors 0 +2
  DetailPrint "$(CheckErrorsFailsMsg)"
SectionEnd

##############################################################
### Uninstall confirmation page.
##############################################################
UninstPage uninstConfirm

##############################################################
### Uninstall page.
##############################################################
UninstPage InstFiles

LangString UninstallConfirmation ${LANG_ENGLISH} "Do you really want to uninstall $(^Name)?"
LangString UninstallConfirmation ${LANG_RUSSIAN} "Вы в самом  деле хотите удалить $(^Name)?"
LangString UninstallMessage ${LANG_ENGLISH} "Right, do not uninstall nothing & never..."
LangString UninstallMessage ${LANG_RUSSIAN} "Точно, никогда и ничего не надо удалять..."
Section "Uninstall"
  Call un.CheckAccessRights
  SetOutPath $INSTDIR
  SetShellVarContext ${ShellVarContext}
  MessageBox MB_YESNO "$(UninstallConfirmation)" IDYES DoUninstall IDNO DoAbort
  DoAbort:
   Abort "$(UninstallMessage)"
  DoUninstall:
   RMDir /r $INSTDIR
   StrCpy $MENUNAME "$SMPROGRAMS\CRW-DAQ - ${DAQ32DIR}-${FACILITY}"
   RMDir /r $MENUNAME
   Delete "$DESKTOP\${DAQ32DIR}-${FACILITY}.Lnk"
   Delete "$QUICKLAUNCH\${DAQ32DIR}-${FACILITY}.Lnk"
SectionEnd

##############################################################
### Select installation language dialog.
##############################################################
Function SelectLanguageDialog
  Push ""               # for the auto count to work the first empty push (Push "") must remain
  Push ${LANG_ENGLISH}  # English
  Push English
  Push ${LANG_RUSSIAN}  # Russian
  Push Russian
  Push A                # A means auto count languages
  LangDLL::LangDialog "Installer Language" "Please select the language of the installer"
  Pop $LANGUAGE
  StrCmp $LANGUAGE "Cancel" 0 +2
   Abort
FunctionEnd
##############################################################
Function un.SelectLanguageDialog
  Push ""               # for the auto count to work the first empty push (Push "") must remain
  Push ${LANG_ENGLISH}  # English
  Push English
  Push ${LANG_RUSSIAN}  # Russian
  Push Russian
  Push A                # A means auto count languages
  LangDLL::LangDialog "Uninstaller Language" "Please select the language of the uninstaller"
  Pop $LANGUAGE
  StrCmp $LANGUAGE "Cancel" 0 +2
   Abort
FunctionEnd
##############################################################

##############################################################
### Check if LANGUAGE is valid to use.
##############################################################
Function CheckLanguage
  StrCmp $LANGUAGE ${LANG_ENGLISH} LANGUAGE_OK +1
  StrCmp $LANGUAGE ${LANG_RUSSIAN} LANGUAGE_OK +1
   MessageBox MB_OK "Invalid LANGUAGE selected ($LANGUAGE)."
   Abort "Invalid LANGUAGE selected ($LANGUAGE)."
  LANGUAGE_OK:
FunctionEnd
##############################################################
Function un.CheckLanguage
  StrCmp $LANGUAGE ${LANG_ENGLISH} LANGUAGE_OK +1
  StrCmp $LANGUAGE ${LANG_RUSSIAN} LANGUAGE_OK +1
   MessageBox MB_OK "Invalid LANGUAGE selected ($LANGUAGE)."
   Abort "Invalid LANGUAGE selected ($LANGUAGE)."
  LANGUAGE_OK:
FunctionEnd
##############################################################

##############################################################
### Check user account type.
### If it is not "Admin", ask user to continue or abort...
##############################################################
Function CheckAccessRights
  Call CheckLanguage
  StrCmp $LANGUAGE ${LANG_ENGLISH} 0 +2
   DetailPrint "Now checking user access rights..."
  StrCmp $LANGUAGE ${LANG_RUSSIAN} 0 +2
   DetailPrint "Проверка прав доступа..."
  ClearErrors
  Var /GLOBAL UserName
  UserInfo::GetName
  IfErrors AccessWin9x
  Pop $UserName
  Var /GLOBAL AccountType
  UserInfo::GetAccountType
  IfErrors AccessWin9x
  Pop $AccountType
  StrCmp $LANGUAGE ${LANG_ENGLISH} 0 +2
   DetailPrint 'Found user "$UserName" of type "$AccountType".'
  StrCmp $LANGUAGE ${LANG_RUSSIAN} 0 +2
   DetailPrint 'Найден пользователь "$UserName" типа "$AccountType".'
  StrCmp $AccountType "Admin" AccessGranted AccessConfirmation
  AccessConfirmation:
   StrCmp $LANGUAGE ${LANG_ENGLISH} 0 +2
    MessageBox MB_YESNO 'User "$UserName" of type "$AccountType" \
                         have no Administrator rights. \
                         Application may work incorrectly after such installation. \
                         Continue installation?' \
                         IDYES AccessGranted IDNO AccessDenied
   StrCmp $LANGUAGE ${LANG_RUSSIAN} 0 +2
    MessageBox MB_YESNO 'Пользователь "$UserName" типа "$AccountType" \
                         не имеет прав Администратора. \
                         Приложение может работать некорректно после такой инсталляции. \
                         Все равно продолжить инсталляцию?' \
                         IDYES AccessGranted IDNO AccessDenied
  AccessDenied:
   StrCmp $LANGUAGE ${LANG_ENGLISH} 0 +4
    DetailPrint 'Access denied to user "$UserName" of type "$AccountType".'
    MessageBox MB_OK 'Access denied to user "$UserName" of type "$AccountType".'
    Abort 'Access denied to user "$UserName" of type "$AccountType".'
   StrCmp $LANGUAGE ${LANG_RUSSIAN} 0 +4
    DetailPrint 'Доступ закрыт для пользователя "$UserName" типа "$AccountType".'
    MessageBox MB_OK 'Доступ закрыт для пользователя "$UserName" типа "$AccountType".'
    Abort 'Доступ закрыт для пользователя "$UserName" типа "$AccountType".'
  AccessWin9x:
   StrCmp $LANGUAGE ${LANG_ENGLISH} 0 +2
    DetailPrint "Don't care about rights in Windows 9x."
   StrCmp $LANGUAGE ${LANG_RUSSIAN} 0 +2
    DetailPrint "Права доступа не играют роли в Windows 9x."
  AccessGranted:
   StrCmp $LANGUAGE ${LANG_ENGLISH} 0 +3
    DetailPrint 'Access granted to user "$UserName" of type "$AccountType".'
    DetailPrint 'Now can continue installation...'
   StrCmp $LANGUAGE ${LANG_RUSSIAN} 0 +3
    DetailPrint 'Доступ открыт для пользователя  "$UserName" типа "$AccountType".'
    DetailPrint 'Можно продолжать инсталляцию...'
FunctionEnd
##############################################################
Function un.CheckAccessRights
  Call un.CheckLanguage
  StrCmp $LANGUAGE ${LANG_ENGLISH} 0 +2
   DetailPrint "Now checking user access rights..."
  StrCmp $LANGUAGE ${LANG_RUSSIAN} 0 +2
   DetailPrint "Проверка прав доступа..."
  ClearErrors
  #Var /GLOBAL UserName
  UserInfo::GetName
  IfErrors AccessWin9x
  Pop $UserName
  #Var /GLOBAL AccountType
  UserInfo::GetAccountType
  IfErrors AccessWin9x
  Pop $AccountType
  StrCmp $LANGUAGE ${LANG_ENGLISH} 0 +2
   DetailPrint 'Found user "$UserName" of type "$AccountType".'
  StrCmp $LANGUAGE ${LANG_RUSSIAN} 0 +2
   DetailPrint 'Найден пользователь "$UserName" типа "$AccountType".'
  StrCmp $AccountType "Admin" AccessGranted AccessConfirmation
  AccessConfirmation:
   StrCmp $LANGUAGE ${LANG_ENGLISH} 0 +2
    MessageBox MB_YESNO 'User "$UserName" of type "$AccountType" \
                         have no Administrator rights. \
                         Uninstallation may fails. \
                         Continue uninstallation?' \
                         IDYES AccessGranted IDNO AccessDenied
   StrCmp $LANGUAGE ${LANG_RUSSIAN} 0 +2
    MessageBox MB_YESNO 'Пользователь "$UserName" типа "$AccountType" \
                         не имеет прав Администратора. \
                         Деинсталляция может пройти некорректно. \
                         Все равно продолжить деинсталляцию?' \
                         IDYES AccessGranted IDNO AccessDenied
  AccessDenied:
   StrCmp $LANGUAGE ${LANG_ENGLISH} 0 +4
    DetailPrint 'Access denied to user "$UserName" of type "$AccountType".'
    MessageBox MB_OK 'Access denied to user "$UserName" of type "$AccountType".'
    Abort 'Access denied to user "$UserName" of type "$AccountType".'
   StrCmp $LANGUAGE ${LANG_RUSSIAN} 0 +4
    DetailPrint 'Доступ закрыт для пользователя "$UserName" типа "$AccountType".'
    MessageBox MB_OK 'Доступ закрыт для пользователя "$UserName" типа "$AccountType".'
    Abort 'Доступ закрыт для пользователя "$UserName" типа "$AccountType".'
  AccessWin9x:
   StrCmp $LANGUAGE ${LANG_ENGLISH} 0 +2
    DetailPrint "Don't care about rights in Windows 9x."
   StrCmp $LANGUAGE ${LANG_RUSSIAN} 0 +2
    DetailPrint "Права доступа не играют роли в Windows 9x."
  AccessGranted:
   StrCmp $LANGUAGE ${LANG_ENGLISH} 0 +3
    DetailPrint 'Access granted to user "$UserName" of type "$AccountType".'
    DetailPrint 'Now can continue uninstallation...'
   StrCmp $LANGUAGE ${LANG_RUSSIAN} 0 +3
    DetailPrint 'Доступ открыт для пользователя  "$UserName" типа "$AccountType".'
    DetailPrint 'Можно продолжать деинсталляцию...'
FunctionEnd
##############################################################

##############################################################
### .onInit - installer initialization function.
##############################################################
Function .onInit
  Call SelectLanguageDialog
  Call CheckLanguage
FunctionEnd
##############################################################

##############################################################
### un.onInit - uninstaller initialization function.
##############################################################
Function un.onInit
  Call un.SelectLanguageDialog
  Call un.CheckLanguage
FunctionEnd
##############################################################
