#Region - TimeStamp
; 2011-06-15 14:12:42   v 1.4
#EndRegion - TimeStamp
#include <ButtonConstants.au3>
#include <Date.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <Misc.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
; BugFix

Opt('GUIOnEventMode', 1)

Global $h10YearView, $h10YearCal, $hYearCal, $hMonthCal, $hComment, $hEdit, $sDateComment, $hCategory
Global $btPrev10YearView, $btNext10YearView
Global $btPrevYear, $btNextYear, $lbYear
Global $btPrevMonth, $btNextMonth, $lbMonth
Global $TodayID, $aCtrlFrame = 0
Global $iCurrMonth = @MON, $iCurrYear = @YEAR, $iCurr10Year = StringLeft($iCurrYear, 3), $iCurr10YearEnd = $iCurr10Year & 9
Global $iShowMonth = $iCurrMonth, $iShowYear = $iCurrYear, $iShow10Year = $iCurr10Year
;~ $iCurrMonth 	    aktueller (bzw. zuletzt gewählter) Monat
;~ $iCurrYear       aktuelles (bzw. zuletzt gewähltes) Jahr
;~ $iCurr10Year     aktuelles (bzw. zuletzt gewähltes) Jahrzehnt (3-stellig)
;~ $iCurr10YearEnd  letztes Jahr des aktuellen (bzw. zuletzt gewählten) Jahrzehnts
;~ $iShowMonth      Monat für Rahmen im Jahreskalender
;~ $iShowYear       Jahr für Rahmen im 10-Jahreskalender
;~ $iShow10Year	    Jahrzehnt für Rahmen in 10-Jahresübersicht (3-stellig)
Global $aShortMonth[12] = ['Jan','Feb','Mrz','Apr','Mai','Jun','Jul','Aug','Sep','Okt','Nov','Dez']
Global $a10YearsView[24], $a10Years[12], $aMonth[12], $aDays[42], $aToolTip[6] ; [ID]
Global $oMarkedDays = ObjCreate("Scripting.Dictionary") ; Key=Datum (JJJJ/MM/TT), Value=Hintergrundfarbe
Global Const $DefCol = 0xF0F0F0, $LightPink = 0xFFB6C1, $LightSkyBlue = 0x87CEEB, $LightGoldenrodYellow = 0xFAFAD2, $LightCyan = 0xE0FFFF
Global $oComment = ObjCreate("Scripting.Dictionary") ; Key=Datum (JJJJ/MM/TT), Value=Kommentar
Global $aCat[1][2] = [[0]], $yCat = 40, $sDateCat, $IndexCat
;~ Global $iChooseCol = $LightSkyBlue
Global $iSetCol, $iChooseCol = -1 ; wenn -1 wird (benutzerdefinierte, speicherbar) Palette (mit Kategorienamen)zur Farbauswahl bei Klick auf Datum geladen, sonst wird die hier definierte Farbe gesetzt
Local $x, $y

; beim Start Markierungen/Kommentare aus INI laden
Local $sINI = @ScriptDir & '\myCal.INI'
_ReadMarkedDaysFromINI($oMarkedDays, $sINI, 'marked')
_ReadMarkedDaysFromINI($oComment, $sINI, 'comment')

#region - Funktionen zu markierten Datumswerten
; Auslesen aus INI und Markierungen setzen beim Programmstart
; Rückgabe: Anzahl gelesener Markierungen
Func _ReadMarkedDaysFromINI(ByRef $oDICT, $sINI, $sSection)
	Local $aSection = IniReadSection($sINI, $sSection)
	If @error Then Return SetError(1)
	For $i = 1 To $aSection[0][0]
		$oDICT.Add($aSection[$i][0], $aSection[$i][1])
	Next
	Return $aSection[0][0]
EndFunc

Func _ReadCategoryFromINI($sINI)
	Local $aRead = IniReadSection($sINI, 'category')
	If @error Then Return
	For $i = 1 To $aRead[0][0]
		_CatCtrlCreate($aRead[$i][0], $aRead[$i][1])
	Next
	GUISetState(@SW_HIDE, $hCategory)
EndFunc

; Schreiben in INI
; Rückgabe: Return von IniWriteSection (1=Erfolg, 0=Fehler)
Func _WriteMarkedDaysToINI(ByRef $oDICT, $sINI, $sSection)
	Local $aToINI = _GetMarkedDays($oDICT)
	If @error Then
		Return SetError(1)
	ElseIf $aToINI = 0 Then
		Return IniWriteSection($sINI, $sSection, '')
	EndIf
	Return IniWriteSection($sINI, $sSection, $aToINI)
