1*b1cdbd2cSJim Jagielski<?xml version="1.0" encoding="UTF-8"?>
2*b1cdbd2cSJim Jagielski<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd">
3*b1cdbd2cSJim Jagielski<!--***********************************************************
4*b1cdbd2cSJim Jagielski *
5*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one
6*b1cdbd2cSJim Jagielski * or more contributor license agreements.  See the NOTICE file
7*b1cdbd2cSJim Jagielski * distributed with this work for additional information
8*b1cdbd2cSJim Jagielski * regarding copyright ownership.  The ASF licenses this file
9*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the
10*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance
11*b1cdbd2cSJim Jagielski * with the License.  You may obtain a copy of the License at
12*b1cdbd2cSJim Jagielski *
13*b1cdbd2cSJim Jagielski *   http://www.apache.org/licenses/LICENSE-2.0
14*b1cdbd2cSJim Jagielski *
15*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing,
16*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an
17*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
18*b1cdbd2cSJim Jagielski * KIND, either express or implied.  See the License for the
19*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations
20*b1cdbd2cSJim Jagielski * under the License.
21*b1cdbd2cSJim Jagielski *
22*b1cdbd2cSJim Jagielski ***********************************************************-->
23*b1cdbd2cSJim Jagielski<script:module xmlns:script="http://openoffice.org/2000/script" script:name="BankHoliday" script:language="StarBasic">Option Explicit
24*b1cdbd2cSJim Jagielski
25*b1cdbd2cSJim JagielskiSub Main()
26*b1cdbd2cSJim Jagielski	Call CalAutopilotTable()
27*b1cdbd2cSJim JagielskiEnd Sub
28*b1cdbd2cSJim Jagielski
29*b1cdbd2cSJim Jagielski
30*b1cdbd2cSJim JagielskiFunction CalEasterTable&amp;(byval Year%)
31*b1cdbd2cSJim JagielskiDim B%,C%,D%,E%,F%,G%,H%,I%,K%,L%,M%,N%,O%, nMonth%, nDay%
32*b1cdbd2cSJim Jagielski       N = Year% mod 19
33*b1cdbd2cSJim Jagielski       B = int(Year% / 100)
34*b1cdbd2cSJim Jagielski       C = Year% mod 100
35*b1cdbd2cSJim Jagielski       D = int(B / 4)
36*b1cdbd2cSJim Jagielski       E = B mod 4
37*b1cdbd2cSJim Jagielski       F = int((B + 8) / 25)
38*b1cdbd2cSJim Jagielski       G = int((B - F + 1) / 3)
39*b1cdbd2cSJim Jagielski       H =(19 * N + B - D - G + 15) mod 30
40*b1cdbd2cSJim Jagielski       I = int(C / 4)
41*b1cdbd2cSJim Jagielski       K = C mod 4
42*b1cdbd2cSJim Jagielski       L =(32 + 2 * E + 2 * I - H - K) mod 7
43*b1cdbd2cSJim Jagielski       M = int((N + 11 * H + 22 * L) / 451)
44*b1cdbd2cSJim Jagielski       O = H + L - 7 * M + 114
45*b1cdbd2cSJim Jagielski       nDay = O mod 31 + 1
46*b1cdbd2cSJim Jagielski       nMonth = int(O / 31)
47*b1cdbd2cSJim Jagielski	   CalEasterTable&amp; = DateSerial(Year, nMonth,nDay)
48*b1cdbd2cSJim JagielskiEnd Function
49*b1cdbd2cSJim Jagielski
50*b1cdbd2cSJim Jagielski
51*b1cdbd2cSJim Jagielski&apos; Note: the following algorithm is valid only till the Year 2100.
52*b1cdbd2cSJim Jagielski&apos; but I have no Idea from which date in the paste it is valid
53*b1cdbd2cSJim JagielskiFunction CalOrthodoxEasterTable(ByVal iYear as Integer) as Long
54*b1cdbd2cSJim JagielskiDim R1%, R2%, R3%, RA%, R4%, RB%, R5%, RC%
55*b1cdbd2cSJim JagielskiDim lDate as Long
56*b1cdbd2cSJim Jagielski	R1 = iYear mod 19
57*b1cdbd2cSJim Jagielski	R2 = iYear mod 4
58*b1cdbd2cSJim Jagielski	R3 = iYear mod 7
59*b1cdbd2cSJim Jagielski	RA =19 * R1 + 16
60*b1cdbd2cSJim Jagielski	R4 = RA mod 30
61*b1cdbd2cSJim Jagielski	RB = 2 * R2 + 4 * R3 + 6 * R4
62*b1cdbd2cSJim Jagielski	R5 = RB mod 7
63*b1cdbd2cSJim Jagielski	RC = R4 + R5
64*b1cdbd2cSJim Jagielski	lDate = DateSerial(iYear, 4,4)
65*b1cdbd2cSJim Jagielski	CalOrthodoxEasterTable() = lDate + RC
66*b1cdbd2cSJim JagielskiEnd Function
67*b1cdbd2cSJim Jagielski
68*b1cdbd2cSJim Jagielski
69*b1cdbd2cSJim JagielskiSub CalInitGlobalVariablesDate()
70*b1cdbd2cSJim JagielskiDim i as Integer
71*b1cdbd2cSJim Jagielski	For i = 1 To 374
72*b1cdbd2cSJim Jagielski		CalBankholidayName$(i) = &quot;&quot;
73*b1cdbd2cSJim Jagielski		CalTypeOfBankHoliday%(i) = cHolidayType_None
74*b1cdbd2cSJim Jagielski	Next
75*b1cdbd2cSJim JagielskiEnd Sub
76*b1cdbd2cSJim Jagielski
77*b1cdbd2cSJim Jagielski
78*b1cdbd2cSJim JagielskiSub CalInsertBankholiday(byval CurDate as Long, byval EventName as String, ByVal iLevel as Integer)
79*b1cdbd2cSJim JagielskiDim iDay
80*b1cdbd2cSJim Jagielski	iDay =(Month(CurDate)-1)*31 +Day(CurDate)
81*b1cdbd2cSJim Jagielski
82*b1cdbd2cSJim Jagielski	If 0 &lt;&gt; CalTypeOfBankHoliday(iDay) Then
83*b1cdbd2cSJim Jagielski		If iLevel &lt; CalTypeOfBankHoliday(iDay) Then
84*b1cdbd2cSJim Jagielski			CalTypeOfBankHoliday(iDay) = iLevel
85*b1cdbd2cSJim Jagielski		End If
86*b1cdbd2cSJim Jagielski	Else
87*b1cdbd2cSJim Jagielski		CalTypeOfBankHoliday(iDay) = iLevel
88*b1cdbd2cSJim Jagielski	End If
89*b1cdbd2cSJim Jagielski
90*b1cdbd2cSJim Jagielski	If CalBankHolidayName(iDay) = &quot;&quot; Then
91*b1cdbd2cSJim Jagielski		CalBankHolidayName(iDay) = EventName
92*b1cdbd2cSJim Jagielski	Else
93*b1cdbd2cSJim Jagielski		CalBankHolidayName(iDay) = CalBankHolidayName(iDay) &amp; &quot; / &quot; &amp; EventName
94*b1cdbd2cSJim Jagielski	End If
95*b1cdbd2cSJim JagielskiEnd Sub
96*b1cdbd2cSJim Jagielski
97*b1cdbd2cSJim JagielskiFunction CalMaxDayInMonth(ByVal iYear as Integer, ByVal iMonth as Integer) as Integer
98*b1cdbd2cSJim Jagielski&apos; delivers the maximum Day of a month in a certain year
99*b1cdbd2cSJim Jagielski	Dim TmpDate as Long
100*b1cdbd2cSJim Jagielski	Dim	MaxDay as Long
101*b1cdbd2cSJim Jagielski
102*b1cdbd2cSJim Jagielski	MaxDay = 28
103*b1cdbd2cSJim Jagielski	TmpDate = DateSerial(iYear, iMonth, MaxDay)
104*b1cdbd2cSJim Jagielski
105*b1cdbd2cSJim Jagielski	While Month(TmpDate) = iMonth
106*b1cdbd2cSJim Jagielski		MaxDay = MaxDay + 1
107*b1cdbd2cSJim Jagielski		TmpDate = TmpDate + 1
108*b1cdbd2cSJim Jagielski	Wend
109*b1cdbd2cSJim Jagielski	Maxday = MaxDay - 1
110*b1cdbd2cSJim Jagielski	CalMaxDayInMonth() = MaxDay
111*b1cdbd2cSJim JagielskiEnd Function
112*b1cdbd2cSJim Jagielski
113*b1cdbd2cSJim Jagielski
114*b1cdbd2cSJim JagielskiFunction CalGetIntOfShortMonthName(ByVal MonthName as String) as Integer
115*b1cdbd2cSJim JagielskiDim i as Integer
116*b1cdbd2cSJim JagielskiDim nMonth as Integer
117*b1cdbd2cSJim Jagielski
118*b1cdbd2cSJim Jagielski	nMonth = Val(MonthName)
119*b1cdbd2cSJim Jagielski
120*b1cdbd2cSJim Jagielski	If (1 &lt;= nMonth And 12 &gt;= nMonth) Then
121*b1cdbd2cSJim Jagielski		CalGetIntOfShortMonthName = nMonth
122*b1cdbd2cSJim Jagielski		Exit Function
123*b1cdbd2cSJim Jagielski	End If
124*b1cdbd2cSJim Jagielski
125*b1cdbd2cSJim Jagielski	MonthName = UCase(Trim(Left(MonthName, 3)))
126*b1cdbd2cSJim Jagielski
127*b1cdbd2cSJim Jagielski	For i = 0 To 11
128*b1cdbd2cSJim Jagielski		If (UCase(cCalShortMonthNames(i)) = MonthName) Then
129*b1cdbd2cSJim Jagielski			CalGetIntOfShortMonthName = i+1
130*b1cdbd2cSJim Jagielski			Exit Function
131*b1cdbd2cSJim Jagielski		End If
132*b1cdbd2cSJim Jagielski	Next
133*b1cdbd2cSJim Jagielski
134*b1cdbd2cSJim Jagielski	&apos;	Not Found
135*b1cdbd2cSJim Jagielski	CalGetIntOfShortMonthName = 0
136*b1cdbd2cSJim JagielskiEnd Function
137*b1cdbd2cSJim Jagielski
138*b1cdbd2cSJim Jagielski
139*b1cdbd2cSJim JagielskiSub CalInsertOwnDataInTables(ByVal iSelYear as Integer)
140*b1cdbd2cSJim Jagielski	&apos; inserts the individual data from the table into the previously unsorted list
141*b1cdbd2cSJim JagielskiDim CurEventName as String
142*b1cdbd2cSJim JagielskiDim CurEvMonth as Integer
143*b1cdbd2cSJim JagielskiDim CurEvDay as Integer
144*b1cdbd2cSJim JagielskiDim LastIndex as Integer
145*b1cdbd2cSJim JagielskiDim i as Integer
146*b1cdbd2cSJim JagielskiDim DateStr as String
147*b1cdbd2cSJim Jagielski	LastIndex = Ubound(DlgCalModel.lstOwnData.StringItemList())
148*b1cdbd2cSJim Jagielski	For i = 0 To LastIndex
149*b1cdbd2cSJim Jagielski		If GetSelectedDateUnits(CurEvDay, CurEvMonth, i) &lt;&gt; SBDATEUNDEFINED Then
150*b1cdbd2cSJim Jagielski			CurEventName = CalGetNameOfEvent(i)
151*b1cdbd2cSJim Jagielski			CalInsertBankholiday(DateSerial(iSelYear, CurEvMonth, CurEvDay), CurEventName, cHolidayType_Own)
152*b1cdbd2cSJim Jagielski		End If
153*b1cdbd2cSJim Jagielski	Next
154*b1cdbd2cSJim JagielskiEnd Sub
155*b1cdbd2cSJim Jagielski
156*b1cdbd2cSJim Jagielski
157*b1cdbd2cSJim Jagielski&apos; Finds eg the first,second Monday in a month
158*b1cdbd2cSJim Jagielski&apos; Note: in This Function the week starts with the Sunday
159*b1cdbd2cSJim JagielskiFunction GetMonthDate(YearInt as Integer, iMonth as Integer, iWeekDay as Integer, iOffset as Integer)
160*b1cdbd2cSJim JagielskiDim bFound as Boolean
161*b1cdbd2cSJim JagielskiDim lDate as Long
162*b1cdbd2cSJim Jagielski	&apos;	1st Tue in Nov : Election Day, Half
163*b1cdbd2cSJim Jagielski	bFound = False
164*b1cdbd2cSJim Jagielski	lDate = DateSerial(YearInt, iMonth, 1)
165*b1cdbd2cSJim Jagielski	Do
166*b1cdbd2cSJim Jagielski		If iWeekDay = WeekDay(lDate) Then
167*b1cdbd2cSJim Jagielski			bFound = True
168*b1cdbd2cSJim Jagielski		Else
169*b1cdbd2cSJim Jagielski			lDate = lDate + 1
170*b1cdbd2cSJim Jagielski		End If
171*b1cdbd2cSJim Jagielski	Loop Until bFound
172*b1cdbd2cSJim Jagielski	GetMonthDate = lDate + iOffset
173*b1cdbd2cSJim JagielskiEnd Function
174*b1cdbd2cSJim Jagielski
175*b1cdbd2cSJim Jagielski
176*b1cdbd2cSJim Jagielski&apos; Finds the next weekday after a fixed date
177*b1cdbd2cSJim Jagielski&apos; e.g. Midsummerfeast in Sweden: next Saturday after 20th June
178*b1cdbd2cSJim JagielskiFunction GetNextWeekDay(iYear as Integer, iMonth as Integer, iDay as Integer, iWeekDay as Integer)
179*b1cdbd2cSJim JagielskiDim lDate as Long
180*b1cdbd2cSJim JagielskiDim iCurWeekDay as Integer
181*b1cdbd2cSJim Jagielski	lDate = DateSerial(iYear, iMonth, iDay)
182*b1cdbd2cSJim Jagielski	iCurWeekDay = WeekDay(lDate)
183*b1cdbd2cSJim Jagielski	While iCurWeekDay &lt;&gt; iWeekDay
184*b1cdbd2cSJim Jagielski		lDate = lDate + 1
185*b1cdbd2cSJim Jagielski		iCurWeekDay = WeekDay(lDate)
186*b1cdbd2cSJim Jagielski	Wend
187*b1cdbd2cSJim Jagielski	GetNextWeekDay() = lDate
188*b1cdbd2cSJim JagielskiEnd Function
189*b1cdbd2cSJim Jagielski
190*b1cdbd2cSJim Jagielski
191*b1cdbd2cSJim JagielskiSub AddFollowUpHolidays(ByVal lStartDate as Long, iCount as Integer, HolidayName as String, iType as Integer)
192*b1cdbd2cSJim JagielskiDim lDate as Long
193*b1cdbd2cSJim Jagielski	For lDate = lStartDate + 1 To lStartDate + 4
194*b1cdbd2cSJim Jagielski		CalInsertBankholiday(lDate, HolidayName, iType)
195*b1cdbd2cSJim Jagielski	Next lDate
196*b1cdbd2cSJim JagielskiEnd Sub
197*b1cdbd2cSJim Jagielski</script:module>
198