#SingleInstance ignore

; Définition des emplacements (téléchargement si besoin)
p_WA := A_ScriptDir
SplitPath, p_WA,, p_Apps
If not FileExist("..\..\Framakey")
	{
	; Mode standalone
	; p_WA = K:\WebappPortable
	; p_WM = K:\WebappsManagerPortable
	; p_Apps = K:
	; p_Racine = K:
	p_Racine := p_Apps
	p_WM := p_Racine . "\WebAppsManagerPortable"
	If not FileExist(p_WM)		
		DownloadInstall(p_Racine)
	}
Else 
	{
	; Mode Framakey
	; p_WA = K:\Apps\WebappPortable
	; p_WM = K:\Framakey\WebappsManagerPortable
	; p_Apps = K:\Apps
	; p_Racine = K:
	SplitPath, p_Apps,, p_Racine
	p_WM := p_Racine . "\Framakey\WebAppsManagerPortable"
	If not FileExist(p_WM)
		DownloadInstall(p_Racine . "\Framakey")
	}


;Lecture des infos appinfo.ini
IniRead, s_Name, %p_WA%\App\AppInfo\appinfo.ini, Framakey, Name,
IniRead, s_Dir, %p_WA%\App\AppInfo\appinfo.ini, Framakey, Dir,
IniRead, s_ApplicationPath, %p_WA%\App\AppInfo\appinfo.ini, WebAppSpecific, ApplicationPath,
IniRead, s_DatabaseName, %p_WA%\App\AppInfo\appinfo.ini, WebAppSpecific, DatabaseName,
IniRead, s_Start, %p_WA%\App\AppInfo\appinfo.ini, Control, Start,
IniRead, s_Website, %p_WA%\App\AppInfo\appinfo.ini, WebAppSpecific, Website,
IniRead, s_FramasoftSupport, %p_WA%\App\AppInfo\appinfo.ini, WebAppSpecific, FramasoftSupport,
IniRead, s_FramasoftPage, %p_WA%\App\AppInfo\appinfo.ini, Framakey, FramasoftPage,
IniRead, s_Support, %p_WA%\App\AppInfo\appinfo.ini, WebAppSpecific, Support,
IniRead, s_DisplayVersion, %p_WA%\App\AppInfo\appinfo.ini, Version, DisplayVersion,
IniRead, s_License, %p_WA%\App\AppInfo\appinfo.ini, Framakey, License,
IniRead, s_Description, %p_WA%\App\AppInfo\appinfo.ini, Details, Description,
s_Description := UTF82Ansi(s_Description)

;Lecture des infos config.ini de WA
IniRead, b_DesactiveAide, %p_WA%\App\AppInfo\config.ini, General, DesactiveAide,0
IniRead, b_DesactiveNavigateur, %p_WA%\App\AppInfo\config.ini, General, DesactiveNavigateur,0
IniRead, b_Public, %p_WA%\App\AppInfo\config.ini, Confidentialite, Public,1

IniRead, s_UtilisateurBdD, %p_WA%\App\AppInfo\config.ini, MariaDB, Utilisateur,0
IniRead, s_MotDePasseBdB, %p_WA%\App\AppInfo\config.ini, MariaDB, MotDePasse,0

;Lecture des infos config.ini de WM
IniRead, b_Https, %p_WM%\App\AppInfo\config.ini, General, Https,0
IniRead, s_Domaine, %p_WM%\App\AppInfo\config.ini, General, Domaine,localhost
IniRead, s_Prefixe, %p_WM%\App\AppInfo\config.ini, General, Prefixe,

DownloadInstall(Dossier) {
; On télécharge et on installe
	url  := "http://files.framakey.org/testing/main/tools/WebappsManagerPortable.exe"
;*ToDo* : Transformer SplashText en barre de progression
	SplashTextOn, 400, 80, Téléchargement en cours,Téléchargement du Webapps Manager.`r`nCe ne sera pas très long et ça ne se produira qu'une fois`r`n`r`nMerci de patienter...
	urldownloadtofile,%url%, %Dossier%\WebappsManagerPortable.exe
	SplashTextOff
	If FileExist(Dossier . "\WebappsManagerPortable.exe")
	{
		RunWait, "%Dossier%\WebappsManagerPortable.exe" -y
		FileDelete, %Dossier%\WebappsManagerPortable.exe
	} Else {
		MsgBox,64,Erreur, Désolé. Le fichier n'a pas pu être téléchargé.
	}
return	
}

