#Region - TimeStamp
; 2012-06-25 13:47:54   v 0.6
#EndRegion - TimeStamp
#Include <Array.au3>
#Include <ButtonConstants.au3>
#Include <EditConstants.au3>
#Include <GUIConstantsEx.au3>
#Include <GuiListView.au3>
#Include <GuiStatusBar.au3>
#Include <ProgressConstants.au3>
#Include <StaticConstants.au3>
#Include <WindowsConstants.au3>
#include "image_get_info.au3"


#cs
Im Skriptordner wird die Datei "Rename.log" erstellt mit der Fehlerprotokollierung.
Die Datei wird bei jedem Neustart (Einlesen) gelöscht und beim Umbenennen neu geschrieben, sofern Fehler auftreten.
#ce

#cs Settings.ini
[General]
Startpfad=
n_stellig=4
Delimiter=_
SubFolder=1
UsePrefix=N
Prefix=
Picture_Formate=JPG,JPEG
Video_Folder_Create=1
Video_Folder_Name=VIDEO
Video_Formate=AVI,THM,MOV
#ce

Global $sPath = @ScriptDir & "\", $bData[2] = [1]
$bData[1] &= "0x0000010001002020000001002000A81000001600000028000000200000004000000001002000000000000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000000100000001808080028080800280808002555555034040400466666605666666055555550655555506555555066666660580808004555555038080800280808002808080020000000100000001000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000180808002666666054D4D4D0A5B5B5B0E5A5A5A115555551259595914555555185252521C5858581D5555551E5555551E5555551E5858581D5858581A55555515515151135A5A5A115555550F5555550C49494907555555030000000100000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00808080027E7E7F997E7E7FFF7E7E7FFF7E7E7FFF7E7E7FFF7E7E7FFF7E7E7FFF7E7E7FFF7E7E7FFF7E7E7FFF7E7E7FFF7E7E7FFF7E7E7FFF7E7E7FFF7E7E7FFF7E7E7FFF7E7E7FFF7E7E7FFF7E7E7FFF7E7E7FFF7E7E7FFF7D7D7E9B4040400400000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00555555037F7F80FFD9D9D9FFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFD9D9D9FF7F7F80FF5555550600000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0080808002818182FFCECECEFFCBCBCBFFCBCBCBFFCBCBCBFFCBCBCBFFCBCBCBFFCBCBCBFFCBCBCBFFCBCBCBFFCBCBCBFFCBCBCBFFCBCBCBFFCBCBCBFFCBCBCBFFCBCBCBFFCBCBCBFFCBCBCBFFCBCBCBFFCBCBCBFFCECECEFF818182FF4040400400000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000001828283FFCFCFCFFFCCCCCCFFCCCCCCFFCCCCCCFFCCCCCCFFCCCCCCFFCCCCCCFFCCCCCCFFCCCCCCFFCCCCCCFFCCCCCCFFCCCCCCFFCCCCCCFFCCCCCCFFCCCCCCFFCCCCCCFFCCCCCCFFCCCCCCFFCCCCCCFFCFCFCFFF828283FF0000000100000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000848485FFCFCFCFFFCDCDCDFFCDCDCDFFCDCDCDFFCDCDCDFFCDCDCDFFCDCDCDFFCDCDCDFFCDCDCDFFCDCDCDFFCACACAFFC0C0C0FFBDBDBDFFC0C0C0FFBDBDBDFFC0C0C0FFCACACAFFCDCDCDFFCDCDCDFFCFCFCFFF848485FF0000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00868687FFD0D0D0FFCECECEFFCECECEFFCECECEFFCECECEFFCECECEFFCECECEFFCECECEFFCECECEFFCECECEFFC1C1C1FFD1D1D1FFFFFFFFFF9B9B9BFFFFFFFFFFD1D1D1FFC1C1C1FFCECECEFFCECECEFFD0D0D0FF868687FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00888889FFD2D2D2FFD0D0D0FFD0D0D0FFD0D0D0FFD0D0D0FFD0D0D0FFD0D0D0FFD0D0D0FFD0D0D0FFD0D0D0FFC0C0C0FFFFFFFFFF585858FFFFFFFFFF585858FFFFFFFFFFC0C0C0FFD0D0D0FFD0D0D0FFD2D2D2FF888889FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF008A8A8BFFD4D3D1FFD6D2C8FFD9D3C1FFDAD4BEFFDAD4BEFFDAD4BEFFDAD4BEFFDAD4BEFFDAD4BEFFDAD4BEFFD3CDB8FFB2AD9BFFFFFFFFFF585858FFFFFFFFFFB2AD9BFFD3CDB8FFD9D3C1FFD6D2C8FFD4D3D1FF8A8A8BFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF008C8C8DFFD9D6CBFFECD99CFFD1C399FFD1C399FFD1C399FFD1C399FFD1C399FFD1C399FFD1C399FFD1C399FFD1C399FFB7AB86FFFFFFFFFF585858FFFFFFFFFFB7AB86FFD1C399FFD1C399FFECD99CFFD8D5CAFF8C8C8DFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF008E8E8FFFDDD7C5FFD1C399FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0E0E0FFFFFFFFFF585858FFFFFFFFFFE0E0E0FFFFFFFFFFFFFFFFFFD1C399FFDBD6C3FF8E8E8FFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00919191FFE0D9C4FFD1C399FFFFFFFFFFA79A70FFFAEDC3FFFAEDC3FFA79A70FFA79A70FFFAEDC3FFFAEDC3FFA79A70FFDBD0ABFFFFFFFFFF585858FFFFFFFFFFE0E0E0FFFFFFFFFFFFFFFFFFD1C399FFDDD6C1FF919191FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00939393FFE1DAC5FFD1C399FFFFFFFFFFA79A70FFA79A70FFFAEDC3FFA79A70FFFAEDC3FFFAEDC3FFA79A70FFA79A70FFDBD0ABFFFFFFFFFF585858FFFFFFFFFFE0E0E0FFFFFFFFFFFFFFFFFFD1C399FFDDD7C1FF939393FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00959596FFE6E0CEFFD1C399FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0E0E0FFFFFFFFFF585858FFFFFFFFFFE0E0E0FFFFFFFFFFFFFFFFFFD1C399FFE2DDCAFF959596FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF"
$bData[1] &= "FFFF00979798FFE6E3D8FFF1DDA1FFD1C399FFD1C399FFD1C399FFD1C399FFD1C399FFD1C399FFD1C399FFD1C399FFD1C399FFB7AB86FFFFFFFFFF585858FFFFFFFFFFB7AB86FFD1C399FFD1C399FFF0DC9FFFE0DDD2FF979798FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF009A9A9AFFE7E6E3FFE7E4D9FFE9E3D0FFE9E2CDFFE9E2CDFFE9E2CDFFE9E2CDFFE9E2CDFFE9E2CDFFE9E2CDFFE2DBC7FFBEB8A7FFFFFFFFFF585858FFFFFFFFFFBBB6A5FFDFD8C4FFE5DECCFFE3DED5FFDFDDDBFF9A9A9AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF009C9C9CFFE8E8E8FFE6E7E7FFE7E7E7FFE7E7E6FFE7E7E7FFE7E7E7FFE7E7E6FFE6E6E6FFE6E7E7FFE7E7E7FFD5D4D5FFFFFFFFFF585858FFFFFFFFFF585858FFFFFFFFFFD5D4D5FFE6E6E6FFE4E4E4FFE0E0E0FF9B9B9BFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF009E9E9EFFEAEAEAFFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFDBDBDBFFDBDBDBFFFFFFFFFFAFAFAFFFFFFFFFFFDBDBDBFFDBDBDBFFE9E9E9FFE9E9E9FFE8E8E8FF9E9E9EFFABABAB00ABABAB00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A0A0A0FFEBEBEBFFEBEBEBFFEBEAEAFFEAEBEAFFEAEAEAFFEBEBEBFFEBEBEBFFEBEBEAFFEBEAEAFFEBEAEAFFE7E6E6FFDDDDDCFFD9D9D8FFDCDCDDFFD7D8D7FFDCDBDCFFE6E6E5FFEBEAEAFFEBEBEBFFE8E8E8FF9E9E9EFFABABAB04ABABAB00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A2A2A2FFEDEDEDFFECEDEDFFEDEDEDFFEDEDECFFEDECEDFFEDEDEDFFECEDECFFEDECEDFFEDEDEDFFECEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEAEAEAFFDCDCDCFFDADADAFFDDDDDDFFDFDFDFFFDEDEDEFFA0A0A0FFABABAB09ABABAB00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A4A4A4FFEFEFEFFFEEEEEEFFEEEEEEFFEFEEEEFFEEEEEEFFEEEEEEFFEEEFEEFFEEEEEEFFEEEEEFFFEEEEEEFFEEEEEEFFEFEEEEFFEEEEEEFFEEEEEEFFEAE9EAFFC7C7C8FFAEAEAEFFB4B4B4FFB7B7B7FFB7B7B7FF9D9D9DFFABABAB07ABABAB00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A6A6A6FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFEBEBEBFFCDCDCDFFB6B6B6FFD7D8D8FFE1E1E1FFC4C4C4FFA3A3A39CABABAB01ABABAB00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A7A7A7FFF2F2F2FFF2F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F2F1FFF1F1F1FFF2F1F2FFF2F1F2FFF2F1F1FFF1F2F1FFF1F1F1FFF1F1F1FFF2F2F1FFEDEDEDFFD2D2D2FFB8B8B8FFE2E2E2FFDEDEDEFFA9A9A9FFA7A7A72DABABAB00ABABAB00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A9A9A9FFF1F0F1FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFEBEBEBFFD0D0D0FFB9B9B9FFDCDCDCFFB2B2B2FFA9A9A963ABABAB00ABABAB00ABABAB00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00AAAAAAFFEFEFEFFFF3F3F3FFF3F3F3FFF3F3F3FFF3F3F3FFF3F3F3FFF3F3F3FFF3F3F3FFF3F3F3FFF3F3F3FFF3F3F3FFF3F3F3FFF3F3F3FFF3F3F3FFEFEFEFFFD5D5D5FFC5C5C5FFB7B7B7FFAAAAAA84ABABAB00ABABAB00ABABAB00ABABAB00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00ABABAB96ABABABFFABABABFFABABABFFABABABFFABABABFFABABABFFABABABFFABABABFFABABABFFABABABFFABABABFFABABABFFABABABFFABABABFFAAAAAAFFA7A7A7FFA7A7A7FFA9A9A999ABABAB00ABABAB00ABABAB00ABABAB00ABABAB00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF"
$bData[1] &= "FFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FC00003FF000000FF0000007F0000007F0000007F000000FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF800000FF800000FF800000FF800000FF800001FF800003FF800007FF80000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
Global $bDatanames[1] = ["Rename Document.ico"]

