#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Date.au3>
#include <Funktionen.au3>

Opt("GUIOnEventMode", 1)

Global Const $aMonate[12] = ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"]
Global Const $aWochenTage[8] = ["konnte Wochentag nicht berechnen", "Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"]

Global $aJulCal[3]
Global $aGregCal[3] = [@MDAY, @MON, @YEAR]
Global $iJulDatum = Date_Gregorian2JD($aGregCal[0], $aGregCal[1], $aGregCal[2])
Date_JD2Julian($iJulDatum, $aJulCal)

#region GUI
$KalenderGUI = GUICreate("Kalenderrechner", 218, 433, 548, 362, BitOR($WS_POPUPWINDOW, $WS_CAPTION))
GUISetOnEvent($GUI_EVENT_CLOSE, "CloseGUI")

GUICtrlCreateGroup("Gregorianischer Kalender", 8, 8, 201, 73)
$guiGregTag = GUICtrlCreateInput("1", 24, 48, 41, 21, BitOR($ES_AUTOHSCROLL, $ES_NUMBER))
GUICtrlSetOnEvent(-1, "GUIValueChanged")
$guiGregMon = GUICtrlCreateCombo("", 72, 48, 73, 25)
GUICtrlSetOnEvent(-1, "GUIValueChanged")
GUICtrlSetData(-1, "Januar|Februar|März|April|Mai|Juni|Juli|August|September|Oktober|November|Dezember")
$guiGregJahr = GUICtrlCreateInput("2011", 152, 48, 41, 21, $ES_AUTOHSCROLL)
GUICtrlSetOnEvent(-1, "GUIValueChanged")
GUICtrlCreateLabel("Tag", 32, 30, 23, 17)
GUICtrlCreateLabel("Monat", 88, 30, 34, 17)
GUICtrlCreateLabel("Jahr", 158, 30, 24, 17)

GUICtrlCreateGroup("Julianischer Kalender", 8, 88, 201, 73)
$guiJulTag = GUICtrlCreateInput("1", 24, 128, 41, 21, BitOR($ES_AUTOHSCROLL, $ES_NUMBER))
GUICtrlSetOnEvent(-1, "GUIValueChanged")
$guiJulMon = GUICtrlCreateCombo("", 72, 128, 73, 25)
GUICtrlSetOnEvent(-1, "GUIValueChanged")
GUICtrlSetData(-1, "Januar|Februar|März|April|Mai|Juni|Juli|August|September|Oktober|November|Dezember")
$guiJulJahr = GUICtrlCreateInput("", 152, 128, 41, 21, $ES_AUTOHSCROLL)
GUICtrlSetOnEvent(-1, "GUIValueChanged")
GUICtrlCreateLabel("Tag", 32, 110, 23, 17)
GUICtrlCreateLabel("Monat", 88, 110, 34, 17)
GUICtrlCreateLabel("Jahr", 158, 110, 24, 17)

GUICtrlCreateGroup("Julianisches Datum", 8, 168, 201, 73)
$guiJulDatum = GUICtrlCreateInput("1", 24, 206, 169, 21, BitOR($ES_AUTOHSCROLL, $ES_NUMBER))
GUICtrlSetOnEvent(-1, "GUIValueChanged")
GUICtrlCreateLabel("Julianisches Datum", 32, 188, 95, 17)

GUICtrlCreateGroup("Wochentag", 8, 248, 201, 57)
$guiWochenTag = GUICtrlCreateInput("", 24, 272, 169, 21, BitOR($ES_AUTOHSCROLL,$ES_READONLY))

$guiLogEdit = GUICtrlCreateEdit("", 0, 320, 214, 112)

RefreshValues()
GUISetState(@SW_SHOW)
#endregion GUI


While 1
	Sleep(100)
WEnd


Func RefreshValues()
	GUICtrlSetData($guiGregTag, Int($aGregCal[0]))
	ControlCommand($KalenderGUI, "", $guiGregMon, "SelectString", GetMonthName($aGregCal[1]))
	GUICtrlSetData($guiGregJahr, Int($aGregCal[2]))

	GUICtrlSetData($guiJulTag, $aJulCal[0])
	ControlCommand($KalenderGUI, "", $guiJulMon, "SelectString", GetMonthName($aJulCal[1]))
	GUICtrlSetData($guiJulJahr, $aJulCal[2])

	GUICtrlSetData($guiJulDatum, $iJulDatum)

	GUICtrlSetData($guiWochenTag, $aWochenTage[_DateToDayOfWeek($aGregCal[2], $aGregCal[1], $aGregCal[0])])

	GUICtrlSetData($guiLogEdit, "")
	If $iJulDatum < 2299161 Then _Fehler(1)	; Gregorianisches Datum außerhalb des gültigen Bereiches
EndFunc   ;==>RefreshValues