;* * * * Ecritures dans la config des serveurs * * * *;
; MariaDB
If FileExist(p_WM . "\App\mariadb\data\" . s_DatabaseName . ".sym")
	FileDelete, %p_WM%\App\mariadb\data\%s_DatabaseName%.sym
FileAppend, %p_WA%\Data\mariadb`n, %p_WM%\App\mariadb\data\%s_DatabaseName%.sym
;*ToDo* : Définir utilisateur/mot de passe BdD pour la webapp et modifier config en fonction

; NginX
If FileExist(p_WM . "\App\nginx\conf\webapps\" . s_Start . ".conf")
	FileDelete, %p_WM%\App\nginx\conf\webapps\%s_Start%.conf
If FileExist(p_WA . "\App\AppInfo\include.conf" )
{
	; *ToDo*
	; Pour NodeJS et autres config un peu spéciales
	; FileRead, f_include, p_WA . "\App\AppInfo\include.conf"
	; Remplace le texte à changer dans f_include
	; FileAppend, %f_include%, %p_WM%\App\nginx\conf\webapps\%s_Start%.conf
} Else {
	FileAppend,
	(
location /%s_ApplicationPath% {
   alias '%p_WA%\App\www';
   index index.php index.html index.htm;
   access_log '%p_WA%\App\logs\access.log';
   error_log  '%p_WA%\App\logs\error.log';
   
   location ~ /%s_ApplicationPath%/(.*\.php)$ {
      try_files  $uri =404;
      fastcgi_param  SCRIPT_FILENAME  '%p_WA%\App\www\$1';
      fastcgi_pass   127.0.0.1:9000;
      fastcgi_index  index.php;
      include fastcgi_params;
   }
}
	), %p_WM%\App\nginx\conf\webapps\%s_Start%.conf
}

RemplaceFichier(p_WM . "\App\nginx\conf\nginx.conf", "`r`n" . A_Tab . "include webapps/" . s_Start . ".conf;`r`n", "") ; Evite les doublons
RemplaceFichier(p_WM . "\App\nginx\conf\nginx.conf", A_Tab . "location / {", A_Tab . "include webapps/" . s_Start . ".conf;`r`n`r`n" . A_Tab . "location / {")

If (b_Public)
{
	RemplaceFichier(p_WM . "\App\nginx\www\robots.txt", "Allow: /" . s_ApplicationPath . "`r`n", "") ; Evite les doublons
	RemplaceFichier(p_WM . "\App\nginx\www\robots.txt", "Disallow: /","Allow: /" . s_ApplicationPath . "`r`nDisallow: /")
	;*ToDo* : Ajouter logo + lien dans nginx/www/index.php
}

; Importer et executer les scripts de startup.ini


;* * * * Lance le WebappsManager * * * *;
Process,Exist,WebappsManagerPortable.exe
If (%ErrorLevel%!=0)
	NginX()
Else
	Run %p_WM%\WebappsManagerPortable.exe

; Ouvre la webapp dans le navigateur	
If !(b_DesactiveAide)
	OuvrirURL("http://localhost/" . s_ApplicationPath)
	
;* * * * * * * GUI * * * * * * *;
; Aide
f_Aide := ""
If FileExist(p_WA . "\App\AppInfo\aide.txt")
	FileRead, f_Aide, %p_WA%\App\AppInfo\aide.txt

Gui, Add, Picture, x30 y20 w64 h64 , %p_WA%\App\AppInfo\appicon_64.png
Gui, Font, S12 CDefault Normal Bold, Verdana
Gui, Add, Text, x116 y20 w406 h30, Bienvenue dans %s_Name% Portable !

Gui, Font, S8 CDefault Normal, Verdana
Gui, Add, Text, x116 y45 w406 h80 , %s_Description%
Gui, Add, Text, x20 y100 w496 h100 , %s_Name% Portable est une Framakey WebApp, c'est à dire une application web fonctionnant sur votre ordinateur sans avoir besoin de l'installer en ligne.`r`n`r`nSi ce n'est pas déjà fait, cliquez sur l'icône à côté de l'horloge et cliquez sur Ouvrir pour lancer l'application.
Gui, Add, Picture, x282 y190 w246 h180 , %p_WA%\App\AppInfo\screenshot.png

Gui, Font, S8 CDefault Bold, Verdana
Gui, Add, Text, x20 y190 w240 h130 , %f_Aide%
Gui, Font, S8 CDefault Normal, Verdana
Gui, Add, Text, x20 y350 w240 h50, Pour obtenir de l'aide, n'hésitez pas à poser vos questions sur : 
Gui, Font, S10 CDefault Bold Underline, Verdana
Gui, Add, Text, x50 y395 w240 h20 cBlue gFramasoftSupport, Le forum de la Framakey

If !(s_Support = "") 
	Gui, Add, Text, x335 y395 w240 h20 cBlue gSupportOfficiel, Le support officiel


If !(b_DesactiveAide)
	{	
	Gui, Show, h450 w544 Center, Aide de %s_Name% Portable
	b_DesactiveAide := 0
	Gui, Font, S8 CDefault Normal, Verdana
	Gui, Add, CheckBox, x20 y420 w370 h30 gDesactiveAide, Ne plus afficher l'aide au démarrage
	}

; A propos
s_Devel := s_Name . " Portable est développé par la communauté " . s_Name . ", l'équipe Framakey et fonctionne grâce à NginX"
If FileExist("%p_WA%\Data\mariadb")
	s_Devel := s_Devel . ",MariaDB"
s_Devel := s_Devel . " et PHP"
	
Gui, 2:Font, S12 CDefault Bold, Verdana
Gui, 2:Add, Text, x50 y10 w200 h20 Center, %s_Name% Portable
Gui, 2:Font, S8 CDefault Normal, Verdana
Gui, 2:Add, Text, x50 y35 w200 h20 Center, version %s_DisplayVersion% | licence %s_License%
Gui, 2:Add, Text, x20 y60 w260 h70 , %s_devel%	
If !(s_Website = "")
	Gui, 2:Add, Text, x15 y120 w130 h20 cBlue gWebsite, Site de %s_Name%
	
If !(s_FramasoftPage = "")	
	Gui, 2:Add, Text, x155 y120 w130 h20 cBlue gFramasoftPage, Article sur Framalibre

; Configuration
Gui, 3:Add, CheckBox, x16 y10 w220 h30 vNb_DesactiveAide Checked%b_DesactiveAide%, Ne pas afficher l'aide au démarrage
Gui, 3:Add, CheckBox, x16 y40 w220 h30 vNb_DesactiveNavigateur Checked%b_DesactiveNavigateur%, Ne pas lancer le navigateur au démarrage
Gui, 3:Add, CheckBox, x16 y70 w220 h30 vNb_Public Checked%b_Public%, Autoriser l'indexation de %s_Name% dans les moteurs de recherche
If FileExist(p_WA . "\Data\mariadb")
{
Gui, 3:Add, GroupBox, x6 y110 w240 h130 , MariaDB (MySQL)
Gui, 3:Add, Text, x16 y130 w220 h20 , Utilisateur
Gui, 3:Add, Edit, x16 y150 w220 h20 vNs_UtilisateurBdD,%s_UtilisateurBdD%
Gui, 3:Add, Text, x16 y180 w220 h20 , Mot de passe
Gui, 3:Add, Edit, x16 y200 w220 h20 vNs_MotDePasseBdD,%s_MotDePasseBdD%
} Else {
Gui, 3:Add, GroupBox, x6 y110 w240 h130 Disabled, MariaDB (MySQL)
Gui, 3:Add, Text, x16 y130 w220 h20 Disabled, Utilisateur
Gui, 3:Add, Edit, x16 y150 w220 h20 Disabled, 
Gui, 3:Add, Text, x16 y180 w220 h20 Disabled, Mot de passe
Gui, 3:Add, Edit, x16 y200 w220 h20 Disabled, 
}
Gui, 3:Add, Button, x16 y250 w80 h30 gEnregistreConfig, Enregistrer
Gui, 3:Add, Text, x106 y250 w130 h40 , NB: Les changements prendront effet après redémarrage		
	
;* * * * * * *  Menu * * * * * * *;
; Titre
Menu, Tray, Add, %s_Name% , showTray
Menu, Tray, Default, %s_Name% ; Affiche le menu au clic gauche
Menu, Tray, Disable, %s_Name% ; Désactive le clic sur le titre
Menu, Tray, Click, 1
Menu, Tray, NoStandard ; Désactive le menu AHK
Menu, Tray, Add

Menu, Tray, Add, Ouvrir

; Sous menu Outils
Menu, Tray, Add, Outils, SousMenu
;Import du fichier outils.ini;,
FileRead, f_Outils, %p_WA%\App\AppInfo\outils.ini
; Remplacement des {$variables} du fichier ini par texte ou équivalent %variables%
; Liste des variables :
;	{$Http}				=	%b_https% dans WM config.ini
;	{$Domaine}			=	%s_Domaine% dans WM config.ini
;	{$PortMariaDB}		=	%i_PortMariaDB% *ToDo* : à faire si on ajoute la possibilité d'incrémenter le port (info dans WM config.ini)
;	Idem pour FastCGI et NodeJS ?
;	{$Webapp}			=	%p_WA%			
;	{$WebappBS}			=	%p_WABS% 		*ToDo* : "K:\\"
;	{$Apps}				=	%p_Apps% 		*ToDo*
;	{$WebappsManager}	=	%p_WM%  		*ToDo*
StringReplace, f_Outils, f_Outils, {$Webapp}, %p_WA% , All
StringReplace, f_Outils, f_Outils, {$Domaine}, %s_Domaine% , All
If(b_https)
	StringReplace, f_Outils, f_Outils, {$Http}, https , All
Else
	StringReplace, f_Outils, f_Outils, {$Http}, http , All

; Création du tableau a_Outils
; Pour chaque section %i%
;	a_Outils%i%_Nom				
;	a_Outils%i%_Description		
;	a_Outils%i%_Type			SQL|EDIT|URL
;	a_Outils%i%_Cible			Requete SQL, fichier (.ini,.sql,.php, etc) ou URL
;	a_Outils%i%_Message			A afficher après execution (surtout pour les requêtes SQL : c'est invisible pour utilisateur)
i_Outils = 0
Loop, Parse, f_Outils, `n`r, %A_Space%%A_Tab%
{
	c := SubStr(A_LoopField, 1, 1)
	if (c="[") ; on trouve une section
		i_Outils := i_Outils+1
	else if (c=";") ; Ligne avec commentaire, on ignore
		continue
	else 
	{ ; Ligne avec key=value
		p := InStr(A_LoopField, "=")
		if p 
		{
			k := SubStr(A_LoopField, 1, p-1) ; key
			a_Outils%i_Outils%_%k% := SubStr(A_LoopField, p+1) ; value
		}
	}
}
; Ajout des entrée dans le menu Outils
Loop, %i_Outils%
{
	_s_Nom := a_Outils%A_Index%_Nom
	Menu, Outils, Add, %_s_Nom%, ActionsOutils
}
; Voir la routine ActionsOutils pour la suite

If FileExist(p_WA . "\Data\mariadb")
{
	Menu, Outils, Add
	Menu, Outils, Add, Adminer, Adminer
	Menu, Outils, Add, Exporter la base de donnée, ExportBdD
	Menu, Outils, Add, Restaurer la base de donnée, RestaureBdD
}
Menu, Tray, Add, Outils, :Outils
Menu, Tray, Add, Configuration
Menu, Tray, Add
Menu, Tray, Add, Aide, Aide
Menu, Tray, Add, A propos, Apropos
Menu, tray, Add
Menu, Tray, Add, Quitter
#Persistent 
OnExit, Quitter
return

SousMenu:
return

ActionsOutils:
	Loop, %i_Outils%
	{
		_s_Index := a_Outils%A_Index%
		_s_Nom := a_Outils%A_Index%_Nom
		_s_Description := a_Outils%A_Index%_Description
		_s_Type := a_Outils%A_Index%_Type
		_s_Cible := a_Outils%A_Index%_Cible
		_s_Message := a_Outils%A_Index%_Message
		If (A_ThisMenuItem = _s_Nom)
		{
			If(_s_Type = "SQL")
			{
				MsgBox,1,%_s_Nom%,%_s_Description%
				IfMsgBox, Ok
				{	
					RequeteSQL(_s_Cible)
					If (_s_Message!="")
						MsgBox,64,%_s_Nom%,%_s_Message%
				}
			}
			If(_s_Type = "EDIT")
				EditerFichier(_s_Cible)
			If(_s_Type = "URL")
				OuvrirURL(_s_Cible)
			If(_s_Type = "REPLACE")
				Loop, Parse, _s_Cible,`,
				{
					If(A_Index = 1)
						_fichier := A_LoopField
					If(A_Index = 2)
						_cherche := A_LoopField
					If(A_Index = 3)
						_remplace := A_LoopField
					If(A_Index = 4)
						_mode := A_LoopField
				}
				If (_mode = "")
					_mode := "texte"
				RemplaceFichier(_fichier,_cherche,_remplace,_mode)
		}
	}		