For $i = 1 To $bData[0]
	Local $sFile = $sPath & $bDatanames[$i -1]
	Local $hFileOut = FileOpen($sFile, 2+8+16)
	FileWrite($hFileOut, Binary($bData[$i]))
	FileClose($hFileOut)
Next

OnAutoItExitRegister("_DelBinaryTempFiles")

Func _DelBinaryTempFiles()
	For $i = 1 To $bData[0]
		FileDelete($sPath & $bDatanames[$i -1])
	Next
EndFunc


Global $sFolder, $aFiles, $fSubFolder = False, $sINI = @ScriptDir & '\Settings.ini', $sLOG = @ScriptDir & '\Rename.log', $hLog, $index, $sDelFile
Global $fDetail = False, $sFileDetail, $sItemTip, $iFolder = 1, $iSubFolder, $aCountFiles[2] = [0,0], $aItemID[1]
Global $hStatus, $progress, $hProgress, $iStep, $aParts[2] = [160, -1]
Global $sPathStart, $iCountNumbers, $sDelimiter, $sExt, $sExtPict, $sExtVideo, $iCreateVideoFolder, $sVideoFolder, $sDeleteList, $aListview[1][2]
Global $lbCntPic, $lbCntVid, $lbCntErr, $iCntErr, $iCntReadOnly, $sReadOnly, $aCurrItem, $fShowContext = False
Global $cbPrefixTmp, $lbPrefixTmp, $inPrefixTmp, $sPrefix, $iPrefix, $fPrefix = False
If Not FileExists($sINI) Then
	IniWrite($sINI, 'General', 'Startpfad', '')
	IniWrite($sINI, 'General', 'n_stellig', 4)
	IniWrite($sINI, 'General', 'Delimiter', '_')
	IniWrite($sINI, 'General', 'SubFolder', 1)
	IniWrite($sINI, 'General', 'UsePrefix', 'N')
	IniWrite($sINI, 'General', 'Prefix', 'TMP')
	IniWrite($sINI, 'General', 'Picture_Formate', 'JPG,JPEG')
	IniWrite($sINI, 'General', 'Video_Folder_Create', 1)
	IniWrite($sINI, 'General', 'Video_Folder_Name', 'VIDEO')
	IniWrite($sINI, 'General', 'Video_Formate', 'AVI,THM,MOV')
	IniWrite($sINI, 'General', 'DeleteList', 'Thumbs.db,Thumbnail.info,Vorschau.pic')
EndIf

$hGui = GUICreate("Dateien Umbenennen                     " & Chr(169) & "BugFix", 608, 535, 400, 50, Default, $GUI_WS_EX_PARENTDRAG)
GUISetBkColor(0xFFFFBB)
GUISetIcon($sPath & "\Rename Document.ico")
GUICtrlCreateGroup("   Ordner Auswählen   ", 15, 15, 570, 87)
$mnu = GUICtrlCreateMenu('Menü')
$mnuSettings = GUICtrlCreateMenuItem('Einstellungen', $mnu)
GUICtrlCreateMenuItem('', $mnu)
$mnuHelp = GUICtrlCreateMenuItem('Hilfe', $mnu)
$inFolder = GUICtrlCreateInput("", 30, 40, 510, 20, $ES_READONLY)
GUICtrlSetBkColor(-1,0xFFFFFF)
$btSelect = GUICtrlCreateButton("...", 550, 40, 20, 20)
GUICtrlSetBkColor(-1, 0xFFD700)
$cbSubFolder = GUICtrlCreateCheckbox('Unterordner mit einbeziehen', 30, 70, 180, 17)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlCreateLabel('Fotos', 330, 64, 60, 17)
$lbCntPic = GUICtrlCreateLabel('0', 405, 64, 30, 17, $ES_RIGHT)
GUICtrlCreateLabel('Videos', 330, 81, 60, 17)
$lbCntVid = GUICtrlCreateLabel('0', 405, 81, 30, 17, $ES_RIGHT)
$btReadFiles = GUICtrlCreateButton('Einlesen', 480, 70, 90 ,22)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetBkColor(-1, 0x7FFF00)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUICtrlCreateGroup("   Datei - Infos   ", 15, 112, 570, 340)
GUICtrlCreateLabel('', 30, 132, 406, 23, $SS_ETCHEDFRAME)
GUICtrlSetState(-1, $GUI_DISABLE)
$cbSelAll = GUICtrlCreateCheckbox(' Dateien   ( Auswahl alle / Auswahl aufheben )', 39, 135, 280, 17)
$rLeft = GUICtrlCreateRadio('links', 330, 135, 50, 17)
GUICtrlSetState(-1, $GUI_CHECKED)
$rRight = GUICtrlCreateRadio('rechts', 380, 135, 50, 17)
GUICtrlCreateLabel('', 435, 132, 136, 23, $SS_ETCHEDFRAME)
GUICtrlCreateLabel('Aufnahmezeitpunkt', 440, 136, 123, 17, $SS_CENTER)
$ListView = GUICtrlCreateListView("Datei|Nr|Aufnahmezeitpunkt", 30, 154, 540, 283, BitOR($LVS_SHOWSELALWAYS,$LVS_REPORT,$LVS_NOCOLUMNHEADER) , BitOR($WS_EX_CLIENTEDGE,$LVS_EX_GRIDLINES,$LVS_EX_FULLROWSELECT,$LVS_EX_CHECKBOXES,$LVS_EX_DOUBLEBUFFER))
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 400)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 0)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 2, $LVSCW_AUTOSIZE_USEHEADER )
$hLV = GUICtrlGetHandle($ListView)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$btExplorer = GUICtrlCreateButton('Explorer', 30, 462, 90 ,22)
GUICtrlSetBkColor(-1, 0xFFD700)
GUICtrlSetState(-1, $GUI_DISABLE)
$lbReadOnly = GUICtrlCreateLabel('', 150, 465, 145, 17)
GUICtrlSetColor(-1, 0xFF0000)
GUICtrlSetState(-1, $GUI_HIDE)
GUICtrlCreateLabel('Fehler', 330, 465, 60, 17)
$lbCntErr = GUICtrlCreateLabel('0', 405, 465, 30, 17, $ES_RIGHT)
$btRename = GUICtrlCreateButton('Umbenennen', 480, 462, 90 ,22)
GUICtrlSetBkColor(-1, 0xFA8072)
GUICtrlSetState(-1, $GUI_DISABLE)
$hStatus = _GUICtrlStatusBar_Create ($hGui)
_GUICtrlStatusBar_SetMinHeight ($hStatus, 20)
_GUICtrlStatusBar_SetParts($hStatus, $aParts)
$inProgress = GUICtrlCreateInput('', 0, 1, 150, 20, BitOR($ES_READONLY,$ES_CENTER), $WS_EX_STATICEDGE)
$hInProgress = GUICtrlGetHandle($inProgress)
_GUICtrlStatusBar_EmbedControl($hStatus, 0, $hInProgress)
$progress = GUICtrlCreateProgress(0, 0, -1, -1, $PBS_SMOOTH)
GUICtrlSetColor(-1, 0x008B00)
$hProgress = GUICtrlGetHandle($progress)
_GUICtrlStatusBar_EmbedControl($hStatus, 1, $hProgress)

