/*
 * * * Compile_AHK SETTINGS BEGIN * * *

[AHK2EXE]
Exe_File=%In_Dir%\..\FramaWizahk.exe
[VERSION]
Set_Version_Info=1
Company_Name=Framakey.org
File_Description=Assistant de portabilisation
File_Version=2.5.0.42
Inc_File_Version=1
Internal_Name=FramaWizahk
Legal_Copyright=2011 Framakey.org
Original_Filename=FramaWizahk.ahk
Product_Version=2.5.0.42
Inc_Product_Version=1
Language_ID=56
[ICONS]
Icon_1=%In_Dir%\img\FramaWizahk.ico

* * * Compile_AHK SETTINGS END * * *
*/

; ================================================================================
; 								FramaWizahk / Unicode
; ================================================================================
;
; 	Par fat115
; 	Le successeur du FramaWizard, les lanceurs sont dorénavant en AutoHotkey
; 	License : GPL
; 	Ce script permet de créer l'application FramaWizahk.
; 	Compiler: AutoHotkey_L (http://www.autohotkey.net/~Lexikos/AutoHotkey_L/).
; 	$id=FramaWizahk.ahk $date=2011-10-21
;
; --------------------------------------------------------------------------------
;						Copyright (C) 2005-2011 Framakey

;						Website: http://www.framakey.org

;This software is OSI Certified Open Source Software.
;OSI Certified is a certification mark of the Open Source Initiative.

;This program is free software; you can redistribute it and/or
;modify it under the terms of the GNU General Public License
;as published by the Free Software Foundation; either version 2
;of the License, or (at your option) any later version.

;This program is distributed in the hope that it will be useful,
;but WITHOUT ANY WARRANTY; without even the implied warranty of
;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	See the
;GNU General Public License for more details.

;You should have received a copy of the GNU General Public License
;along with this program; if not, write to the Free Software
;Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA	02110-1301, USA.
; --------------------------------------------------------------------------------

s_ScriptName := StringTrimRight(var := A_ScriptName, 4)

; On force le répertoire des includes à être celui du script
#Include %A_ScriptDir%\AhkIncludes
#Include FW_Functions.ahk
#Include Functions.ahk
#Include VersionInfo.ahk
#Include ini.ahk
; Pour la suite, on définit de manière explicite le répertoire de travail
SetWorkingDir %A_ScriptDir%
; On définit le format des Float
SetFormat, FloatFast, 0.2
FileEncoding, UTF-8
; récupération de la version pour affichage dans la barre de titre
FileGetVersion, FramaWizahkVer, %A_ScriptName%
; on crée un répertoire temporaire spécifique au processus
Process, Exist
i_PID := ErrorLevel
p_TempDir := A_Temp . "\" . s_ScriptName . "." . i_PID
FileCreateDir, %p_TempDir%
; procédure de sortie
OnExit, QuitWizard

; extraction des images
FileCreateDir, %p_TempDir%\img
FileInstall, .\img\about.ico, %p_TempDir%\img\about.ico
FileInstall, .\img\app_new.ico, %p_TempDir%\img\app_new.ico
FileInstall, .\img\app_update.ico, %p_TempDir%\img\app_update.ico
FileInstall, .\img\config.ico, %p_TempDir%\img\config.ico
FileInstall, .\img\FramaWizahk.ico, %p_TempDir%\img\FramaWizahk.ico
FileInstall, .\img\quit.ico, %p_TempDir%\img\quit.ico
FileInstall, .\img\FramaWizahk.png, %p_TempDir%\img\FramaWizahk.png
FileInstall, .\img\NoPicture.png, %p_TempDir%\img\NoPicture.png
FileInstall, licence.txt, %p_TempDir%\licence.txt


; On définit les sous dossiers pour le traitement des fichiers temporaires et des images
p_7zExe := A_ScriptDir . "\Tools\7zip\7za.exe"
p_ImgDir := p_TempDir . "\img"
p_IMConvert := A_ScriptDir . "\Tools\ImageMagick\convert.exe"
p_png2ico := A_ScriptDir . "\Tools\png2ico\png2ico.exe"
p_icobundle := A_ScriptDir . "\Tools\icobundle\icobundl.exe"
; définition des icones
f_about := p_ImgDir . "\about.ico"
f_appnew := p_ImgDir . "\app_new.ico"
f_appupdate := p_ImgDir . "\app_update.ico"
f_config := p_ImgDir . "\config.ico"
f_quit := p_ImgDir . "\quit.ico"
f_appicon := p_ImgDir . "\FramaWizahk.ico"
; définition des tailes d'icones
s_LogoSizes := "256|128|64|48|32|24|16"

s_LogMsg := ""

; Lecture du fichier INI et construction des DropDownList
ini_load(s_FWIniFile, s_ScriptName . ".ini", "UTF-8")
p_FramaDevDir := ini_getValue(s_FWIniFile, "DEVELOPMENT", "FramaKeyDir")
p_FramaEditor := ini_getValue(s_FWIniFile, "DEVELOPMENT", "FramaEditeur")
p_FramaCompiler := ini_getValue(s_FWIniFile, "DEVELOPMENT", "FramaCompilateur")
p_FramaCompressor := ini_getValue(s_FWIniFile, "DEVELOPMENT", "FramaCompressor")

s_ListCategory := StringReplace(var := ini_getAllValues(s_FWIniFile,"CATEGORIES"), "`n", "|", "All")
s_ListLicense := StringReplace(var := ini_getAllValues(s_FWIniFile,"LICENSES"), "`n", "|", "All")
s_ListLang := StringReplace(var := ini_getAllValues(s_FWIniFile,"LANGUAGES"), "`n", "|", "All")
s_ListBranch := StringReplace(var := ini_getAllValues(s_FWIniFile,"BRANCHES"), "`n", "|", "All")

; appel des définitions des infobulles
#Include ToolTipMsg.ahk

; ================================================================================
;					 Définition de la GUI principale
; ================================================================================
MainGuiDef:
{
	Gui, +LastFound
	; Définition des Menus
	Menu, FileMenu, Add, &Nouvelle Application	Ctrl+N, MenuFileNew
	Menu, FileMenu, Icon, &Nouvelle Application	Ctrl+N, %f_appnew%
	Menu, FileMenu, Add, &Mise à jour d'une application	Ctrl+M, MenuFileUpdate
	Menu, FileMenu, Icon, &Mise à jour d'une application	Ctrl+M, %f_appupdate%
	Menu, FileMenu, Add
	Menu, FileMenu, Add, &Configuration	Alt+C, ConfigWindow
	Menu, FileMenu, Icon, &Configuration	Alt+C, %f_config%
	Menu, FileMenu, Add
	Menu, FileMenu, Add, &Quitter	Alt+F4, GuiClose
	Menu, FileMenu, Icon, &Quitter	Alt+F4, %f_quit%
	Menu, HelpMenu, Add, A Propos …, About
	Menu, HelpMenu, Icon, A Propos …, %f_about%
	Menu, MainMenuBar, Add, Fichier, :FileMenu
	Menu, MainMenuBar, Add, ?, :HelpMenu
	Menu, TRAY, Icon, %f_appicon%
	Gui, Menu, MainMenuBar
	; Définitions des Boutons & Onglets 
	Gui, Add, Button, x754 y30 w120 h24 Disabled vb_CopyApp gUpdateApp, Transférer l'application
	Gui, Add, Button, xp+0 yp+50 w120 h48 Disabled vb_EditScript gEditAHK, Créer/Éditer le script AHK
	Gui, Add, Button, xp+0 yp+50 w120 h24 Disabled vb_CompileScript gCompileAHK, Compiler le script AHK
	Gui, Add, Button, xp+0 yp+30 w120 h24 Disabled vb_CompileRO gCompileAHKRO, … pour lecture seule
	Gui, Add, Button, xp+0 yp+30 w120 h24 Disabled vb_CompileN gCompileAHKN, … pour réseau
	Gui, Add, Button, xp+0 yp+50 w120 h24 Disabled vb_TryLauncher gTryLauncher, Essayer le lanceur
	Gui, Add, Button, xp+0 yp+50 w120 h24 Disabled vb_ManualClean gClean, Faire du ménage
	Gui, Add, Button, xp+0 yp+50 w120 h24 Disabled vb_ZipPack gZipPack, Paquet ZIP
	Gui, Add, Button, xp+0 yp+50 w120 h24 Disabled vb_Compress gCompress, Essai de compression
	Gui, Add, Button, x754 y486 w120 h24 gGuiClose, Quitter
	Gui, Add, Tab, x6 y2 w740 h520 , Général|Images
		; Onglet Général
	Gui, Tab, Général
	{
		; Groupe Application
		Gui, Add, GroupBox, x16 y24 w720 h180 , Application
		Gui, Add, Text, x22 y42 w146 h16 , Nom de l'application portable :
		Gui, Add, Edit, x172 y39 w190 h22 ReadOnly vs_PortAppName, 
		Gui, Add, Text, x392 y42 w146 h16 , Nom de l'application mère :
		Gui, Add, Edit, x542 y39 w190 h22 vs_AppName, 
		Gui, Add, Text, x22 y70 w60 h16 +Right, Catégorie :
		Gui, Add, DropDownList, x88 y67 w156 h21 R10 vs_Category, %s_ListCategory%
		Gui, Add, Text, x260 y70 w60 h16 +Right, Licence :
		Gui, Add, DropDownList, x326 y67 w156 h21 R5 vs_License, %s_ListLicense%
		Gui, Add, Text, x506 y70 w60 h16 +Right, Langue :
		Gui, Add, DropDownList, x572 y67 w160 h21 R5 vs_Lang, %s_ListLang%
		Gui, Add, Text, x22 y100 w88 h16 , Nom court (Kiosk)
		Gui, Add, Edit, x114 y96 w150 h22 vs_FriendlyName, 
		Gui, Add, Text, x276 y100 w92 h16 , Description rapide
		Gui, Add, Edit, x372 y96 w360 h22 vs_ShortDesc, 
		Gui, Add, Text, x22 y134 w88 h16 , Description
		Gui, Add, Edit, x114 y125 w618 h70 vs_LongDesc, 
		; Groupe Internet
		Gui, Add, GroupBox, x16 y208 w720 h102 , Internet
		Gui, Add, Text, x22 y226 w146 h16 , Adresse de la page Framakey
		Gui, Add, Edit, x172 y223 w286 h22 vs_Homepage, 
		Gui, Add, Text, x22 y254 w146 h16 , Notice sur Framasoft
		Gui, Add, Edit, x172 y251 w286 h22 vs_FramasoftPage, 
		Gui, Add, Text, x22 y282 w146 h16 , Nom du site Internet mère
		Gui, Add, Edit, x172 y279 w140 h22 vs_AppWebsiteName, 
		Gui, Add, Text, x318 y282 w146 h16 , Adresse du site Internet mère
		Gui, Add, Edit, x470 y279 w262 h22 vs_AppWebsite, 
		; Groupe Release
		Gui, Add, GroupBox, x16 y314 w396 h200 , Release
		Gui, Add, Text, x22 y332 w90 h16 , Date de la release
		Gui, Add, DateTime, x118 y328 w90 h24 vh_ReleaseDate, 
		Gui, Add, Text, x22 y360 w140 h16 , Développeur de la release :
		Gui, Add, Edit, x168 y357 w238 h22 vs_ReleaseDev, 
		Gui, Add, Text, x22 y416 w70 h16 , Changelog :
		Gui, Add, Edit, x22 y441 w384 h67 vs_ChangeLog, 
		Gui, Add, Text, x250 y332 w50 h16 , Branche :
		Gui, Add, DropDownList, x306 y329 w100 h21 R5 vs_Branch, %s_ListBranch%
		Gui, Add, Text, x22 y388 w90 h16 , Nom du paquet :
		Gui, Add, Edit, x118 y385 w288 h22 vs_PacketName, 
		Gui, Add, Text, x252 y416 w84 h16 , Taille (en octets)
		Gui, Add, Edit, x342 y413 w64 h22 Right vi_Size, 0
		; Groupe Code
		Gui, Add, GroupBox, x418 y314 w318 h200 , Code
		Gui, Add, Text, x426 y332 w120 h16 , Dossier de l'exécutable
		Gui, Add, Edit, x552 y329 w180 h22 vp_ExecFolder, 
		Gui, Add, Text, x426 y360 w120 h16 , Nom de l'exécutable
		Gui, Add, Edit, x552 y357 w180 h22 vf_ExecName, 
		Gui, Add, Text, x426 y388 w120 h16 , Version du lanceur
		Gui, Add, Edit, x552 y385 w52 h22 vi_LauncherVer, 
		Gui, Add, Button, x426 y413 w308 h16 vb_ButtonInstDir gCustomInstDir, Personnaliser les dossiers d'installation
		Gui, Add, Text, x426 y438 w132 h16 , Fichiers/Dossiers à sauver
		Gui, Add, Button, x564 y435 w64 h20 vb_ButtonAddFile gDirsaveAddFile, + Fichier(s)
		Gui, Add, Button, x632 y435 w64 h20 vb_ButtonAddFolder gDirsaveAddFolder, + Dossier(s)
		Gui, Add, Button, x700 y435 w34 h20 vb_ButtonResetSave gDirsaveRaz, RaZ
		Gui, Add, Edit, x426 y458 w308 h20 ReadOnly vs_DirSave, 
		Gui, Add, Text, x456 y487 w50 h16 vs_Version, Version :
		Gui, Add, Edit, x511 y484 w52 h22 vi_ExecVer1, 
		Gui, Add, UpDown, x511 y484 w52 h22 vUpVer1, 0
		Gui, Add, Edit, x566 y484 w52 h22 vi_ExecVer2, 
		Gui, Add, UpDown, x566 y484 w52 h22 vUpVer2, 0
		Gui, Add, Edit, x621 y484 w52 h22 vi_ExecVer3, 
		Gui, Add, UpDown, x621 y484 w52 h22 vUpVer3, 0
		Gui, Add, Edit, x676 y484 w52 h22 vi_ExecVer4, 
		Gui, Add, UpDown, x676 y484 w52 h22 vUpVer4, 0
	}
	; Onglet Images
	Gui, Tab, Images
	{
		; Groupe Icône
		Gui, Add, GroupBox, x16 y32 w720 h298 , Icônes et logos
		Gui, Add, Text, x23 y52 w152 h20 , Image PNG d'origine
		Gui, Add, Edit, x182 y52 w140 h20 ReadOnly vf_PNGFile, 
		Gui, Add, Button, x336 y52 w30 h20 Disabled vb_ButtonLogo gFileSelectLogo, ...
		Gui, Add, Text, x23 y80 w286 h16 , Icône (App\AppInfo\appicon.ico)
		Gui, Add, Edit, x316 y77 w184 h22 vb_AppIcon ReadOnly +Center, 
		Loop, parse, s_LogoSizes, |
			{
			_ypostext := 80 + A_Index * 28
			_yposedit := _ypostext -3
			Gui, Add, Text, x23 y%_ypostext% w286 h16 , Image PNG %A_LoopField% pixels (App\AppInfo\appicon_%A_LoopField%.png)
			Gui, Add, Edit, x316 y%_yposedit% w184 h22 vb_appicon%A_LoopField% ReadOnly +Center, 
			}
		Gui, Add, Picture, x588 y78 w128 h-1 vf_Logo128, 
		; Groupe Screenshot
		Gui, Add, GroupBox, x16 y342 w720 h160 , Vignettes
		Gui, Add, Text, x23 y362 w152 h20 , Image d'origine
		Gui, Add, Edit, x182 y362 w140 h20 vf_ScreenFile, 
		Gui, Add, Button, x336 y362 w30 h20n Disabled vb_ButtonScreen gFileSelectScreen, ...
		Gui, Add, Text, x23 y390 w286 h16 , Image PNG taille originale (App\AppInfo\screenshot.png)
		Gui, Add, Edit, x316 y387 w184 h22 vb_ScreenCap +Center ReadOnly, 
		Gui, Add, Text, x23 y418 w286 h16 , Image PNG 128 pixels (App\AppInfo\screenshot_128.png)
		Gui, Add, Edit, x316 y415 w184 h22 vb_ScreenCap128 +Center ReadOnly, 
		Gui, Add, Picture, x588 y368 w128 h-1 vf_Screen128, 
	}
	Gui, Add, StatusBar, x172 y114 w140 h22 vLogDisplay gLogWindow ,
	; Generated using SmartGUI Creator 4.0
	Gui, Show, Center h563 w890, %s_ScriptName% %FramaWizahkVer%
	OnMessage(0x200, "WM_MOUSEMOVE")
Return
}

; ================================================================================
;			Gestion des boites de dialogue de selection et de fermeture
; ================================================================================
; Gestion des Hotkeys
#IfWinActive, FramaWizahk
^n::  ; Le raccourci Ctrl+N
MenuFileNew:
{
	Gui +OwnDialogs  ; Désactive la possibilité d'interagir avec la GUI principale
	InputBox, s_PortAppName, Nouvelle Application, Entrez le nom de la nouvelle application :, , 256, 128, , , , , XYZPortable
	If ErrorLevel
		Return
	If (s_PortAppName = "")
		Return
	; On complète les boites en automatique à partir du nom du dossier
	Gosub AutoCompletion
	; Par sécurité, récupération des contenus des boites
	Gui, Submit, NoHide
	p_SelectedFolder := A_ScriptDir . "\" . s_PortAppName
	p_AppInfo := p_SelectedFolder . "\App\AppInfo\"
	p_Source := p_SelectedFolder . "\Other\Source\"
	FileCopyDir, %A_ScriptDir%\DefaultStructure, %p_SelectedFolder%
	If ErrorLevel
		{
		LogStatus("Erreur : Le dossier de destination existe déjà.", "user32.dll", 2)
		Return
		}
	; Remplissage du nom de l'appli portable et autocomplétion des autres boites liées
	LogStatus("Tentative de récupération de données à partir du site.", "user32.dll", 2)
	Gosub ReadURLFile
	b_NewApp := 1
	FileCreateDir, %p_SelectedFolder%\App\%p_ExecFolder%
	LogStatus("Les dossiers ont été créés.", "user32.dll", 5)
	Loop, %p_Source%default*.*
		{
		f_Target := StringReplace(var := A_LoopFileLongPath, "default", s_PortAppName)
		FileMove, %A_LoopFileLongPath%, %f_Target%
		}
	LogStatus("Les fichiers ont été renommés correctement.")
	Gosub DisplayImages
	Gosub VerifyLogo
	Gosub VerifyScreen
	GuiControl, Enable, b_CopyApp
	GuiControl, Enable, b_ButtonLogo
	GuiControl, Enable, b_ButtonScreen
Return
}

; Gestion des Hotkeys
#IfWinActive, FramaWizahk
^m::  ; Le raccourci Ctrl+M
MenuFileUpdate:
{
	Gui +OwnDialogs  ; Désactive la possibilité d'interagir avec la GUI principale
	FileSelectFolder, p_SelectedFolder, *%p_FramaDevDir%, ,Sélection du dossier de base de l'application
	If ErrorLevel
		Return
	; Vérifie que XyzPortable existe"
	If !(FileExist(p_SelectedFolder . "\*Portable.exe"))
		{
		; redirection vers Repack si PortableXyz existe
		If FileExist(p_SelectedFolder . "\Portable*.exe")
			MsgBox Ce dossier semble contenir une application au format Framakey 1.x`nVous devriez d'abord passer par Repack.
		Else
			MsgBox Impossible de reconnaitre le format utilisé. Désolé`, la boule de cristal c'est pour la prochaine version.
		Return
		}

	LogStatus("Copie du répertoire en cours …", "user32.dll", 5)
	; On isole le nom du dossier (et donc de l'appli portable)
	Loop, parse, p_SelectedFolder, \
		s_PortAppName := A_LoopField
	; On copie le répertoire indiqué vers un sous répertoire de FramaWizahk
	FileRemoveDir, %s_PortAppName%, 1
	FileCopyDir, %p_SelectedFolder%, %s_PortAppName%
	; on redéfinit le répertoire sur lequel on va travailler
	p_SelectedFolder = %A_ScriptDir%\%s_PortAppName%
	p_AppInfo := p_SelectedFolder . "\App\AppInfo\"
	p_Source := p_SelectedFolder . "\Other\Source\"
	LogStatus("Copie terminée.")

	; On récupère à partir du appinfo.ini s'il existe
	If (FileGetSize(p_AppInfo . "appinfo.ini") != 0)
		Gosub ReadAppInfoFile
	Else
		{
		FileCopy, %A_ScriptDir%\DefaultStructure\App\AppInfo\appinfo.ini, %p_AppInfo%appinfo.ini, 1
		LogStatus("Pas de fichier appinfo.ini disponible. Tentative de récupération de données à partir du site.", "user32.dll", 2)
		Gosub ReadURLFile
		}

	; On récupère à partir de XyzPortable.ini s'il existe dans le dossier Source
	LogStatus("Récupération de données du fichier " . s_PortAppName . ".ini en cours …", "user32.dll", 5)
	Gosub AutoCompletion
	ini_load(s_IniPortable, p_Source . s_PortAppName . ".ini", "CP1252")
	If !(ErrorLevel)
		{
		p_ExecFolder := StringReplace(var := ini_getValue(s_IniPortable, s_PortAppName, "ApplicationDirectory"), "App\", "")
		f_ExecName := ini_getValue(s_IniPortable, s_PortAppName, "ApplicationExecutable")
		; si vide on est en présence d'un ancien format AppNameDirectory/Executable
		If !p_ExecFolder
			{
			p_ExecFolder := StringReplace(var := ini_getValue(s_IniPortable, s_PortAppName, s_AppName . "Directory"), "App\", "")
			f_ExecName := ini_getValue(s_IniPortable, s_PortAppName, s_AppName . "Executable")
			ini_replaceKey(s_IniPortable, s_PortAppName, s_AppName . "Directory", "ApplicationDirectory=App\" . p_ExecFolder)
			ini_replaceKey(s_IniPortable, s_PortAppName, s_AppName . "Executable", "ApplicationExecutable=" . f_ExecName)
			}
		GuiControl,, p_ExecFolder, %p_ExecFolder%
		GuiControl,, f_ExecName, %f_ExecName%
		}
	Else
		{
		FileRead, s_IniPortable, %A_ScriptDir%\DefaultStructure\Other\Source\default.ini
		s_IniPortable := StringReplace(s_IniPortable, "__name__", s_PortAppName)
		FileAppend, %s_IniPortable%, %p_Source%%s_PortAppName%.ini
		}
	LogStatus("Récupération terminée. Veuillez vérifier les différents items.")
	; on traite le cas des lanceurs NSIS
	IfExist, %p_Source%%s_PortAppName%.nsi
		{
		; script principal
		FileDelete, %p_Source%%s_PortAppName%.nsi
		; includes
		FileDelete, %p_Source%*.nsh
		; splashscreen
		FileDelete, %p_Source%*.jpg
		FileCopy, %A_ScriptDir%\DefaultStructure\Other\Source\*.ahk, %p_Source%*.*, 1
		FileMove, %p_Source%default.ahk, %p_Source%%s_PortAppName%.ahk, 1
		FileCopy, %A_ScriptDir%\DefaultStructure\Other\Source\Lang.ini, %p_Source%Lang.ini, 1
		FileCopy, %A_ScriptDir%\DefaultStructure\Other\Source\LogigrammeLanceur.odg, %p_Source%LogigrammeLanceur.odg, 1
		}
	Gosub DisplayImages
	Gosub VerifyLogo
	Gosub VerifyScreen
	GuiControl, Enable, b_CopyApp
	GuiControl, Enable, b_ButtonLogo
	GuiControl, Enable, b_ButtonScreen
	b_NewApp := 0
Return
}

FileSelectLogo:
{
	Gui +OwnDialogs  ; Désactive la possibilité d'interagir avec la GUI principale
	FileSelectFile, p_SelectedPNG,,%p_AppInfo%,Sélection de l'image au format PNG, Images PNG (*.png)
	If ErrorLevel
		Return
	GuiControl,, f_PNGFile, %p_SelectedPNG%
	Gosub TransformPNG
	Gosub VerifyLogo
Return
}

FileSelectScreen:
{
	Gui +OwnDialogs  ; Désactive la possibilité d'interagir avec la GUI principale
	FileSelectFile, p_SelectedScreen,,%p_AppInfo%,Sélection de la capture écran, Images (*.png; *.gif; *.jpg; *.jpeg; *.bmp)
	If ErrorLevel
		Return
	GuiControl,, f_ScreenFile, %p_SelectedScreen%
	Gosub TransformScreen
	Gosub VerifyScreen
Return
}

; Gestion des Hotkeys
#IfWinActive, FramaWizahk
!F4:: ; Le raccourci Alt+F4
GuiClose:
	ExitApp
Return

QuitWizard:
{
	; On efface le dossier temporaire
	FileRemoveDir, %p_TempDir%, 1
ExitApp
Return
}

; ================================================================================
;						Gestion des boutons
; ================================================================================
; Remplissage du fichier appinfo.ini
FillAppInfo:
{
	; Par sécurité, récupération des contenus des boites
	Gui, Submit, NoHide
	; Remplissage de la section Details
	VerifyKeys(s_AppInfoFile, "Details", "Name|AppID|Publisher|Homepage|Category|Description|Language|Trademarks|InstallType")
	ini_replaceValue(s_AppInfoFile, "Details", "Name", s_PortAppName)
	ini_replaceValue(s_AppInfoFile, "Details", "AppID", s_PortAppName)
	ini_replaceValue(s_AppInfoFile, "Details", "Publisher", s_AppWebsiteName . " et FramaKey.org")
	ini_replaceValue(s_AppInfoFile, "Details", "Homepage", s_Homepage)
	ini_replaceValue(s_AppInfoFile, "Details", "Category", s_Category)
	ini_replaceValue(s_AppInfoFile, "Details", "Description", s_ShortDesc)
	StringSplit, Language, s_Lang, `;
	ini_replaceValue(s_AppInfoFile, "Details", "Language", Language1)
	LangAbrev := SubStr(Language2, 1, InStr(Language2, "_") - 1)
	; Vu la politique Framakey, on met tout à True pour la section License
	VerifyKeys(s_AppInfoFile, "License", "Shareable|OpenSource|Freeware|CommercialUse")
	ini_replaceValue(s_AppInfoFile, "License", "Shareable", "true")
	ini_replaceValue(s_AppInfoFile, "License", "OpenSource", "true")
	ini_replaceValue(s_AppInfoFile, "License", "Freeware", "true")
	ini_replaceValue(s_AppInfoFile, "License", "CommercialUse", "true")
	; Remplissage de la section Version
	VerifyKeys(s_AppInfoFile, "Version", "PackageVersion|DisplayVersion")
	Loop, 4
		{
		If i_ExecVer%A_Index% = 
			i_ExecVer%A_Index% := 0
		}
	ExecVer := i_ExecVer1 . "." . i_ExecVer2 . "." . i_ExecVer3 . "." . i_ExecVer4
	; on stocke la version pour le AHK
	s_ExecVer := ExecVer
	ini_replaceValue(s_AppInfoFile, "Version", "PackageVersion", ExecVer)
	Loop, 4
		{
		Count := 5 - A_Index
		If i_ExecVer%Count% = 0
			StringTrimRight, ExecVer, ExecVer, 2
		Else
			Break
		}
	; on stocke la version pour le nom du paquet
	s_FinalVer := ExecVer . "-" . LangAbrev . "-r" . i_LauncherVer
	ini_replaceValue(s_AppInfoFile, "Version", "DisplayVersion", ExecVer . " " . LangAbrev . " Realease " . i_LauncherVer)
	; Remplissage de la section Control
	ini_replaceValue(s_AppInfoFile, "Control", "Start", s_PortAppName . ".exe")
	; Remplissage des infos spécifiques Framakey, on reporte size à plus tard
	VerifyKeys(s_AppInfoFile, "Framakey", "Name|FriendlyName|Size|Repository|Type|FramasoftPage|AppWebsite|License|LongDesc|Date|Dirsave|Installdir|Dir")
	ini_replaceValue(s_AppInfoFile, "Framakey", "Name", s_AppName)
	ini_replaceValue(s_AppInfoFile, "Framakey", "FriendlyName", s_FriendlyName)
	ini_replaceValue(s_AppInfoFile, "Framakey", "Repository", s_Branch)
	ini_replaceValue(s_AppInfoFile, "Framakey", "FramasoftPage", s_FramasoftPage)
	ini_replaceValue(s_AppInfoFile, "Framakey", "AppWebsite", s_AppWebsite)
	ini_replaceValue(s_AppInfoFile, "Framakey", "License", s_License)
	ini_replaceValue(s_AppInfoFile, "Framakey", "LongDesc", TxtToHTMLite(s_LongDesc))
	ini_replaceValue(s_AppInfoFile, "Framakey", "Date", SubStr(h_ReleaseDate, 1, 4) . "/" . SubStr(h_ReleaseDate, 5, 2) . "/" . SubStr(h_ReleaseDate, 7, 2))
	s_Dir := (!s_Dir) ? s_PortAppName : s_Dir
	ini_replaceValue(s_AppInfoFile, "Framakey", "Dir", s_Dir)
	ini_replaceValue(s_AppInfoFile, "Framakey", "Installdir", s_Installdir)
	ini_replaceValue(s_AppInfoFile, "Framakey", "Dirsave", s_Dirsave)
	; on met une valeur temporaire comme taille
	ini_replaceValue(s_AppInfoFile, "Framakey", "Size", SumFolderSize(p_SelectedFolder))
	ini_save(s_AppInfoFile, p_AppInfo . "appinfo.ini", "UTF-8")
	; traitement du fichier launch
	f_AppLch := p_AppInfo . "app.lch"
	IniWrite, FramaRoot\Apps\%s_PortAppName%\%s_PortAppName%.exe, %f_AppLch%, Launch, ExecuteFile
	IniWrite, FramaRoot\Apps\%s_PortAppName%, %f_AppLch%, Launch, ExecuteDirectory
	LogStatus("Le fichier appinfo.ini est rempli en fonction des données existantes.", "user32.dll", 5)
Return
}

UpdateApp:
{
	LogStatus("Début de la copie/mise à jour de l'application.", "user32.dll", 5)
	GuiControlGet, p_ExecFolder
	If !(FileExist(p_SelectedFolder . "\App\" . p_ExecFolder))
		{
		MsgBox, 16, Erreur, Le dossier de l'application n'est pas défini ou est introuvable.
		GuiControl, Focus, p_ExecFolder
		Return
		}
	; Sauvegarde des fichiers et dossiers inscrits dans s_Dirsave
	If s_Dirsave
		{
		Loop, parse, s_Dirsave, |
			{
			StringReplace, s_Tampon , A_LoopField, /, \, All
			; sélection de l'action en fonction du type : fichier ou dossier
			If InStr(FileExist(p_SelectedFolder "\" s_Tampon), "D")
				FileMoveDir, %p_SelectedFolder%\%s_Tampon%, %p_TempDir%\%s_Tampon%, 1
			Else
				{
				SplitPath, s_Tampon, , s_Tampondir
				IfNotExist, %p_TempDir%\%s_Tampondir%
					FileCreateDir, %p_TempDir%\%s_Tampondir%
				FileMove, %p_SelectedFolder%\%s_Tampon%, %p_TempDir%\%s_Tampon%, 1
				}
			}
		}
	; s'il s'agit d'une mise à jour on efface le dossier de l'appli
	If !b_NewApp
		FileRemoveDir, %p_SelectedFolder%\App\%p_ExecFolder%, 1
	Gui +OwnDialogs  ; Désactive la possibilité d'interagir avec la GUI principale
	FileSelectFolder, UpdateFolder, , ,Sélection du dossier contenant la nouvelle version
	If ErrorLevel
		Return
	FileCopyDir, %UpdateFolder%, %p_SelectedFolder%\App\%p_ExecFolder%, 1
	If ErrorLevel
		LogStatus("Une erreur est survenue lors de la copie.", "user32.dll", 2)
	Else
		LogStatus("L'application a été mise à jour.", "user32.dll", 5)
	; On essaie de renseigner automatiquement le nom de l'exécutable
	GuiControlGet, f_ExecName
	If (f_ExecName = "")
		{
		IfExist, %p_SelectedFolder%\App\%p_ExecFolder%\%s_AppName%.exe
			f_ExecName := s_AppName . ".exe"
		Else
			{
			; recherche du plus gros exécutable
			i_TestSize := 0
			Loop, %p_SelectedFolder%\App\%p_ExecFolder%\*.exe
				{
				If (FileGetSize(A_LoopFileLongPath) > i_TestSize)
					{
					i_TestSize := FileGetSize(A_LoopFileLongPath)
					f_ExecName := A_LoopFileName
					}
				}
			}
		}
	GuiControl,, f_ExecName, %f_ExecName%
	; On essaie de renseigner automatiquement la version
	s_VerInfo := FileGetFullVer(p_SelectedFolder . "\App\" . p_ExecFolder . "\" . f_ExecName)
	s_FileVersion := StringReplace(s_VerInfo.CommaFileVersion, "`,", ".", "All")
	StringSplit, i_ExecVer, s_FileVersion, .
	Loop, 4
		{
		i_Content := i_ExecVer%A_Index%
		GuiControl,, i_ExecVer%A_Index%, %i_Content%
		}
	GuiControl,, i_LauncherVer, 01
	; remise en place des fichiers sauvegardés (s_Dirsave)
	If s_Dirsave
		{
		Loop, parse, s_Dirsave, |
			{
			StringReplace, s_Tampon , A_LoopField, /, \, All
			; sélection de l'action en fonction du type : fichier ou dossier
			If InStr(FileExist(p_TempDir . s_Tampon), "D")
				FileMoveDir, %p_TempDir%\%s_Tampon%, %p_SelectedFolder%\%s_Tampon%, 1
			Else
				FileMove, %p_TempDir%\%s_Tampon%, %p_SelectedFolder%\%s_Tampon%, 1
			}
		}
		
	GuiControl, Enable, b_EditScript
Return
}

EditAHK:
{
	Gosub UpdateToolTipMsg
	If s_Undefined
		{
		LogStatus("Erreur : il reste des informations non remplies.", "user32.dll", 2)
		Return
		}
	; on charge et on met à jour appinfo.ini
	ini_load(s_AppInfoFile, p_AppInfo . "appinfo.ini", "UTF-8")
	Gosub FillAppInfo
	; pour info, on envoie le nom du paquet à la GUI
	GuiControl, , s_PacketName, %s_PortAppName%_%s_FinalVer%.fmk.zip
	; on charge et on met à jour XyzPortable.ini
	ini_load(s_IniPortable, p_Source . s_PortAppName . ".ini", "CP1252")
	; suivant le format, on met à jour ou on ajuste
	IfInString, s_IniPortable, ApplicationExecutable
		{
		ini_replaceValue(s_IniPortable, s_PortAppName, "ApplicationDirectory", "App\" . p_ExecFolder)
		ini_replaceValue(s_IniPortable, s_PortAppName, "ApplicationExecutable", f_ExecName)
		}
	Else
		{
		ini_replaceKey(s_IniPortable, s_PortAppName, s_AppName . "Directory", "ApplicationDirectory=App\" . p_ExecFolder)
		ini_replaceKey(s_IniPortable, s_PortAppName, s_AppName . "Executable", "ApplicationExecutable=" . f_ExecName)
		}
	; on efface l'éventuelle section SplashScreen (reliquat)
	If (ini_getSection(s_IniPortable, "SplashScreen") != "")
		{
		ini_replaceSection(s_IniPortable, "SplashScreen")
		ini_replaceValue(s_IniPortable, s_PortAppName, "DisableSplashScreen", "false")
		}
	ini_save(s_IniPortable,  p_Source . s_PortAppName . ".ini")
	LogStatus("Le fichier " . s_PortAppName . ".ini est rempli en fonction des données existantes.", "user32.dll", 5)
	s_DateEn := SubStr(h_ReleaseDate, 1, 4) . "-" . SubStr(h_ReleaseDate, 5, 2) . "-" . SubStr(h_ReleaseDate, 7, 2)
	FileRead, s_AHKFile, %p_Source%%s_PortAppName%.ahk
	If s_AHKFile
		{
		s_AHKFile := RegExReplace(s_AHKFile, "m)^; .*?Portable$", "; " . s_PortAppName, "", 1)
		s_AHKFile := RegExReplace(s_AHKFile, "m)^; Portable.*?$", "; " . s_PortAppName, "", 1)
		s_AHKFile := RegExReplace(s_AHKFile, "m)^; Par.*?$", "; Par " . s_ReleaseDev, "", 1)
		s_AHKFile := RegExReplace(s_AHKFile, "m)lanceur de.*?$", "lanceur de " . s_PortAppName . ".", "", 1)
		s_AHKFile := RegExReplace(s_AHKFile, "m)^; \$id=.*?\.ahk", "; $id=" . s_PortAppName . ".ahk", "", 1)
		s_AHKFile := RegExReplace(s_AHKFile, "m)\$date=.*?$", "$date=" . s_DateEn, "", 1)
		s_AHKFile := RegExReplace(s_AHKFile, "2005-.*? ", "2005-" . A_Year . " ")
		s_AHKFile := RegExReplace(s_AHKFile, "m)^_DEFAULTEXE.*", "_DEFAULTEXE := """ . f_ExecName . """", "", 1)
		s_AHKFile := RegExReplace(s_AHKFile, "m)^_DEFAULTAPPDIR.*", "_DEFAULTAPPDIR := ""App\" . p_ExecFolder . """", "", 1)
		FileDelete, %p_Source%%s_PortAppName%.ahk
		FileAppend, %s_AHKFile%, %p_Source%%s_PortAppName%.ahk
		}
	LogStatus("Le fichier AHK a été mis à jour.", "user32.dll", 5)
	
	LogStatus("Lancement de l'éditeur pour modification du script AHK.", "user32.dll", 5)
	WinMinimize, %s_ScriptName%
	RunWait, "%p_FramaEditor%" "%p_Source%%s_PortAppName%.ahk"
	WinRestore,  %s_ScriptName%
	LogStatus("Edition du script AHK terminée.")
	GuiControl, Enable, b_CompileScript
Return
}

CompileAHK:
{
	LogStatus("Lancement de la compilation du script AHK.", "user32.dll", 5)
	CmdLine = "%p_FramaCompiler%" "%p_Source%%s_PortAppName%.ahk" -console
	s_LogCmd := LogRunWait(CmdLine)
	LogStatus("--------------- Début du log AHK ---------------")
	s_LogCmd := StringReplace(s_LogCmd, "`r`n", "|", "All")
	LogStatus(s_LogCmd)
	LogStatus("---------------- Fin du log AHK ----------------")
	IfNotInString, s_LogCmd, ExitCode=
		{
		LogStatus("Compilation du script AHK correctement terminée.")
		GuiControl, Enable, b_CompileRO
		GuiControl, Enable, b_CompileN
		GuiControl, Enable, b_ZipPack
		GuiControl, Enable, b_TryLauncher
		GuiControl, Enable, b_ManualClean
		}
	Else
		{
		LogStatus("Erreur lors de la compilation du script AHK. Voir le log pour plus de détails.", "user32.dll", 4)
		Return
		}
	; on recalcule la taille décompressée
	i_Size := SumFolderSize(p_SelectedFolder)
	GuiControl, , i_Size, %i_Size%
Return
}

CompileAHKRO:
{
	LogStatus("Lancement de la compilation du script AHK pour lanceur spécifique au média en lecture seule.", "user32.dll", 5)
	CmdLine = "%p_FramaCompiler%" "%p_Source%%s_PortAppName%.ahk" -console -readonly
	s_LogCmd := LogRunWait(CmdLine)
	LogStatus("--------------- Début du log AHK ---------------")
	s_LogCmd := StringReplace(s_LogCmd, "`r`n", "|", "All")
	LogStatus(s_LogCmd)
	LogStatus("---------------- Fin du log AHK ----------------")
	IfNotInString, s_LogCmd, ExitCode=
		LogStatus("Compilation du script AHK correctement terminée.")
	Else
		LogStatus("Erreur lors de la compilation du script AHK. Voir le log pour plus de détails.", "user32.dll", 4)
Return
}

CompileAHKN:
{
	LogStatus("Lancement de la compilation du script AHK pour lanceur spécifique à une utilisation réseau.", "user32.dll", 5)
	CmdLine = "%p_FramaCompiler%" "%p_Source%%s_PortAppName%.ahk" -console -network
	s_LogCmd := LogRunWait(CmdLine)
	LogStatus("--------------- Début du log AHK ---------------")
	s_LogCmd := StringReplace(s_LogCmd, "`r`n", "|", "All")
	LogStatus(s_LogCmd)
	LogStatus("---------------- Fin du log AHK ----------------")
	IfNotInString, s_LogCmd, ExitCode=
		LogStatus("Compilation du script AHK correctement terminée.")
	Else
		LogStatus("Erreur lors de la compilation du script AHK. Voir le log pour plus de détails.", "user32.dll", 4)
Return
}

TryLauncher:
{
	WinMinimize, %s_ScriptName%
	RunWait, %p_SelectedFolder%\%s_PortAppName%.exe
	WinRestore,  %s_ScriptName%

Return
}

Clean:
{
	WinMinimize, %s_ScriptName%
	RunWait, explorer.exe /e`,/root`,"%p_SelectedFolder%"
	WinRestore,  %s_ScriptName%
Return
}

ZipPack:
{
	; Ecriture du changelog
	GuiControlGet, s_Developer, , s_ReleaseDev
	GuiControlGet, s_Change, , s_ChangeLog
	s_AddChangelog := "`n----- " . s_DateEn . " -----`n"
					. "** Modifications par " . s_Developer . " **`n"
					. s_Change . "`n** Fin des modifications **`n"
	FileAppend, %s_AddChangelog%, %p_Source%changelog.txt
	; on recalcule la taille décompressée
	i_Size := SumFolderSize(p_SelectedFolder)
	GuiControl, , i_Size, %i_Size%
	ini_replaceValue(s_AppInfoFile, "Framakey", "Size", i_Size)
	ini_save(s_AppInfoFile, p_AppInfo . "appinfo.ini", "UTF-8")
	; Création de l'archive
	LogStatus("Création du paquet ZIP en cours.", "user32.dll", 5)
	GuiControlGet, f_ZipFile, , s_PacketName
	CmdLine = "%p_7zExe%" a -tzip "%f_ZipFile%" "%p_SelectedFolder%\" -mx9
	s_LogCmd := LogRunWait(CmdLine)
	LogStatus("--------------- Début du log 7-Zip ---------------")
	s_LogCmd := StringReplace(s_LogCmd, "`r`n", "|", "All")
	LogStatus(s_LogCmd)
	LogStatus("---------------- Fin du log 7-Zip ----------------")
	LogStatus("Archivage terminé. Le fichier " . f_ZipFile . " est disponible dans le dossier de FramaWizahk.")
	GuiControl, Enable, b_Compress
Return
}

Compress:
{
	RunWait, %p_FramaCompressor%
Return
}

; ================================================================================
;						Gestion des contenus des contrôles
; ================================================================================
; Autocomplétion à partir de la valeur rentrée dans le nom d'appli portable
AutoCompletion:
{
	GuiControl,, s_PortAppName, %s_PortAppName%
	IfNotInString, s_PortAppName, Portable
		s_PortAppName .= "Portable"
	StringReplace, s_AppName, s_PortAppName, Portable
	GuiControl,, s_PortAppName, %s_PortAppName%
	GuiControl,, s_AppName, %s_AppName%
	s_PortAppNameWeb := NormLink(s_PortAppName)
	GuiControl,, s_Homepage, %s_PortAppNameWeb%
	GuiControl,, s_AppWebsiteName, %s_AppName%
	GuiControl,, p_ExecFolder, %s_AppName%
Return
}

; création des icônes et logos à partir d'un PNG
; Très largement inspiré d'IconMakerTk par Tuxmouraille
TransformPNG:
{
	LogStatus("Création des images et logos", "user32.dll", 5)
	Progress, B1 P0 CWWhite, Travail en cours ..., Création des images.
	i_Bar := 0
	s_32bpp := ""
	s_8bpp := ""
	s_4bpp := ""
	Loop, Parse, s_LogoSizes, |
		{
		i_Bar += 7
		Progress, %i_Bar%, Logo %A_LoopField% pixels, Création des images.
		; on traite différemment le premier PNG
		If (A_Index = 1)
			{
			RunWait, "%p_IMConvert%" "%p_SelectedPNG%" -scale %A_LoopField%x%A_LoopField% -background transparent -gravity center -extent %A_LoopField%x%A_LoopField% "%p_AppInfo%appicon_%A_LoopField%.png",, Hide
			i_BasePNGSize := A_LoopField
			}
		Else
			{
			RunWait, "%p_IMConvert%" "%p_AppInfo%appicon_%i_BasePNGSize%.png" -scale %A_LoopField%x%A_LoopField% "%p_AppInfo%appicon_%A_LoopField%.png",, Hide
			s_32bpp .= """" . p_AppInfo . "appicon_" . A_LoopField . ".png"" "
			s_8bpp .= "--colors 256 """ . p_AppInfo . "appicon_" . A_LoopField . ".png"" "
			s_4bpp .= "--colors 16 """ . p_AppInfo . "appicon_" . A_LoopField . ".png"" "
			}
		}
	; on lance la création de l'icône multiple 32bpp
	Progress, 65 , Icônes 32bpp, Création de l'icône.
	RunWait, "%p_IMConvert%" "%p_AppInfo%appicon_48.png" "%p_AppInfo%appicon_32.png" "%p_AppInfo%appicon_16.png" "%p_AppInfo%appicon_32bpp.ico",, Hide
	; on lance la création de l'icône spécial 256px
	RunWait, "%p_IMConvert%" "%p_AppInfo%appicon_256.png" "%p_AppInfo%appicon_256.ico",, Hide
	; on lance la création de l'icône multiple 8bpp
	Progress, 75 , Icônes 8bpp, Création de l'icône.
	RunWait, "%p_png2ico%" "%p_AppInfo%appicon_8bpp.ico" --colors 256 "%p_AppInfo%appicon_48.png" --colors 256 "%p_AppInfo%appicon_32.png" --colors 256 "%p_AppInfo%appicon_16.png",, Hide
	; on lance la création de l'icône multiple 4bpp
	Progress, 85 , Icônes 4bpp, Création de l'icône.
	RunWait, "%p_png2ico%" "%p_AppInfo%appicon_4bpp.ico" --colors 16 "%p_AppInfo%appicon_48.png" --colors 16 "%p_AppInfo%appicon_32.png" --colors 16 "%p_AppInfo%appicon_16.png",, Hide
	; on met tout ça dans l'icône
	Progress, 95 , Création de l'icône de l'exécutable, Création des images.
	RunWait, "%p_icobundle%" -o "%p_AppInfo%appicon.ico" "%p_AppInfo%appicon_4bpp.ico" "%p_AppInfo%appicon_8bpp.ico" "%p_AppInfo%appicon_256.ico" "%p_AppInfo%appicon_32bpp.ico" ,, Hide
	Progress, 100 , Terminé, Création des images.
	FileDelete, %p_AppInfo%appicon_*.ico
	Sleep, 1000
	Progress, Off
	LogStatus("Création des images terminée.")
	GuiControl, , f_Logo128, %p_AppInfo%appicon_128.png
Return
}

; création des captures écran
TransformScreen:
{
	LogStatus("Création des captures d'écran", "user32.dll", 5)
	RunWait, "%p_IMConvert%" "%p_SelectedScreen%" "%p_AppInfo%screenshot.png",, Hide
	RunWait, "%p_IMConvert%" "%p_SelectedScreen%" -scale 128x128 -background transparent -gravity center -extent 128x128 "%p_AppInfo%screenshot_128.png",, Hide
	LogStatus("Création des images terminée.")
	GuiControl, , f_Screen128, %p_AppInfo%screenshot_128.png
Return
}

VerifyLogo:
{
	;vérification des images 16/32/64/128 px
	Loop, Parse, s_LogoSizes, |
		UpImgStatus("b_appicon" A_LoopField, p_AppInfo "appicon_" A_LoopField ".png")
	
	;vérification de l'icône
	UpImgStatus("b_AppIcon", p_AppInfo . "appicon.ico")
Return
}

VerifyScreen:
{
	;vérification de la capture
	UpImgStatus("b_ScreenCap", p_AppInfo . "screenshot.png")
	
	;vérification de la capture 128 px
	UpImgStatus("b_ScreenCap128", p_AppInfo . "screenshot_128.png")
Return
}


; affichage des images dans l'onglet Images
DisplayImages:
{
	IfExist, %p_AppInfo%appicon_128.png
		GuiControl, , f_Logo128, %p_AppInfo%appicon_128.png
	Else
		GuiControl, , f_Logo128, %p_ImgDir%\NoPicture.png
	IfExist, %p_AppInfo%screenshot.png
		GuiControl, , f_Screen128, %p_AppInfo%screenshot.png
	Else
		GuiControl, , f_Screen128, %p_ImgDir%\NoPicture.png
Return
}

UpdateToolTipMsg:
{
	; Vérification de l'existence des valeurs
	; Attention, le contenu n'est pas vérifié !
	s_ListBoxes := "s_PortAppName|s_AppName|s_Category|s_License|"
				. "s_Lang|s_AppWebsite|h_ReleaseDate|s_ReleaseDev|"
				. "s_Branch|f_ExecName|p_ExecFolder"
	s_ListHumanReadable := "Nom de l'appli portable|Nom de l'appli d'origine|Catégorie|Licence|"
				. "Langue|Site officiel de l'application d'origine|Date de la version|Développeur|"
				. "Branche de développement|Nom de l'exécutable|dossier de l'exécutable"
	s_Undefined := ""
	StringSplit, s_Boxes, s_ListBoxes, |
	StringSplit, s_HumanReadable, s_ListHumanReadable, |
	Loop, %s_Boxes0%
		{
		TestBox := s_Boxes%A_Index%
		GuiControlGet, Tampon, , %TestBox%
		If (Tampon = "")
			s_Undefined .= s_HumanReadable%A_Index% . "`n"
		}
	If s_Undefined
		s_Undefined := "`nLes données suivantes sont manquantes :`n" . s_Undefined
	Gui, Submit, NoHide
	If (b_appicon128 != "Présent" || b_appicon64 != "Présent" || b_appicon32 != "Présent" || b_appicon16 != "Présent" || b_AppIcon != "Présent")
		s_Undefined .= "`nIl manque des images du logo`n"
	If (b_ScreenCap != "Présent" || b_ScreenCap128 != "Présent")
		s_Undefined .= "`nIl manque des images des captures`n"
	b_EditScript_TT := b_EditScript_TTbase . s_Undefined
Return
}


; ================================================================================
;						Gestion des importations/lectures
; ================================================================================
; extraction des données du fichier appinfo.ini
ReadAppInfoFile:
{
	; lecture des valeurs
	LogStatus("Récupération des données du fichier appinfo.ini en cours …", "user32.dll", 5)
	ini_load(s_AppInfoFile, p_AppInfo . "appinfo.ini", "UTF-8")
	; vérification du nom de l'appli
	s_AppNameIni := ini_getValue(s_AppInfoFile, "Details", "Name")
	If (s_AppNameIni != s_PortAppName)
		{
		FileMoveDir, %A_ScriptDir%\%s_PortAppName%, %A_ScriptDir%\%s_AppNameIni%
		s_PortAppName := s_AppNameIni
		p_SelectedFolder = %A_ScriptDir%\%s_PortAppName%
		}
	s_AppName := ini_getValue(s_AppInfoFile, "Framakey", "Name")
	s_FriendlyName := ini_getValue(s_AppInfoFile, "Framakey", "FriendlyName")
	s_Category := ini_getValue(s_AppInfoFile, "Details", "Category")
	s_License := ini_getValue(s_AppInfoFile, "Framakey", "License")
	s_ShortDesc := ini_getValue(s_AppInfoFile, "Details", "Description")
	s_LongDesc := UnHTM(ini_getValue(s_AppInfoFile, "FramaKey", "LongDesc"))
	s_Lang := ini_getValue(s_AppInfoFile, "Details", "Language")
	s_Branch := ini_getValue(s_AppInfoFile, "FramaKey", "Repository")
	s_Date := ini_getValue(s_AppInfoFile, "FramaKey", "Date")
	s_Homepage := ini_getValue(s_AppInfoFile, "Details", "Homepage")
	s_FramasoftPage := ini_getValue(s_AppInfoFile, "FramaKey", "FramasoftPage")
	s_AppWebsite := ini_getValue(s_AppInfoFile, "FramaKey", "AppWebsite")
	s_AppWebsiteName := ini_getValue(s_AppInfoFile, "Framakey", "Name")
	s_Installdir := ini_getValue(s_AppInfoFile, "Framakey", "Installdir")
	s_Dir := ini_getValue(s_AppInfoFile, "Framakey", "Dir")
	s_Dirsave := ini_getValue(s_AppInfoFile, "Framakey", "Dirsave")
	s_DisplayVersion := ini_getValue(s_AppInfoFile, "Version", "DisplayVersion")
	; Mise en forme de certaines valeurs
	s_Date := SubStr(s_Date, 1, 4) . SubStr(s_Date, 6, 2) . SubStr(s_Date, 9, 2) . "000000"
	StringSplit, s_Version, s_DisplayVersion, %A_Space%
	StringSplit, s_ExecVer, s_Version1, . 
	; Envoi des données vers les boites
	GuiControl,, s_PortAppName, %s_PortAppName%
	GuiControl,, s_AppName, %s_AppName%
	GuiControl, ChooseString, s_Category, %s_Category%
	GuiControl, ChooseString, s_Lang, %s_Lang%
	GuiControl, ChooseString, s_License, %s_License%
	GuiControl,, s_FriendlyName, %s_FriendlyName%
	GuiControl,, s_ShortDesc, %s_ShortDesc%
	GuiControl,, s_LongDesc, %s_LongDesc%
	GuiControl,, s_Homepage, %s_Homepage%
	GuiControl,, s_FramasoftPage, %s_FramasoftPage%
	GuiControl,, s_AppWebsiteName, %s_AppWebsiteName%
	GuiControl,, s_AppWebsite, %s_AppWebsite%
	GuiControl,, h_ReleaseDate, %s_Date%
	GuiControl,, i_LauncherVer, %s_Version4%
	GuiControl,, s_Dirsave, %s_Dirsave%
	GuiControl, ChooseString, s_Branch, %s_Branch%
	GuiControl,, i_ExecVer1, %s_ExecVer1%
	GuiControl,, i_ExecVer2, %s_ExecVer2%
	GuiControl,, i_ExecVer3, %s_ExecVer3%
	GuiControl,, i_ExecVer4, %s_ExecVer4%
	LogStatus("Récupération des données du fichier appinfo.ini terminée !")
Return
}

; extraction des données de la page correspondante du site
ReadURLFile:
{
	URLDownloadToFile, http://%s_PortAppNameWeb%, %p_TempDir%\%s_PortAppName%.html
	; On lit le fichier et on enlève tout ce qui est avant le titre
	s_HTMLFile := FileRead("*P28591 " . p_TempDir . "\" . s_PortAppName . ".html")
	IfInString, s_HTMLFile, Create page
		{
		LogStatus("La page http://" . s_PortAppNameWeb . " n'existe pas.", "user32.dll", 2)
		s_HTMLFile := ""
		Return
		}
	s_HTMLFile := StringTrimLeft(s_HTMLFile, InStr(s_HTMLFile, "<h1>" . s_PortAppName . "</h1>") - 1)
	; Vive les expressions régulières
	FoundPos := RegExMatch(s_HTMLFile, "<h2>(.*)</h2>", SubtitleXML)
	FoundPos := RegExMatch(s_HTMLFile, "'frame rfloat'><img src='(.*?)'.*?</div>(.*?)<div class='vspace'></div><table", ContentXML)
	FoundPos := RegExMatch(s_HTMLFile, "origine : <a class='urllink' href='(.*?)'>(.*?)</a>", ParentSite)
	FoundPos := RegExMatch(s_HTMLFile, "<li>Licence : (.*?)\R", LicenceURL)
	FoundPos := RegExMatch(s_HTMLFile, "Fiche Framasoft : <a class='urllink' href='(.*?)'", NoticeURL)
	FoundPos := RegExMatch(s_HTMLFile, "'frame rfloat'><a class='urllink' href='(.*?)'><img src='(.*?)'", ScreenURL)
	FoundPos := RegExMatch(s_HTMLFile, "<br clear='all' />.*?, (.*?)\.", LangURL)
	
	; Nettoyage de la description
	ContentXML2 := UnHTM(ContentXML2)
	
	; On fait le ménage
	s_HTMLFile := ""
	
	; On complète à partir des données récupérées sur le site
	GuiControl, ChooseString, s_Lang, %LangURL1%
	GuiControl, ChooseString, s_License, %LicenceURL1%
	GuiControl,, s_ShortDesc, %SubtitleXML1%
	GuiControl,, s_LongDesc, %ContentXML2%
	GuiControl,, s_AppWebsiteName, %ParentSite2%
	GuiControl,, s_AppWebsite, %ParentSite1%
	GuiControl,, s_FramasoftPage, %NoticeURL1%
	GuiControl,, s_Homepage, %s_PortAppNameWeb%
	
	; on télécharge les images : logo et screenshot
	IfNotExist, %p_AppInfo%appicon_128.png
		{
		URLDownloadToFile, %ContentXML1%, %p_TempDir%\FKLogo.png
		p_SelectedPNG := p_TempDir . "\FKLogo.png"
		Gosub TransformPNG
		}
	IfNotExist, %p_AppInfo%screenshot.png
		{
		URLDownloadToFile, %ScreenURL1%, %p_TempDir%\FKScreen.png
		p_SelectedScreen := p_TempDir . "\FKScreen.png"
		Gosub TransformScreen
		}
	LogStatus("Fin de la récupération de données à partir du site.", "user32.dll", 5)
Return
}

; ================================================================================
;				Gestion des boutons du groupe Code
; ================================================================================
DirsaveAddFile:
{
	GuiControlGet, s_Dirsave
	FileSelectFile, s_SelectedFiles, M, %p_SelectedFolder%, Sélectionnez les fichiers à sauvegarder avant mise à jour :
	If s_SelectedFiles
		{
		s_BasePath := ""
		Loop, parse, s_SelectedFiles, `n
			{
			If A_Index = 1
				s_BasePath := StringReplace(A_LoopField, p_SelectedFolder "\")
			Else
				{
				_file := (s_BasePath) ? s_BasePath . "\" . A_LoopField : A_LoopField
				s_Dirsave .= (!s_Dirsave) ? _file : "|" . _file
				}
			}
		s_SelectedFiles := ""
		}
	Sort, s_Dirsave, U D|
	GuiControl,, s_Dirsave, %s_Dirsave%

Return
}

DirsaveAddFolder:
{
	GuiControlGet, s_Dirsave
	FileSelectFolder, s_SelectedFolders, %p_SelectedFolder%, 0, Sélectionnez les dossiers à sauvegarder avant mise à jour :
	If s_SelectedFolders
		{
		s_SelectedFolders := StringReplace(s_SelectedFolders, p_SelectedFolder "\")
		s_Dirsave .= (!s_Dirsave) ? s_SelectedFolders : "|" . s_SelectedFolders
		s_SelectedFolders := ""
		}
	Sort, s_Dirsave, U D|
	GuiControl,, s_Dirsave, %s_Dirsave%

Return
}

DirsaveRaz:
{
	GuiControl,, s_Dirsave, 

Return
}

; ================================================================================
;				Appel des définitions des Gui complémentaires
; ================================================================================
#Include Gui_Prefs.ahk
#Include Gui_Log.ahk
#Include Gui_About.ahk
#Include Gui_InstDir.ahk