EndFunc
; z.B. Vorbereiten zum Schreiben in INI
; mit Übergabe Datum (JJJJ/MM/TT) wird geprüft ob dieser Tag markiert, sonst Rückgabe alle markierten Datumswerte
; Rückgabe Array [['JJJJ/MM/TT', iColor]] oder Trennzeichen-String '|' (nur Datum)
; wenn Datum nicht markiert oder keine markierten Daten vorhanden ==> Rückgabe 0, Fehler 1
Func _GetMarkedDays(ByRef $oDICT, $sDate='', $fString=0)
	Local $iCount = $oDICT.Count, $sRet = ''
	If Not $iCount Then Return 0
	If $sDate = '' Then
		Local $aRet[$iCount +1][2] = [[$iCount]]
	Else
		If Not $oDICT.Exists($sDate) Then Return SetError(1,0,0)
		Local $aRet[2][2] = [[1],[$sDate,$oDICT.Item($sDate)]]
		If $fString = 1 Then Return $sDate
		Return $aRet
	EndIf
	Local $i = 1, $strKey, $colKeys = $oDICT.Keys
	For $strKey In $colKeys
		$aRet[$i][0] = $strKey
		$aRet[$i][1] = $oDICT.Item($strKey)
		$sRet &= $strKey & '|'
		$i += 1
	Next
	If $fString = 1 Then Return StringTrimRight($sRet, 1)
	Return $aRet
EndFunc
#endregion - markierte Datumswerte

#region - Jahrzehnt Übersicht
$h10YearView = GUICreate('Kalender', 200, 171, -1, -1, -1, $WS_EX_TOOLWINDOW)
GUISetOnEvent($GUI_EVENT_CLOSE, '_end', $h10YearView)
$btPrev10YearView = GUICtrlCreateButton('<', 5, 5, 15, 20)
GUICtrlSetOnEvent(-1, '_10YearViewEvent')
$btNext10YearView = GUICtrlCreateButton('>', 180, 5, 15, 20)
GUICtrlSetOnEvent(-1, '_10YearViewEvent')
GUICtrlSetState(-1, $GUI_HIDE)
$x = 6
$y = 37
For $i = 0 To 23
	Switch $i
		Case 2, 4, 6, 10, 12, 14, 18, 20, 22
			$y -= 21
			$x += 47
		Case 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23
			$y += 21
		Case 8, 16
			$x = 6
			$y += 22
	EndSwitch
	$a10YearsView[$i] = GUICtrlCreateLabel('', $x, $y, 46, 21, BitOR($ES_CENTER, $SS_CENTERIMAGE))
	GUICtrlSetOnEvent(-1, '_10YearEvent')
	GUICtrlSetBkColor(-1, 0xD0D0D0)
Next
#endregion - Jahrzehnt Übersicht

#region - Jahrzehntkalender
$h10YearCal = GUICreate('Kalender', 200, 171, -1, -1, -1, $WS_EX_TOOLWINDOW)
GUISetOnEvent($GUI_EVENT_CLOSE, '_end', $h10YearCal)
$btPrev10Year = GUICtrlCreateButton('<', 5, 5, 15, 20)
GUICtrlSetOnEvent(-1, '_10YearCalEvent')
$lb10Year = GUICtrlCreateLabel($iCurr10YearEnd -9 & ' - ' & $iCurr10YearEnd, 21, 8, 158, 17, $ES_CENTER)
GUICtrlSetOnEvent(-1, '_10YearCalEvent')
GUICtrlSetColor(-1, 0x0000FF)
$btNext10Year = GUICtrlCreateButton('>', 180, 5, 15, 20)
GUICtrlSetOnEvent(-1, '_10YearCalEvent')
$x = 6
$y = -5
For $i = 0 To 11
	If Not Mod($i, 4) Then
		$x = 6
		$y += 42
	EndIf
	$a10Years[$i] = GUICtrlCreateLabel($iCurr10YearEnd -10 +$i, $x, $y, 46, 41, BitOR($ES_CENTER, $SS_CENTERIMAGE))
	GUICtrlSetOnEvent(-1, '_YearEvent')
	GUICtrlSetBkColor(-1, 0xD0D0D0)
	If $i = 0 Or $i = 11 Then
		GUICtrlSetState(-1, $GUI_DISABLE)
	Else
		GUICtrlSetState(-1, $GUI_ENABLE)
	EndIf
	$x += 47
Next
#endregion - Jahrzehntkalender

#region - Jahreskalender
$hYearCal = GUICreate('Kalender', 200, 171, -1, -1, -1, $WS_EX_TOOLWINDOW)
GUISetOnEvent($GUI_EVENT_CLOSE, '_end', $hYearCal)
$btPrevYear = GUICtrlCreateButton('<', 5, 5, 15, 20)
GUICtrlSetOnEvent(-1, '_YearCalEvent')
$lbYear = GUICtrlCreateLabel($iCurrYear, 21, 8, 158, 17, $ES_CENTER)
GUICtrlSetOnEvent(-1, '_YearCalEvent')
GUICtrlSetColor(-1, 0x0000FF)
$btNextYear = GUICtrlCreateButton('>', 180, 5, 15, 20)
GUICtrlSetOnEvent(-1, '_YearCalEvent')
$x = 6
$y = -5
For $i = 0 To 11
	If Not Mod($i, 4) Then
		$x = 6
		$y += 42
	EndIf
	$aMonth[$i] = GUICtrlCreateLabel($aShortMonth[$i], $x, $y, 46, 41, BitOR($ES_CENTER, $SS_CENTERIMAGE))
	GUICtrlSetBkColor(-1, 0xD0D0D0)
	GUICtrlSetOnEvent(-1, '_MonthEvent')
	$x += 47
