#include "IE.au3"
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIListBox.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <File.au3>
#include <Array.au3>

Opt('MustDeclareVars', 1)

Global $folderitem, $okbutton, $cancelbutton, $test, $msg, $empty, $status, $statuscheck
Global $sFilename2 = ''
Global $sFilename = @UserProfileDir
Global $sFilename2 = "Pfad Exiftool.exe"
Global $sCurFilename, $hFile, $folder, $Filelist, $Filelist2, $progressbar, $i, $rows, $exiftool, $hFile2, $sCurFilename2, $sTmpFile, $statusbutton, $progressbar2

_Main()

Func _Main()
		
	GuiCreate("Shutterstock EXIF Übernahme", 400, 290) 
    GUICtrlCreateLabel("Shutterstock Metadaten übernahme für .jpg und .eps Bilder.", 10, 15, 380, 15) 
	GUICtrlCreateLabel("Geben Sie bitte nun den Ordner zu Ihren Shutterstock Bildern an.", 10, 45, 380, 12)
	GUICtrlCreateLabel('(Bilder müssen im Format "shutterstock_XXX.jpg/.eps" beschriftet sein.)', 10, 60, 380, 15)
	$hFile = GUICtrlCreateInput($sFilename, 10, 85, 250, 20, -1, $WS_EX_STATICEDGE)
	$folderitem = GUICtrlCreateButton("Bilder Ordner...", 270, 85, 120, 20)
	;$statusbutton = GuiCtrlCreateCheckbox("inkl. Unterordner", 280, 105, 120, 25)
	GuiCtrlSetState(-1, $GUI_UNCHECKED)
	GUICtrlCreateLabel("Geben Sie nun den Pfad zur Exiftool.exe bekannt.", 10, 130, 380, 15)
	;$hFile2 = GUICtrlCreateInput($sFilename2, 10, 140, 250, 20, -1, $WS_EX_STATICEDGE)
	$exiftool = GUICtrlCreateButton($sFilename2, 10, 145, 250, 20)
	$okbutton = GUICtrlCreateButton("Batch starten!", 10, 175, 90, 20)
	$test = GUICtrlCreateButton("Ausgewählte Bilder anzeigen", 105, 175, 155, 20)
	GUICtrlCreateLabel(".Jpg", 10, 206, 30, 20)
	$progressbar = GuiCtrlCreateProgress(50, 206, 340, 20)
	GUICtrlCreateLabel(".Eps", 10, 230, 30, 20)
	$progressbar2 = GuiCtrlCreateProgress(50, 230, 340, 20)
	$cancelbutton = GUICtrlCreateButton("Abbrechen", 150, 260, 100, 20)

	
	GUISetState() 
		
	 ; Die Schleife wiederholt sich, bis der Benutzer die Beenden-Aktion der GUI auslöst
    While 1
		$msg = GUIGetMsg()
		; Code below will check if the file is dropped (or selected)
		
		
		$sCurFilename = GUICtrlRead($hFile)
		If $sCurFilename <> $sFilename Then
			$sFilename = $sCurFilename
		EndIf
		$sCurFilename2 = GUICtrlRead($exiftool)
		If $sCurFilename2 <> $sFilename2 Then
			$sFilename2 = $sCurFilename2
		EndIf
		$statuscheck = GUICtrlRead($statusbutton)
		IF $statuscheck = $GUI_CHECKED Then 
			$status = "/s" 
		Else 
			$status = " "
		EndIf
		

		Select
			Case $msg = $GUI_EVENT_CLOSE Or $msg = $cancelbutton
				Exit
								
			Case $msg = $cancelbutton
				_Cancel()

			Case $msg = $folderitem
				$folder = FileSelectFolder("Ordner wählen...", "")
				If @error Then ContinueLoop
				GUICtrlSetData($hFile, $folder); GUI will be updated at next iteration
				
			Case $msg = $exiftool
				$sTmpFile = FileOpenDialog("Exiftool.exe auswählen:", "", "Exiftool.exe (exiftool.exe;)")
				If @error Then ContinueLoop
				GUICtrlSetData($exiftool, $sTmpFile); GUI will be updated at next iteration
				
			Case $msg = $test
				$Filelist = _FileListToArrayEx($sFilename, "shutterstock_*.jpg; shutterstock_*.eps") 
				_ArrayDelete($Filelist, 0)
				_ArrayDisplay($Filelist, 'Bilddaten')
				
			Case $msg = $okbutton
				If $sFilename2 = "Pfad Exiftool.exe" Then 
					MsgBox(64, "Fehler!", "Bitte geben Sie den Pfad zu Ihrer exiftool.exe bekannt.")
				Else 
					_startBatch()
				EndIf
				GUICtrlSetData($progressbar, 0)
				GUICtrlSetData($progressbar2, 0)
			
		EndSelect
	WEnd
