#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=WinTimeKill.ico
#AutoIt3Wrapper_Outfile_x64=WinTimeKill.exe
#AutoIt3Wrapper_Res_requestedExecutionLevel=asInvoker
#AutoIt3Wrapper_Res_Fileversion=1.0.24.4
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
; =====================================================================
; Include-Dateien einbinden
; =====================================================================
#include <Sound.au3>
; =====================================================================
; Variablen defnieren
; =====================================================================
Global Const $s_version = " v. " & FileGetVersion(@ScriptFullPath)
Global Const $s_by = "by RedHead"
Global Const $GUI_FOCUS = 256
Global Const $GUI_EVENT_CLOSE = -3
Global Const $GUI_EVENT_MINIMIZE = -4
Global Const $GUI_UNCHECKED = 4
Global Const $GUI_CHECKED = 1
Global Const $GUI_DISABLE = 128
Global Const $GUI_ENABLE = 64
Global Const $s_title = "WinTimeKill"
Global $s_soundfile = Default
Global $i_stunde
Global $i_minute
Global $i_sekunde
Global $a_trayitem_label[3] = ["Fenster zeigen", "", "Beenden"]
Global $h_trayitem[UBound($a_trayitem_label, 1)]
Global $a_submenue_hilfe_label[2] = ["Hilfe", "Über..."]
Global $h_submenue_hilfe[UBound($a_submenue_hilfe_label, 1)]
Global $h_GUI
Global $b_timer = False
Global $b_sound = False
Global $b_sound_counter = False
Global $i_sound_timer = 0
Global $a_countdown_label[3] = [00, 00, 00]
Global $h_countdown[3]
Global $h_soundfile
Global $h_countdown_updown[3]
Global $i_shutdown_code = -1
Global $i_soundlength = Default
Global $a_info[3] = ["Stunden", "Minuten", "Sekunden"]
Global $a_uhrzeit_label[3] = [@HOUR, @MIN, @SEC]
Global $h_uhrzeit[3]
Global $h_uhrzeit_updown[3]
Global $a_button_label[3] = ["OK", "Sound wählen", "Abbruch"]
Global $h_button[UBound($a_button_label, 1)]
Global $a_button_info[UBound($a_button_label, 1)] = ["Versteckt das Fenster und " & @CRLF & "lässt den Timer beginnen!", "Wählt die Sounddatei," & @CRLF & "welche zur Erinnerung abgespielt wird!", "Beendet das Programm!"]
; =====================================================================
; Vorbereitung
; =====================================================================
Opt("TrayMenuMode",3)
Opt("TrayAutoPause", 0)
Opt("TrayOnEventMode", 1)
Opt("GUIOnEventMode", 1)

$a_path = _FileGetType()

If $a_path[1] == "exe" Then ProcessSetPriority($a_path[0] & "." & $a_path[1], 0)
; =====================================================================
; =====================================================================
; Hauptprogramm
; =====================================================================
; =====================================================================

For $i = 0 To UBound($a_trayitem_label, 1) - 1
	$h_trayitem[$i] = TrayCreateItem($a_trayitem_label[$i])
Next
TrayItemSetOnEvent($h_trayitem[0], "GUI_zeigen")
TrayItemSetOnEvent($h_trayitem[2], "Terminate")

$h_GUI = GUICreate($s_title & " " & $s_version & " " & $s_by, 260, 380)
GUISetOnEvent($GUI_EVENT_CLOSE, "Terminate")
GUISetOnEvent($GUI_EVENT_MINIMIZE, "GUI_verbergen")
GUISetFont(10, 400, 0, "Comic Sans MS")
$h_mainmenue_hilfe = GUICtrlCreateMenu("Hilfe")
For $i = 0 To UBound($a_submenue_hilfe_label, 1) - 1
	$h_submenue_hilfe[$i] = GUICtrlCreateMenuItem($a_submenue_hilfe_label[$i], $h_mainmenue_hilfe)
	GUICtrlSetOnEvent($h_submenue_hilfe[$i], "Info")