Next
#endregion - Jahreskalender

#region - Kategorie Marker
$hCategory = GUICreate('Kategorie', 200, 40, -1, -1, -1, $WS_EX_TOOLWINDOW)
GUISetOnEvent($GUI_EVENT_CLOSE, '_CloseCategory', $hComment)
$btCat_New = GUICtrlCreateButton('Neu', 5, 5, 60, 20)
GUICtrlSetResizing(-1, $GUI_DOCKALL)
GUICtrlSetOnEvent(-1, '_CatNew')
$btCat_Del = GUICtrlCreateButton('Löschen', 70, 5, 60, 20)
GUICtrlSetResizing(-1, $GUI_DOCKALL)
GUICtrlSetOnEvent(-1, '_CatDel')
$btCat_Sel = GUICtrlCreateButton('Auswahl', 135, 5, 60, 20)
GUICtrlSetResizing(-1, $GUI_DOCKALL)
GUICtrlSetOnEvent(-1, '_CatSel')
$group = GUICtrlCreateGroup('', 5, 28, 190, 2)
GUICtrlSetBkColor(-1, 0xD0D0D0)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUICtrlSetResizing($group, $GUI_DOCKALL)
_setCatCtrlState()
_ReadCategoryFromINI($sINI)
#endregion - Kategorie Marker

#region - Kommentarfenster
$hComment = GUICreate('Kommentar', 300, 250, -1, -1, -1, $WS_EX_TOOLWINDOW)
GUISetOnEvent($GUI_EVENT_CLOSE, '_CloseComment', $hComment)
$hEdit = GUICtrlCreateEdit('', 5, 5, 290, 240)
#endregion

#region - Monatskalender
Local $aWDays[7] = ['Mo','Di','Mi','Do','Fr','Sa','So']
$hMonthCal = GUICreate('Kalender', 200, 171, -1, -1, -1, $WS_EX_TOOLWINDOW)
GUISetOnEvent($GUI_EVENT_CLOSE, '_end', $hMonthCal)
GUISetOnEvent($GUI_EVENT_SECONDARYUP, '_RClickMonth', $hMonthCal)
$btPrevMonth = GUICtrlCreateButton('<', 5, 5, 15, 20)
GUICtrlSetOnEvent(-1, '_MonthCalEvent')
$lbMonth = GUICtrlCreateLabel('Monat Jahr', 21, 8, 158, 17, $ES_CENTER)
GUICtrlSetOnEvent(-1, '_MonthCalEvent')
GUICtrlSetColor(-1, 0x0000FF)
$btNextMonth = GUICtrlCreateButton('>', 180, 5, 15, 20)
GUICtrlSetOnEvent(-1, '_MonthCalEvent')
$x = 6
For $i = 0 To 6
	GUICtrlCreateLabel($aWDays[$i], $x, 30, 26, 17, BitOR($ES_CENTER, $SS_CENTERIMAGE))
	GUICtrlSetBkColor(-1, 0xD0D0D0)
	$x += 27
Next
$x = 6
$y = 40
For $i = 0 To 41
	If Not Mod($i, 7) Then
		$x = 6
		$y += 18
	EndIf
	$aDays[$i] = GUICtrlCreateLabel($i, $x, $y, 26, 17, BitOR($ES_CENTER, $SS_CENTERIMAGE))
	GUICtrlSetOnEvent(-1, '_DayEvent')
	$x += 27
Next
; (leere) Label für Tooltip Wochennummer
$y = 58
For $i = 0 To 5
	$aToolTip[$i] = GUICtrlCreateLabel(' ', 1, $y, 5, 17)
	$y += 18
Next
_setMonthView()
#endregion - Monatskalender


GUIRegisterMsg($WM_MOVE, "_WM_MOVE")
GUISetState(@SW_SHOW, $hMonthCal)

While 1
	Sleep(10)
WEnd

Func _end()
	; Kommentare löschen, falls Markierung gelöscht
	_DeleteUnusedComments()
	; beim Beenden Markierungen/Kommentare/Kategorien in INI schreiben
	If $aCat[0][0] = 0 Then
		IniWriteSection($sINI, 'category', '')
	Else
		For $i = 1 To $aCat[0][0]
			$aCat[$i][0] = ControlGetText($hCategory, '', $aCat[$i][0])
		Next
		IniWriteSection($sINI, 'category', $aCat)
	EndIf
	_WriteMarkedDaysToINI($oMarkedDays, $sINI, 'marked')
	_WriteMarkedDaysToINI($oComment, $sINI, 'comment')
	Exit