return

Aide:
	Gui, Show, h450 w544 Center, Aide de %s_Name% Portable
return

Apropos:
	Gui, 2:Show, h160 w300 Center, A propos
return

Configuration:
	Gui, 3:Show, x131 y121 h301 w255 Center, Configuration
return

DesactiveAide:
	IniWrite, 1, %p_WA%\App\AppInfo\config.ini, General, DesactiveAide
Gui, Hide
GuiControl, Hide, Ne plus afficher l'aide au démarrage
return

EnregistreConfig:
	Gui, 3:Submit
	IniWrite, %Nb_DesactiveAide%, %p_WA%\App\AppInfo\config.ini, General, DesactiveAide
	IniWrite, %Nb_DesactiveNavigateur%, %p_WA%\App\AppInfo\config.ini, General, DesactiveNavigateur
	IniWrite, %Nb_Public%, %p_WA%\App\AppInfo\config.ini, Confidentialite, Public

	IniWrite, %Ns_UtilisateurBdD%, %p_WA%\App\AppInfo\config.ini, MariaDB, Utilisateur
	IniWrite, %Ns_MotDePasseBdB%, %p_WA%\App\AppInfo\config.ini, MariaDB, MotDePasse
	Gui, 3:Hide
return

showTray:
Menu, Tray, show
return

