Opt("WinWaitDelay",100)
Opt("WinTitleMatchMode",4)
Opt("WinDetectHiddenText",1)
Opt("MouseCoordMode",0)
#include <file.au3>
#include <math.au3>
#include <Date.au3>
#include <Array.au3>

$jahr = IniRead(@ScriptDir & "\Export.ini", "FEIERTAGS_JAHR", "FETA", @YEAR)
;~ $jahr =2006
$txtFile = "Feiertage.txt"
$Pfad = @ScriptDir & "\" & $txtFile
$arFeiertage = _Feiertage($jahr)
$file = FileOpen($Pfad, 2)
For $i = 0 To UBound($arFeiertage)-1
	FileWriteLine($file, $arFeiertage[$i])
Next
FileClose($file)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	Funktion _Feiertage($Jahr)
;
;	gibt die Feiertage des übergebenen Jahres
;	als sortiertes Array[TT.MM.JJJJ \ Feiertag] zurück
;	(Trennzeichen veränderbar über Variable: $Delimiter)
;
;	Autor	BugFix (bugfix@autoit.de)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
Func _Feiertage($year)
	Dim $4AdvDat, $3AdvDat, $2AdvDat, $1AdvDat, $TotSoDat, $BuBDat, $MutterDat, $ErnteDat, $tmp, $Delimiter = "."
	Dim $HDays[200]
	
;fixe Feiertage
	$HDays[0] = $year & "/01/01" ;& $Delimiter & "Neujahr"
	$HDays[1] = $year & "/01/06" ;& $Delimiter & "Heilige Drei Könige"
	$HDays[2] = $year & "/05/01" ;& $Delimiter & "Maifeiertag"
	$HDays[3] = $year & "/08/15" ;& $Delimiter & "Mariä Himmelfahrt"
	$HDays[4] = $year & "/10/26" ;& $Delimiter & "Nationalfeiertag"
	$HDays[5] = $year & "/11/01" ;& $Delimiter & "Allerheiligen"
	$HDays[6] = $year & "/12/08" ;& $Delimiter & "Mariä Empfängnis"
	$HDays[7] = $year & "/12/25" ;& $Delimiter & "1. Weihnachtsfeiertag"
	$HDays[8] = $year & "/12/26" ;& $Delimiter & "2. Weihnachtsfeiertag"