EndFunc

Func _CloseComment()
	Local $sRead = GUICtrlRead($hEdit)
	If $sRead <> '' Then
		$sRead = StringRegExpReplace($sRead, '\r\n', '¤')
		If $oComment.Exists($sDateComment) Then
			$oComment.Item($sDateComment) = $sRead
		Else
			$oComment.Add($sDateComment, $sRead)
		EndIf
	EndIf
	GUICtrlSetData($hEdit, '')
	GUISetState(@SW_HIDE, $hComment)
EndFunc

Func _DeleteUnusedComments()
	Local $strKey, $colKeys = $oComment.Keys
	For $strKey In $colKeys
		If Not $oMarkedDays.Exists($strKey) Then
			$oComment.Remove($strKey)
		EndIf
	Next
EndFunc

;======= ANZEIGEN =====
Func _show10YearView() ; wechselt von 10-Jahreskalender zu 10-Jahres-Übersicht
	GUISetState(@SW_SHOW, $h10YearView)
	_set10YearView()
	GUISetState(@SW_HIDE, $h10YearCal)
EndFunc

Func _show10YearCal($hWndFrom) ; wechselt von Jahreskalender/10-Jahres-Übersicht zu 10-Jahreskalender
	GUISetState(@SW_SHOW, $h10YearCal)
	If $iCurr10Year = $iShow10Year Then
		$aCtrlFrame = _FrameAroundCtrl_Create($h10YearCal, $a10Years[StringRight($iShowYear,1)+1])
	Else
		_FrameAroundCtrl_Delete()
	EndIf
	GUISetState(@SW_HIDE, $hWndFrom)
EndFunc

Func _showYearCal($hWndFrom) ; wechselt von Monatskalender/10-Jahreskalender zu Jahreskalender
	GUICtrlSetData($lbYear, $iCurrYear)
	GUISetState(@SW_SHOW, $hYearCal)
	_setYear()
	GUISetState(@SW_HIDE, $hWndFrom)
EndFunc

Func _showMonthCal() ; wechselt von Jahreskalender zu Monatskalender
	GUISetState(@SW_SHOW, $hMonthCal)
	If $iCurrYear = @YEAR And $iCurrMonth = @MON Then
		$aCtrlFrame = _FrameAroundCtrl_Create($hMonthCal, $TodayID)
	Else
		_FrameAroundCtrl_Delete()
	EndIf
	GUISetState(@SW_HIDE, $hYearCal)
EndFunc
;======================

;======= ÜBERSICHT ====
Func _10YearViewEvent() ; Klick auf Control in 10-Jahres-Übersicht
	GUISetState(@SW_LOCK, $h10YearView)
	Switch @GUI_CtrlId
		Case $btPrev10YearView
			If $iCurrYear -10 < 1900 Then Return
			$iCurrYear = 1900
			GUICtrlSetState($btPrev10YearView, $GUI_HIDE)
			GUICtrlSetState($btNext10YearView, $GUI_SHOW)
		Case $btNext10YearView
			If $iCurrYear +10 > 2099 Then Return
			$iCurrYear = 2099
			GUICtrlSetState($btPrev10YearView, $GUI_SHOW)
			GUICtrlSetState($btNext10YearView, $GUI_HIDE)
	EndSwitch
	_set10YearView()
	GUISetState(@SW_UNLOCK, $h10YearView)
EndFunc

Func _10YearEvent() ; Klick auf 10-Jahresbereich in 10-Jahres-Übersicht
	_FrameAroundCtrl_Delete()
	Local $i10Year = GUICtrlRead(@GUI_CtrlId)
	If $i10Year = '' Then Return
	If StringRight($i10Year, 1) = 0 Then $i10Year += 9
	$iCurr10YearEnd = $i10Year
	$iCurr10Year = StringLeft($i10Year, 3)
	GUICtrlSetData($lb10Year, $iCurr10Year & '0 - ' & $iCurr10YearEnd)
	_set10Year()
	_show10YearCal($h10YearView)
EndFunc