GuiClose:
Gui, Hide
return
;* * * * * * *  Actions * * * * * * *;
; Liens
Ouvrir:
	OuvrirURL("http://localhost/" . s_ApplicationPath)
return

Website:
	OuvrirURL(s_Website)
return

FramasoftPage:
	OuvrirURL(s_FramasoftPage)
return

SupportOfficiel:
	OuvrirURL(s_Support)
return

FramasoftSupport:
	OuvrirURL(s_FramasoftSupport)
return
;* * * * * * * * * * * * * * * * *;


; Outils
Adminer:
	If (s_UtilisateurBdD!=0 and s_UtilisateurBdD!="")
		OuvrirURL("http://localhost/" . s_Prefixe . "-adminer.php?username=" . s_UtilisateurBdD . "&db=" . s_DatabaseName)
	Else
		OuvrirURL("http://localhost/" . s_Prefixe . "-adminer.php?username=root&db=" . s_DatabaseName)
return

ExportBdD:
	Run, %comspec% /c cd "%p_WM%\App\mariadb\bin\" & mysqldump -P 3306 --opt %s_DatabaseName% -u root > "%p_WA%\Data\%s_DatabaseName%_%A_YYYY%-%A_MM%-%A_DD%_%A_Hour%-%A_Min%-%A_Sec%.sql",,Hide
	MsgBox,4,Base de donnée sauvegardée,Le fichier "%s_DatabaseName%_%A_YYYY%-%A_MM%-%A_DD%_%A_Hour%-%A_Min%-%A_Sec%.sql" d'export`r`na été enregistré dans le dossier "%s_Dir%\Data"`r`n`r`nVoulez-vous afficher ce dossier ?
	IfMsgBox, Yes
		Run, explorer.exe "%p_WA%\Data"