;variable Feiertage
	$aa = Mod($year, 19)
	$bb = Mod($year, 4)
	$cc = Mod($year, 7)
	$H1 = Int($year / 100)
	$H2 = Int($year / 400)
	$N = 4 + $H1 - $H2
	$MM = 15 + $H1 - $H2 - _Floor (Int((8 * $H1 + 13) / 25))
	$dd = Mod((19 * $aa + $MM), 30)
	$ee = Mod((2 * $bb + 4 * $cc + 6 * $dd + $N), 7)
	If $dd + $ee = 35 Then
		$Easter = 50
	Else
		If $dd = 28 And $ee = 6 And $aa > 10 Then
			$Easter = 49
		Else
			$Easter = 22 + $dd + $ee
		EndIf
	EndIf
	If $Easter < 32 Then
		$EasterDay = $Easter
		$EasterMonth = "03"
	Else
		$EasterDay = $Easter - 31
		$EasterMonth = "04"
	EndIf
	If $EasterDay < 10 Then
		$EasterDay = "0" & $EasterDay
	EndIf
	
	If $year < 1900 Then ;Datumsoperationen nur mgl. wenn > 1900 , Jahr wird konvertiert
		$RestJahr = Mod($year, 100)
		If _DateIsLeapYear($year) Then
			If $RestJahr < 10 Then
				$RestJahr = "0" & $RestJahr
			EndIf
			$Tempyear = 20 & $RestJahr
		Else
			If $RestJahr < 10 Then
				$RestJahr = "0" & $RestJahr
			EndIf
			$Tempyear = 19 & $RestJahr
		EndIf
		$EasterDate = $Tempyear & "/" & $EasterMonth & "/" & $EasterDay
	Else
		$EasterDate = $year & "/" & $EasterMonth & "/" & $EasterDay
	EndIf
	$WFastDate = _DateAdd( 'd', -52, $EasterDate)
	$RosDat = _DateAdd( 'd', -48, $EasterDate)
	$FastDat = _DateAdd( 'd', -47, $EasterDate)
	$AschDat = _DateAdd( 'd', -46, $EasterDate)
	$GrDoDat = _DateAdd( 'd', -3, $EasterDate)
	$KarDat = _DateAdd( 'd', -2, $EasterDate)
	$OSaDat = _DateAdd( 'd', -1, $EasterDate)
	$OSoDat = $EasterDate
	$OMoDat = _DateAdd( 'd', 1, $EasterDate)
	$HiFaDat = _DateAdd( 'd', 39, $EasterDate)
	$PfSoDat = _DateAdd( 'd', 49, $EasterDate)
	$PfMoDat = _DateAdd( 'd', 50, $EasterDate)
	$FroDat = _DateAdd( 'd', 60, $EasterDate)
	
	;Ermitteln nicht von Ostern abhängiger, veränderlicher Feiertage
	;Muttertag = 2. Sonntag im Mai ABER wenn Pfingsten = 2.Sonntag im Mai dann ist Muttertag am 1. Sonntag
	;Der 2. Sonntag kann nur zw. dem 8. u. 14.5. liegen
	For $maitag = 8 To 14
		If _DateToDayOfWeek($year, 5, $maitag) = 1 Then
			If $maitag < 10 Then
				$maitag = "0" & $maitag
			EndIf
			$MutterDat = $year & "/05/" & $maitag
			If $MutterDat = $PfSoDat Then
				$MutterDat = _DateAdd( 'd', -7, $year & "/05/" & $maitag)
			EndIf
			ExitLoop
		EndIf
	Next
	
	;Erntedankfest 1. Sonntag im Oktober (zw. 1. u. 7.10.)
	For $oktobertag = 1 To 7
		If _DateToDayOfWeek($year, 10, $oktobertag) = 1 Then
			$oktobertag = "0" & $oktobertag
			$ErnteDat = $year & "/10/" & $oktobertag
			ExitLoop
		EndIf
	Next
	
	;4.Advent = Sonntag vor 25.12. (zw. 18. u. 24.12.)
	For $deztag = 18 To 24
		If _DateToDayOfWeek($year, 12, $deztag) = 1 Then
			$4AdvDat = $year & "/12/" & $deztag
			$3AdvDat = _DateAdd( 'd', -7, $4AdvDat)
			$2AdvDat = _DateAdd( 'd', -14, $4AdvDat)
			$1AdvDat = _DateAdd( 'd', -21, $4AdvDat)
			$TotSoDat = _DateAdd( 'd', -28, $4AdvDat)
			$BuBDat = _DateAdd( 'd', -32, $4AdvDat)
			ExitLoop
		EndIf
	Next

	$HDays[09] = $OSaDat ;& $Delimiter & "Ostersamstag"
	$HDays[10] = $OSoDat ;& $Delimiter & "Ostersonntag"
	$HDays[11] = $OMoDat ;& $Delimiter & "Ostermontag"
	$HDays[12] = $HiFaDat ;& $Delimiter & "Christi Himmelfahrt"
	$HDays[13] = $PfSoDat ;& $Delimiter & "Pfingstsonntag"
	$HDays[14] = $PfMoDat ;& $Delimiter & "Pfingstmontag"
	$HDays[15] = $FroDat ;& $Delimiter & "Fronleichnam"
	$HDays[16] = $TotSoDat ;& $Delimiter & "Totensonntag"
	$HDays[17] = $1AdvDat ;& $Delimiter & "1. Advent"
	$HDays[18] = $2AdvDat ;& $Delimiter & "2. Advent"
	$HDays[19] = $3AdvDat ;& $Delimiter & "3. Advent"
	$HDays[20] = $4AdvDat ;& $Delimiter & "4. Advent"
	$counter = 21
	
	; Wochenenden einschließen (von peethebee)
	For $i = 0 to 365
;~ 		MsgBox(0, "", _DateAdd("d", $i, $year & "/01/01"))
		$wedate = _DateAdd("d", $i, $year & "/01/01")
		$parts = StringSplit($wedate, "/")
		$dow = _DateToDayOfWeek($parts[1], $parts[2], $parts[3])
		If $dow = 1 or $dow = 7 Then 
			$HDays[$counter] = $wedate
			$counter += 1
		EndIf
	Next
	ReDim $HDays[$counter]
	
	_ArraySort($HDays)

	Return $HDays
EndFunc   ;==>_Feiertage 