Func _set10YearView() ; setze Daten in 10-Jahres-Übersicht
	_FrameAroundCtrl_Delete()
	Local $iSet = 2, $iFrom = 1990, $iTo = 1999, $iLoop = 2
	GUICtrlSetState($btPrev10YearView, $GUI_SHOW)
	GUICtrlSetState($btNext10YearView, $GUI_HIDE)
	If $iCurrYear < 2010 Then
		$iSet = 1
		$iFrom = 1900
		$iTo = 1909
		GUICtrlSetState($btPrev10YearView, $GUI_HIDE)
		GUICtrlSetState($btNext10YearView, $GUI_SHOW)
	EndIf
	If $iSet = 1 Then
		GUICtrlSetData($a10YearsView[0], '')
		GUICtrlSetData($a10YearsView[1], '')
	Else
		$iLoop = 0
		GUICtrlSetData($a10YearsView[22], '')
		GUICtrlSetData($a10YearsView[23], '')
	EndIf
	For $i = $iLoop To $iLoop +21
		If Not Mod($i, 2) Then
			GUICtrlSetData($a10YearsView[$i], $iFrom)
			$iFrom += 10
		Else
			GUICtrlSetData($a10YearsView[$i], $iTo)
			If StringLeft(GUICtrlRead($a10YearsView[$i]),3) = $iShow10Year Then _
				$aCtrlFrame = _FrameAroundCtrl_Create($h10YearView, $a10YearsView[$i])
			$iTo += 10
		EndIf
	Next
EndFunc
;======================

;======= 10 JAHR ======
Func _10YearCalEvent() ; Klick auf Control im 10-Jahreskalender
	GUISetState(@SW_LOCK, $h10YearCal)
	Switch @GUI_CtrlId
		Case $btPrev10Year
			If $iCurr10Year -1 < 190 Then Return
			$iCurr10YearEnd -= 10
			$iCurrYear -= 10
			$iCurr10Year -= 1
			_set10Year()
		Case $btNext10Year
			If $iCurr10Year +1 > 209 Then Return
			$iCurr10YearEnd += 10
			$iCurrYear += 10
			$iCurr10Year += 1
			_set10Year()
		Case $lb10Year
			$iShow10Year = $iCurr10Year
			_show10YearView()
	EndSwitch
	GUISetState(@SW_UNLOCK, $h10YearCal)
EndFunc

Func _YearEvent() ; Klick auf Jahr im 10-Jahreskalender
	$iCurrYear = GUICtrlRead(@GUI_CtrlId)
	$iCurr10Year = StringLeft($iCurrYear, 3)
	GUICtrlSetData($lbYear, $iCurrYear)
	_showYearCal($h10YearCal)
EndFunc

Func _set10Year()
	GUICtrlSetData($lb10Year, $iCurr10YearEnd -9 & ' - ' & $iCurr10YearEnd)
	Local $iStart = $iCurr10YearEnd -10
	For $i = 0 To 11
		GUICtrlSetData($a10Years[$i], $iStart + $i)
	Next
	If $iCurrYear = $iShowYear Then
		$aCtrlFrame = _FrameAroundCtrl_Create($h10YearCal, $a10Years[StringRight($iShowYear,1)+1])
	Else
		_FrameAroundCtrl_Delete()
	EndIf
EndFunc
;======================

;======= JAHR =========
Func _YearCalEvent() ; Klick auf Controls im Jahreskalender
	GUISetState(@SW_LOCK, $hYearCal)
	Switch @GUI_CtrlId
		Case $btPrevYear
			If $iCurrYear -1 < 1900 Then Return
			$iCurrYear -= 1
			_setYear()
		Case $btNextYear
			If $iCurrYear +1 > 2099 Then Return
			$iCurrYear += 1
			_setYear()
		Case $lbYear
			$iCurrYear = GUICtrlRead($lbYear)
			$iShowYear = $iCurrYear
			$iShow10Year = StringLeft($iShowYear, 3)
			GUICtrlSetData($lb10Year, $iCurr10Year & '0 - ' & $iCurr10YearEnd)
			_set10Year()
			_show10YearCal($hYearCal)
	EndSwitch
	GUISetState(@SW_UNLOCK, $hYearCal)
EndFunc

Func _MonthEvent() ; Klick auf Monat im Jahreskalender
	Local $sMonth = GUICtrlRead(@GUI_CtrlId)
	For $i = 0 To 11
		If $aShortMonth[$i] = $sMonth Then
			$iCurrMonth = $i +1
			ExitLoop
		EndIf
	Next
	$iShowMonth = $iCurrMonth
	$iCurrYear = GUICtrlRead($lbYear)
	$iShowYear = $iCurrYear
	$iCurr10Year = StringLeft($iCurrYear, 3)
	_setMonthView($iCurrYear, $iCurrMonth)
	_showMonthCal()
EndFunc

Func _setYear()
	$iCurr10Year = StringLeft($iCurrYear, 3)
	$iCurr10YearEnd = $iCurr10Year & 9
	GUICtrlSetData($lbYear, $iCurrYear)
	If $iCurrYear = $iShowYear Then
		$aCtrlFrame = _FrameAroundCtrl_Create($hYearCal, $aMonth[$iShowMonth-1])
	Else
		_FrameAroundCtrl_Delete()
	EndIf
EndFunc
;======================