return

RestaureBdD:
	RequeteSQL(p_WA . "\Data\fichier-de-restauration.sql")
	MsgBox,64,Restauration effectuée, La base de donnée a été restaurée.
return

Quitter:
	Quitter(s_Start)
	ExitApp
return

;* * * * * * *  Fonctions * * * * * * *;
Quitter(_exe,_verbose="on") {
	; _verbose = "off" est utilisé pour les fermetures silencieuses et brutales des WA et du WM
	; quand _verbose = "on", il faut appeler ExitApp ensuite.
	global p_WM
	global p_WA
	global s_DatabaseName
	;* * * * Fermer le WebappsManager * * * *;
	If(_exe="WebappsManagerPortable.exe")
	{
		; On arrête les serveurs
		NginX("stop")
		FastCGI("stop")
		MariaDB("stop")
				
		; On ferme les Webapps actives
		s_WebappsActives =
		Loop, %p_WM%\App\nginx\conf\webapps\*.conf
			s_WebappsActives = %s_WebappsActives%%A_LoopFileName%`n
		Loop, parse, s_WebappsActives, `n
		{
			StringReplace, _WAexe, A_LoopField, .conf, , All
			Process,Exist,%_WAexe%
			If (%ErrorLevel%!=0 && _WAexe != "")
				Quitter(_WAexe,"off")
		}
		; On supprime tous les liens symboliques MariaDB et fichiers de conf NginX
		; et on réinitialise nginx.conf
		FileDelete, %p_WM%\App\mariadb\data\*.sym
		FileDelete, %p_WM%\App\nginx\conf\webapps\*.conf
		RestaureFichier(p_WM . "\App\nginx\conf\nginx.conf")
		
		; La fermeture s'est correctement déroulée, on supprime le fichier lock
		FileDelete, %p_WM%\App\AppInfo\lock
	;* * * * Fermer une Webapp	* * * *;
	} Else {
		; Suppression du lien symbolique MariaDB de la WA.
		; Il ne se passe rien lorsque la fonction est appelée depuis le WM.
		If FileExist(p_WM . "\App\mariadb\data\" . s_DatabaseName . ".sym")
			FileDelete, %p_WM%\App\mariadb\data\%s_DatabaseName%.sym
		; Suppression du fichier de config Nginx de la WA
		If FileExist(p_WM . "\App\nginx\conf\webapps\" . _exe . ".conf")
			FileDelete, %p_WM%\App\nginx\conf\webapps\%_exe%.conf
		; Suppression du include dans nginx.conf
		RemplaceFichier(p_WM . "\App\nginx\conf\nginx.conf", "`r`n" . A_Tab . "include webapps/" . _exe . ".conf;`r`n`", "")
		
		; Vérifier si la WA était la dernière active : Fermer le WM ou Recharger Nginx ?
		Process,Exist,WebappsManagerPortable.exe
		pid := ErrorLevel
		If FileExist(p_WM . "\App\nginx\conf\webapps\*.conf")
		{
			NginX()
		} Else {
			If (%pid%!=0)
			{
				If (_verbose="on")
				{
					MsgBox,4,Fermer le WebappsManager,Vous venez de fermer la dernière webapp active.`r`nVoulez-vous fermer le WebappsManager ?
					IfMsgBox, Yes
						Quitter("WebappsManagerPortable.exe", "off")
					Else
						NginX()
				} Else {
					NginX()
				}
			}
		}	
	}
	If(_verbose="off")
	{
		Process,Exist,%_exe%		
		If (%ErrorLevel%!=0)
			Process,Close,%ErrorLevel%
	}
}

NginX(statut="start") {
	global p_WM
	If (statut="start")
	{
		Process,Exist,nginx.exe
		If (%ErrorLevel%!=0)
			Run, %comspec% /c cd "%p_WM%\App\nginx" & nginx.exe -s reload, , Hide
		Else
			Run, %comspec% /c cd "%p_WM%\App\nginx" & nginx.exe, , Hide
	}
	If (statut="stop")
	{
		Run, %comspec% /c cd "%p_WM%\App\nginx" & nginx.exe -s stop, , Hide
		Sleep 200
		TuerProcessus("nginx.exe")
	}
}

MariaDB(statut="start") {
	global p_WM
	If (statut="start")
	{
		Process,Exist,mysqld.exe
		If (%ErrorLevel%!=0)
		{
			MariaDB("stop")
			Sleep 200
			Run, %comspec% /c cd "%p_WM%\App\mariadb\bin" & mysqld.exe --defaults-file="%p_WM%\App\mariadb\my.ini", , Hide
		} Else {
			Run, %comspec% /c cd "%p_WM%\App\mariadb\bin" & mysqld.exe --defaults-file="%p_WM%\App\mariadb\my.ini", , Hide
		}
	}
	If (statut="stop")
	{
		Run, %comspec% /c cd "%p_WM%\App\mariadb\bin\" & mysqladmin.exe -u root shutdown, , Hide
		Sleep 200
		TuerProcessus("mysqld.exe")
	}
}

FastCGI(statut="start") {
	global p_WM
	If (statut="start")
	{
		Process,Exist,php-cgi.exe
		If (%ErrorLevel%!=0)
		{
			FastCGI("stop")
			Sleep 200
			Run, %comspec% /c cd "%p_WM%\App\php" & php-cgi.exe -b localhost:9000, , Hide
		} Else {
			Run, %comspec% /c cd "%p_WM%\App\php" & php-cgi.exe -b localhost:9000, , Hide
		}
	}
	If (statut="stop")
	{
		TuerProcessus("php-cgi.exe") ; Procedure normale :)
	}
}

TuerProcessus(_exe) {
	Process,Exist,%_exe%
	pid := ErrorLevel
	While(%pid% !=0)
	{
		Process,Close,%_exe%
		Sleep 100
		Process,Exist,%_exe%
		pid := ErrorLevel
	}
}

OuvrirURL(url)
{
	global p_Apps	
	If FileExist(p_Apps . "\FramafoxPortable\FramafoxPortable.exe")
		Run %p_Apps%\FramafoxPortable\FramafoxPortable.exe %url%
	Else
		Run %url%
}

EditerFichier(fichier)
{
	global p_Apps	
	If FileExist(p_Apps . "\Notepad++Portable\Notepad++Portable.exe")
		Run %p_Apps%\Notepad++Portable\Notepad++Portable.exe %fichier%
	Else
		Run notepad.exe %fichier%
}

RequeteSQL(SQL) {
	global p_WM
	global s_DatabaseName
	If (SubStr(SQL, -3) = ".sql")
	{
		If not FileExist(SQL) 
			MsgBox,64,Erreur,Le fichier %SQL% n'existe pas
		RunWait, %comspec% /c cd "%p_WM%\App\mariadb\bin\" && mysql.exe -u root -e "source %SQL%" %s_DatabaseName%,,Hide
	} Else {
		RunWait, %comspec% /c cd "%p_WM%\App\mariadb\bin\" && mysql.exe -u root -e "%SQL%" %s_DatabaseName%,,Hide
	}
}

RemplaceFichier(fichier, cherche, remplace, mode="texte") {
	If not FileExist(fichier) 
	{
		MsgBox,64,Erreur,Le fichier %fichier% n'existe pas
		return
	} Else {
		If (mode="texte")
		{
			FileRead, f_Fichier, %fichier%
			StringReplace, f_Fichier, f_Fichier, %cherche%, %remplace%, All
			FileDelete, %fichier%
			FileAppend, %f_Fichier%, %fichier%
		}
		If (mode="regex")
		{
			FileRead, f_Fichier, %fichier%
			FileDelete, %fichier%
			Nf_Fichier =
			
			Loop, Parse, f_Fichier, `r
			{
				Nf_Fichier := RegExReplace(A_LoopField, cherche, remplace)
				FileAppend, %Nf_Fichier%`r, %fichier%
			}
		}
	}
}