Next
GUICtrlCreateGroup("Aufgabe", 10, 10, 240, 60)
$h_combo_aufgaben = GUICtrlCreateCombo("", 20, 30, 220, 20)
GUICtrlSetData($h_combo_aufgaben, "Beenden|Neu Starten|Abmelden|Herunterfahren erzwingen|Standy|Schlafmodus|Erinnerung")
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUICtrlCreateGroup("Zeit", 10, 70, 240, 160)
GUICtrlCreateGroup("Countdown", 20, 90, 220, 60)
$h_checkbox_countdown = GUICtrlCreateCheckbox("", 30, 118, 15, 15)
GUICtrlSetOnEvent($h_checkbox_countdown, "_Switch")
For $i = 0 To UBound($a_countdown_label) -1
	$h_countdown[$i] = GUICtrlCreateInput($a_countdown_label[$i], 60 + ($i * 60), 115, 50, 20, 8192)
next
For $i = 0 To UBound($a_countdown_label) - 1
	$h_countdown_updown[$i] = GUICtrlCreateUpdown($h_countdown[$i])
	GUICtrlSetOnEvent($h_countdown_updown[$i], "_Switch_Countdown")
Next
GUICtrlSetLimit($h_countdown_updown[0], 23, 0)
GUICtrlSetLimit($h_countdown_updown[1], 59, 0)
GUICtrlSetLimit($h_countdown_updown[2], 59, 0)
For $i = 0 To UBound($a_info) - 1
	GUICtrlSetTip($h_countdown_updown[$i], $a_info[$i])
Next
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUICtrlCreateGroup("Uhrzeit", 20, 160, 220, 60)
$h_checkbox_uhrzeit = GUICtrlCreateCheckbox("", 30, 188, 15, 15)
GUICtrlSetOnEvent($h_checkbox_uhrzeit, "_Switch")
For $i = 0 To UBound($a_uhrzeit_label) - 1
	$h_uhrzeit[$i] = GUICtrlCreateInput($a_uhrzeit_label[$i], 60 + ($i * 60), 185, 50, 20, 8192)
Next
For $i = 0 To UBound($a_uhrzeit_label) - 1
	$h_uhrzeit_updown[$i] = GUICtrlCreateUpdown($h_uhrzeit[$i])
	GUICtrlSetOnEvent($h_uhrzeit_updown[$i], "_Switch_Uhrzeit")
Next
GUICtrlSetLimit($h_uhrzeit_updown[0], 23, 0)
GUICtrlSetLimit($h_uhrzeit_updown[1], 59, 0)
GUICtrlSetLimit($h_uhrzeit_updown[2], 59, 0)
For $i = 0 To UBound($a_info) - 1
	GUICtrlSetTip($h_uhrzeit_updown[$i], $a_info[$i])
Next
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUICtrlCreateGroup("", -99, -99, 1, 1)
For $i = 0 To UBound($h_button, 1) - 1
	$h_button[$i] = GUICtrlCreateButton($a_button_label[$i], 10, 240 + ($i * 40), 240, 30)
Next
GUICtrlSetOnEvent($h_button[0], "Timer_starten")
GUICtrlSetOnEvent($h_button[1], "Soundfile")
GUICtrlSetOnEvent($h_button[2], "Terminate")
For $i = 0 To UBound($a_button_label, 1) - 1
	GUICtrlSetTip($h_button[$i], $a_button_info[$i], "Info", 1)
Next
GUICtrlSetState($h_button[2], $GUI_FOCUS)
_GUIFadeInOut($h_GUI, True, 12)