$hContext  = GUICreate('Listview Menü', 200, 69, -1, -1, $WS_POPUP, $WS_EX_MDICHILD, $hGui)
GUICtrlCreateLabel('', 0, 0, 200, 23, $SS_ETCHEDFRAME)
GUICtrlSetState(-1, $GUI_DISABLE)
$ConPath = GUICtrlCreateLabel('Pfad Anzeigen', 10, 4, 188, 17)
GUICtrlSetColor(-1, 0x000080)
GUICtrlCreateLabel('', 0, 23, 200, 23, $SS_ETCHEDFRAME)
GUICtrlSetState(-1, $GUI_DISABLE)
$ConDetail = GUICtrlCreateLabel('Details Anzeigen', 10, 27, 188, 17)
GUICtrlSetColor(-1, 0x000080)
GUICtrlCreateLabel('', 0, 46, 200, 23, $SS_ETCHEDFRAME)
GUICtrlSetState(-1, $GUI_DISABLE)
$ConNoRO   = GUICtrlCreateLabel('Schreibschutz Aufheben', 10, 50, 188, 17)
GUICtrlSetColor(-1, 0x8B0000)

$hSettings = GUICreate("Einstellungen", 561, 685, -1, -1, Default, $WS_EX_MDICHILD, $hGui)
GUISetBkColor(0xFFFFBB)
GUISetIcon($sPath & "\Rename Document.ico")
GUICtrlCreateGroup("   Startordner für Auswahl   ", 20, 15, 520, 65)
$inStartFolder = GUICtrlCreateInput("", 35, 40, 450, 20, BitOR($GUI_SS_DEFAULT_INPUT,$ES_READONLY))
GUICtrlSetBkColor(-1, 0xFFFFFF)
$btFolderSelect = GUICtrlCreateButton("...", 500, 40, 20, 20)
GUICtrlSetBkColor(-1, 0xFFD700)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUICtrlCreateGroup("   Verschiedenes   ", 20, 95, 520, 95)
$cbSubDir = GUICtrlCreateCheckbox(' Unterordner Durchsuchen', 35, 120, 150)
GUICtrlCreateLabel("Trennzeichen", 210, 124, 80, 20)
$inDelimiter = GUICtrlCreateInput("_", 285, 121, 30, 20)
GUICtrlCreateLabel("Nummerierung Anzahl Ziffern", 345, 124, 140, 17)
$inFileNum = GUICtrlCreateInput("4", 490, 121, 30, 20, BitOR($GUI_SS_DEFAULT_INPUT,$ES_NUMBER))
$cbPrefixTmp = GUICtrlCreateCheckbox('Temporär umbenennen  (Vermeidung Namenskollision)', 35, 150, 290)
$lbPrefixTmp = GUICtrlCreateLabel('Präfix', 345, 154, 50)
GUICtrlSetState(-1, $GUI_DISABLE)
$inPrefixTmp = GUICtrlCreateInput('TMP', 460, 151, 60, 20)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUICtrlCreateGroup("   Bilder   ", 20, 205, 520, 65)
GUICtrlCreateLabel("Bildformate, kommagetrennt", 35, 230, 171, 20)
$inFormatPict = GUICtrlCreateInput("JPG,JPEG", 230, 230, 290, 20)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUICtrlCreateGroup("   Video   ", 20, 285, 520, 130)
GUICtrlCreateLabel("Eigenen Ordner für Videos erstellen", 35, 315, 215, 20)
$rVideoJa = GUICtrlCreateRadio("Ja", 310, 311, 50, 17)
GUICtrlSetState(-1, $GUI_CHECKED)
$rVideoNein = GUICtrlCreateRadio("Nein", 420, 311, 50, 17)
GUICtrlCreateLabel("Name des Video Ordners", 35, 343, 160, 20)
$inVideoFolder = GUICtrlCreateInput("VIDEO", 230, 342, 290, 20)
GUICtrlCreateLabel("Videoformate, kommagetrennt", 35, 376, 185, 20)
$inFormatVideo = GUICtrlCreateInput("AVI,THM,MOV", 230, 373, 290, 20)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUICtrlCreateGroup("   zu löschende Dateien   ", 20, 430, 520, 200)
$ListViewDel = GUICtrlCreateListView("|", 35, 455, 330, 160, BitOR($GUI_SS_DEFAULT_LISTVIEW,$LVS_NOCOLUMNHEADER), BitOR($WS_EX_CLIENTEDGE,$LVS_EX_GRIDLINES,$LVS_EX_FULLROWSELECT))
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, $LVSCW_AUTOSIZE_USEHEADER)
$hLVDel = GUICtrlGetHandle($ListViewDel)
$btAddDelFile = GUICtrlCreateButton("Hinzufügen", 410, 455, 110, 25)
GUICtrlSetBkColor(-1, 0x7FFF00)
$btDelDelFile = GUICtrlCreateButton("Löschen", 410, 505, 110, 25)
GUICtrlSetBkColor(-1, 0x00BFFF)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$btSave = GUICtrlCreateButton('Speichern', 410, 645, 110, 25)
GUICtrlSetBkColor(-1, 0xFA8072)

$hHelp = GUICreate("Hilfe", 641, 618, -1, -1, Default, $WS_EX_MDICHILD, $hGui)
GUISetBkColor(0xFFFFBB)
GUISetIcon($sPath & "\Rename Document.ico")
$ListViewHelp = GuiCtrlCreateListView('||', 20, 20, 601, 578, BitOR($GUI_SS_DEFAULT_LISTVIEW,$LVS_NOCOLUMNHEADER), BitOR($WS_EX_CLIENTEDGE,$LVS_EX_GRIDLINES,$LVS_EX_FULLROWSELECT))
GUICtrlSetBkColor(-1, 0xF5FFFA)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_LV_ALTERNATE)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 200)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, $LVSCW_AUTOSIZE_USEHEADER)
$sHelp = _
'EINSTELLUNGEN|' & @CRLF & _
'  "Startordner für Auswahl"|Root-Ordner zur Auswahl der Mediendateiordner' & @CRLF & _
'  "Trennzeichen"|Zeichen zwischen Dateiname und Nummerierung' & @CRLF & _
'  "Nummerierung Anzahl Ziffern"|Nummer in Dateinamen, Länge mit Vornullen' & @CRLF & _
'  "Unterordner durchsuchen"|Alle Ordner unterhalb der Auswahl werden auch verwendet' & @CRLF & _
'  "Bildformate"|Bilddateitypen, die umbenannt werden sollen' & @CRLF & _
'  "Temporär Umbenennen"|Um Konflikte mit bereits existierenden Zieldateinamen' & @CRLF & _
'  |zu vermeiden, werden alle Dateien vorab mit dem gewählten Präfix' & @CRLF & _
'  |umbenannt und erst dann in der endgültigen Form gespeichert.' & @CRLF & _
'  "Videoordner erstellen"|Eigenen Ordner für Videos in jeweiligem Ordner erstellen' & @CRLF & _
'|Alle Videodateien des Ordners werden dorthin verschoben' & @CRLF & _
'  "Name Video Ordner"|Bezeichnung für anzulegende Videoordner' & @CRLF & _
'  "Videoformate"|Videodateitypen, die umbenannt werden sollen' & @CRLF & _
'  "zu löschende Dateien"|Dateien, die in den Ordnern gelöscht werden sollen' & @CRLF & _
'|' & @CRLF & _
'PROGRAMM|' & @CRLF & _
'  "Ordner auswählen"|Ordner dessen Mediendateien umbenannt werden sollen' & @CRLF & _
'|Anwenden auf Unterordner kann unabhängig von den Vor-' & @CRLF & _
'|einstellungen gesetzt werden' & @CRLF & _
'  < Einlesen >|Der/Die (Unter)Ordner werden nach den Dateitypen durchsucht.' & @CRLF & _
'|Gefundenes wird mit Pfad in das Listview eingetragen.' & @CRLF & _
'|Das Erstelldatum wird in Spalte 2 angezeigt.' & @CRLF & _
'  "Checkbox Auswahl Dateien"|Auswählen/Auswahl aufheben für alle Dateien' & @CRLF & _
'|Ausgewählte Dateien werden umbenannt' & @CRLF & _
'  "Radio links / rechts"|Ausrichtung Dateipfade im Listview' & @CRLF & _
'  < Explorer >|Öffnet Explorer im Startordner Auswahl' & @CRLF & _
'  < Umbenennen >|Gewählte Dateien werden umbenannt in:' & @CRLF & _
'|ORDNERNAME-TRENNZEICHEN-NUMMER' & @CRLF & _
'|Nummer ansteigend geordnet nach Erstelldatum' & @CRLF & _
'|Die Nummerierung beginnt in jedem Ordner bei 1' & @CRLF & _
'|Videos haben eine eigene Nummerierung' & @CRLF & _
'|' & @CRLF & _
'LISTVIEW FUNKTIONEN|' & @CRLF & _
'  Doppel-Klick|Öffnet die Datei im Standardprogramm' & @CRLF & _
'  Rechts-Klick|Kontext-Menü' & @CRLF & _
'|    Kompletter Dateipfad als Tooltipp' & @CRLF & _
'|    Alle verfügbaren Details von Bilddateien' & @CRLF & _
'|    Aufheben Schreibschutz markierter Datei(en)' & @CRLF & _
'|' & @CRLF & _
'FEHLERBEHANDLUNG|' & @CRLF & _
'|Anzahl der Fehler wird auf der Oberfläche angezeigt' & @CRLF & _
'|Im Programmordner wird eine Datei "Rename.log" erstellt,' & @CRLF & _
'|dort werden Fehler protokolliert.' & @CRLF & _
'|Treten Fehler auf, wird "Rename.log" im Standardeditor geöffnet.' & @CRLF & _
'|' & @CRLF & _
'TIPP|' & @CRLF & _
'|Treten beim Umbenennen Namenskonflikte wegen bereits' & @CRLF & _
'|existierender Zieldateien auf:' & @CRLF & _
'|  - Einstellungen "Temporär Umbenennen" aktivieren' & @CRLF & _
'|  - Dateien erneut < Einlesen >' & @CRLF & _
'|  - < Umbenennen >'
$aItem = StringSplit($sHelp, @CRLF, 1)
For $i = 1 To $aItem[0]
	GUICtrlCreateListViewItem($aItem[$i], $ListViewHelp)
	GUICtrlSetBkColor(-1, 0xFFFFF0)