SauvegardeFichier(fichier) {
	SplitPath, fichier, nom_fichier, dossier
	FileCopy, %fichier%, %dossier%\~%nom_fichier%, 1
}

RestaureFichier(fichier) {
	SplitPath, fichier, nom_fichier, dossier
	FileCopy, %dossier%\~%nom_fichier%, %fichier%, 1
}

ChaineAleatoire(i_longueur) {
	_chars=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_
	Loop, %i_longueur%
	{
		Random, _i, 0, 62
		_char := SubStr(_chars, _i, 1)
		_key = %_key%%_char%
	}
	return %_key%
}

;* * * * Code Importé * * * *;
UTF82Ansi(zString)
{
   Ansi2Unicode(zString, wString, 65001)
   Unicode2Ansi(wString, sString, 0)
   Return sString
}

Ansi2Unicode(ByRef sString, ByRef wString, CP = 0)
{
     nSize := DllCall("MultiByteToWideChar"
      , "Uint", CP
      , "Uint", 0
      , "Uint", &sString
      , "int",  -1
      , "Uint", 0
      , "int",  0)

   VarSetCapacity(wString, nSize * 2)

   DllCall("MultiByteToWideChar"
      , "Uint", CP
      , "Uint", 0
      , "Uint", &sString
      , "int",  -1
      , "Uint", &wString
      , "int",  nSize)
}

Unicode2Ansi(ByRef wString, ByRef sString, CP = 0)
{
     nSize := DllCall("WideCharToMultiByte"
      , "Uint", CP
      , "Uint", 0
      , "Uint", &wString
      , "int",  -1
      , "Uint", 0
      , "int",  0
      , "Uint", 0
      , "Uint", 0)

   VarSetCapacity(sString, nSize)

   DllCall("WideCharToMultiByte"
      , "Uint", CP
      , "Uint", 0
      , "Uint", &wString
      , "int",  -1
      , "str",  sString
      , "int",  nSize
      , "Uint", 0
      , "Uint", 0)
}