While Sleep(300)
	If $b_timer Then
		Do
			Sleep(700)
		Until $i_stunde == @HOUR
		Do
			Sleep(500)
		Until $i_minute == @MIN
		Do
			Sleep(400)
		Until $i_sekunde == @SEC
		If $i_shutdown_code == 0.5 Then
			If $b_sound Then
				SoundSetWaveVolume(100)
				$h_soundfile = _SoundOpen($s_soundfile)
				_SoundPlay($h_soundfile, 0)
				$i_soundlength = _SoundLength($h_soundfile, 2)
				If @error Then
					Beep(700, 5000)
					Terminate()
				EndIf
				$b_sound_counter = True
			Else
				Beep(700, 5000)
				Terminate()
			EndIf
			$b_timer = False
		Else
			Shutdown($i_shutdown_code)
		EndIf
	ElseIf $b_sound_counter Then
		$i_sound_timer += 300
		If $i_soundlength <= $i_sound_timer Then
			_SoundClose($h_soundfile)
			Terminate()
		EndIf
	EndIf
WEnd

Func Timer_starten()
	If GUICtrlRead($h_button[0]) = "OK" Then
		$s_aufgabe = GUICtrlRead($h_combo_aufgaben)
		Switch $s_aufgabe
			Case ""
				MsgBox(64, "Info", "Bitte geben sie eine Aufgabe an!")
				Return 0
			Case "Beenden"
				$i_shutdown_code = 1
			Case "Neu Starten"
				$i_shutdown_code = 2
			Case "Abmelden"
				$i_shutdown_code = 0
			Case "Herunterfahren erzwingen"
				$i_shutdown_code = 5
			Case "Standy"
				$i_shutdown_code = 32
			Case "Schlafmodus"
				$i_shutdown_code = 64
			Case "Erinnerung"
				$i_shutdown_code = 0.5
		EndSwitch
		If BitAND(GUICtrlRead($h_checkbox_countdown), $GUI_CHECKED) Then
			$i_stunde = Int(GUICtrlRead($h_countdown[0])) + @HOUR
			If $i_stunde > 23 Then $i_stunde -= 24
			$i_minute = Int(GUICtrlRead($h_countdown[1])) + @MIN
			If $i_minute > 59 Then
				$i_minute -= 60
				$i_stunde += 1
			EndIf
			If StringLen(String($i_stunde)) = 1 Then $i_stunde = 0 & $i_stunde
			$i_sekunde = Int(GUICtrlRead($h_countdown[2])) + @SEC
			If $i_sekunde > 59 Then
				$i_sekunde -= 60
				$i_minute += 1
			EndIf
			If StringLen(String($i_minute)) = 1 Then $i_minute = 0 & $i_minute
			If StringLen(String($i_sekunde)) = 1 Then $i_sekunde = 0 & $i_sekunde
		ElseIf BitAND(GUICtrlRead($h_checkbox_uhrzeit), $GUI_CHECKED) Then
			$i_stunde = Int(GUICtrlRead($h_uhrzeit[0]))
			If StringLen(String($i_stunde)) = 1 Then $i_stunde = 0 & $i_stunde
			$i_minute = Int(GUICtrlRead($h_uhrzeit[1]))
			If StringLen(String($i_minute)) = 1 Then $i_minute = 0 & $i_minute
			$i_sekunde = Int(GUICtrlRead($h_uhrzeit[2]))
			If StringLen(String($i_sekunde)) = 1 Then $i_sekunde = 0 & $i_sekunde
		Else
			Return MsgBox(64, "Info", "Bitte geben sie einen Timer an!")
		EndIf
		TraySetToolTip($s_aufgabe & "!" & @CRLF & "Stunde: " & $i_stunde & @CRLF & "Minute: " & $i_minute & @CRLF & "Sekunde: " & $i_sekunde)
		_GUIFadeInOut($h_GUI, False, 12)
		GUICtrlSetState($h_button[1], $GUI_DISABLE)
		GUICtrlSetData($h_button[0], "Neuer Timer")
		$b_timer = True
	ElseIf GUICtrlRead($h_button[0]) = "Neuer Timer" Then
		ShellExecute(@ScriptFullPath)
		Exit
	EndIf
