#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', 800, 600, $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