;======================================================================
;
; DiskSalv general installer -- $VER: Install 11.5 (11.4.94)
;
; 11.5	Added updates for DiskSalv V11.30 distribution, mainly support
;	for the additional locale files.
; 11.4	Simple updates for DiskSalv V11.28
;	Fixed the install-locale-from-archive routine
; 11.3	Added better checks for the existance of the locales archive
;
;======================================================================
;
; Some basic strings

(set #disksalv-install 
     (cat "\nInstall DiskSalv\n"
          "\nYou may install the DiskSalv program and related "
          "files in the directory of your choice.  Proceed?"))

(set #disksalv-install-help
     (cat "\nThis section lets you choose in which drawer or on "
          "which disk the DiskSalv program will be installed."
          "\n\nIf you choose to proceed, you will be asked where you "
          "want the DiskSalv files placed.  If you choose "
          "to skip this part, you will go to the portion of the "
          "installation that processes language installations".))

(set #which-disk
     "In which disk or drawer should DiskSalv be installed?")

(set #any-locale
     (cat "\nInstall DiskSalv Localizations\n"
          "\nYou may install the DiskSalv locale files for various "
          "languages in the LOCALE: directory.  Proceed?"))

(set #any-locale-help
     (cat "\nDiskSalv can be operated in different languages."
          "\n\nIf you choose to proceed, you will be asked to "
          "select the translations you want available on your"
	  "system."))