;======= MONAT ========
Func _MonthCalEvent() ; Klick auf Controls im Monatskalender
	GUISetState(@SW_LOCK, $hMonthCal)
	Switch @GUI_CtrlId
		Case $btPrevMonth
			$iCurrMonth -= 1
			_setMonthView($iCurrYear, $iCurrMonth)
		Case $btNextMonth
			$iCurrMonth += 1
			_setMonthView($iCurrYear, $iCurrMonth)
		Case $lbMonth
			$iShowMonth = $iCurrMonth
			_showYearCal($hMonthCal)
	EndSwitch
	GUISetState(@SW_UNLOCK, $hMonthCal)
EndFunc

Func _DayEvent() ; Klick auf Tag im Monatskalender
	$iSetCol = $iChooseCol
	For $i = 0 To 41
		$IndexCat = $i
		If $aDays[$i] = @GUI_CtrlId Then ExitLoop
	Next
	Local $sFullDate = $iCurrYear & '/' & StringRight( '0' & $iCurrMonth, 2) & '/' & GUICtrlRead($aDays[$i])
	$sDateCat = $sFullDate
	If $oMarkedDays.Exists($sFullDate) Then
		$oMarkedDays.Remove($sFullDate)
		GUICtrlSetBkColor($aDays[$i], $DefCol)
	Else
		If $iChooseCol = -1 Then
			GUISetState(@SW_SHOW, $hCategory)
		Else
			$oMarkedDays.Add($sFullDate, $iSetCol)
			GUICtrlSetBkColor($aDays[$i],$iSetCol)
		EndIf
	EndIf
EndFunc

Func _setMonthView($iYear=-1, $iMonth=-1) ; setzt Monatskalender für aktuellen Monat/Jahr
	Local $aLongMonth[13] = ['','Januar ','Februar ','März ','April ','Mai ','Juni ','Juli ','August ','September ','Oktober ','November ','Dezember ']
	If $iYear = -1 Or IsKeyword($iYear) Then $iYear = @YEAR
	If $iMonth = -1 Or IsKeyword($iMonth) Then $iMonth = @MON
	If $iMonth = 0 Then
		If $iCurrYear -1 < 1900 Then Return
		$iCurrYear -= 1
		$iCurrMonth = 12
	ElseIf $iMonth = 13 Then
		If $iCurrYear +1 > 2099 Then Return
		$iCurrMonth = 1
		$iCurrYear += 1
	Else
		$iCurrMonth = $iMonth
		$iCurrYear = $iYear
	EndIf
	$iCurr10Year = StringLeft($iCurrYear, 3)
	$iCurr10YearEnd = $iCurr10Year & 9
	GUICtrlSetData($lbMonth, $aLongMonth[$iCurrMonth] & $iCurrYear)
	_CalcDayArray()
	If $iCurrYear = @YEAR And $iCurrMonth = @MON Then	; Datum HEUTE mit Rahmen
		$aCtrlFrame = _FrameAroundCtrl_Create($hMonthCal, $TodayID)
	Else
		_FrameAroundCtrl_Delete()
	EndIf

EndFunc

Func _CalcDayArray() ; im Monatskalender Tageswerte (+ Farben, falls gesetzt) eintragen
	Local $iMonthDays = _DateDaysInMonth($iCurrYear, $iCurrMonth)
	Local $1stWeekDay = (_DateToDayOfWeekISO($iCurrYear, $iCurrMonth, 1) -1) *(-1)
	Local $s1stFullDate = $iCurrYear & '/' & $iCurrMonth & '/01'
	Local $1stWeekNum = _WeekNumberISO($iCurrYear, $iCurrMonth, '01'), $refDate, $n = 0
	For $i = 0 To 5
		GUICtrlSetTip($aToolTip[$i], $1stWeekNum +$i, 'Kalenderwoche', 1, 1)
	Next
	If $1stWeekDay <> 0 Then
		For $i = $1stWeekDay To 0
			If $i = 0 Then ExitLoop
			$refDate = _DateAdd('D', $i, $s1stFullDate)
			If $oMarkedDays.Exists($refDate) Then
				GUICtrlSetBkColor($aDays[$n], $oMarkedDays.Item($refDate))
			Else
				GUICtrlSetBkColor($aDays[$n], $DefCol)
			EndIf
			GUICtrlSetData($aDays[$n], StringRight($refDate, 2))
			GUICtrlSetState($aDays[$n], $GUI_DISABLE)
			$n += 1
		Next
	EndIf
	For $i = 0 To $iMonthDays -1
		$refDate = _DateAdd('D', $i, $s1stFullDate)
		If $oMarkedDays.Exists($refDate) Then
			GUICtrlSetBkColor($aDays[$n], $oMarkedDays.Item($refDate))
		Else
			GUICtrlSetBkColor($aDays[$n], $DefCol)
		EndIf
		GUICtrlSetData($aDays[$n], StringRight($refDate, 2))
		GUICtrlSetState($aDays[$n], $GUI_ENABLE)
		If StringRight($refDate, 2) = @MDAY Then $TodayID = $aDays[$n]
		$n += 1
	Next
	$i = $iMonthDays
	While $n <= 41
		$refDate = _DateAdd('D', $i, $s1stFullDate)
		If $oMarkedDays.Exists($refDate) Then
			GUICtrlSetBkColor($aDays[$n], $oMarkedDays.Item($refDate))
		Else
			GUICtrlSetBkColor($aDays[$n], $DefCol)
		EndIf
		GUICtrlSetData($aDays[$n], StringRight($refDate, 2))
		GUICtrlSetState($aDays[$n], $GUI_DISABLE)
		$i += 1
		$n += 1
	WEnd