EndFunc   	

Func _startBatch()
	Local $file, $oIE, $oLinks, $keywords, $oLinks2, $bildNAME, $oLinks3, $bildID, $batch, $FertigeBilder, $stopvar, $FertigeBilder2, $rows2, $shutter_num2, $batch2, $keywords2, $bildNAME2
	Dim $descript

$Filelist = _FileListToArrayEx($sFilename, "shutterstock_*.jpg") 
_ArrayDelete($Filelist, 0)
_ArrayTrim($Filelist, 13, 0)
_ArrayTrim($Filelist, 4, 1)

$Filelist2 = _FileListToArrayEx($sFilename, "shutterstock_*.eps") 
_ArrayDelete($Filelist2, 0)
_ArrayTrim($Filelist2, 13, 0)
_ArrayTrim($Filelist2, 4, 1)

$rows = UBound($Filelist)
$FertigeBilder = 0
$rows2 = UBound($Filelist2)
$FertigeBilder2 = 0
$stopvar = 0
For $shutter_num In $Filelist
	$FertigeBilder += 1
	GUICtrlSetData($progressbar,Round(($FertigeBilder / $rows) * 100, 2) )
	
	$file = "http://www.shutterstock.com/pic-" & $shutter_num & ".html"
	
$oIE = _IECreate($file)
$oLinks = _IETagNameGetCollection ($oIE, "a")
$keywords = ""
For $oLink In $oLinks
    If $oLink.className <> "0" Then 
        If ($oLink.className = "middlelink") Then
            $keywords = $keywords & $oLink.getAttribute("x_shutterstock_keyword") & ', '
		EndIf
    EndIf
Next

$oLinks2 = _IEGetObjById ($oIE, "display-pic-description")
$bildNAME = _IEPropertyGet($oLinks2, "innertext")

_IEQuit ($oIE)

$batch = $sFilename2 & ' -m -L -overwrite_original -keywords="' & $keywords & '" -title="' & $shutter_num & '" -description="' & $bildNAME & '" ' & $sFilename & '\shutterstock_' & $shutter_num & '.jpg'
RunWait(@ComSpec & " /c " & $batch & "") 
Sleep(500)

Next

For $shutter_num2 In $Filelist2
	$FertigeBilder2 += 1
	GUICtrlSetData($progressbar2,Round(($FertigeBilder2 / $rows2) * 100, 2) )
	
	$file = "http://www.shutterstock.com/pic-" & $shutter_num2 & ".html"
	
$oIE = _IECreate($file)
$oLinks = _IETagNameGetCollection ($oIE, "a")
$keywords2 = ""
For $oLink In $oLinks
    If $oLink.className <> "0" Then 
        If ($oLink.className = "middlelink") Then
            $keywords2 = $keywords2 & $oLink.getAttribute("x_shutterstock_keyword") & ', '
		EndIf
    EndIf
Next

$oLinks2 = _IEGetObjById ($oIE, "display-pic-description")
$bildNAME2 = _IEPropertyGet($oLinks2, "innertext")

_IEQuit ($oIE)

$batch2 = $sFilename2 & ' -m -L -overwrite_original -description="' & $keywords2 & '" -title="' & $shutter_num2 & '-' & $bildNAME2 &'" ' & $sFilename & '\shutterstock_' & $shutter_num2 & '.eps'
RunWait(@ComSpec & " /c " & $batch2 & "")  ; @SW_HIDE
Sleep(500)

Next


MsgBox(64, "Vorgang Beendet", "Die Bilder wurden erfolgreich bearbeitet.")

EndFunc

Func _Cancel()
    InetClose($hDownload)
    GUIDelete($hGUI)
    Exit
EndFunc