Func GUIValueChanged()
	If Int(ControlGetText($KalenderGUI, "", $guiGregTag)) <> $aGregCal[0] Or Int(GetMonthNumber(ControlCommand($KalenderGUI, "", $guiGregMon, "GetCurrentSelection", ""))) <> $aGregCal[1] Or $aGregCal[2] <> Int(ControlGetText($KalenderGUI, "", $guiGregJahr)) Then

		If Not StringRegExp(ControlGetText($KalenderGUI, "", $guiGregTag), "^[-\d]+$") Or Int(ControlGetText($KalenderGUI, "", $guiGregTag)) < 1 Or Int(ControlGetText($KalenderGUI, "", $guiGregTag)) > 31 Then
			_Fehler(2, "Gregorianisches Datum: Tag")
			Return
		EndIf
		If Not StringRegExp(ControlGetText($KalenderGUI, "", $guiGregJahr), "^[-\d]+$") Then
			_Fehler(2, "Gregorianisches Datum: Jahr")
			Return
		EndIf
		$aGregCal[0] = Int(ControlGetText($KalenderGUI, "", $guiGregTag))
		$aGregCal[1] = Int(GetMonthNumber(ControlCommand($KalenderGUI, "", $guiGregMon, "GetCurrentSelection", "")))
		$aGregCal[2] = Int(ControlGetText($KalenderGUI, "", $guiGregJahr))
		$iJulDatum = Date_Gregorian2JD($aGregCal[0], $aGregCal[1], $aGregCal[2])
		Date_JD2Julian($iJulDatum, $aJulCal)
		RefreshValues()

	ElseIf $aJulCal[0] <> Int(ControlGetText($KalenderGUI, "", $guiJulTag)) Or $aJulCal[1] <> Int(GetMonthNumber(ControlCommand($KalenderGUI, "", $guiJulMon, "GetCurrentSelection", ""))) Or $aJulCal[2] <> Int(ControlGetText($KalenderGUI, "", $guiJulJahr)) Then
		If Not StringRegExp(ControlGetText($KalenderGUI, "", $guiJulTag), "^[-\d]+$") Or Int(ControlGetText($KalenderGUI, "", $guiJulTag)) < 1 Or Int(ControlGetText($KalenderGUI, "", $guiJulTag)) > 31 Then
			_Fehler(2, "Julianischer Kalender: Tag")
			Return
		EndIf
		If Not StringRegExp(ControlGetText($KalenderGUI, "", $guiJulJahr), "^[-\d]+$") Then
			_Fehler(2, "Julianischer Kalender: Jahr")
			Return
		EndIf
		$aJulCal[0] = Int(ControlGetText($KalenderGUI, "", $guiJulTag))
		$aJulCal[1] = Int(GetMonthNumber(ControlCommand($KalenderGUI, "", $guiJulMon, "GetCurrentSelection", "")))
		$aJulCal[2] = Int(ControlGetText($KalenderGUI, "", $guiJulJahr))
		$iJulDatum = Date_Julian2JD($aJulCal[0], $aJulCal[1], $aJulCal[2])
		Date_JD2Gregor($iJulDatum, $aGregCal)
		RefreshValues()

	ElseIf $iJulDatum <> Int(ControlGetText($KalenderGUI, "", $guiJulDatum)) Then
		If Not StringRegExp(ControlGetText($KalenderGUI, "", $guiJulDatum), "^[\d]+$") Then
			_Fehler(2, "Julianisches Datum")
			Return
		EndIf
		$iJulDatum = Int(ControlGetText($KalenderGUI, "", $guiJulDatum))
		Date_JD2Julian($iJulDatum, $aJulCal)
		Date_JD2Gregor($iJulDatum, $aGregCal)
		RefreshValues()
	EndIf
EndFunc   ;==>GUIValueChanged


Func GetMonthName($iMonthNumber)
	$iMonthNumber = Int($iMonthNumber)
	If $iMonthNumber > UBound($aMonate) Then Return SetError(1, 0, "")
	Return $aMonate[$iMonthNumber - 1]
EndFunc   ;==>GetMonthName

Func GetMonthNumber(Const $sMonthName)
	For $i = 0 To UBound($aMonate) - 1
		If $aMonate[$i] = $sMonthName Then Return $i + 1
	Next
	Return SetError(1, 0, -1)
EndFunc   ;==>GetMonthNumber


Func _Fehler(Const $eCode, Const $extendedInfo = "")
	Local $sText = "> "

	Switch $eCode

		Case 1 ; Gregorianischer Kalender außerhalb gültigen Bereiches
			$sText &= "Gregorianischer Kalender außerhalb des gültigen Bereiches (vor dem 15. Oktober 1582)"

		Case 2	; ungültige Eingabe
			$sText &= "Ungültige Eingabe im Feld " & $extendedInfo
	EndSwitch
	GUICtrlSetData($guiLogEdit, $sText & @CRLF, 1)
EndFunc   ;==>_Fehler

Func CloseGUI()
	Exit
EndFunc   ;==>CloseGUI