/*
 * * * Compile_AHK SETTINGS BEGIN * * *

[AHK2EXE]
Exe_File=%In_Dir%\Repack.exe
[VERSION]
Set_Version_Info=1
Company_Name=Framakey.org
File_Description=Repackaging d'applications portables
File_Version=0.3.3.0
Inc_File_Version=0
Internal_Name=repack
[ICONS]
Icon_1=%In_Dir%\Repack.ico
Icon_2=0
Icon_3=0
Icon_4=0
Icon_5=0
Icon_6=0

* * * Compile_AHK SETTINGS END * * *
*/

; ================================================================================
; 								Repack
; ================================================================================
;
; 	Par fat115
; 	License : GPL
; 	Ce script permet de repackager des FramApplis au format PA.c.
; 	Compiler: AutoHotkey (http://www.autohotkey.com/).
; 	$id=Repack.ahk $date=2010-06-05
;
; --------------------------------------------------------------------------------
;						Copyright (C) 2010 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.
; --------------------------------------------------------------------------------

; On force le répertoire des includes à être celui du script
#Include %A_ScriptDir%
; On désactive l'icône de la barre des tâches
#NoTrayIcon
; On inclut pour le traitement des fichiers xml
#Include xpath.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

; On définit les sous dossiers pour le traitement des fichiers temporaires et des images
7zExe := A_ScriptDir . "\7zip\7za.exe"
ImgDir := A_ScriptDir . "\img"
TempDir := A_ScriptDir . "\Temp"
IMConvert := A_ScriptDir . "\ImageMagick\convert.exe"

LogMsg := ""

; Lecture du fichier INI et construction des DropDownList
IniRead, FramaDevDir, %A_ScriptDir%\Repack.ini, DEVELOPMENT, FramaKeyDir
IniRead, FramaEditor,  %A_ScriptDir%\Repack.ini, DEVELOPMENT, FramaEditeur
IniRead, FramaCompiler,  %A_ScriptDir%\Repack.ini, DEVELOPMENT, FramaCompilateur

ListCategory := ListIni("CATEGORIES")
ListLicense := ListIni("LICENSES")
ListLang := ListIni("LANGUAGES")
ListBranch := ListIni("BRANCHES")

; ================================================================================
;					 Définition de la GUI principale
; ================================================================================
MainGuiDef:
{
	; Définitions des Boutons & Onglets 
	Gui, Add, Button, x15 y30 w120 h24 gFolderOpen, Importer un dossier
	Gui, Add, Button, x15 y60 w120 h24 Hidden vCopyStructure gCopyStructure, Créer la structure PA
	Gui, Add, Button, x15 y90 w120 h24 Hidden vCopyAppli gCopyAppli, Copier l'appli vers PA
	Gui, Add, Button, x15 y120 w120 h24 Disabled vCopyPictures gCopyPictures, Transférer les images
	Gui, Add, Button, x15 y150 w120 h24 Disabled vFillAppInfo gFillAppInfo, Remplir appinfo.ini
	Gui, Add, Button, x15 y210 w120 h24 Disabled vCreateNSI gCreateNSI, Créer un nouveau NSI
	Gui, Add, Button, x15 y240 w120 h24 Disabled vKeepNSI gKeepNSI, Conserver les NSI PA.c
	Gui, Add, Button, x15 y270 w120 h24 Disabled vImportNSI gImportNSI, Importer l'ancien NSI FK
	Gui, Add, Button, x15 y330 w120 h24 Disabled vEditNSI gEditNSI, Editer le NSI
	Gui, Add, Button, x15 y360 w120 h24 Disabled vCompileNSI gCompileNSI, (Re)Compiler le NSI
	Gui, Add, Button, x15 y390 w120 h24 Disabled vZipPack gZipPack, Paquet ZIP
	Gui, Add, Button, x15 y480 w120 h48 Disabled vCleanTemp gCleanTemp, Nettoyer les dossiers temporaires
	Gui, Add, Button, x15 y540 w120 h24 vGuiClose gGuiClose, Quitter
	Gui, Add, Tab, x156 y2 w714 h564 vOnglets, Général|Images|Release
	; Onglet Général
	Gui, Tab, Général
	{
		Gui, Add, Text, x163 y35 w152 h16 , Nom de l'application portable
		Gui, Add, Edit, x322 y32 w140 h22 vPortAppName gAutoCompletion, 
		Gui, Add, Text, x163 y61 w152 h16 , Nom de l'application mère
		Gui, Add, Edit, x322 y58 w140 h22 vAppName, 
		Gui, Add, Text, x163 y89 w152 h16 , Catégorie
		Gui, Add, DropDownList, x322 y86 w140 h22 R10 vCategory, %ListCategory%
		Gui, Add, Text, x163 y117 w152 h16 , Langue
		Gui, Add, DropDownList, x322 y114 w140 h22 R5 vLang, %ListLang%
		Gui, Add, Text, x163 y145 w152 h16 , Licence
		Gui, Add, DropDownList, x322 y142 w140 h22 R5 vLicense, %ListLicense%
		Gui, Add, Text, x163 y173 w152 h16, Description rapide
		Gui, Add, Edit, x322 y170 w536 h22  vQuickDesc, 
		Gui, Add, Text, x163 y216 w152 h16 , Description
		Gui, Add, Edit, x322 y198 w536 h52 vDesc, 
		Gui, Add, Text, x163 y269 w152 h16 Hidden, Commentaire
		Gui, Add, Edit, x322 y256 w536 h42 Hidden vComment, 
		Gui, Add, Text, x163 y307 w152 h16 , Nom du site Internet
		Gui, Add, Edit, x322 y304 w200 h22 vSiteName, 
		Gui, Add, Text, x163 y335 w152 h16 , Adresse du site Internet
		Gui, Add, Edit, x322 y332 w286 h22 vSiteAddress, 
		Gui, Add, Text, x163 y391 w152 h16 , Nom du site Internet mère
		Gui, Add, Edit, x322 y388 w200 h22 vMainSiteName, 
		Gui, Add, Text, x163 y419 w152 h16 , Adresse du site Internet mère
		Gui, Add, Edit, x322 y416 w286 h22 vMainSiteAddress, 
		Gui, Add, Text, x163 y475 w152 h16 , Notice sur Framasoft
		Gui, Add, Edit, x322 y472 w286 h22 vFramaNotice, 
	}
	; Onglet Images
	Gui, Tab, Images
	{
		Gui, Add, GroupBox, x166 y32 w698 h220 , Icônes et logos
		Gui, Add, Text, x173 y52 w152 h20 , Image PNG d'origine 
		Gui, Add, Edit, x332 y52 w140 h20 vPNGFile, 
		Gui, Add, Button, x486 y52 w30 h20 gFileSelectPNG, ...
		Gui, Add, Text, x173 y80 w152 h16 , Logo
		Gui, Add, Edit, x332 y77 w184 h22 Disabled vLogo, 
		Gui, Add, Text, x173 y108 w152 h16 , Logo (miniature)
		Gui, Add, Edit, x332 y105 w184 h22 Disabled vLogoThumb, 
		Gui, Add, Text, x173 y136 w152 h16 , Icône de l'exécutable
		Gui, Add, Edit, x332 y133 w184 h22 Disabled vIconExe, 
		Gui, Add, Text, x173 y164 w152 h16 , Icône du FramaLauncher
		Gui, Add, Edit, x332 y161 w184 h22 Disabled vIconFrama, 
		Gui, Add, Picture, x676 y78 w128 h-1 vLogo128,
		Gui, Add, GroupBox, x166 y282 w698 h220 , Vignettes
		Gui, Add, Text, x173 y302 w152 h20 , Image d'origine 
		Gui, Add, Edit, x332 y302 w140 h20 vScreenFile, 
		Gui, Add, Button, x486 y302 w30 h20 gFileSelectScreen, ...
		Gui, Add, Text, x173 y330 w152 h16 , Screenshot
		Gui, Add, Edit, x332 y327 w318 h22 Disabled vScreenCap, 
		Gui, Add, Text, x173 y358 w152 h16 , Screenshot (miniature)
		Gui, Add, Edit, x332 y355 w318 h22 Disabled vScreenCapThumb, 
		Gui, Add, Picture, x676 y328 w128 h-1 vScreen128,
	}
	; Onglet Release
	Gui, Tab, Release
	{
		Gui, Add, Text, x163 y34 w152 h16 , Date de la release
		Gui, Add, DateTime, x322 y30 w140 h24 vReleaseDate, 
		Gui, Add, Text, x163 y63 w152 h16 , Développeur de la release
		Gui, Add, Edit, x322 y60 w140 h22 vReleaseDev, 
		Gui, Add, Text, x163 y105 w152 h16 , Changelog
		Gui, Add, Edit, x322 y88 w536 h50 vChangeLog, 
		Gui, Add, Text, x163 y148 w152 h16 , Branche
		Gui, Add, DropDownList, x322 y144 w140 h22 R5 vBranch, %ListBranch%
		Gui, Add, Text, x163 y189 w152 h16 , Notes
		Gui, Add, Edit, x322 y172 w536 h50 Disabled vNotes, 
		Gui, Add, Text, x163 y231 w152 h16 , Adresse de téléchargement
		Gui, Add, Edit, x322 y228 w318 h22 Disabled vDLAddress, 
		Gui, Add, Text, x163 y259 w152 h16 , Nom du paquet
		Gui, Add, Edit, x322 y256 w238 h22 Disabled vPacketName, 
		Gui, Add, Text, x163 y287 w152 h16 , Nom de l'exécutable
		Gui, Add, Edit, x322 y284 w140 h22 vExecName, 
		Gui, Add, Text, x163 y315 w152 h16 , Version de l'exécutable
		Gui, Add, Edit, x322 y312 w50 h22 vExecVer1, 
		Gui, Add, UpDown, vUpVer1, 0
		Gui, Add, Edit, x377 y312 w50 h22 vExecVer2, 
		Gui, Add, UpDown, vUpVer2, 0
		Gui, Add, Edit, x432 y312 w50 h22 vExecVer3, 
		Gui, Add, UpDown, vUpVer3, 0
		Gui, Add, Edit, x487 y312 w50 h22 vExecVer4, 
		Gui, Add, UpDown, vUpVer4, 0
		Gui, Add, Text, x163 y343 w152 h16 , Dossier de l'exécutable
		Gui, Add, Edit, x322 y340 w140 h22 vExecFolder, 
		Gui, Add, Text, x163 y371 w152 h16 , Version du lanceur
		Gui, Add, Edit, x322 y368 w140 h22 vLauncherVer, 
		Gui, Add, Text, x163 y399 w152 h16 , Site de développement
		Gui, Add, Edit, x322 y396 w306 h22 Disabled vDevSite, 
	}
	Gui, Add, StatusBar, gLogWindow
	; Generated using SmartGUI Creator 4.0
	Gui, Show, Center h600 w876, Repack
Return
}

; ================================================================================
;			Gestion des boites de dialogue de selection et de fermeture
; ================================================================================
FolderOpen:
{
	Gui +OwnDialogs  ; Force the user to dismiss the FileSelectFile dialog before returning to the main window.
	FileSelectFolder, SelectedFolder, *%FramaDevDir%, ,Sélection du dossier de base de l'application
	If ErrorLevel
		Return
	; on essaie de déterminer le type de structure
	If (InStr(FileExist(SelectedFolder . "\App"), "D") AND InStr(FileExist(SelectedFolder . "\Data"), "D") AND InStr(FileExist(SelectedFolder . "\Other"), "D"))
		StructureType := "PA"
	Else If InStr(FileExist(SelectedFolder . "\*Code"), "D")
		StructureType := "FK"
	Else
		StructureType := "Autre"
	; Vérifie que le nom du dossier ou d'un de ses exécutables contient "portable"
	IfNotInString, SelectedFolder, Portable
		{
		Loop, %SelectedFolder%\*.exe
			{
			IfInString, A_LoopFileName, Portable
				TestPortable := true
			}
		IfNotEqual, TestPortable, true
			{
			MsgBox Impossible de reconnaitre le format utilisé. Désolé`, la boule de cristal c'est pour la prochaine version.
			Return
			}
		}
	; on détermine le nouveau nom "AppName" + "Portable"
	Loop, parse, SelectedFolder, \
		SelectedAppName := A_LoopField
	StringReplace, ShortAppName, SelectedAppName, Portable, , All
	NewAppName :=  ShortAppName . "Portable"
	; on traite les cas de structures détectées
	If (StructureType = "PA")
		{
		SB_SetIcon("user32.dll", 5)
		LogStatus("Structure PA.c détectée, on recopie directement vers le nouvel emplacement.")
		FileRemoveDir, %NewAppName%, 1
		FileCopyDir, %SelectedFolder%, %NewAppName%
		SelectedFolder = %NewAppName%
		CodeFolder = %SelectedFolder%\Other\Source
		SB_SetIcon("user32.dll", 5)
		LogStatus("Copie terminée.")
		Gosub ReadURLFile
		CodeIniFile = %NewAppName%\Other\Source\%SelectedAppName%.ini
		Gosub ReadCode
		LogoFile = %TempDir%\appicon.png
		ScreenshotFile = %TempDir%\screenshot.png
		}
	Else If (StructureType = "FK")
		{
		SB_SetIcon("user32.dll", 5)
		LogStatus("Structure FK détectée, on recopie vers le dossier temporaire.")
		FileRemoveDir, %TempDir%, 1
		FileCopyDir, %SelectedFolder%, %TempDir%
		SelectedFolder = %TempDir%
		CodeFolder = %SelectedFolder%\%SelectedAppName%Code
		KioskFolder = %SelectedFolder%\%SelectedAppName%Kiosk
		SB_SetIcon("user32.dll", 5)
		LogStatus("Copie terminée.")
		; On récupère à partir du xml s'il existe
		IfExist, %KioskFolder%\%SelectedAppName%.xml
			{
			SelectedFile := KioskFolder . "\" . SelectedAppName . ".xml"
			FileGetSize, XMLSize, %SelectedFile%
			If XMLSize != 0
				Gosub ReadXMLFile
			Else
				Gosub ReadURLFile
			}
		Else
			Gosub ReadURLFile
		CodeIniFile = %SelectedFolder%\%SelectedAppName%Code\%SelectedAppName%.ini
		Gosub ReadCode
		GuiControlGet, Logo
		GuiControlGet, ScreenCapThumb
		LogoFile = %KioskFolder%\%Logo%
		ScreenshotFile = %KioskFolder%\%ScreenCapThumb%
		Gosub CopyStructure
		Gosub CopyAppli
		}
	Else If (StructureType = "Autre")
		{
		SB_SetIcon("user32.dll", 5)
		LogStatus("Structure détectée ni FK ni PA.c, on recopie vers le dossier temporaire.")
		FileRemoveDir, %TempDir%, 1
		FileCopyDir, %SelectedFolder%, %TempDir%
		SelectedFolder = %TempDir%
		SB_SetIcon("user32.dll", 5)
		LogStatus("Copie terminée.")
		Gosub ReadURLFile
		; on met un nom de fichier inexistant pour sauter le premier test de Readcode
		CodeIniFile = %SelectedFolder%\%SelectedAppName%.ini
		LogoFile = %TempDir%\appicon.png
		ScreenshotFile = %TempDir%\screenshot.png
		Gosub ReadCode
		Gosub CopyStructure
		Gosub CopyAppli
		}
	Else
		{
		SB_SetIcon("user32.dll", 2)
		LogStatus("Structure inconnue. Vous allez devoir traiter cette appli manuellement.")
		MsgBox Impossible de reconnaitre le format utilisé. Désolé`, la boule de cristal c'est pour la prochaine version.
		Return
		}
	Gosub DisplayImages
	GuiControl, ChooseString, Onglets, Images
	GuiControl, Enable, CopyPictures
	MsgBox, 64, Structure créée., La structure a été créée et les infos récupérées.`nVous devez compléter les infos manquantes., 5
Return
}

FileSelectPNG:
{
	Gui +OwnDialogs  ; Force the user to dismiss the FileSelectFile dialog before returning to the main window.
	FileSelectFile,SelectedPNG,,,Sélection de l'image au format PNG, Images PNG (*.png)
	If ErrorLevel
		Return
	GuiControl,, PNGFile, %SelectedPNG%
	LogoFile := SelectedPNG
	Gosub, TransformPNG
Return
}

FileSelectScreen:
{
	Gui +OwnDialogs  ; Force the user to dismiss the FileSelectFile dialog before returning to the main window.
	FileSelectFile,SelectedScreen,,,Sélection de la capture écran, Images (*.png; *.gif; *.jpg; *.jpeg; *.bmp)
	If ErrorLevel
		Return
	GuiControl,, ScreenFile, %SelectedScreen%
	ScreenshotFile := SelectedScreen
	Gosub, TransformScreen
Return
}

; ================================================================================
;						Gestion des boutons
; ================================================================================
; Gestion du bouton Quitter
GuiClose:
	Gosub CleanTemp
	ExitApp
Return

CopyStructure:
{
	If (NewAppName = "")
		{
		MsgBox, 16, Oups !, Le nom de l'application n'a pas été récupéré correctement !
		Return
		}
	FileCopyDir, DefaultStructure, %NewAppName%, 1
	; on renomme les fichiers source
	Loop, %NewAppName%\Other\Source\default*.*
		{
		StringReplace, NewFileName, A_LoopFileName, default, %NewAppName%
		FileMove, %NewAppName%\Other\Source\%A_LoopFileName%, %NewAppName%\Other\Source\%NewFileName%
		}
	SB_SetIcon("user32.dll", 5)	
	LogStatus("Les dossiers ont été créés et les fichiers sources renommés.")
	GuiControl, Enable, CopyAppli
Return
}

; Copie l'application vers la structure PA
CopyAppli:
{
	Gui, Submit, NoHide
	FileMoveDir, %TempDir%\%AppName%, %NewAppName%\App\%AppName%, 1
	IfExist, %NewAppName%\App\%AppName%\%ExecName%
		{
		SB_SetIcon("user32.dll", 5)
		LogStatus("Le dossier " . AppName . " a été correctement copié.")
		}
	Else
		{
		SB_SetIcon("user32.dll", 2)
		LogStatus("Le dossier " . AppName . " n'a pas été copié.")
		GuiControl, Enable, GuiClose
		}
Return
}

CopyPictures:
{
	IfNotExist, %LogoFile%
		{
		MsgBox, 16, Oups !, L'image n'existe pas, commencez par la choisir.
		Return
		}
	SelectedPNG := LogoFile
	; on recrée les icones et les images PNG
	Gosub TransformPNG
	; on permute enfin le nom de l'appli portable
	GuiControl,, PortAppName, %NewAppName%
	Gosub AutoCompletion
	Gui, Submit, NoHide
	IfNotExist, %PortAppName%\App\AppInfo
		FileCreateDir, %PortAppName%\App\AppInfo
	IfNotExist, %PortAppName%\Other\Source
		FileCreateDir, %PortAppName%\Other\Source
	; on les copie
	FileCopy, %TempDir%\Logo128.png, %PortAppName%\App\AppInfo\appicon_128.png, 1
	FileCopy, %TempDir%\Logo64.png, %PortAppName%\App\AppInfo\appicon_64.png, 1
	FileCopy, %TempDir%\Icon32_32.png, %PortAppName%\App\AppInfo\appicon_32.png, 1
	FileCopy, %TempDir%\Icon16_32.png, %PortAppName%\App\AppInfo\appicon_16.png, 1
	FileCopy, %TempDir%\Icon.ico, %PortAppName%\App\AppInfo\appicon.ico, 1
	; on s'occupe des screenshots
	IfNotExist, %ScreenshotFile%
		{
		MsgBox, 20, Oups !, La capture d'écran n'existe pas. Voulez-vous l'ignorer ?
		IfMsgBox, No
			Return
		}
	Else
		Gosub TransferScreens
	Gosub CopySplash
	GuiControl, Enable, FillAppInfo
	SB_SetIcon("user32.dll", 5)
	LogStatus("La copie des images est terminée.")
Return
}

; Export des captures
TransferScreens:
{
	SelectedScreen := ScreenshotFile
	; on recrée les screenshots
	Gosub TransformScreen
	; on les copie
	FileCopy, %TempDir%\Screen.png, %PortAppName%\App\AppInfo\screenshot.png
	FileCopy, %TempDir%\Screen128.png, %PortAppName%\App\AppInfo\screenshot_128.png
Return
}

CopySplash:
{

Return
}


; Remplissage du fichier appinfo.ini
FillAppInfo:
{
	Gui, Submit, NoHide
	f_AppInfoIni := PortAppName . "\App\AppInfo\appinfo.ini"
	f_AppLch := PortAppName . "\App\AppInfo\app.lch"
	; Remplisage de la section Details
	IniWrite, %PortAppName%, %f_AppInfoIni%, Details, Name
	IniWrite, %PortAppName%, %f_AppInfoIni%, Details, AppID
	IniWrite, %MainSiteName% et Framakey.org, %f_AppInfoIni%, Details, Publisher
	StringReplace, FramakeyPage, SiteAddress, http://
	IniWrite, %FramakeyPage%, %f_AppInfoIni%, Details, Homepage
	IniWrite, %Category%, %f_AppInfoIni%, Details, Category
	IniWrite, %QuickDesc%, %f_AppInfoIni%, Details, Description
	StringSplit, Language, Lang, `;
	LangAbrev := SubStr(Language2, 1, 2)
	LangShort := Language1
	IniWrite, %LangShort%, %f_AppInfoIni%, Details, Language
	; Vu la politique Framakey, on met tout à True pour la section License
	IniWrite, true, %f_AppInfoIni%, License, Shareable
	IniWrite, true, %f_AppInfoIni%, License, OpenSource
	IniWrite, true, %f_AppInfoIni%, License, Freeware
	IniWrite, true, %f_AppInfoIni%, License, CommercialUse
	; Remplissage de la section Version
	Loop, 4
		{
		If ExecVer%A_Index% = 
			ExecVer%A_Index% := 0
		}
	ExecVer := ExecVer1 . "." . ExecVer2 . "." . ExecVer3 . "." . ExecVer4
	IniWrite, %ExecVer%, %f_AppInfoIni%, Version, PackageVersion
	Loop, 4
		{
		Count := 5 - A_Index
		If ExecVer%Count% = 0
			StringTrimRight, ExecVer, ExecVer, 2
		Else
			Break
		}
	; on stocke la version pour le nom du paquet
	s_FinalVer := ExecVer . "-" . LangAbrev . "-r" . LauncherVer
	IniWrite, %ExecVer% %LangAbrev% Realease %LauncherVer%, %f_AppInfoIni%, Version, DisplayVersion
	; Remplissage de la section Control
	IniWrite, %PortAppName%.exe, %f_AppInfoIni%, Control, Start
	; Remplissage des infos spécifiques Framakey, on reporte size à plus tard
	IniWrite, %AppName%, %f_AppInfoIni%, Framakey, Name
	; on teste la branche
	If Branch not contains stable
		{
		If Branch contains dev,test
			Branch := "Testing"
		Else
			{
			MsgBox, 16, Erreur, La branche de développement n'est pas renseignée.`nElle est obligatoire pourle nouveau format.`n`nMerci de la choisir sur l'onglet suivant.
			GuiControl, ChooseString, Onglets, Release
			GuiControl, Focus, Branch
			Return
			}
		}
	IniWrite, %Branch%, %f_AppInfoIni%, Framakey, Repository
	IniWrite, %FramaNotice%, %f_AppInfoIni%, Framakey, FramasoftPage
	IniWrite, %MainSiteAddress%, %f_AppInfoIni%, Framakey, AppWebsite
	IniWrite, %License%, %f_AppInfoIni%, Framakey, License
	LongDesc := TxtToHTMLite(Desc)
	IniWrite, %LongDesc%, %f_AppInfoIni%, Framakey, LongDesc
	DateLocale := SubStr(ReleaseDate, 1, 4) . "/" . SubStr(ReleaseDate, 5, 2) . "/" . SubStr(ReleaseDate, 7, 2)
	IniWrite, %DateLocale%, %f_AppInfoIni%, Framakey, Date
	IniWrite, %PortAppName%, %f_AppInfoIni%, Framakey, Dir
	; conversion ANSI vers Unicode (UTF8 sans BOM) du fichier ini
	AnsiFileToUnicode(f_AppInfoIni)
	; on traite le fichier lch
	IniWrite, FramaRoot\Apps\%PortAppName%\%PortAppName%.exe, %f_AppLch%, Launch, ExecuteFile
	IniWrite, FramaRoot\Apps\%PortAppName%, %f_AppLch%, Launch, ExecuteDirectory
	AnsiFileToUnicode(f_AppLch)
	SB_SetIcon("user32.dll", 5)
	LogStatus("Le fichier appinfo.ini est rempli en fonction des données existantes.")
	; activation des boutons selon la structure originelle
	If (StructureType = "PA")
		{
		GuiControl, Enable, KeepNSI
		GuiControl, Enable, CreateNSI
		}
	Else If (StructureType = "FK")
		{
		GuiControl, Enable, ImportNSI
		GuiControl, Enable, CreateNSI
		}
	Else If (StructureType = "Autre")
		GuiControl, Enable, CreateNSI
	
	; vérification des dossiers supplémentaires
	IfNotInString, StructureType, PA
		{
		Loop, %TempDir%\*.*, 2
			{
			If A_LoopFileName not contains Kiosk,Code,%AppName%
				{
				MsgBox, 36, Dossiers additionnels, Il reste des dossiers additionnels dans l'apppli d'origine.`nVoulez-vous les traiter maintenant ? (manuellement).
				IfMsgBox, Yes
					{
					Commande := "explorer.exe /e,/root,"
					Run, %Commande%%TempDir%
					RunWait, %Commande%%A_ScriptDir%\%PortAppName%
					Break
					}
				Else
					Break
				}
			}
		}
Return
}

CreateNSI:
{
	Gui, Submit, NoHide
	If (PortAppName = "")
		{
		MsgBox, 16, Oups !, C'est mieux si vous donnez un nom à votre application !
		Return
		}
	SourceFolder = %A_ScriptDir%\%PortAppName%\Other\Source
	DateEn := SubStr(ReleaseDate, 1, 4) . "-" . SubStr(ReleaseDate, 5, 2) . "-" . SubStr(ReleaseDate, 7, 2)
	; Pour éviter les erreurs de compilation : on remplace les chaines vides par des 0
	Loop, 4
		{
		If ExecVer%A_Index% = 
			ExecVer%A_Index% := 0
		}
	ExecVer := ExecVer1 . "." . ExecVer2 . "." . ExecVer3 . "." . ExecVer4
	; Fichier ini
		{
		FileRead, INIFile, %SourceFolder%\%PortAppName%.ini
		StringReplace, INIFile, INIFile, __name__, %PortAppName%, A
		StringReplace, INIFile, INIFile, __parent_name__, %AppName%, A
		StringReplace, INIFile, INIFile, __folder__, %ExecFolder%, A
		StringReplace, INIFile, INIFile, __exe__, %ExecName%, A
		FileDelete, %SourceFolder%\%PortAppName%.ini
		FileAppend, %INIFile%, %SourceFolder%\%PortAppName%.ini
		}
	; Script NSIS
		{
		FileRead, NSIFile, %SourceFolder%\%PortAppName%.nsi
		StringReplace, NSIFile, NSIFile, __name__, %PortAppName%, A
		StringReplace, NSIFile, NSIFile, __parent_name__, %AppName%, A
		StringReplace, NSIFile, NSIFile, __folder__, %ExecFolder%, A
		StringReplace, NSIFile, NSIFile, __exe__, %ExecName%, A
		StringReplace, NSIFile, NSIFile, __version_lanceur__, %LauncherVer%, A
		StringReplace, NSIFile, NSIFile, __version__, %ExecVer%, A
		StringReplace, NSIFile, NSIFile, __releaser__, %ReleaseDev%, A
		StringReplace, NSIFile, NSIFile, __date_en__, %DateEn%, A
		StringReplace, NSIFile, NSIFile, __subtitle__, %QuickDesc%, A
		FileDelete, %SourceFolder%\%PortAppName%.nsi
		FileAppend, %NSIFile%, %SourceFolder%\%PortAppName%.nsi
		}
	; Includes NSIS
		Loop, %SourceFolder%\%PortAppName%Lang_*.nsh
			{
			FileRead, NSHFile, %SourceFolder%\%A_LoopFileName%
			StringReplace, NSHFile, NSHFile, __name__, %PortAppName%, A
			StringReplace, NSHFile, NSHFile, __date_en__, %DateEn%, A
			FileDelete, %SourceFolder%\%A_LoopFileName%
			FileAppend, %NSHFile%, %SourceFolder%\%A_LoopFileName%
			}
	SB_SetIcon("user32.dll", 5)
	LogStatus("La création des nouveaux fichiers NSI est terminée.")
	GuiControl, Enable, EditNSI
	GuiControl, Enable, CompileNSI
Return
}

KeepNSI:
{
	GuiControl, Enable, EditNSI
	GuiControl, Enable, CompileNSI
Return
}

ImportNSI:
{
	Gui, Submit, NoHide
	FileCopy, %CodeFolder%\*.nsi, %PortAppName%\Other\Source, 1
	FileCopy, %CodeFolder%\*.nsh, %PortAppName%\Other\Source, 1
	FileCopy, %CodeFolder%\*.ini, %PortAppName%\Other\Source, 1
	; modification des références : PortableXYZ vers XYZPortable
	FileRead, NSIFile, %PortAppName%\Other\Source\%SelectedAppName%.nsi
	DateEn := SubStr(ReleaseDate, 1, 4) . "-" . SubStr(ReleaseDate, 5, 2) . "-" . SubStr(ReleaseDate, 7, 2)
	StringReplace, NSIFile, NSIFile, %SelectedAppName%, %PortAppName%, All
	StringReplace, NSIFile, NSIFile, define DEFAULTAPPDIR ", define DEFAULTAPPDIR "App\
	StringReplace, NSIFile, NSIFile, OutFile "..\, OutFile "..\..\
	DateComplete := "date=" . DateEn
	IconLocation = Icon "..\..\App\AppInfo\appicon.ico
	; astuce "
	NSIFile := RegExReplace(NSIFile, "date=[0-9]+-[0-9]+-[0-9]+", DateComplete, "", 1)
	NSIFile := RegExReplace(NSIFile, "Icon .*?\.ico", IconLocation, "", 1)
	FileDelete, %PortAppName%\Other\Source\%PortAppName%.nsi
	FileAppend, %NSIFile%, %PortAppName%\Other\Source\%PortAppName%.nsi
	FileRead, INIFile, %PortAppName%\Other\Source\%SelectedAppName%.ini
	StringReplace, INIFile, INIFile, %SelectedAppName%, %PortAppName%, All
	FileDelete, %PortAppName%\Other\Source\%PortAppName%.ini
	FileAppend, %INIFile%, %PortAppName%\Other\Source\%PortAppName%.ini
	Loop, %PortAppName%\Other\Source\%SelectedAppName%*.nsh
		{
		StringReplace, NewName, A_LoopFileName, %SelectedAppName%, %PortAppName%
		FileCopy, %PortAppName%\Other\Source\%A_LoopFileName%, %PortAppName%\Other\Source\%NewName%, 1
		}
	; nettoyage
	FileDelete, %PortAppName%\Other\Source\%SelectedAppName%*.*
	SB_SetIcon("user32.dll", 5)
	LogStatus("L'import et l'adaptation des fichiers NSI est terminée.")
	GuiControl, Enable, EditNSI
	GuiControl, Enable, CompileNSI
Return
}


EditNSI:
{
	SB_SetIcon("user32.dll", 5)	
	LogStatus("Lancement de l'éditeur pour modification du script NSIS.")
	RunWait, "%FramaEditor%" "%PortAppName%\Other\Source\%PortAppName%.nsi"
	LogStatus("Edition du script NSIS terminée.")
Return
}

CompileNSI:
{
	Gui, Submit, NoHide
	IfNotExist, %PortAppName%\App\AppInfo\appicon.ico
		{
			MsgBox, 16, Erreur, Impossible de compiler : pas d'icône disponible !
			SB_SetIcon("user32.dll", 2)	
			LogStatus("Compilation interrompue : pas d'icône disponible.")
			GuiControl, ChooseString, Onglets, Images
			Return
		}
	SB_SetIcon("user32.dll", 5)	
	LogStatus("Lancement de la compilation du script NSIS.")
	RunWait, "%FramaCompiler%" "%PortAppName%\Other\Source\%PortAppName%.nsi"
	GuiControl, Enable, ZipPack
	LogStatus("Compilation du script NSIS terminée. Voir le log pour plus de détails.")
Return
}

ZipPack:
{
	SB_SetIcon("user32.dll", 5)	
	LogStatus("Calcul de la taille décompressée en cours.")
	; On calcule la taille du dossier décompressé
	SetBatchLines, -1
	FolderSize = 0
	Loop, %PortAppName%\*.*, , 1
		FolderSize += %A_LoopFileSize%
	IniWrite, %FolderSize%, %PortAppName%\App\AppInfo\appinfo.ini, Framakey, Size
	; et on recommence pour prendre en compte les changements
	FolderSize = 0
	Loop, %PortAppName%\*.*, , 1
		FolderSize += %A_LoopFileSize%
	IniWrite, %FolderSize%, %PortAppName%\App\AppInfo\appinfo.ini, Framakey, Size
	SB_SetIcon("user32.dll", 5)	
	LogStatus("Création du paquet ZIP en cours.")
	PortAppFolder := A_ScriptDir . "\" . PortAppName
	RunWait, "%7zExe%" a -tzip "%PortAppName%_%s_FinalVer%.fmk.zip" "%PortAppFolder%\" -mx9,, Hide
	LogStatus("Archivage terminé. Le fichier " . PortAppName . ".fmk.zip est disponible dans le dossier de Repack.")
	GuiControl, Enable, CleanTemp
	GuiControl, Enable, GuiClose
Return
}

CleanTemp:
{
	FileRemoveDir, %NewAppName%, 1
	FileRemoveDir, %TempDir%, 1
	FileCreateDir, %TempDir%
	GuiControl, Disable, CopyPictures
	GuiControl, Disable, FillAppInfo
	GuiControl, Disable, CreateNSI
	GuiControl, Disable, KeepNSI
	GuiControl, Disable, ImportNSI
	GuiControl, Disable, EditNSI
	GuiControl, Disable, CompileNSI
	GuiControl, Disable, ZipPack
	GuiControl,, PortAppName,
	GuiControl,, AppName,
	GuiControl, ChooseString, Category, Bureautique
	GuiControl, ChooseString, Lang, Fran
	GuiControl, ChooseString, License, GPL
	GuiControl,, Logo,
	GuiControl,, LogoThumb,
	GuiControl,, IconExe,
	GuiControl,, IconFrama,
	GuiControl,, Logo128,
	GuiControl,, Screen128,
	GuiControl,, PNGFile,
	GuiControl,, ScreenFile,
	GuiControl,, QuickDesc,
	GuiControl,, Desc,
	GuiControl,, SiteName,
	GuiControl,, SiteAddress,
	GuiControl,, MainSiteName,
	GuiControl,, MainSiteAddress,
	GuiControl,, FramaNotice,
	GuiControl,, ReleaseDev,
	GuiControl,, Changelog,
	GuiControl, ChooseString, Branch, Testing
	GuiControl,, ScreenCap,
	GuiControl,, ScreenCapThumb,
	GuiControl,, ExecName,
	GuiControl,, ExecFolder,
	GuiControl,, LauncherVer,
	GuiControl,, ExecVer1,
	GuiControl,, ExecVer2,
	GuiControl,, ExecVer3,
	GuiControl,, ExecVer4,
Return
}

; ================================================================================
;						Gestion des importations/lectures
; ================================================================================

; extraction des données du fichier XML
ReadXMLFile:
{
	; lecture des valeurs
	SB_SetIcon("user32.dll", 5)
	LogStatus("Récupération des données du fichier XML en cours ...")
	xml := xpath_load(X_file, SelectedFile)
	PortAppNameXML := xpath(X_file, "/portablesoft/name/text()")
	ParentNameXML := xpath(X_file, "/portablesoft/parent_name/text()")
	CategoryXML := xpath(X_file, "/portablesoft/category/text()")
	LangXML := xpath(X_file, "/portablesoft/lang/text()")
	LogoXML := xpath(X_file, "/portablesoft/logo/original/text()")
	LogosmallXML := xpath(X_file, "/portablesoft/logo/small/text()")
	LicenceXML := xpath(X_file, "/portablesoft/licenses/license/text()")
	SubtitleXML := xpath(X_file, "/portablesoft/desc/subtitle/text()")
	ContentXML := xpath(X_file, "/portablesoft/desc/content/text()")
	CommentXML := xpath(X_file, "/portablesoft/desc/comment/text()")
	SiteXML := xpath(X_file, "/portablesoft/website/website_name/text()")
	SiteURLXML := xpath(X_file, "/portablesoft/website/website_url/text()")
	ParentSiteXML := xpath(X_file, "/portablesoft/website/parent_website_name/text()")
	ParentURLXML := xpath(X_file, "/portablesoft/website/parent_website_url/text()")
	NoticeURLXML := xpath(X_file, "/portablesoft/framasoft_url/text()")
	ChangeLXML := xpath(X_file, "/portablesoft/release/changelog/text()")
	DateLXML := xpath(X_file, "/portablesoft/release/date/text()")
	ReleaserXML := xpath(X_file, "/portablesoft/release/releaser/text()")
	NotesXML := xpath(X_file, "/portablesoft/release/notes/text()")
	BranchXML := xpath(X_file, "/portablesoft/release/branch/text()")
	DownloadURLXML := xpath(X_file, "/portablesoft/release/files/download_url/text()")
	PackedXML := xpath(X_file, "/portablesoft/release/files/packed_file/text()")
	SizePackXML := xpath(X_file, "/portablesoft/release/files/sizes/packed/text()")
	SizeUnpackXML := xpath(X_file, "/portablesoft/release/files/sizes/unpacked/text()")
	CapXML := xpath(X_file, "/portablesoft/release/screenshots/screenshot/url/text()")
	CapThumbXML := xpath(X_file, "/portablesoft/release/screenshots/screenshot/url_small/text()")
	; Mise en forme de certaines valeurs
	DateLong := SubStr(DateLXML, 7, 4) . SubStr(DateLXML, 4, 2) . SubStr(DateLXML, 1, 2) . "000000"
	; Envoi des données vers les boites
	GuiControl,, PortAppName, %PortAppNameXML%
	GuiControl,, AppName, %ParentNameXML%
	GuiControl, ChooseString, Category, %CategoryXML%
	GuiControl, ChooseString, Lang, %LangXML%
	GuiControl, ChooseString, License, %LicenceXML%
	GuiControl,, Logo, %LogoXML%
	GuiControl,, LogoThumb, %LogosmallXML%
	GuiControl,, QuickDesc, %SubtitleXML%
	GuiControl,, Desc, %ContentXML%
	GuiControl,, Comment, %CommentXML%
	GuiControl,, SiteName, %SiteXML%
	GuiControl,, SiteAddress, %SiteURLXML%
	GuiControl,, MainSiteName, %ParentSiteXML%
	GuiControl,, MainSiteAddress, %ParentURLXML%
	GuiControl,, FramaNotice, %NoticeURLXML%
	GuiControl,, ReleaseDate, %DateLong%
	GuiControl,, ReleaseDev, %ReleaserXML%
	GuiControl,, Changelog, %ChangeLXML%
	GuiControl, ChooseString, Branch, %BranchXML%
	GuiControl,, Notes, %NotesXML%
	GuiControl,, DLAddress, %DownloadURLXML%
	GuiControl,, PacketName, %PackedXML%
	GuiControl,, ScreenCap, %CapXML%
	GuiControl,, ScreenCapThumb, %CapThumbXML%
	LogStatus("Récupération des données du fichier XML terminée !")
Return
}

; extraction des données de la page correspondante du site
ReadURLFile:
{
	SB_SetIcon("user32.dll", 2)
	LogStatus("Pas de fichier XML disponible. Tentative de récupération de données à partir du site.")
	; On complète les boites en automatique à partir du nom du dossier
	GuiControl,, PortAppName, %SelectedAppName%
	Gosub AutoCompletion
	; Au cas où on ait un +
	StringReplace, SelectedAppNameWeb, SelectedAppName, +, plus, All
	FKPageOK := "false"
	While FKPageOK = "false"
		{
		URLDownloadToFile, http://www.framakey.org/Portables/%SelectedAppNameWeb%, %TempDir%\%SelectedAppName%.html
		; On lit le fichier et on enlève tout ce qui est avant le titre
		FileRead, HTMLFile, %TempDir%\%SelectedAppName%.html
		Entete1 := "<h1>Portable" . ShortAppName . "</h1>"
		Entete2 := "<h1>" . ShortAppName . "Portable</h1>"
		FoundPos := InStr(HTMLFile, Entete1) + InStr(HTMLFile, Entete2)
		; on vérifie l'existence de la page via l'entête
		If FoundPos = 0
			{
			InputBox, SelectedAppNameWeb, Page Framakey, La page %SelectedAppNameWeb% n'est pas encore définie.`n`nVous pouvez indiquer une autre page à rechercher ci-dessous.`n`nhttp://www.framakey.org/Portables/
			If ErrorLevel
				{
				FKPageCancel := "true"
				Break
				}
			}
		Else
			FKPageOK := "true"
		}
	If FKPageCancel
		Return
	FoundPos -= 1
	StringTrimLeft, HTMLFile, HTMLFile, %FoundPos%
	; Vive les expressions régulières
	FoundPos := RegExMatch(HTMLFile, "<h2>(.*)</h2>", SubtitleXML)
	FoundPos := RegExMatch(HTMLFile, "'frame rfloat'><img src='(.*?)'.*?</div>(.*?)<div class='vspace'></div><table", ContentXML)
	FoundPos := RegExMatch(HTMLFile, "origine : <a class='urllink' href='(.*?)'>(.*?)</a>", ParentSite)
	FoundPos := RegExMatch(HTMLFile, "<li>Licence : (.*?)\R", LicenceURL)
	FoundPos := RegExMatch(HTMLFile, "Fiche Framasoft : <a class='urllink' href='(.*?)'", NoticeURL)
	FoundPos := RegExMatch(HTMLFile, "'frame rfloat'><a class='urllink' href='(.*?)'><img src='(.*?)'", ScreenURL)
	FoundPos := RegExMatch(HTMLFile, "<br clear='all' />.*?, (.*?)\.", LangURL)
	
	; Nettoyage des descriptions
	SubtitleXML1 := UnHTM(SubtitleXML1)
	ContentXML1 := UnHTM(ContentXML1)
	ContentXML2 := UnHTM(ContentXML2)
	
	; On fait le ménage
	HTMLFile := ""
	FileDelete, %TempDir%\%SelectedAppName%.html
	
	; On complète à partir des données récupérées sur le site
	GuiControl, ChooseString, Lang, %LangURL1%
	GuiControl, ChooseString, License, %LicenceURL1%
	GuiControl,, QuickDesc, %SubtitleXML1%
	GuiControl,, Desc, %ContentXML2%
	GuiControl,, MainSiteName, %ParentSite2%
	GuiControl,, MainSiteAddress, %ParentSite1%
	GuiControl,, FramaNotice, %NoticeURL1%
	; on récupère systématiquement les logos et screenshot
	If ContentXML1
		URLDownloadToFile, %ContentXML1%, %TempDir%\appicon.png
	If ScreenURL1
		URLDownloadToFile, %ScreenURL1%, %TempDir%\screenshot.png
	SB_SetIcon("user32.dll", 5)
	LogStatus("Fin de la récupération des données à partir du site.")
Return
}

; extraction des données des fichiers INI et Version
ReadCode:
{
	; On récupère à partir de l'ini s'il existe
	SB_SetIcon("user32.dll", 5)
	LogStatus("Récupération de données à partir des fichiers existants.")
	IfExist, %CodeIniFile%
		{
		IniRead, AppDir, %CodeIniFile%, %SelectedAppName%, %ShortAppName%Directory
		IniRead, AppExe, %CodeIniFile%, %SelectedAppName%, %ShortAppName%Executable
		}
	Else
		{
		AppDir := ShortAppName
		AppExe := ShortAppName . ".exe"
		}
	; On essaie de récupérer les informations de version
	IfExist, %SelectedFolder%\Version.txt
		{
		FileRead, VersionFile, %SelectedFolder%\Version.txt
		FoundPos := RegExMatch(VersionFile, "-(.*?)-", VInfos)
		FoundPos := RegExMatch(VersionFile, "-r(.*)", LInfos)
		}
	Else IfExist, %SelectedFolder%\*%ShortAppName%*.txt
		{
		Loop, %SelectedFolder%\*%ShortAppName%*.txt
			{
			FoundPos := RegExMatch(A_LoopFileName, "-(.*?)-", VInfos)
			FoundPos := RegExMatch(A_LoopFileName, "-r(.*?)\.", LInfos)
			}
		}
	Else IfExist, %SelectedFolder%\%AppDir%\%AppExe%
		FileGetVersion, VInfos1, %SelectedFolder%\%AppDir%\%AppExe%
	Else
		LogStatus("Impossible de récupérer les informations de version.")
	GuiControl,, ExecName, %AppExe%
	GuiControl,, ExecFolder, %AppDir%
	GuiControl,, LauncherVer, %LInfos1%
	StringSplit, VExe, VInfos1, .
	GuiControl,, ExecVer1, %VExe1%
	GuiControl,, ExecVer2, %VExe2%
	GuiControl,, ExecVer3, %VExe3%
	GuiControl,, ExecVer4, %VExe4%
	LogStatus("Récupération terminée. Veuillez vérifier les différents items.")
Return
}


; ================================================================================
;						Gestion des contenus des contrôles
; ================================================================================
; Autocomplétion à partir de la valeur rentrée dans le nom d'appli portable
AutoCompletion:
{
	GuiControlGet, PortAppName
	IfInString, PortAppName, Portable
		{
		StringReplace, BaseName, PortAppName, Portable
		; General Tab Edit Box Autocompletion
		GuiControl,, AppName, %BaseName%
		GuiControl,, Logo, %PortAppName%_128px.png
		GuiControl,, LogoThumb, %PortAppName%_64px.png
		GuiControl,, IconExe, %PortAppName%.ico
		GuiControl,, IconFrama, %PortAppName%_16px.bmp
		GuiControl,, SiteName, Framakey / %PortAppName%
		GuiControl,, SiteAddress, http://www.framakey.org/Portables/%PortAppName%
		GuiControl,, MainSiteName, %BaseName%
		; Release Tab Edit Box Autocompletion
		GuiControl,, ScreenCap, %PortAppName%_screenshot.png
		GuiControl,, ScreenCapThumb, %PortAppName%_screenshot_small.png
		; Release Code Edit Box Autocompletion
		GuiControl,, ExecFolder, %BaseName%
		}
	Else
		{
		; General Tab Edit Box Autocompletion
		GuiControl,, AppName, %PortAppName%
		GuiControl,, Logo, %PortAppName%_128px.png
		GuiControl,, LogoThumb, %PortAppName%_64px.png
		GuiControl,, IconExe, %PortAppName%.ico
		GuiControl,, IconFrama, %PortAppName%_16px.bmp
		GuiControl,, SiteName, Framakey / %PortAppName%
		GuiControl,, SiteAddress, http://www.framakey.org/Portables/%PortAppName%
		GuiControl,, MainSiteName, %PortAppName%
		; Release Tab Edit Box Autocompletion
		GuiControl,, ScreenCap, %PortAppName%_screenshot.png
		GuiControl,, ScreenCapThumb, %PortAppName%_screenshot_small.png
		; Release Code Edit Box Autocompletion
		GuiControl,, ExecFolder, %BaseName%
		}
Return
}

; création des icônes et logos à partir d'un PNG
; Très largement inspiré d'IconMakerTk par Tuxmouraille
TransformPNG:
{
	SB_SetIcon("user32.dll", 5)
	LogStatus("Création des images et logos")
	Progress, B1 P0 CWWhite, Logo 128 pixels, Création des images.
	RunWait, "%IMConvert%" "%SelectedPNG%" -scale 128x128 -trim -background transparent -gravity center -extent 128x128 "%TempDir%\Logo128.png",, Hide
	Progress, 7 , Logo 64 pixels, Création des images.
	; on réduit de moitié pour créer la miniature du logo
	RunWait, "%IMConvert%" "%TempDir%\Logo128.png" -scale 50`% "%TempDir%\Logo64.png",, Hide
	Progress, 15 , Icône 48px * 32bpp, Création des images.
	; on lance la céation des diffrérentes images pour la création de l'icône multiple (48, 32 et 16 px en 32, 8 et 4 bpp)
	RunWait, "%IMConvert%" "%TempDir%\Logo128.png" -scale 48x48 "%TempDir%\Icon48_32.png",, Hide
	Progress, 22 , Icône 32px * 32bpp, Création des images.
	RunWait, "%IMConvert%" "%TempDir%\Logo128.png" -scale 32x32 "%TempDir%\Icon32_32.png",, Hide
	Progress, 30 , Icône 16px * 32bpp, Création des images.
	RunWait, "%IMConvert%" "%TempDir%\Logo128.png" -scale 16x16 "%TempDir%\Icon16_32.png",, Hide
	Progress, 37 , Icône 48px * 8bpp, Création des images.
	RunWait, "%IMConvert%" "%TempDir%\Logo128.png" -scale 48x48 -colors 8 "%TempDir%\Icon48_8.png",, Hide
	Progress, 45 , Icône 32px * 8bpp, Création des images.
	RunWait, "%IMConvert%" "%TempDir%\Logo128.png" -scale 32x32 -colors 8 "%TempDir%\Icon32_8.png",, Hide
	Progress, 52 , Icône 16px * 8bpp, Création des images.
	RunWait, "%IMConvert%" "%TempDir%\Logo128.png" -scale 16x16 -colors 8 "%TempDir%\Icon16_8.png",, Hide
	Progress, 60 , Icône 48px * 4bpp, Création des images.
	RunWait, "%IMConvert%" "%TempDir%\Logo128.png" -scale 48x48 -colors 4 "%TempDir%\Icon48_4.png",, Hide
	Progress, 67 , Icône 32px * 4bpp, Création des images.
	RunWait, "%IMConvert%" "%TempDir%\Logo128.png" -scale 32x32 -colors 4 "%TempDir%\Icon32_4.png",, Hide
	Progress, 75 , Icône 16px * 4bpp, Création des images.
	RunWait, "%IMConvert%" "%TempDir%\Logo128.png" -scale 16x16 -colors 4 "%TempDir%\Icon16_4.png",, Hide
	Progress, 85 , Création de l'icône de l'exécutable, Création des images.
	; on met tout ça dans l'icône
	RunWait, "%IMConvert%"  "%TempDir%\Icon*.png" "%TempDir%\Icon.ico",, Hide
	Progress, 100 , Terminé, Création des images.
	Sleep, 1000
	Progress, Off
	LogStatus("Création des images terminée.")
	GuiControl, , Logo128, %TempDir%\Logo128.png
Return
}

; création des captures écran
TransformScreen:
{
	SB_SetIcon("user32.dll", 5)
	LogStatus("Création des captures d'écran")
	RunWait, "%IMConvert%" "%SelectedScreen%" "%TempDir%\Screen.png",, Hide
	RunWait, "%IMConvert%" "%SelectedScreen%" -scale 128x128 -trim -background transparent -gravity center -extent 128x128 "%TempDir%\Screen128.png",, Hide
	LogStatus("Création des images terminée.")
	GuiControl, , Screen128, %TempDir%\Screen128.png
	GuiControl, Show, ExportImages
	GuiControl, Show, ExportAll
Return
}

; affichage des images dans l'onglet Images
DisplayImages:
{
	IfExist, %LogoFile%
		GuiControl, , Logo128, *w128 *h-1 %LogoFile%
	Else
		GuiControl, , Logo128, *w128 *h-1 %ImgDir%\NoPicture.png
	IfExist, %ScreenshotFile%
		GuiControl, , Screen128, *w128 *h-1 %ScreenshotFile%
	Else
		GuiControl, , Screen128, *w128 *h-1 %ImgDir%\NoPicture.png
Return
}

; ================================================================================
; 						Définitions des fonctions
; ================================================================================
ListIni(INISect)
{
	TempList := ""
	Loop {
		IniRead, Entry%A_Index%, %A_ScriptDir%\Repack.ini, %INISect%, name%A_Index%, Fini
		IfEqual, Entry%A_Index%, Fini, Break
		TempList .= Entry%A_Index% . "|"
		}
	StringTrimRight, TempList, TempList, 1
Return, %TempList%
}

TestPicture(PicFolder, LocalPic, RemotePic)
{
	Ajout := ""
	IfNotExist, %PicFolder%\%LocalPic%
		{
		Ajout .= LocalPic
		IfNotEqual, RemotePic
			Ajout .= "* `r`n"
		Else
			Ajout .= "`r`n"
		}
Return %Ajout%
}

LogStatus(LogMessage)
{
	global LogMsg, LogDisplay
	LogMsg .= LogMessage . "|"
	SB_SetText(LogMessage)
	GuiControl, 3: , LogDisplay, %LogMessage%||
Return
}

UnHTM( HTM ) { ; Remove HTML formatting / Convert to ordinary text     by SKAN 19-Nov-2009
 Static HT     ; Forum Topic: www.autohotkey.com/forum/topic51342.html
 IfEqual,HT,,   SetEnv,HT, % "&aacuteá&acircâ&acute´&aeligæ&agraveà&amp&aringå&atildeã&au"
 . "mlä&bdquo„&brvbar¦&bull•&ccedilç&cedil¸&cent¢&circˆ&copy©&curren¤&dagger†&dagger‡&deg"
 . "°&divide÷&eacuteé&ecircê&egraveè&ethð&eumlë&euro€&fnofƒ&frac12½&frac14¼&frac34¾&gt>&h"
 . "ellip…&iacuteí&icircî&iexcl¡&igraveì&iquest¿&iumlï&laquo«&ldquo“&lsaquo‹&lsquo‘&lt<&m"
 . "acr¯&mdash—&microµ&middot·&nbsp &ndash–&not¬&ntildeñ&oacuteó&ocircô&oeligœ&ograveò&or"
 . "dfª&ordmº&oslashø&otildeõ&oumlö&para¶&permil‰&plusmn±&pound£&quot""&raquo»&rdquo”&reg"
 . "®&rsaquo›&rsquo’&sbquo‚&scaronš&sect§&shy­&sup1¹&sup2²&sup3³&szligß&thornþ&tilde˜&tim"
 . "es×&trade™&uacuteú&ucircû&ugraveù&uml¨&uumlü&yacuteý&yen¥&yumlÿ"
 TXT := RegExReplace( HTM,"<[^>]+>" )               ; Remove all tags between  "<" and ">"
 Loop, Parse, TXT, &`;                              ; Create a list of special characters
   L := "&" A_LoopField ";", R .= (!(A_Index&1)) ? ( (!InStr(R,L,1)) ? L:"" ) : ""
 StringTrimRight, R, R, 1
 Loop, Parse, R , `;                                ; Parse Special Characters
  If F := InStr( HT, A_LoopField )                  ; Lookup HT Data
    StringReplace, TXT,TXT, %A_LoopField%`;, % SubStr( HT,F+StrLen(A_LoopField), 1 ), All
  Else If ( SubStr( A_LoopField,2,1)="#" )
    StringReplace, TXT, TXT, %A_LoopField%`;, % Chr(SubStr(A_LoopField,3)), All
Return RegExReplace( TXT, "(^\s*|\s*$)")            ; Remove leading/trailing white spaces
}

AnsiToUnicode(_String)
{
	ClipSaved := ClipboardAll
	Clipboard := _String
	Transform, _String, Unicode
	Clipboard := ClipSaved
	ClipSaved := ""
Return %_String%
}

AnsiFileToUnicode(_File)
{
	FileRead, _TempFile, %_File%
	_Result := AnsiToUnicode(_TempFile)
	FileDelete, %_File%
	FileAppend, %_Result%, %_File%
Return
}

TxtToHTMLite(_String)
{
	StringReplace, _String, _String, `r`n, `n, All
	StringReplace, _String, _String, `n`n, </p><p>, All
	StringReplace, _String, _String, `n, <br />, All
	StringReplace, _String, _String, %A_Tab%, , All
	_String := "<p>" . _String . "</p>"
Return %_String%
}

; ================================================================================
;					 Gestion des Fenêtres supplémentaires
; ================================================================================

LogWindow:
{
	Gui, 3:+owner1 -SysMenu
	Gui, 3:Add, ListBox, x5 y5 w490 h300 ReadOnly vLogDisplay, %LogMsg%
	Gui, 3:Add, Button, x245 y310 w80 h25 gLogClose, Quitter
	; Generated using SmartGUI Creator 4.0
	Gui, 3:Show, Center h340 w500, Fenêtre de Log
Return
}

LogClose:
	Gui, 1:-Disabled
	Gui, Destroy
Return