EndFunc
;======================

;======= KATEGORIE ====
Func _setCatCtrlState()
	If $aCat[0][0] = 0 Then
		GUICtrlSetState($btCat_Del, $GUI_DISABLE)
		GUICtrlSetState($btCat_Sel, $GUI_DISABLE)
	Else
		GUICtrlSetState($btCat_Del, $GUI_ENABLE)
		GUICtrlSetState($btCat_Sel, $GUI_ENABLE)
	EndIf
EndFunc

Func _CatNew()
	Local $sName = InputBox('Neue Kategorie', 'Bitte Namen der Kategorie eingeben')
	If $sName = '' Then Return
	If $aCat[0][0] > 0 Then
		For $i = 1 To $aCat[0][0]
			If GUICtrlRead($aCat[$i][0]) = $sName Then Return MsgBox(0, 'Achtung!', 'Eine Kategorie mit diesem Namen' & @CRLF & 'existiert bereits!')
		Next
	EndIf
	Local $iBkCol = _ChooseColor(2)
	If $iBkCol = -1 Then Return
	_CatCtrlCreate($sName, $iBkCol)
EndFunc

Func _CatCtrlCreate($sName, $iBkCol)
	Local $y = $yCat
	If $aCat[0][0] > 0 Then $y = $yCat + ($aCat[0][0] * 27)
	ReDim $aCat[UBound($aCat) +1][2]
	$aCat[0][0] += 1
	Local $winPos = WinGetPos($hCategory)
	WinMove($hCategory, '', $winPos[0], $winPos[1] -13, $winPos[2], $winPos[3] +27)
	$aCat[UBound($aCat) -1][0] = GUICtrlCreateRadio($sName, 5, $y, 190, 22, BitOR($BS_CENTER, $BS_VCENTER))
	GUICtrlSetResizing(-1, $GUI_DOCKALL)
	GUICtrlSetBkColor($aCat[UBound($aCat) -1][0], $iBkCol)
	$aCat[UBound($aCat) -1][1] = $iBkCol
	_setCatCtrlState()
EndFunc

Func _CatDel()
	Local $Index = 0
	For $i = 1 To $aCat[0][0]
		If BitAND(GUICtrlRead($aCat[$i][0]), $GUI_CHECKED) Then
			$Index = $i
			ExitLoop
		EndIf
	Next
	If $Index = 0 Then Return
	Local $CtrlPos
	GUICtrlDelete($aCat[$Index][0])
	Local $winPos = WinGetPos($hCategory)
	For $i = $Index To $aCat[0][0] -1
		$CtrlPos = ControlGetPos($hCategory, '', $aCat[$i+1][0])
		$aCat[$i][0] = GUICtrlCreateRadio(ControlGetText($hCategory, '', $aCat[$i+1][0]), 5, $CtrlPos[1] -27, 190, 22, BitOR($BS_CENTER, $BS_VCENTER))
		GUICtrlSetResizing(-1, $GUI_DOCKALL)
		GUICtrlSetBkColor(-1, $aCat[$i+1][1])
		$aCat[$i][1] = $aCat[$i+1][1]
		GUICtrlDelete($aCat[$i+1][0])
	Next
	WinMove($hCategory, '', $winPos[0], $winPos[1] +13, $winPos[2], $winPos[3] -27)
	$aCat[0][0] -= 1
	ReDim $aCat[UBound($aCat)-1][2]
	_setCatCtrlState()
EndFunc

Func _CatSel()
	$iSetCol = -1
	Local $Index = 0
	For $i = 1 To $aCat[0][0]
		If BitAND(GUICtrlRead($aCat[$i][0]), $GUI_CHECKED) Then
			$Index = $i
			ExitLoop
		EndIf
	Next
	If $Index = 0 Then Return
	$iSetCol = $aCat[$Index][1]
	_CloseCategory()
EndFunc

Func _CloseCategory()
	GUISetState(@SW_HIDE, $hCategory)
	If $iSetCol <> -1 Then
		$oMarkedDays.Add($sDateCat, $iSetCol)
		GUICtrlSetBkColor($aDays[$IndexCat],$iSetCol)
		$iSetCol = -1
	EndIf
	GUISetState(@SW_SHOW, $hMonthCal) ; wirkt machmal nicht
	WinWaitActive($hMonthCal, '', 1)
	If WinGetHandle('[ACTIVE]') <> $hMonthCal Then WinActivate($hMonthCal)
EndFunc
;======================

