; --------------------------------------------------------------------------------------------------
;							Ensemble de fonctions pour FramaUpdate
; --------------------------------------------------------------------------------------------------


;===============================================================================
;  Function Name:	 GetPortableApps
;  Description:		retourne une liste des noms valides des dossiers *Portable* 
;					séparés par des newlines, valide signifiant que l'application 
;					existe dans le dossier *Portable*.
;  Parameters:		un dossier , un tableau
;  ===============================================================================
GetPortableApps(_folder, ByRef _array)
{
	global s_ThisAppName
	IfNotExist, %_folder%
		{
		MsgBox, 0, %s_ThisAppName%, Le dossier %_folder% n'existe pas. On sort.
		ExitApp
		}
	_listfolder =
	; A propos de la double boucle suivante :
	; Originellement elle était unique mais ne permettait pas la
	; récupération des lanceurs multiples type OOo, GoOo et LibO
	; Par contre elle vérifiait la conformité des appellations des applis.
	; Maintenant elle récupère tout même si ça n'a pas de rapport
	; (un reliquat nommé GenericPortable lors des tests par exemple)
	Loop, %_folder%\*Portable*, 2
		{
		_folderapp := A_LoopFileName
		Loop, %_folder%\%_folderapp%\*Portable*.exe
			{
			StringReplace, _app, A_LoopFileName, .exe
			_listfolder .= (!_listfolder) ? _app : "`n" _app
			_array.Insert(_app, _folderapp)
			}
		}
	If !_listfolder
		{
		MsgBox, 4, %s_ThisAppName%, Le dossier %_folder% ne contient aucune application portable valide.`nVoulez-vous quand même continuer ?
		IfMsgBox, No
			ExitApp
		}
Return %_listfolder%
}


;===============================================================================
; Function Name:	 	SearchDiffApps
; Description:		Cherche les correspondances des applis et retourne 2 listes
; Parameters:		1e liste (chaine), 2e liste (chaine),
; 					resultat1 (chaine, uniquement dans 1),
; 					resultat2 (chaine, uniquement dans 2),
;===============================================================================
SearchDiffApps(_listf, _lists, ByRef _onlyf, ByRef _onlys)
{
	; concaténation des deux chaines et tri unique
	_onlyf := _listf "`n" _lists "`n"
	Sort, _onlyf, U
	_onlys := _onlyf
	Loop, parse, _lists, `n
		{
		StringReplace, _onlyf, _onlyf, %A_LoopField%`n
		}
	Loop, parse, _listf, `n
		{
		StringReplace, _onlys, _onlys, %A_LoopField%`n
		}
Return
}


;===============================================================================
; Function Name:	 RemoveNodes
; Description:		Enlève les noeuds excédentaires du fichier XML
; Parameters:		XMLFile - contenu du fichier XML
; 					listapps - liste des applis manquantes
;===============================================================================
RemoveNodes(_XMLFile, _listapps)
{
	Loop, parse, _listapps, `n
		{
		_Needle = s)<Software name=\Q"%A_LoopField%"\E.*?</Software>
		_XMLFile := RegExReplace(_XMLFile, _Needle)
		}
Return %_XMLFile%
}

;===============================================================================
; Function Name:	 CreateAddNodes
; Description:		Crée les noeud manquants et les ajoute au XML
; Parameters:		XMLFile - contenu du fichier XML
; 					listapps - liste des nouvelles applis
;===============================================================================
CreateAddNodes(_XMLFile, _listapps)
{
	global p_Asuite2AppsPath
	global s_ASuiteCat
	global b_SortingApps
	global o_ListAppsFolder
	global p_AppsDir
	If b_SortingApps
		{
		Loop, parse, _listapps, `n
			{
			If !A_LoopField
				Continue
			; Nom de l'appli => dossier de l'appli
			_dir := o_ListAppsFolder[A_LoopField]
			; Constitution du noeud
			_Nodes := "<Software name=""" . A_LoopField . """>`r`n"
			_Nodes .= "`t<PathCache></PathCache>`r`n"
			_Nodes .= "`t<PathExe>$ASuite\" . p_Asuite2AppsPath . "\" . _dir . "\" . A_LoopField . ".exe</PathExe>`r`n"
			_Nodes .= "`t<Description></Description>`r`n"
			_Nodes .= "</Software>`r`n"
			; Récupération de la catégorie : utilisation de l'include car appinfo en UTF8
			ini_load(_inifile, p_AppsDir . "\" . _dir . "\App\AppInfo\appinfo.ini", "UTF-8")
			_categ := ini_getValuewDefault(_inifile, A_LoopField, "Category", ini_getValue(_inifile, "Details", "Category"))
			IfInString, s_ASuiteCat, %_categ%
				{
				_Needle = <Category name="%_categ%">
				_FoundPos := RegExMatch(_XMLFile, _Needle) + 20
				_Nodes .= "</Category>`r`n"
				_XMLFile := RegExReplace(_XMLFile, "</Category>", _Nodes, "", 1, _FoundPos)
				}
			Else IfInString, s_ASuiteCat, Autre
				{
				_Needle = <Category name="Autre">
				_FoundPos := RegExMatch(_XMLFile, _Needle) + 20
				_Nodes .= "</Category>`r`n"
				_XMLFile := RegExReplace(_XMLFile, "</Category>", _Nodes, "", 1, _FoundPos)
				}
			Else
				{
				_Nodes = "<Category>`r`n" . _Nodes
				_XMLFile := RegExReplace(_XMLFile, "<Category>", _Nodes, "", 1)
				}
			}
		}
	Else
		{
		_Nodes := "<Category>`r`n"
		Loop, parse, _listapps, `n
			{
			; Nom de l'appli => dossier de l'appli
			_dir := o_ListAppsFolder[A_LoopField]
			; Constitution du noeud
			_Nodes .= "<Software name=""" . A_LoopField . """>`r`n"
			_Nodes .= "`t<PathCache></PathCache>`r`n"
			_Nodes .= "`t<PathExe>$ASuite\" . p_Asuite2AppsPath . "\" . _dir . "\" . A_LoopField . ".exe</PathExe>`r`n"
			_Nodes .= "`t<Description></Description>`r`n"
			_Nodes .= "</Software>`r`n"
			}
		; FK non standard ou rangement désactivé par l'utilisateur : on se contente de rajouter les applis au début
		_XMLFile := RegExReplace(_XMLFile, "<Category>", _Nodes, "", 1)
		}
Return %_XMLFile%
}


;===============================================================================
; Function Name:	 RemoveDivKiosk
; Description:		Enlève les div excédentaires des fichier HTML
; Parameters:		listapps - liste des applis manquantes
;===============================================================================
RemoveDivKiosk(_listapps)
{
	global o_ListKioskCat
	global p_KioskPagesDir
	For k, v in o_ListKioskCat
		{
		FileRead, _Tampon, %p_KioskPagesDir%\%v%.html
		_CountRep =
		Loop, parse, _listapps, `n
			{
			_Needle = s)<div class="app" lch="lch/Apps/\Q%A_LoopField%.lch"\E.*?</div>
			_Tampon := RegExReplace(_Tampon, _Needle, "", _Count)
			_CountRep += _Count
			}
		If _CountRep
			{
			FileDelete, %p_KioskPagesDir%\%v%.html
			FileAppend, %_Tampon%, %p_KioskPagesDir%\%v%.html
			}
		}
Return
}


;===============================================================================
; Function Name:	 AddDivKiosk
; Description:		Ajoute les nouveaux div aux fichiers HTML
; Parameters:		listapps - liste des nouvelles applis
;===============================================================================
AddDivKiosk(_listapps)
{
	global o_ListKioskCat
	global p_KioskPagesDir
	global b_SortingApps
	global o_ListAppsFolder
	global p_AppsDir
	global p_RelKPages2Apps
	IfExist, %p_KioskPagesDir%\autre.html
		{
		For k, v in o_ListKioskCat
			{
			_Catname := k
			If (v = "autre")
				Break
			_Catname =
			}
		If _Catname
			_CategOther := _Catname
		Else
			{
			o_ListKioskCat.Insert("Autre", "autre")
			_CategOther := "Autre"
			}
		}
	Else
		{
		_Catname =
		FileAppend, <?xml version="1.0" encoding="UTF-8"?>`r`n, %p_KioskPagesDir%\autre.html
		o_ListKioskCat.Insert("Autre", "autre")
		_CategOther := "Autre"
		}
	If b_SortingApps
		{
		Loop, parse, _listapps, `n
			{
			If !A_LoopField
				Continue
			; Nom de l'appli => dossier de l'appli
			_dir := o_ListAppsFolder[A_LoopField]
			; Récupération de la catégorie : utilisation des fonctions ini.ahk car plusieurs items 
			; (limitation du nombre d'accès disque)
			ini_load(_inicontent, p_AppsDir "\" _dir "\App\AppInfo\appinfo.ini", "UTF-8")
			_categ := ini_getValuewDefault(_inicontent, A_LoopField, "Category", ini_getValue(_inicontent, "Details", "Category"))
			; Vérification de l'existence de la catégorie dans le Kiosk
			If ((!o_ListKioskCat[_categ]) || (o_ListKioskCat[_categ] = "autre"))
				{
				_categ := _CategOther
				_IsUsedOther := true
				}
			_friendlyname := ini_getValuewDefault(_inicontent, A_LoopField, "FriendlyName", ini_getValue(_inicontent, "Framakey", "FriendlyName"))
			_desc := ini_getValue(_inicontent, "Details", "Description")
			; Constitution du div
			_Div := "`r`n<div class=""app"" lch=""lch/Apps/" . A_LoopField . ".lch"" desc=""" . _desc . """>`r`n"
			IfExist, %p_AppsDir%\%_dir%\App\AppInfo\%A_LoopField%.png
				_Div .= "`t<img src=""" . p_RelKPages2Apps . _dir . "/App/AppInfo/" . A_LoopField . ".png"" />`r`n"
			Else
				_Div .= "`t<img src=""" . p_RelKPages2Apps . _dir . "/App/AppInfo/appicon_64.png"" />`r`n"
			_Div .= "`t" . _friendlyname . "`r`n"
			_Div .= "</div>`r`n"
			; vérification de l'existence du fichier lch/Apps/ et création si besoin
			IfNotExist, %p_KioskPagesDir%\lch\Apps\%A_LoopField%.lch
				{
				_launch := "[Launch]`r`nExecuteFile=FramaRoot\Apps\" . _dir . "\" . A_LoopField . ".exe`r`nExecuteDirectory=FramaRoot\Apps\" . _dir . "\"
				FileAppend, %_launch%, %p_KioskPagesDir%\lch\Apps\%A_LoopField%.lch
				}
			_filename := o_ListKioskCat[_categ]
			FileAppend, %_Div%, %p_KioskPagesDir%\%_filename%.html
			}
		; Ajout de la page autre si elle a été utilisée alors qu'elle n'était pas dans index.html
		If (_IsUsedOther && !_CatName)
			{
			FileRead, _Tampon, %p_KioskPagesDir%\index.html
			StringReplace, _Tampon, _Tampon, </ul>, `t<li page="./autre.html" icon="menu_autre.png">%_CategOther%</li<`r`n`t`t</ul>
			FileDelete, %p_KioskPagesDir%\index.html
			FileAppend, %_Tampon%, %p_KioskPagesDir%\index.html
			}
		}
	Else
		{
		_Div =
		Loop, parse, _listapps, `n
			{
			If !A_LoopField
				Continue
			_dir := o_ListAppsFolder[A_LoopField]
			ini_load(_inicontent, p_AppsDir "\" _dir "\App\AppInfo\appinfo.ini", "UTF-8")
			_friendlyname := ini_getValue(_inicontent, "Framakey", "FriendlyName")
			_desc := ini_getValue(_inicontent, "Details", "Description")
			; Constitution du div
			_Div .= "`r`n<div class=""app"" lch=""lch/Apps/" . A_LoopField . ".lch"" desc=""" . _desc . """>`r`n"
			IfExist, %p_AppsDir%\%_dir%\App\AppInfo\%A_LoopField%.png
				_Div .= "`t<img src=""" . p_RelKPages2Apps . _dir . "/App/AppInfo/" . A_LoopField . ".png"" />`r`n"
			Else
				_Div .= "`t<img src=""" . p_RelKPages2Apps . _dir . "/App/AppInfo/appicon_64.png"" />`r`n"
			_Div .= "`t" . _friendlyname . "`r`n"
			_Div .= "</div>`r`n"
			; vérification de l'existence du fichier lch/Apps/ et création si besoin
			IfNotExist, %p_KioskPagesDir%\lch\Apps\%A_LoopField%.lch
				{
				_launch := "[Launch]`r`nExecuteFile=FramaRoot\Apps\" . _dir . "\" . A_LoopField . ".exe`r`nExecuteDirectory=FramaRoot\Apps\" . _dir . "\"
				FileAppend, %_launch%, %p_KioskPagesDir%\lch\Apps\%A_LoopField%.lch
				}
			}
		_filename := o_ListKioskCat[_CategOther]
		FileAppend, %_Div%, %p_KioskPagesDir%\%_filename%.html
		If !_CatName
			{
			FileRead, _Tampon, %p_KioskPagesDir%\index.html
			StringReplace, _Tampon, _Tampon, </ul>, `t<li page="./autre.html" icon="menu_autre.png">%_CategOther%</li<`r`n`t`t</ul>
			FileDelete, %p_KioskPagesDir%\index.html
			FileAppend, %_Tampon%, %p_KioskPagesDir%\index.html
			}
		
		}
	
Return
}