Func _FileListToArrayEx($s_path, $s_mask = "*.*", $i_flag = 0, $s_exclude = -1, $f_recurse = True, $f_full_path = False)

    If FileExists($s_path) = 0 Then Return SetError(1, 1, 0)

    ; Strip trailing backslash, and add one after to make sure there's only one
    $s_path = StringRegExpReplace($s_path, "[\\/]+\z", "") & "\"

    ; Set all defaults
    If $s_mask = -1 Or $s_mask = Default Then $s_mask = "*.*"
    If $i_flag = -1 Or $i_flag = Default Then $i_flag = 0
    If $s_exclude = -1 Or $s_exclude = Default Then $s_exclude = ""

    ; Look for bad chars
    If StringRegExp($s_mask, "[/:><\|]") Or StringRegExp($s_exclude, "[/:><\|]") Then
        Return SetError(2, 2, 0)
    EndIf

    ; Strip leading spaces between semi colon delimiter
    $s_mask = StringRegExpReplace($s_mask, "\s*;\s*", ";")
    If $s_exclude Then $s_exclude = StringRegExpReplace($s_exclude, "\s*;\s*", ";")

    ; Confirm mask has something in it
    If StringStripWS($s_mask, 8) = "" Then Return SetError(2, 2, 0)
    If $i_flag < 0 Or $i_flag > 2 Then Return SetError(3, 3, 0)

    ; Validate and create path + mask params
    Local $a_split = StringSplit($s_mask, ";"), $s_hold_split = ""
    For $i = 1 To $a_split[0]
        If StringStripWS($a_split[$i], 8) = "" Then ContinueLoop
        If StringRegExp($a_split[$i], "^\..*?\..*?\z") Then
            $a_split[$i] &= "*" & $a_split[$i]
        EndIf
        $s_hold_split &= '"' & $s_path & $a_split[$i] & '" '
    Next
    $s_hold_split = StringTrimRight($s_hold_split, 1)
    If $s_hold_split = "" Then $s_hold_split = '"' & $s_path & '*.*"'

    Local $i_pid, $s_stdout, $s_hold_out, $s_dir_file_only = "", $s_recurse = "/s "
    If $i_flag = 1 Then $s_dir_file_only = ":-d"
    If $i_flag = 2 Then $s_dir_file_only = ":D"
    If Not $f_recurse Then $s_recurse = ""

   ; $i_pid = Run(@ComSpec & " /c dir /b " & $s_recurse & "/a" & $s_dir_file_only & " " & $s_hold_split, "", @SW_HIDE, 4 + 2)  -  Original
	
	$i_pid = Run(@ComSpec & " /c dir /b " & $status & "/a" & $s_dir_file_only & " " & $s_hold_split, "", @SW_HIDE, 4 + 2)
	
    While 1
        $s_stdout = StdoutRead($i_pid)
        If @error Then ExitLoop
        $s_hold_out &= $s_stdout
    WEnd

    $s_hold_out = StringRegExpReplace($s_hold_out, "\v+\z", "")
    If Not $s_hold_out Then Return SetError(4, 4, 0)

    ; Parse data and find matches based on flags
    Local $a_fsplit = StringSplit(StringStripCR($s_hold_out), @LF), $s_hold_ret
    $s_hold_out = ""

    If $s_exclude Then $s_exclude = StringReplace(StringReplace($s_exclude, "*", ".*?"), ";", "|")

    For $i = 1 To $a_fsplit[0]
        If $s_exclude And StringRegExp(StringRegExpReplace( _
            $a_fsplit[$i], "(.*?[\\/]+)*(.*?\z)", "\2"), "(?i)\Q" & $s_exclude & "\E") Then ContinueLoop
        If StringRegExp($a_fsplit[$i], "^\w:[\\/]+") = 0 Then $a_fsplit[$i] = $s_path & $a_fsplit[$i]
        If $f_full_path Then
            $s_hold_ret &= $a_fsplit[$i] & Chr(1)
        Else
            $s_hold_ret &= StringRegExpReplace($a_fsplit[$i], "((?:.*?[\\/]+)*)(.*?\z)", "$2") & Chr(1)
        EndIf
    Next

    $s_hold_ret = StringTrimRight($s_hold_ret, 1)
    If $s_hold_ret = "" Then Return SetError(5, 5, 0)

    Return StringSplit($s_hold_ret, Chr(1))
EndFunc