;======= KOMMENTAR ====
Func _RClickMonth()
	Local $IDover = _GetCtrlUnderMouse()
	If $IDover = 0 Or BitAND(GUICtrlGetState($IDover), $GUI_DISABLE) Then Return
	$sDateComment = $iCurrYear & '/' & $iCurrMonth & '/' & GUICtrlRead($IDover)
	If Not _GetMarkedDays($oMarkedDays, $sDateComment, 1) Then Return
	WinSetTitle($hComment, '', 'Kommentar  ' & StringRegExpReplace($sDateComment, '(\d{4})/(\d{2})/(\d{2})', '$3.$2.$1'))
	If $oComment.Exists($sDateComment) Then GUICtrlSetData($hEdit, StringRegExpReplace($oComment.Item($sDateComment), '¤', @CRLF))
	GUISetState(@SW_SHOW, $hComment)
EndFunc

Func _GetCtrlUnderMouse()
	Local $oldOpt = Opt('MouseCoordMode', 2)
	Local $Mouse = MouseGetPos(), $Ctrl, $retID = 0
	For $i = 0 To 41
		$Ctrl = ControlGetPos($hMonthCal, '', $aDays[$i])
		If @error Then ContinueLoop
		If ($Mouse[0] >= $Ctrl[0] And $Mouse[0] <= $Ctrl[0] + $Ctrl[2]) And _
		   ($Mouse[1] >= $Ctrl[1] And $Mouse[1] <= $Ctrl[1] + $Ctrl[3]) Then
		   $retID = $aDays[$i]
		   ExitLoop
		EndIf
	Next
	Opt('MouseCoordMode', $oldOpt)
	Return $retID
EndFunc
;======================

;======= RAHMEN =======
Func _FrameAroundCtrl_Create($hWnd, $ID) ; roten Rahmen um Control zeichnen
	_FrameAroundCtrl_Delete()
	Local $aSize[4]
	If $hWnd = $h10YearView Then ; VonJahr-BisJahr als ein Ctrl berechnen
		Local $ID_start, $ID_end
		If StringRight(GUICtrlRead($ID), 1) = 0 Then
			$ID_start = $ID
		ElseIf StringRight(GUICtrlRead($ID), 1) = 9 Then
			$ID_start = $ID -1
		EndIf
		Local $aPos = ControlGetPos($hWnd, '', $ID_start)
		$aSize[0] = $aPos[0]
		$aSize[1] = $aPos[1]
		$aSize[2] = $aPos[2]
		$aSize[3] = 2 *$aPos[3]
	Else
		$aSize = ControlGetPos($hWnd, '', $ID)
	EndIf
	Local $aFrame[4] = [ _
		GUICtrlCreateLabel('', $aSize[0] -1, $aSize[1] -1, $aSize[2] +2, 1), _         ; top
		GUICtrlCreateLabel('', $aSize[0] -1, $aSize[1] +$aSize[3], $aSize[2] +2, 1), _ ; bottom
		GUICtrlCreateLabel('', $aSize[0] -1, $aSize[1], 1, $aSize[3]), _               ; left
		GUICtrlCreateLabel('', $aSize[0] +$aSize[2], $aSize[1], 1, $aSize[3])]         ; right
	For $i = 0 To 3
		GUICtrlSetBkColor($aFrame[$i], 0xFF0000)
	Next
	Return $aFrame
EndFunc

Func _FrameAroundCtrl_Delete() ; Rahmen löschen
	If Not IsArray($aCtrlFrame) Then Return
	GUISetState(@SW_LOCK, WinGetHandle('[ACTIVE]'))
	For $i = 0 To 3
		GUICtrlDelete($aCtrlFrame[$i])
	Next
	GUISetState(@SW_UNLOCK, WinGetHandle('[ACTIVE]'))
	$aCtrlFrame = 0
EndFunc
;======================

Func _WM_MOVE($hWnd)
	Local $pos = WinGetPos($hWnd)
    Switch $hWnd
		Case $h10YearView
			WinMove($h10YearCal, '', $pos[0], $pos[1])
			WinMove($hYearCal, '', $pos[0], $pos[1])
			WinMove($hMonthCal, '', $pos[0], $pos[1])
		Case $h10YearCal
			WinMove($h10YearView, '', $pos[0], $pos[1])
			WinMove($hYearCal, '', $pos[0], $pos[1])
			WinMove($hMonthCal, '', $pos[0], $pos[1])
		Case $hYearCal
			WinMove($h10YearView, '', $pos[0], $pos[1])
			WinMove($h10YearCal, '', $pos[0], $pos[1])
			WinMove($hMonthCal, '', $pos[0], $pos[1])
		Case $hMonthCal
			WinMove($h10YearView, '', $pos[0], $pos[1])
			WinMove($h10YearCal, '', $pos[0], $pos[1])
			WinMove($hYearCal, '', $pos[0], $pos[1])
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc
