; ================================================================================
; 						Définitions des fonctions
; 					spécifiques pour FramaWizard
; ================================================================================


;===============================================================================
; Function Name:	LogStatus
; Description:		Gestion de l'affichage et de l'historique du log
; Parameters:		chaine
;===============================================================================
LogStatus(LogMessage)
{
	global s_LogMsg, LogDisplay
	s_LogMsg .= LogMessage . "|"
	SB_SetText(LogMessage)
	GuiControl, 3: , LogDisplay, %LogMessage%||
Return
}

; Conversion HTML vers texte
;===============================================================================
; Function Name:	UnHTM
; Description:		Enlève toutes les balises HTML d'une chaine
; 					Convertit vers un texte ordinaire
; Parameters:		chaine
;===============================================================================
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ÿ"
 HTM := RegExReplace(HTM, "<br[^>]*>", "`n")
 StringReplace, HTM, HTM, </p><p>, `n, All
 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
}

;===============================================================================
; Function Name:	TxtToHTMLite
; Description:		Convertit un texte simple en HTML basique
; Parameters:		chaine
;===============================================================================
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%
}

;===============================================================================
; Function Name:	SumFolderSize
; Description:		Calcule la taille d'un dossier de manière récursive
; Parameters:		chemin
;===============================================================================
SumFolderSize(Folder)
{
	; On calcule la taille du dossier décompressé
	SetBatchLines, -1
	v = 0
	Loop, %Folder%\*.*, , 1
		v += %A_LoopFileSize%
Return v
}

;===============================================================================
; Function Name:	WM_MOUSEMOVE
; Description:		Affiche et masque les ToolTip en fonction du contrôle
; Parameters:		Aucun
;===============================================================================
WM_MOUSEMOVE()
{
	static CurrControl, PrevControl, _TT  ; _TT is kept blank for use by the ToolTip command below.
	CurrControl := A_GuiControl

	If (CurrControl <> PrevControl and not InStr(CurrControl, " "))
	{
		ToolTip  ; Turn off any previous tooltip.
		SetTimer, DisplayToolTip, 1000
		PrevControl := CurrControl
	}
	return

	DisplayToolTip:
	If (CurrControl = "b_EditScript")
		Gosub UpdateToolTipMsg
	SetTimer, DisplayToolTip, Off
	ToolTip % %CurrControl%_TT  ; The leading percent sign tell it to use an expression.
	SetTimer, RemoveToolTip, 3000
	return

	RemoveToolTip:
	SetTimer, RemoveToolTip, Off
	ToolTip
	return

}

;===============================================================================
; Function Name:	ConvPath2Abs
; Description:		Convertit inconditionnellement un chemin en absolu
; Parameters:		chemin
;===============================================================================
ConvPath2Abs(Folder)
{
	p_SDir := A_ScriptDir
	If Folder contains ..\,.\
		{
		StringReplace, Folder, Folder, ..\, , UseErrorLevel
		If ErrorLevel
			{
			i_Count := ErrorLevel
			Folder := StringLeft(p_SDir, StringGetPos(p_SDir, "\", "R" . i_Count) + 1) . Folder
			}
		StringReplace, Folder, Folder, .\, \, UseErrorLevel
		If ErrorLevel
			Folder := p_SDir . Folder
		}
Return Folder
}

;===============================================================================
; Function Name:	CalcRelPath
; Description:		Calcule les chemins relatifs entre les deux dossiers
; Parameters:		dossier référence (chemin), dossier à référencer (chemin)
;===============================================================================
CalcRelPath(OrigDir, RelDir)
{
	; On commence par convertir les éventuels chemins relatifs en absolus
	OrigDir := ConvPath2Abs(OrigDir)
	RelDir := ConvPath2Abs(RelDir)
	; 1e cas simple RelDir est un sous répertoire de OrigDir
	IfInString, RelDir, %OrigDir%
		StringReplace, OutputPath, RelDir, %OrigDir%, .
	Else
		{
		; on vérifie que les lecteurs soient identiques
		SplitPath, OrigDir, , , , , OrigDrive
		SplitPath, RelDir, , , , , RelDrive
		If (OrigDrive != RelDrive)
			{
			MsgBox, 16, Erreur, %OrigDir% et %RelDir% sont sur des lecteurs différents !, 3
			Return
			}
		ConcatPath := ""
		Loop, parse, OrigDir, \
			{
			IfInString, RelDir, %ConcatPath%%A_LoopField%
				ConcatPath .= A_LoopField . "\"
			Else
				Break
			}
		StringReplace, OutputPath, RelDir, %ConcatPath%
		StringReplace, OrigDir, OrigDir, %ConcatPath%
		StringReplace, Poubelle, OrigDir, \, |, UseErrorLevel
		Count := ErrorLevel + 1
		Loop, %Count%
			{
			OutputPath := "..\" . OutputPath
			}
		}
Return OutputPath
}

;===============================================================================
; Function Name:	CreateSection
; Description:		Formate une chaine de caractères sous forme de section de 
; 					fichier ini avec la liste des clés et leurs valeurs
; Parameters:		nom de la section, liste d'items
;===============================================================================
CreateSection(_Section, _List)
{
	s_SectionString := "[" . _Section . "]"
	Sort, _List, U CL
	i_Count := 0
	Loop, Parse, _List, `n
		{
		; on évite de traiter en cas de ligne vide (pas sûr que cela soit utile avec le Sort précédent)
		If A_LoopField
			{
			i_Count += 1
			s_SectionString .= "`nname" . i_Count . "=" . A_LoopField
			}
		}
Return s_SectionString
}

;===============================================================================
; Function Name:	VerifyKeys
; Description:		Vérifie l'existence de clés dans la section d'un
; 					fichier ini et les crée si besoin
; Parameters:		référence du fichier, nom de la section, liste d'items (séparateur | )
;===============================================================================
VerifyKeys(ByRef _File, _Section, _List)
{
	s_ListKeys := ini_getAllKeyNames(_File, _Section)
	Loop, parse, _List, |
		{
		IfNotInString, s_ListKeys, %A_LoopField%
			ini_insertKey(_File, _Section, A_LoopField . "=")
		}
Return 
}


;===============================================================================
; Function Name:	LogRunWait
; Description:		exécute une commande et renvoie StdOut
; Parameters:		la commande à exécuter
;===============================================================================
LogRunWait(_CmdLine)
{
	; on déclare le chemin de gclip
	p_gclip := A_ScriptDir . "\Tools\UnxUtils\gclip.exe"
	; on efface le presse-papiers
	clipboard =
	; on lance la commande dans une invite invisible et on pipe vers gclip
	RunWait, %comspec% /c "%_CmdLine% | "%p_gclip%"", ,Hide
	; on retourne le contenu du presse-papiers
Return clipboard
}
