#include <Array.au3>

;#Function# ============================================================================================================================================
; Name............: _IniWriteArray
; Description.....: Schreibt ein 1D oder 2D Array in eine Inidatei
; Syntax..........: _IniWriteArray($sfilename, $sSection, $sKey, $aArray, $bStripIdx = False)
; Parameters......:
;                   $sfilename   - Dateiname des Inifiles
;                   $sSection    - Sectionname
;                   $sKey        - Keyname
;                   $aArray      - Das zu speichernde Array
;                   $bStripIdx   - [optional] Index entfernen. Bei True wird element 0 des Array´s ignoriert
; Return values  .:
;                   Success		 - 1
;                   Failure      - -1 , sets @error to:
;                                | 1 Übergebenes Array ist kein Array
;                                | 2 Array ist ein 3D Array und kann nicht verarbeitet werden
;                                | 3 Array konnte nicht in String umgewandelt werden
;                                | 4 Erzeugter String konnte nicht in die INI Datei geschrieben werden
;
; Author ........:  Raupi@Autoit.de
; Modified.......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......;
; ======================================================================================================================================================
Func _IniWriteArray($sfilename, $sSection, $sKey, $aArray, $bStripIdx = False)
	Local $iIndex = 0, $sDimens = "1D", $sTemp, $sTemp
	If UBound($aArray, 2) <> 0 Then $sDimens = "2D"
	If Not IsArray($aArray) Then Return SetError(1, 0, -1)
	If UBound($aArray, 3) <> 0 Then Return SetError(2, 0, -1)
	If $sDimens = "1D" Then
		If $bStripIdx = True Then
			$sTemp1 = _ArrayToString($aArray, '|', 1)
			If @error Then Return SetError(3, 0, -1)
		Else
			$sTemp1 = _ArrayToString($aArray, '|')
			If @error Then Return SetError(3, 0, -1)
		EndIf
	Else
		If $bStripIdx = True Then
			$sTemp1 = _Array2D2String($aArray, 1, 0, '|', ',')
			If @error Then Return SetError(3, 0, -1)
		Else
			$sTemp1 = _Array2D2String($aArray, 0, 0, '|', ',')
			If @error Then Return SetError(3, 0, -1)
		EndIf
	EndIf
	$sTemp = $sDimens & "*" & $sTemp1
	IniWrite($sfilename, $sSection, $sKey, $sTemp)
	If @error Then Return SetError(4, 0, -1)

	Return 1
EndFunc   ;==>_IniWriteArray

;#Function# ============================================================================================================================================
; Name............: _IniReadArray
; Description.....: Liest ein Array aus einer INI-Datei das mittels _IniWriteArray darin gespeichert wurde
; Syntax..........: _IniReadArray($sfilename, $sSection, $sKey, $bCreateIdx = False)
; Parameters......:
;                   $sfilename   - Dateiname des Inifiles
;                   $sSection    - Sectionname
;                   $sKey        - Keyname
;                   $aArray      - Das zu speichernde Array
;                   $bCreateIdx  - [optional] Bei True wird in Element 0 des Array´s die Anzahl der Einträge gespeichert
; Return values  .:
;                   Success		 - Das Ausgelesene Array
;                   Failure      - 0 , sets @error to:
;                                | 1 INI-Eintrag konnte nicht gelesen werden
;                                | 2 INI-Eintag wurde nicht mit _IniWriteArray in die Datei geschrieben
;                                | 3 Array konnte nicht erzeugt werden
;
; Author ........:  Raupi@Autoit.de
; Modified.......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......;
; ======================================================================================================================================================
Func _IniReadArray($sfilename, $sSection, $sKey, $bCreateIdx = False)
	Local $sTemp, $aTemp, $aTemp1
	$sTemp = IniRead($sfilename, $sSection, $sKey, "Not Found")
	If $sTemp = "Not Found" Then Return SetError(1, 0, 0)
	$aTemp = StringSplit($sTemp, "*", 2)
	If Not IsArray($aTemp) Then SetError(2, 0, 0)
	If $aTemp[0] = "1D" Then
		If $bCreateIdx Then
			$aTemp1 = StringSplit($aTemp[1], "|", 0)
			If Not IsArray($aTemp1) Then Return SetError(3, 0, 0)
		Else
			$aTemp1 = StringSplit($aTemp[1], "|", 2)
			If Not IsArray($aTemp1) Then Return SetError(3, 0, 0)
		EndIf
	Else
		$aTemp1 = _String2Array2D($aTemp[1], '|', ',', $bCreateIdx)
		If @error Then Return SetError(3, 0, 0)
	EndIf
	Return $aTemp1