EndFunc

Func GUI_verbergen()
	_GUIFadeInOut($h_GUI, False, 12)
EndFunc

Func GUI_zeigen()
	_GUIFadeInOut($h_GUI, True, 12)
	GUISetState(@SW_RESTORE, $h_GUI)
EndFunc

Func Terminate()
	If _SoundStatus($h_soundfile) == "playing" Then _SoundClose($h_soundfile)
	_GUIFadeInOut($h_GUI, False, 12)
	GUIDelete($h_GUI)
	Exit
EndFunc

Func Soundfile()
	$s_soundfile = FileOpenDialog("WinTimeKill", @WindowsDir & "/", "Sound (*.mp3;*.wmv)", 1)
	$b_sound = True
EndFunc

Func _Switch()
	Switch @GUI_CtrlId
		Case $h_checkbox_countdown
			If GUICtrlRead($h_checkbox_uhrzeit) = $GUI_CHECKED Then
				GUICtrlSetState($h_checkbox_uhrzeit, $GUI_UNCHECKED)
			EndIf
		Case $h_checkbox_uhrzeit
			If GUICtrlRead($h_checkbox_countdown) = $GUI_CHECKED Then
				GUICtrlSetState($h_checkbox_countdown, $GUI_UNCHECKED)
			EndIf
	EndSwitch
EndFunc

Func _Switch_Countdown()
	GUICtrlSetState($h_checkbox_countdown, $GUI_CHECKED)
	GUICtrlSetState($h_checkbox_uhrzeit, $GUI_UNCHECKED)
EndFunc

Func _Switch_Uhrzeit()
	GUICtrlSetState($h_checkbox_countdown, $GUI_UNCHECKED)
	GUICtrlSetState($h_checkbox_uhrzeit, $GUI_CHECKED)
EndFunc

Func Info()
	Switch @GUI_CtrlId
		Case $h_submenue_hilfe[0]
			MsgBox(64, "Hilfe", "Dieses Program führt die gewählte Aktion nach dem angegebenen Countdown bzw. der angegebenen Uhrzeit aus!")
		Case $h_submenue_hilfe[1]
			MsgBox(64, "Über...", "Erstellt von RedHead!")
	EndSwitch
EndFunc

Func _GUIFadeInOut($hGUI, $bFadeIn = True, $iSpeed = 1)
    If Not (IsHWnd($hGUI) And IsBool($bFadeIn) And ($iSpeed > 0)) Then Return SetError(-1 * (Not IsHWnd($hGUI)) - 2 * (Not IsBool($bFadeIn)) - 4 * (Not ($iSpeed > 0)))
    If $bFadeIn Then GUISetState(@SW_SHOW + 0 * WinSetTrans($hGUI, "", 255 * (Not $bFadeIn)), $hGUI)
    For $i = 0 To 255 Step $iSpeed
        WinSetTrans($hGUI, "", (2 * $i - 255) * $bFadeIn + (255 - $i) + 0 * Sleep(10))
    Next
    WinSetTrans($hGUI, "", 255 * $bFadeIn) ; Korrigiert Fehler, wenn die Schleife nicht bei 0 oder 255 endet.
    If Not $bFadeIn Then GUISetState(@SW_HIDE, $hGUI)
EndFunc

Func _FileGetType($s_path = @ScriptFullPath)
	Local $a_file[2]
	If StringRegExp(StringLeft($s_path, 1), "[a-zA-Z]") And StringMid($s_path, 2, 1) == ":" Then
		$a_path = StringSplit($s_path, "\")
		$a_path = StringSplit($a_path[$a_path[0]], ".")
		$a_file[0] = $a_path[1]
		$a_file[1] = $a_path[2]
		Return $a_file
	Else
		Return SetError(-1)
	EndIf
EndFunc