Next


$hDetail = GUICreate("Details", 561, 618, -1, -1, Default, $WS_EX_MDICHILD, $hGui)
GUISetBkColor(0xFFFFBB)
GUISetIcon($sPath & "\Rename Document.ico")
$ListViewDetail = GuiCtrlCreateListView('||', 20, 20, 521, 578, BitOR($GUI_SS_DEFAULT_LISTVIEW,$LVS_NOCOLUMNHEADER), BitOR($WS_EX_CLIENTEDGE,$LVS_EX_GRIDLINES,$LVS_EX_FULLROWSELECT))
GUICtrlSetBkColor(-1, 0xF5FFFA)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_LV_ALTERNATE)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 200)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, $LVSCW_AUTOSIZE_USEHEADER)
$hLVDetail = GUICtrlGetHandle($ListViewDetail)

_ReadSettingsFromINI()

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUISetState(@SW_SHOW, $hGui)

While 1
	$aMsg = GUIGetMsg(1)
	Switch $aMsg[0]
		Case $GUI_EVENT_CLOSE
			If $aMsg[1] = $hSettings Then
				GUISetState(@SW_HIDE, $hSettings)
			ElseIf $aMsg[1] = $hDetail Then
				GUISetState(@SW_HIDE, $hDetail)
			ElseIf $aMsg[1] = $hHelp Then
				GUISetState(@SW_HIDE, $hHelp)
			Else
				Exit
			EndIf
		Case $GUI_EVENT_PRIMARYUP
			If $fShowContext Then
				$aMPos = MouseGetPos()
				$tPoint = DllStructCreate('int;int')
				DllStructSetData($tPoint, 1, $aMPos[0])
				DllStructSetData($tPoint, 2, $aMPos[1])
				$tRectContext = _WinAPI_GetWindowRect($hContext)
				If Not _WinAPI_PtInRect($tRectContext, $tPoint) Then
					GUISetState(@SW_HIDE, $hContext)
					$fShowContext = False
				EndIf
			EndIf
		Case $mnuSettings
			_SettingsSet()
			GUISetState(@SW_SHOW, $hSettings)
		Case $mnuHelp
			GUISetState(@SW_SHOW, $hHelp)
		Case $ConPath
			GUISetState(@SW_HIDE, $hContext)
			$aCurrItem = _GUICtrlListView_GetSelectedIndices($hLV, True)
			If $aCurrItem[0] <> 0 Then _ToolTipMouseExit(_GUICtrlListView_GetItemText($hLV, $aCurrItem[1]), 4000)
		Case $ConDetail  ; == Dateidetail, bei mehreren markierten Dateien wird nur die erste Datei der Markierung verwendet
			GUISetState(@SW_HIDE, $hContext)
			$aCurrItem = _GUICtrlListView_GetSelectedIndices($hLV, True)
			If $aCurrItem[0] <> 0 Then
				$sFileDetail = _GUICtrlListView_GetItemText($hLV, $aCurrItem[1])
				_ShowDetail()
			EndIf
		Case $ConNoRO    ; == Schreibschutz aufheben, bei mehreren markierten Dateien wird der Schreibschutz für alle markierten Dateien aufgehoben
			GUISetState(@SW_HIDE, $hContext)
			$aCurrItem = _GUICtrlListView_GetSelectedIndices($hLV, True)
			For $i = 1 To $aCurrItem[0]
				If Not FileSetAttrib(_GUICtrlListView_GetItemText($hLV, $aCurrItem[$i]), '-R') Then
					MsgBox(262160, "Fehler", "Der Schreibschutz für diese Datei konnte nicht aufgehoben werden.")
				Else
					_GUICtrlListView_SetItemChecked($hLV, $aCurrItem[$i])
					GUICtrlSetColor($aItemID[$aCurrItem[$i]], 0x00008B)
					$sReadOnly = StringReplace($sReadOnly, ' ' & $aCurrItem[$i] & ' ', ' ')
					$iCntReadOnly -= 1
					If $iCntReadOnly = 0 Then
						GUICtrlSetState($lbReadOnly, $GUI_HIDE)
					Else
						GUICtrlSetData($lbReadOnly, 'Schreibgeschützt: ' & $iCntReadOnly)
					EndIf
				EndIf
			Next
		Case $btSelect
			GUICtrlSetData($lbCntErr, 0)
			GUICtrlSetData($lbCntPic, 0)
			GUICtrlSetData($lbCntVid, 0)
			GUICtrlSetData($progress, 0)
			$sFolder = FileSelectFolder('Ordner mit Bildern auswählen', $sPathStart)
			If $sFolder <> '' Then
				GUICtrlSetData($inFolder, $sFolder)
				GUICtrlSetState($btReadFiles, $GUI_ENABLE)
				GUICtrlSetState($cbSubFolder, $GUI_ENABLE)
				GUICtrlSetState($btExplorer,  $GUI_ENABLE)
				GUICtrlSetState($lbReadOnly,  $GUI_HIDE)
				GUICtrlSetData($progress, 0)
				GUICtrlSetData($inProgress, '')
			EndIf
		Case $cbSubFolder
			If BitAND(GUICtrlRead($cbSubFolder), $GUI_CHECKED) Then
				$fSubFolder = True
			Else
				$fSubFolder = False
			EndIf
		Case $btReadFiles
			GUICtrlSetState($cbSubFolder, $GUI_DISABLE)
			If FileExists($sLOG) Then FileDelete($sLOG)
			 $aCountFiles[0] = 0
			 $aCountFiles[1] = 0
			$iCntErr = 0
			$iCntReadOnly = 0
			$sReadOnly = ' '
			_LoadListview()
			If $iCntReadOnly > 0 Then
				GUICtrlSetState($lbReadOnly, $GUI_SHOW)
				GUICtrlSetData($lbReadOnly, 'Schreibgeschützt: ' & $iCntReadOnly)
			EndIf
		Case $cbSelAll
			If _GUICtrlListView_GetItemCount($hLV) > 0 Then
				If BitAND(GUICtrlRead($cbSelAll), $GUI_CHECKED) Then
					_CheckAll(True)
				Else
					_CheckAll(False)
				EndIf
			Else
				GUICtrlSetState($cbSelAll, $GUI_UNCHECKED)
			EndIf
		Case $cbPrefixTmp
				If BitAND(GUICtrlRead($cbPrefixTmp), $GUI_CHECKED) Then
					GUICtrlSetState($lbPrefixTmp, $GUI_ENABLE)
					GUICtrlSetState($inPrefixTmp, $GUI_ENABLE)
					$fPrefix = True
				Else
					GUICtrlSetState($lbPrefixTmp, $GUI_DISABLE)
					GUICtrlSetState($inPrefixTmp, $GUI_DISABLE)
					$fPrefix = False
				EndIf
		Case $rLeft, $rRight
			If BitAND(GUICtrlRead($rLeft), $GUI_CHECKED) Then
				_GUICtrlListView_SetColumn($hLV, 0, 'Datei', -1, 0)
			Else
				_GUICtrlListView_SetColumn($hLV, 0, 'Datei', -1, 1)
			EndIf
			_WinAPI_RedrawWindow($hLV)
		Case $btExplorer
			If $sFolder <> '' Then Run('explorer.exe /root,"' & $sFolder & '"')
		Case $btRename
			GUICtrlSetState($btRename, $GUI_DISABLE)
			$hLog = FileOpen($sLOG, 9)
			_RenameFiles()
			FileClose($hLog)
		Case $btFolderSelect
			$sPathStart = FileSelectFolder('Start Ordner auswählen', '')
			If $sPathStart <> '' Then GUICtrlSetData($inStartFolder, $sPathStart)
		Case $btAddDelFile
			$sDelFile = FileOpenDialog('Dateien zum Löschen wählen', $sPathStart, 'Alle(*.*)')
			If $sDelFile <> '' Then GUICtrlCreateListViewItem(StringTrimLeft($sDelFile, StringInStr($sDelFile, '\', 1, -1)) , $ListViewDel)
		Case $btDelDelFile
			_GUICtrlListView_DeleteItemsSelected($hLVDel)
		Case $btSave
			_WriteSettingsToINI()
			GUISetState(@SW_HIDE, $hSettings)
	EndSwitch
WEnd

Func _RenameFiles()
	GUICtrlSetData($inProgress, 'Dateien Umbenennen [0%]')
	GUICtrlSetData($progress, 0)
	Local $iItem = _GUICtrlListView_GetItemCount($hLV)
	Local $iStep = 100/$iItem
	Local $nPIC = 0, $nVID = 0, $sItem, $sFile, $sSfx, $sPath, $sNewItem, $sFolder, $sNewPath, $sLastPath, $fCheck = False
	Local $aFilesToDelete = StringSplit($sDeleteList, ',')
	_GUICtrlListView_BeginUpdate($hLV)
	If $fPrefix Then ; == vorher umbenennen mit Präfix
		For $i = 0 To $iItem -1
			GUICtrlSetData($progress, ($i+1)*$iStep)
			GUICtrlSetData($inProgress, 'Temporär Umbenennen [' & Int(($i+1)*$iStep) & '%]')
			If Not _GUICtrlListView_GetItemChecked($hLV, $i) Then ContinueLoop
			$sItem = _GUICtrlListView_GetItemText($hLV, $i)
			$sPath = StringLeft($sItem, StringInStr($sItem, '\', 1, -1))
			$sFile = StringTrimLeft($sItem, StringLen($sPath))
			$sNewItem = $sPath & $sPrefix & '_' & $sFile
			If FileMove($sItem, $sNewItem) Then
				_GUICtrlListView_SetItemText($hLV, $i, $sNewItem)
			Else
				_GUICtrlListView_SetItemChecked($hLV, $i, False)
				GUICtrlSetColor($aItemID[$i], 0xFF1493)
				FileWrite($hLog, 'FEHLER_PRÄFIX   "' & $sItem & '" konnte nicht zu "' & $sNewItem & '" umbenannt werden!' & @CRLF)
				$iCntErr += 1
			EndIf
		Next
	EndIf
	For $i = 0 To $iItem -1
		GUICtrlSetData($progress, ($i+1)*$iStep)
		GUICtrlSetData($inProgress, 'Dateien Umbenennen [' & Int(($i+1)*$iStep) & '%]')
		$sItem = _GUICtrlListView_GetItemText($hLV, $i)
		$sSfx = StringTrimLeft($sItem, StringInStr($sItem, '.', 1, -1))
		$sPath = StringLeft($sItem, StringInStr($sItem, '\', 1, -1) -1)
		$sFolder = StringTrimLeft($sPath, StringInStr($sPath, '\', 1, -1))
		If $sPath <> $sLastPath Then
			$sLastPath = $sPath
			$fCheck = True
			$nPIC = 0
			$nVID = 0
		EndIf
		If Not _GUICtrlListView_GetItemChecked($hLV, $i) Then ContinueLoop
		Select
			Case StringInStr($sExtPict, $sSfx)
				$nPIC += 1
				$sNewPath = $sPath & '\' & $sFolder & $sDelimiter & StringFormat('%0' & $iCountNumbers & 'd', $nPIC) & '.' & StringLower($sSfx)
				If FileExists($sNewPath) Then
					$iCntErr += 1
					FileWrite($hLog, 'NAMENSKONFLIKT   "' & $sItem & '" konnte nicht zu "' & $sNewPath & '" umbenannt werden, da diese Datei bereits existiert!' & @CRLF)
				Else
					If FileMove($sItem, $sNewPath) = 0 Then
						$iCntErr += 1
						FileWrite($hLog, 'FEHLER_VERSCHIEBEN   ' & $sItem & @CRLF)
						GUICtrlSetColor($aItemID[$i], 0xFF1493)
					Else
						_GUICtrlListView_SetItemText($hLV, $i, $sNewPath)
						GUICtrlSetColor($aItemID[$i], 0x228B22)
					EndIf
				EndIf
;~ ConsoleWrite(_OutputLen('+> FileMove(' & $sItem, 100) & $sNewPath & ')' & @CRLF)
			Case StringInStr($sExtVideo, $sSfx)
				If $iCreateVideoFolder = 1 Then
					Local $sLenVid = StringLen($sVideoFolder), $sLenPath = StringLen($sPath)
					If ($sLenPath > $sLenVid And StringRight($sPath, $sLenVid) <> $sVideoFolder) Or ($sLenPath < $sLenVid) Then $sPath &= '\' & $sVideoFolder
				EndIf
				$nVID += 1
				If StringRight($sFolder, StringLen($sVideoFolder)) = $sVideoFolder Then
					Local $sTmp = StringTrimRight($sPath, StringLen($sVideoFolder) +1)
					$sFolder = StringTrimLeft($sTmp, StringInStr($sTmp, '\', 1, -1))
				EndIf
				$sNewPath = $sPath & '\' & $sFolder & $sDelimiter & StringFormat('%0' & $iCountNumbers & 'd', $nVID) & '.' & StringLower($sSfx)
				If FileExists($sNewPath) Then
					$iCntErr += 1
					FileWrite($hLog, 'NAMENSKONFLIKT   "' & $sItem & '" konnte nicht zu "' & $sNewPath & '" umbenannt werden, da diese Datei bereits existiert!' & @CRLF)
				Else
					If FileMove($sItem, $sNewPath, 8) = 0 Then
						$iCntErr += 1
						FileWrite($hLog, 'FEHLER_VERSCHIEBEN   "' & $sItem & '" nach "' & $sNewPath & '"' & @CRLF)
						GUICtrlSetColor($aItemID[$i], 0xFF1493)
					Else
						_GUICtrlListView_SetItemText($hLV, $i, $sNewPath)
						GUICtrlSetColor($aItemID[$i], 0x228B22)
					EndIf
				EndIf
;~ ConsoleWrite(_OutputLen('+> FileMove(' & $sItem, 100) & $sNewPath & ', 8)' & @CRLF)
		EndSelect
		If $fCheck Then
			$fCheck = False
			If UBound($aFilesToDelete) > 1 Then
				For $j = 1 To $aFilesToDelete[0]
					If FileExists($sPath & '\' & $aFilesToDelete[$j]) Then
						If FileDelete($sPath & '\' & $aFilesToDelete[$j]) = 0 Then
							$iCntErr += 1
							FileWrite($hLog, 'FEHLER_LÖSCHEN   ' & $sPath & '\' & $aFilesToDelete[$j] & @CRLF)
						EndIf
;~ ConsoleWrite('!> FileDelete(' & $sPath & '\' & $aFilesToDelete[$j] & ')' & @CRLF)
					EndIf
				Next
			EndIf
		EndIf
	Next
	_GUICtrlListView_EndUpdate($hLV)
	GUICtrlSetData($progress, 100)
	GUICtrlSetData($inProgress, 'Dateien Umbenennen [100%]')
	GUICtrlSetData($lbCntErr, $iCntErr)
	If $iCntErr > 0 Then ShellExecute($sLOG)
EndFunc


;==================================================================================
Func _OutputLen($_s, $_iLen, $_sFill='.')      ; == NUR FÜR KONSOLENAUSGABE IM TEST
	Local $sLen = StringLen($_s)
	If $_iLen <= $sLen Then Return $_s & $_sFill
	For $i = $sLen To $_iLen
		$_s &= $_sFill
	Next
	Return $_s
EndFunc
;==================================================================================

Func _ShowDetail()
	If $sFileDetail = '' Then Return
	Local $sInfo = _ImageGetInfo($sFileDetail)
	Local $aTmp, $aSplit = StringSplit(StringTrimRight($sInfo, 1), @LF, 1)
	If @error Then Return
	_GUICtrlListView_DeleteAllItems($hLVDetail)
	For $i = 1 To $aSplit[0]
		$aTmp = StringSplit($aSplit[$i], '=')
		If StringLen(StringStripWS($aTmp[2], 8)) Then
			GUICtrlCreateListViewItem($aTmp[1] & '|' & StringStripWS($aTmp[2], 2), $ListViewDetail)
			GUICtrlSetBkColor(-1, 0xFFFFF0)
		EndIf
	Next
	WinSetTitle($hDetail, '', 'Details von "' & StringTrimLeft($sFileDetail, StringInStr($sFileDetail, '\', 1, -1)) & '"')
	GUISetState(@SW_SHOW, $hDetail)
EndFunc

Func _ReadSettingsFromINI()
	$sPathStart         = IniRead($sINI, 'General', 'Startpfad', '')
	$iCountNumbers      = IniRead($sINI, 'General', 'n_stellig', 4)
	$sDelimiter         = IniRead($sINI, 'General', 'Delimiter', '_')
	$iSubFolder         = IniRead($sINI, 'General', 'SubFolder', 1)
	If $iSubFolder = 1 Then
		GUICtrlSetState($cbSubFolder, $GUI_CHECKED)
		$fSubFolder = True
	Else
		GUICtrlSetState($cbSubFolder, $GUI_UNCHECKED)
	EndIf
	$iPrefix            = IniRead($sINI, 'General', 'UsePrefix', 0)
	If $iPrefix = 1 Then
		GUICtrlSetState($cbPrefixTmp, $GUI_CHECKED)
		$fPrefix = True
	Else
		GUICtrlSetState($cbPrefixTmp, $GUI_UNCHECKED)
	EndIf
	$sPrefix            = IniRead($sINI, 'General', 'Prefix', 'TMP')
	$sExtPict           = IniRead($sINI, 'General', 'Picture_Formate', 'JPG,JPEG')
	$sExtVideo          = IniRead($sINI, 'General', 'Video_Formate', 'AVI,THM,MOV')
	If $sExtVideo <> '' Then
		$sExt = $sExtPict & ',' & $sExtVideo
	Else
		$sExt = $sExtPict
	EndIf
	$iCreateVideoFolder = IniRead($sINI, 'General', 'Video_Folder_Create', 1)
	$sVideoFolder       = IniRead($sINI, 'General', 'Video_Folder_Name', 'VIDEO')
	$sDeleteList        = IniRead($sINI, 'General', 'DeleteList', 'Thumbs.db,Thumbnail.info,Vorschau.pic')
EndFunc

Func _WriteSettingsToINI()
	$sPathStart = GUICtrlRead($inStartFolder)
	IniWrite($sINI, 'General', 'Startpfad', $sPathStart)
	$iCountNumbers = GUICtrlRead($inFileNum)
	IniWrite($sINI, 'General', 'n_stellig', $iCountNumbers)
	$iSubFolder = 0
	If BitAND(GUICtrlRead($cbSubDir), $GUI_CHECKED) Then $iSubFolder = 1
	IniWrite($sINI, 'General', 'SubFolder', $iSubFolder)
	If $iSubFolder = 1 Then
		GUICtrlSetState($cbSubFolder, $GUI_CHECKED)
	Else
		GUICtrlSetState($cbSubFolder, $GUI_UNCHECKED)
	EndIf
	$sDelimiter = GUICtrlRead($inDelimiter)
	IniWrite($sINI, 'General', 'Delimiter', $sDelimiter)
	$iPrefix = 0
	If BitAND(GUICtrlRead($cbPrefixTmp), $GUI_CHECKED) Then $iPrefix = 1
	IniWrite($sINI, 'General', 'UsePrefix', $iPrefix)
	IniWrite($sINI, 'General', 'Prefix', GUICtrlRead($inPrefixTmp))
	$sExtPict = GUICtrlRead($inFormatPict)
	IniWrite($sINI, 'General', 'Picture_Formate', $sExtPict)
	$sExtVideo = GUICtrlRead($inFormatVideo)
	IniWrite($sINI, 'General', 'Video_Formate', $sExtVideo)
	If $sExtVideo <> '' Then
		$sExt = $sExtPict & ',' & $sExtVideo
	Else
		$sExt = $sExtPict
	EndIf
	$iCreateVideoFolder = 1
	If BitAND(GUICtrlRead($rVideoJa), $GUI_UNCHECKED) Then $iCreateVideoFolder = 0
	IniWrite($sINI, 'General', 'Video_Folder_Create', $iCreateVideoFolder)
	$sVideoFolder = GUICtrlRead($inVideoFolder)
	IniWrite($sINI, 'General', 'Video_Folder_Name', $sVideoFolder)
	$sDeleteList = ''
	For $i = 0 To _GUICtrlListView_GetItemCount($hLVDel) -1
		$sDeleteList &= _GUICtrlListView_GetItemText($hLVDel, $i) & ','
	Next
	If $sDeleteList <> '' Then $sDeleteList = StringTrimRight($sDeleteList, 1)
	IniWrite($sINI, 'General', 'DeleteList', $sDeleteList)
EndFunc

Func _SettingsSet()
	GUICtrlSetData($inStartFolder, $sPathStart)
	GUICtrlSetData($inFileNum,     $iCountNumbers)
	GUICtrlSetData($inDelimiter,   $sDelimiter)
	GUICtrlSetData($inVideoFolder, $sVideoFolder)
	GUICtrlSetData($inFormatVideo, $sExtVideo)
	GUICtrlSetData($inFormatPict,  $sExtPict)
	If $iSubFolder = 1 Then
		GUICtrlSetState($cbSubDir, $GUI_CHECKED)
	Else
		GUICtrlSetState($cbSubDir, $GUI_UNCHECKED)
	EndIf
	If $iPrefix = 1 Then
		GUICtrlSetState($cbPrefixTmp, $GUI_CHECKED)
		GUICtrlSetState($lbPrefixTmp, $GUI_ENABLE)
		GUICtrlSetState($inPrefixTmp, $GUI_ENABLE)
		$fPrefix = True
	Else
		GUICtrlSetState($cbPrefixTmp, $GUI_UNCHECKED)
		GUICtrlSetState($lbPrefixTmp, $GUI_DISABLE)
		GUICtrlSetState($inPrefixTmp, $GUI_DISABLE)
		$fPrefix = False
	EndIf
	If $iCreateVideoFolder = 1 Then
		GUICtrlSetState($rVideoJa, $GUI_CHECKED)
	Else
		GUICtrlSetState($rVideoNein, $GUI_CHECKED)
	EndIf
	_GUICtrlListView_DeleteAllItems($hLVDel)
	Local $a = StringSplit($sDeleteList, ',')
	For $i = 1 To $a[0]
		GUICtrlCreateListViewItem($a[$i], $ListViewDel)
	Next
EndFunc

Func _LoadListview()
	_GUICtrlListView_DeleteAllItems($hLV)
	Local $aFolderRecursive, $sFilesFound, $sAllFiles = '', $iErr = 0
	If $fSubFolder Then
		GUICtrlSetData($inProgress, 'Unterordner Einlesen [0%]')
		$sAllFiles = _Multi_FileListToArray($sFolder, $sExt, 1, 1, '', True)
		If StringLen($sAllFiles) = 1 Then
			$sAllFiles = ''
		Else
			$sAllFiles &= Chr(0)
		EndIf
		$aFolderRecursive = _GetFilesFolder_Rekursiv($sFolder, $sExt, 1, 0)
		If @error Then
			If $sAllFiles <> '' Then
				$aFiles = StringSplit(StringTrimRight($sAllFiles, 1), Chr(0))
			Else
				$iErr = 1
			EndIf
		Else
			$iStep = 100/$aFolderRecursive[0]
			For $i = 1 To $aFolderRecursive[0]
				GUICtrlSetData($progress, $i*$iStep)
				GUICtrlSetData($inProgress, 'Unterordner Einlesen [' & Int($i*$iStep) & '%]')
				$sFilesFound = _Multi_FileListToArray($aFolderRecursive[$i], $sExt, 1, 1, '', True)
				If @error Then
					ContinueLoop
				Else
					$sAllFiles &= $sFilesFound & Chr(0)
				EndIf
			Next
			GUICtrlSetData($progress, 100)
			GUICtrlSetData($inProgress, 'Unterordner Einlesen [100%]')
			If $sAllFiles <> '' Then
				$aFiles = StringSplit(StringTrimRight($sAllFiles, 1), Chr(0))
			EndIf
		EndIf
	Else
		$aFiles = _Multi_FileListToArray($sFolder, $sExt, 1, 1)
		If @error Then $iErr = 1
	EndIf
	If $iErr = 1 Then Return
	_GetCountFiles($aFiles)

	GUICtrlSetData($progress, 0)
	GUICtrlSetData($inProgress, 'Datei Info Lesen [0%]')
	Sleep(300)
	Local $sInfo, $sDateTime, $sPath, $sLastPath, $iFolder = 0
	$iStep = 100/$aFiles[0]
	ReDim $aListview[$aFiles[0]][3]
	ReDim $aItemID[$aFiles[0]]
	For $i = 1 To $aFiles[0]
		GUICtrlSetData($progress, $i*$iStep)
		GUICtrlSetData($inProgress, 'Datei Info Lesen [' & Int($i*$iStep) & '%]')
		$sInfo = _ImageGetInfo($aFiles[$i])
		$sDateTime = _ImageGetParam($sInfo, "DateTime")
		If $sDateTime = '' Then
			$sDateTime = FileGetTime($aFiles[$i], 1, 1)
			If $sDateTime = '' Then
				ContinueLoop
			Else
				$sDateTime = StringRegExpReplace($sDateTime, '(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})', '$1:$2:$3 $4:$5:$6')
			EndIf
		EndIf
		$sPath = StringLeft($aFiles[$i], StringInStr($aFiles[$i], '\', 1, -1) -1)
		If $sPath <> $sLastPath Then
			$sLastPath = $sPath
			$iFolder += 1
		EndIf
		$aListview[$i-1][0] = $iFolder
		$aListview[$i-1][1] = $sDateTime
		$aListview[$i-1][2] = $aFiles[$i]
	Next
	GUICtrlSetData($inProgress, 'Datei Info Lesen [100%]')
	Sleep(500)
	GUICtrlSetData($progress, 0)
	GUICtrlSetData($inProgress, 'Dateien Laden [0%]')
	_ArraySort_2ary($aListview, 0, 0)
	Sleep(300)
	_GUICtrlListView_BeginUpdate($hLV)
	For $i = 0 To UBound($aListview) -1
		GUICtrlSetData($progress, ($i+1)*$iStep)
		GUICtrlSetData($inProgress, 'Dateien Laden [' & Int(($i+1)*$iStep) & '%]')
		$aItemID[$i] = GUICtrlCreateListViewItem($aListview[$i][2] & '|' & $aListview[$i][0] & '|' & $aListview[$i][1], $ListView)
		If StringInStr(FileGetAttrib($aListview[$i][2]), 'R') Then
			GUICtrlSetColor(-1, 0xFF0000)  ; == Test auf Schreibschutz
			$sReadOnly &= $i & ' '
			$iCntReadOnly += 1
		Else
			GUICtrlSetColor(-1, 0x00008B)
		EndIf
	Next
	_GUICtrlListView_HideColumn($hLV, 1)
	_GUICtrlListView_EndUpdate($hLV)
	GUICtrlSetData($progress, 100)
	GUICtrlSetData($inProgress, 'Dateien Laden [100%]')
	GUICtrlSetState($cbSelAll, $GUI_CHECKED)
	GUICtrlSetState($btRename, $GUI_ENABLE)
	_CheckAll(True)
EndFunc

Func _CheckAll($_iState)
	Local $iCount = _GUICtrlListView_GetItemCount($hLV)
	If $iCount = 0 Then Return
	For $i = 0 To $iCount -1
		If _StringInList($sReadOnly, String($i)) Then ContinueLoop
		_GUICtrlListView_SetItemChecked($hLV, $i, $_iState)
	Next
EndFunc

Func _StringInList($_sStr, $_sSub, $_sDelim=' ', $_iCase=0, $_iPart=0)
	Local $aList = StringSplit($_sStr, $_sDelim, 1)
	For $i = 1 To $aList[0]
		If $_iPart = 1 Then
			If StringInStr($aList[$i], $_sSub, $_iCase) Then Return True
		Else
			If $_iCase = 1 Then
				If $aList[$i] == $_sSub Then Return True
			Else
				If $aList[$i] = $_sSub Then Return True
			EndIf
		EndIf
	Next
	Return False
EndFunc

Func _GetCountFiles($_a)
	Local $sExt
	For $i = 1 To $_a[0]
		$sExt = StringTrimLeft($_a[$i], StringInStr($_a[$i], '.', 1, -1))
		If StringInStr($sExtPict, $sExt) Then
			$aCountFiles[0] += 1
			ContinueLoop
		EndIf
		If StringInStr($sExtVideo, $sExt) Then $aCountFiles[1] += 1
	Next
	GUICtrlSetData($lbCntPic, $aCountFiles[0])
	GUICtrlSetData($lbCntVid, $aCountFiles[1])
EndFunc

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
    $hWndListView = $hLV
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
	If $hWndFrom <> $hWndListView Then Return $GUI_RUNDEFMSG
    Switch DllStructGetData($tNMHDR, "Code")
		Case $NM_DBLCLK
			Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
			Local $iItem = DllStructGetData($tInfo, "Index")
			If $iItem >= 0 Then ShellExecute(_GUICtrlListView_GetItemText($hLV, $iItem))
		Case $NM_RCLICK
			Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
			Local $iItem = DllStructGetData($tInfo, "Index")
			If $iItem < 0 Then Return $GUI_RUNDEFMSG
			If StringInStr(FileGetAttrib(_GUICtrlListView_GetItemText($hLV, $iItem)), 'R') Then
				GUICtrlSetState($ConNoRO, $GUI_ENABLE)
			Else
				GUICtrlSetState($ConNoRO, $GUI_DISABLE)
			EndIf
			Local $aMPos = MouseGetPos()
			WinMove($hContext, '', $aMPos[0]-20, $aMPos[1]-70)
			GUISetState(@SW_SHOW, $hContext)
			$fShowContext = True
	EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc  ;==>WM_NOTIFY

;----------------------------------------------------------------------------------------------------------------------
;	Function		_ToolTipMouseExit("text", [time [, x=-1 [, y=-1 [, "title" [, icon [, options]]]]]] )
;
;	Description		usual ToolTip, will be terminate with mouse move, latest after time
;
;	Parameter		same as used by ToolTip
;					if x Or y =-1 then ToolTip will be placed at mouse position
;		optional	$TIME			default is 3000 ms
;
;	Author			BugFix (bugfix@autoit.de)
;----------------------------------------------------------------------------------------------------------------------
Func _ToolTipMouseExit($TEXT, $TIME=-1, $x=-1, $y=-1, $TITLE='', $ICON=0, $OPT='')
	If $TIME = -1 Then $TIME = 3000
	Local $start = TimerInit(), $pos0 = MouseGetPos()
	If ($x = -1) Or ($y = -1) Then
		ToolTip($TEXT, $pos0[0], $pos0[1]-15, $TITLE, $ICON, $OPT)
	Else
		ToolTip($TEXT, $x, $y, $TITLE, $ICON, $OPT)
	EndIf
	Do
		Sleep(50)
		$pos = MouseGetPos()
	Until (TimerDiff($start) > $TIME) Or _
		(Abs($pos[0] - $pos0[0]) > 10 Or _
		 Abs($pos[1] - $pos0[1]) > 10)
	ToolTip('')
EndFunc ;==>_ToolTipMouseExit

;==================================================================================================
; Function Name:   _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [, $iRetType=0 ,[$sDelim='0']]]])
; Description:     Recursive listing of files and/or folders
; Parameter(s):    $sPath     Basicpath of listing ('.' -current path, '..' -parent path)
;                  $sExt      Extension for file selection '*' or -1 for all (Default)
;                  $iDir      -1 Files+Folder(Default), 0 only Files, 1 only Folder
;      optional:   $iRetType  0 for Array, 1 for String as Return
;      optional:   $sDelim    Delimiter for string return
;                             0 -@CRLF (Default)  1 -@CR  2 -@LF  3 -';'  4 -'|'
; Return Value(s): Array (Default) or string with found pathes of files and/or folder
;                  Array[0] includes count of found files/folder
; Author(s):       BugFix (bugfix@autoit.de)
;==================================================================================================
Func _GetFilesFolder_Rekursiv($sPath, $sExt='*', $iDir=-1, $iRetType=0, $sDelim='0')
    Global $oFSO = ObjCreate('Scripting.FileSystemObject')
    Global $strFiles = ''
	Switch $sDelim
		Case '1'
			$sDelim = @CR
		Case '2'
			$sDelim = @LF
		Case '3'
			$sDelim = ';'
		Case '4'
			$sDelim = '|'
		Case Else
			$sDelim = @CRLF
	EndSwitch
    If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0
    If $sExt = -1 Then $sExt = '*'
    If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1
    _ShowSubFolders($oFSO.GetFolder($sPath),$sExt,$iDir,$sDelim)
	If $strFiles = '' Then Return SetError(1,0,0)
    If $iRetType = 0 Then
        Local $aOut
        $aOut = StringSplit(StringTrimRight($strFiles, StringLen($sDelim)), $sDelim, 1)
        If $aOut[1] = '' Then
            ReDim $aOut[1]
            $aOut[0] = 0
        EndIf
        Return $aOut
    Else
        Return StringTrimRight($strFiles, StringLen($sDelim))
    EndIf
EndFunc

Func _ShowSubFolders($Folder, $Ext='*', $Dir=-1, $Delim=@CRLF)
	If Not IsDeclared("strFiles") Then Global $strFiles = ''
    If ($Dir = -1) Or ($Dir = 0) Then
        For $file In $Folder.Files
            If $Ext <> '*' Then
                If StringRight($file.Name, StringLen($Ext)) = $Ext Then _
                    $strFiles &= $file.Path & $Delim
            Else
                $strFiles &= $file.Path & $Delim
            EndIf
        Next
    EndIf
    For $Subfolder In $Folder.SubFolders
        If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
        _ShowSubFolders($Subfolder, $Ext, $Dir, $Delim)
    Next
EndFunc

;===============================================================================
; Function Name....: _Multi_FileListToArray
; Description......: Dateien und/oder Ordner eines Pfades auflisten, mehrere Wildcards möglich
; Parameter(s).....: $_sPath      Pfad für Auflistung
; .................: $_sFilter    Filter für Dateityp(en), Wildcard ist "*" (Standard), mehrere Filter möglich, trennen mit "," z.B. "jpg,jpeg,gif,png,bmp"
; .................: $_iFlag      0 (Standard) = Dateien u. Ordner, 1 = nur Dateien, 2 = nur Ordner
; .................: $_fFullPath  0 (Standard) = nur Datei/Ordnername, 1 = kpl. Pfad
; .......optional..: $_sDirChar   Standard "", Zeichen(folge), die einer Ordnerausgabe vorangestellt werden kann (z.B. "[D] ")
; .......optional..: $_fStrRet    'False' (Standard), mit 'True' Rückgabe eines Chr(0) getrennten Strings, statt eines Arrays
; Return Value(s)..: Erfolg       Array mit den Dateien/Ordnern, Anzahl an $a[0]
; .................: Fehler       0 @error: 1-Pfad existiert nicht; 2-Filter fehlerhaft; 3-Flag fehlerhaft; 4-nichts gefunden
; Author(s)........: BugFix ( bugfix@autoit.de )
;===============================================================================
Func _Multi_FileListToArray($_sPath, $_sFilter='*', $_iFlag=0, $_fFullPath=0, $_sDirChar='', $_fStrRet=False)
	If Not FileExists($_sPath) Then Return SetError(1,0,0)
	If StringRegExp($_sFilter, '[.;\s]') Then Return SetError(2,0,0)
	If $_iFlag < 0 Or $_iFlag > 2 Then Return SetError(3,0,0)
	If StringRight($_sPath, 1) <> '\' Then $_sPath &= '\'
	Local $fAll = False, $sFiles = '', $aFilter[2] = [1,'*'], $hSearch, $sFound, $aRet, $sSuffix, $sPath = ''
	If $_fFullPath Then $sPath = $_sPath
	If $_sFilter = '*' Then $fAll = True
	If Not $fAll Then $aFilter = StringSplit($_sFilter, ',')
	$hSearch = FileFindFirstFile($_sPath & '*.*')
	While True
		$sFound = FileFindNextFile($hSearch)
		If @error Then ExitLoop
		Switch $_iFlag
			Case 0
				If StringInStr(FileGetAttrib($_sPath & $sFound), 'D') Then  ; == alle Ordner
					$sFiles &= $_sDirChar & $sPath & $sFound & Chr(0)
				Else                                                        ; == Dateien Filtern
					If $fAll Then
						$sFiles &= $sPath & $sFound & Chr(0)                ; == alle Dateien
					Else
						For $i = 1 To $aFilter[0]                           ; == Dateien aus Filter
							$sSuffix = StringTrimLeft($sFound, StringInStr($sFound, '.', 1, -1))
							If $aFilter[$i] = $sSuffix Then
								$sFiles &= $sPath & $sFound & Chr(0)
								ExitLoop
							EndIf
						Next
					EndIf
				EndIf
			Case 1 ; == Dateien
				If StringInStr(FileGetAttrib($_sPath & $sFound), 'D') Then ContinueLoop
				If $fAll Then
					$sFiles &= $sPath & $sFound & Chr(0)                    ; == alle Dateien
				Else
					For $i = 1 To $aFilter[0]                               ; == Dateien aus Filter
						$sSuffix = StringTrimLeft($sFound, StringInStr($sFound, '.', 1, -1))
						If $aFilter[$i] = $sSuffix Then
							$sFiles &= $sPath & $sFound & Chr(0)
							ExitLoop
						EndIf
					Next
				EndIf
			Case 2 ; == Ordner
				If Not StringInStr(FileGetAttrib($_sPath & $sFound), 'D') Then ContinueLoop
				$sFiles &= $_sDirChar & $sPath & $sFound & Chr(0)
		EndSwitch
	WEnd
	If $_fStrRet And $sFiles <> '' Then Return StringTrimRight($sFiles, 1)
	$aRet = StringSplit(StringTrimRight($sFiles, 1), Chr(0))
	If @error Then Return SetError(4,0,0)
	Return $aRet
EndFunc  ;==> _Multi_FileListToArray

;------------------------------------------------------------------------------------------------------------
;	Function		_ArraySort_2ary(ByRef $ARRAY [, $DIM_1ST=0 [, $DESCENDING=0 [$REVERSE=False]]])
;
;	Description		sort an 2D-Array 2-ary
;					BaseIndex is 0
;					sort the whole array
;
;	Parameter		$ARRAY:			Array to sort
;		optional	$DIM_1ST:		MainSortIndex; 1st Dim. [0] or last occurence in 2nd Dim.[all other values] (default 0)
;		optional	$DESCENDING:	Sort ascending[0]/descending[1] (default 0)
;		optional	$REVERSE:		Sort 2nd Dimension reverse to 1st Dimension (default False)
;
;	Return			Succes			ByRef 2-ary sorted Array
;					Failure			0  set @error
;									@error = 1 	given array is not array
;									@error = 2 	given array has only 1 dimension
;
;	Requirements	By using numeric entry, be sure that type is "number" for correct sort
;					Works with any occurences in 2nd Dimension
;
;	Author			BugFix (bugfix@autoit.de)
;------------------------------------------------------------------------------------------------------------
Func _ArraySort_2ary(ByRef $ARRAY, $DIM_1ST=0, $DESCENDING=0, $REVERSE=False)
	If ( Not IsArray($ARRAY) ) Then
		SetError(1)
		Return 0
	EndIf
	Local $FIRST = 0, $LAST, $tmpFIRST, $sortYES = 0
	Local $UBound2nd = UBound($ARRAY,2)
	If @error = 2 Then
		SetError(2)
		Return 0
	EndIf
	If $DIM_1ST <> 0 Then $DIM_1ST = $UBound2nd-1
	Local $arTmp[1][$UBound2nd]
	_ArraySort($ARRAY,$DESCENDING,0,0,$DIM_1ST)
	If $REVERSE Then
		Switch $DESCENDING
			Case 0
				$DESCENDING = 1
			Case 1
				$DESCENDING = 0
		EndSwitch
	EndIf
	For $u = 0 To $UBound2nd-1
		For $i = 0 To UBound($ARRAY)-1
			If $sortYES = 0 Then
				If $u > 0 Then
					If ( $i < UBound($ARRAY)-1 ) And ( $ARRAY[$i][$u] = $ARRAY[$i+1][$u] ) And _
						( $ARRAY[$i][$u-1] = $ARRAY[$i+1][$u-1] )Then
						$sortYES = 1
						$FIRST = $i
					EndIf
				Else
					If ( $i < UBound($ARRAY)-1 ) And ( $ARRAY[$i][$u] = $ARRAY[$i+1][$u] ) Then
						$sortYES = 1
						$FIRST = $i
					EndIf
				EndIf
			ElseIf $sortYES = 1 Then
				If ( $i = UBound($ARRAY)-1 ) Or ( $ARRAY[$i][$u] <> $ARRAY[$i+1][$u] ) Then
					$sortYES = 0
					$LAST = $i +1
					ReDim $arTmp[$LAST-$FIRST][$UBound2nd]
					$tmpFIRST = $FIRST
					For $k = 0 To UBound($arTmp)-1
						For $l = 0 To $UBound2nd-1
							$arTmp[$k][$l] = $ARRAY[$tmpFIRST][$l]
						Next
						$tmpFIRST += 1
					Next
					$tmpFIRST = $FIRST
					Switch $DIM_1ST
						Case 0
							If $u = $UBound2nd-1 Then
								_ArraySort($arTmp,$DESCENDING,0,0,$UBound2nd-1)
							Else
								_ArraySort($arTmp,$DESCENDING,0,0,$u+1)
							EndIf
							For $k = 0 To UBound($arTmp)-1
								For $l = 1 To $UBound2nd-1
									$ARRAY[$tmpFIRST][$l] = $arTmp[$k][$l]
								Next
								$tmpFIRST += 1
							Next
						Case $UBound2nd-1
							If $u = $UBound2nd-1 Then
								_ArraySort($arTmp,$DESCENDING,0,0,0)
							Else
								_ArraySort($arTmp,$DESCENDING,0,0,$UBound2nd-1-$u-1)
							EndIf
							For $k = 0 To UBound($arTmp)-1
								For $l = 0 To $UBound2nd-2
									$ARRAY[$tmpFIRST][$l] = $arTmp[$k][$l]
								Next
								$tmpFIRST += 1
							Next
					EndSwitch
				EndIf
			EndIf
		Next
		$sortYES = 0
	Next
EndFunc ;==>_ArraySort_2ary