(set #which-language "\nWhich catalogs should be installed?")

(set #which-language-help
     (cat "\nDiskSalv can be operated in many different "
         "languages. One file will be copied to your "
         "hard drive for each language supported.\n\n"
         "To reduce the amount of space consumed by the "
         "language files, you can select only the "
         "files of specific languages to be copied.\n\n"
         "Check the boxes of the languages you wish "
         "to have available on your system.\n\n"
         @askoptions-help))

(set #docs-install
     (cat "\nInstall DiskSalv Documentation\n"
          "\nA small manual for DiskSalv can be installed in the"
          "\ndirectory of your choice.  Proceed?"))

(set #which-docs "\nWhich manuals should be installed?")

(set #docs-install-help
     (cat "\nThis section lets you choose in which drawer or on "
          "which disk the DiskSalv documentation will be installed."
          "\n\nIf you choose to proceed, you will be asked where you "
          "want the DiskSalv documents placed.  If you choose "
          "to skip this part, installation is complete."))

(set #docs-where
     (cat "\nIn which disk or drawer should DiskSalv documentation "
          "be installed?"))

(set #system-catalog "locale:catalogs"
     #subdir-catalog "locale/catalogs"
     #subdir-docs    "locale/docs"
     #dscatname      "DiskSalv.catalog"
     #dsdocname      "DiskSalv.doc"
     #tmp-dir        "T:DiskSalv")

(set #get-dearchiver
     (cat "\nPlease specify the file name of a de-archiver "
          "program for \"LHA\"-type files."))

;======================================================================
;
; This function asks about the language, and sets the global "lang" to
; the language bit mask returned by the request.
;

(procedure ASKLANGUAGE
   (if (= askmode 0)
       ((set lang (askoptions (prompt #which-language)
                              (help #which-language-help)
                              (choices "dansk"
                                       "deutsch"
                                       "english"
				       "español"
                                       "français"
                                       "italiano"
                                       "norsk"
                                       "suomi"
                                       "svenska")))
         (if (IN lang 2) (set doclang 1))
         (if (IN lang 7) (set doclang (+ doclang 2))))
     (if (= doclang 0)
         ((set doclang (askoptions (prompt #which-docs)
			           (help #which-language-help)
                                   (choices "english" 
				            "español"
                                            "français"
                                            "svenska")))))))

;======================================================================
;
; This function finds a de-archiver in the user's system, resulting to
; a panic "ask-the-user" if none can be found.
;

(procedure FINDARCPROG
   (set n 0)
   (while (set test (select n "lz"
                              "lha"
                              ""))
      (if (not (run (cat "which " test)))
          (set arcprog test))
      (set n (+ n 1)))

   (if (= arcprog "")
       (set arcprog (askfile (prompt #get-dearchiver)
                             (help @askfile-help)
                             (default "C:"))))
)

;======================================================================
;
; This function gets the locale file information.  We mark the occasion
; with bit 0 set for the availability of the subdirectory, bit 1 set 
; for the availability of the archive file. 
;

(procedure ANYLOCALE
   (set localecode 0)
   (if (exists locale-catalogs)
       (set localecode 1))
   (if (exists locale-archive)
       (set localecode (+ localecode 2)))
   localecode)

;======================================================================
;
; This function transfers a locale file from the appropriate archive
; entry to the proper LOCALE:Catalogs subdirectory.
;

(procedure DOCATARCS
   (if (= arcprog "") (FINDARCPROG))
   (if (<> arcprog "")
       ((working "\nDe-archiving selected catalogs\n")
	(makedir #tmp-dir)
        (set arcsfiles (cat #subdir-catalog "/(" arclst ")/#?"))
        (set dearc-com (cat arcprog " >NIL: <NIL: e " locale-archive " "
                            arcsfiles))
        (set script (tackon #tmp-dir "de-archive-script"))
        (textfile (dest script)
                  (append (cat "cd " #tmp-dir "\n" dearc-com "\n")))

        (execute script)
        (copyfiles (source (tackon #tmp-dir #subdir-catalog))
                   (dest   #system-catalog)
                   (pattern "#?"))
        (run (cat "Delete >NIL: <NIL: " #tmp-dir " all")))))

;======================================================================
;
; This function transfers the locale files from the appropriate 
; existing subdirectories (in "sublst")  to the corresponding
; LOCALE:Catalogs subdirectories.
;

(procedure DOCATSUBS
   (copyfiles (source locale-catalogs)
              (dest   #system-catalog)
              (pattern (cat "(" sublst ")"))))

;======================================================================
;
; This function merges the new and old locale files if they both exist.
;

(procedure MERGELOCALES
   (if (not (exists locale-archive))
       (set locale-archive locale-update)
       (if (exists locale-update)
           ((if (= arcprog "") (FINDARCPROG))
            (if (<> arcprog "")
                ((working "\nUpdating Locale Archives...\n")
                 (makedir #tmp-dir)
                 (set dearc-com (cat arcprog " >NIL: <NIL: e " locale-update))
                 (set rearc-com (cat arcprog " >NIL: <NIL: u " locale-archive
                                             " locale/#?"))
                 (set script (tackon #tmp-dir "re-archive-script"))
                 (textfile (dest script)
                            (append (cat "cd " #tmp-dir "\n" dearc-com "\n" rearc-com "\n")))
                 (execute script)
;                 (run (cat "Delete >NIL: <NIL: " #tmp-dir " all"))
))))))

;======================================================================
;
; This function selects the language to be installed.
;

(procedure DOLOCALE
   (if (not (exists #system-catalog))
       (makedir #system-catalog))
   (set n      0
        sublst ""
        arclst "")
   (while (set language (select n "dansk"
                                  "deutsch"
                                  "english"
                                  "français"
                                  "italiano"
                                  "norsk"
                                  "suomi"
                                  "svenska"
                                  ""))
     (if (AND (IN lang n) (<> n 2))
        (if (exists (tackon locale-catalogs (tackon language #dscatname)))
            (if (= sublst "") (set sublst language) (set sublst (cat sublst "|" language)))
            (if (= arclst "") (set arclst language) (set arclst (cat arclst "|" language)))))
     (set n (+ n 1)))

   (if (AND (IN localecode 0) (<> sublst "")) (DOCATSUBS))
   (if (AND (IN localecode 1) (<> arclst "")) (DOCATARCS)))

;======================================================================
;
; This function gets the locale file information.  We mark the occasion
; with bit 0 set for the availability of the subdirectory, bit 1 set 
; for the availability of the archive file. 
;

(procedure ANYDOCS
   (set docscode 0)
   (if (exists locale-docs)
       (set docscode 1))
   (if (exists locale-archive)
       (set docscode (+ docscode 2)))
   docscode)

;======================================================================
;
; This function transfers a doc file from the appropriate archive
; entry to the selected documentation subdirectory.
;

(procedure DODOCARCS
   (if (= arcprog "") (FINDARCPROG))
   (if (<> arcprog "")
       ((working "\nDe-archiving selected docs files\n")
	(makedir #tmp-dir)
        (set arcsfiles (cat "(" #subdir-docs "/(" arclst ")/#?|" 
                                #subdir-docs ".info)"))
        (set dearc-com (cat arcprog " >NIL: <NIL: e " locale-archive " "
                            arcsfiles))
        (set script (tackon #tmp-dir "de-archive-script"))
        (textfile (dest script)
                  (append (cat "cd " #tmp-dir "\n" dearc-com "\n")))
        (execute script)
        (copyfiles (source (tackon #tmp-dir #subdir-docs))
                   (dest   docoutputdir)
                   (pattern "#?"))
        (run (cat "Delete >NIL: <NIL: " #tmp-dir " all")))))

;======================================================================
;
; This function transfers the docs files from the appropriate 
; existing subdirectories (in "sublst")  to the selected
; directory.
;

(procedure DODOCSUBS
   (copyfiles (source locale-docs)
              (dest   docoutputdir)
              (pattern (cat "(" sublst ")"))))

;======================================================================
;
; This function manages document installation.  It should automatically
; install any docs based on the requested localizations.  If none match,
; the user should be given a new choice of languages.
;

(procedure DODOCS
   (set docoutputdir 
        (tackon (askdir (prompt  #docs-where)
		        (help    @askdir-help)
		        (default @default-dest))
                "DiskSalv_Docs"))
   (set n      0
        sublst ""
        arclst "")
   (while (set language (select n "english"
				  "français"
                                  "svenska"
                                  ""))
     (if (IN doclang n)
        ((set testfile (tackon locale-docs (tackon language #dsdocname)))
         (if (exists testfile)
             (if (= sublst "") (set sublst language) (set sublst (cat sublst "|" language "|"
                                                                      language ".info")))
             (if (= arclst "") (set arclst language) (set arclst (cat arclst "|" language "|"
                                                                      language ".info"))))))
     (set n (+ n 1)))
   (if (AND (IN docscode 0) (<> sublst "")) (DODOCSUBS))
   (if (AND (IN docscode 1) (<> arclst "")) (DODOCARCS)))

;======================================================================
;
; The main program

(set inputdir          (pathonly @icon))
(set locale-archive    (tackon inputdir "DSLocale.lha")
     locale-update     (tackon inputdir "DSLocale11_30.lha")
     locale-catalogs   (tackon inputdir #subdir-catalog)
     locale-docs       (tackon inputdir #subdir-docs)
     arcprog           ""
     doclang           0
     @default-dest     "SYS:Tools")

; First, install the DiskSalv program proper

(if (askbool (prompt #disksalv-install)
             (help #disksalv-install-help)
             (choices "Yes" "Skip This Part")
             (default 1))
    ((set outputdir 
          (askdir (prompt  #which-disk)
		  (help    @askdir-help)
		  (default @default-dest)))
     (set @default-dest outputdir)
     (copyfiles (source inputdir)
                (dest outputdir)
                (pattern "DiskSalv")
                (files)
                (infos))
     (tooltype  (dest (tackon outputdir "DiskSalv"))
                (noposition)))
    (set @default-dest ""))

; Next, consider the locales.  Ask the user for a selection
; of catalogs, then call the catalog installer function. 

(MERGELOCALES)

(if (ANYLOCALE)
    (if (askbool (prompt #any-locale)
                 (help #any-locale-help)
                 (choices "Yes" "Skip This Part")
                 (default 1))
                  
        ((set askmode 0)
         (ASKLANGUAGE)
         (DOLOCALE))))

(if (ANYDOCS)
    (if (askbool (prompt #docs-install)
	         (help #docs-install-help)
                 (choices "Yes" "Skip This Part")
                 (default 1))
        ((set askmode 1)
         (ASKLANGUAGE)
         (DODOCS))))