EndFunc   ;==>_IniReadArray
;#Function# ============================================================================================================================================
; Name............: _Array2D2String
; Description.....: Wandelt ein 2D Array in einen String um
; Syntax..........: _Array2D2String($Array, $iStart = 0, $iEnd = 0, $DelimRow = '|', $DelimCol = ',')
; Parameters......:
;                   $Array       - Array das umgewandelt werden soll
;                   $iStart      - [optional] Index ab welchem gestartet werden soll
;                   $iEnd        - [optional] Index bis zu welchem verarbeitet werden soll
;                   $DelimRow    - [optional] Seperator für Rows
;                   $DelimCol    - [optional] Seperator für Colums
; Return values  .:
;                   Success		 - String mit dem Inhalt des Array´s
;                   Failure		 - 1 Übergebenes Array ist kein Array

; Author ........:  BugFix@Autoit.de
; Modified.......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......;
; ======================================================================================================================================================
Func _Array2D2String($Array, $iStart = 0, $iEnd = 0, $DelimRow = '|', $DelimCol = ','); Funktion zum erstellen eines Strings von einem 2D Array (c) BugFix
	If Not IsArray($Array) Then Return SetError(1, 0, 0)
	Local $sOut = ''
	If $iStart < 0 Then $iStart = 0
	If $iEnd = 0 Or $iEnd > UBound($Array) - 1 Then $iEnd = UBound($Array) - 1
	For $i = $iStart To $iEnd
		For $j = 0 To UBound($Array, 2) - 1
			$sOut &= $Array[$i][$j] & $DelimCol
		Next
		$sOut = StringTrimRight($sOut, 1) & $DelimRow
	Next
	Return StringTrimRight($sOut, 1)
EndFunc   ;==>_Array2D2String

;#Function# ============================================================================================================================================
; Name............: _String2Array2D
; Description.....: Wandel einen mit _Array2D2String konvertierten String in ein Array um.
; Syntax..........: _String2Array2D($string, $DelimRow = '|', $DelimCol = ',', $nIndex = False)
; Parameters......:
;                   $string      - Umzuwandelnder String
;                   $DelimRow    - [optional] Seperator für Rows
;                   $DelimCol    - [optional] Seperator für Colomns
;                   $bIndex      - [optional] Index mit Anzahl der enthaltenen Einträge wird erstellt. False = kein Index erstellen
; Return values  .:
;                   Success		 - Array das erstellt wurde
;                   Failure		 - 1 Parameter $bIndex ist nicht vom Type Boolean
;                                - 2 Row Split nicht erfolgreich
;                                - 3 Column Split nicht erfolgreich
; Author ........:  BugFix@Autoit.de
; Modified.......:  Raupi@Autoit.de
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......;
; ======================================================================================================================================================
Func _String2Array2D($string, $DelimRow = '|', $DelimCol = ',', $Idx = False); Funktion von BugFix erweitert von Raupi
	If Not IsBool($Idx) Then Return SetError(1, 0, 0)
	Local $tmp = StringSplit($string, $DelimRow, 2)
	If @error Then Return SetError(2, 0, 0)
	Local $tmp1 = StringSplit($tmp[0], $DelimCol, 2)
	If @error Then Return SetError(3, 0, 0)
	Local $aOut[UBound($tmp) + $Idx][UBound($tmp1)]
	For $i = 0 To UBound($tmp) - 1
		$tmp1 = StringSplit($tmp[$i], $DelimCol, 2)
		For $j = 0 To UBound($tmp1) - 1
			$aOut[$i + $Idx][$j] = $tmp1[$j]
		Next
	Next
	If $Idx = True Then $aOut[0][0] = UBound($aOut, 1) - 1
	Return $aOut
EndFunc   ;==>_String2Array2D