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&(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& = DateSerial(Year, nMonth,nDay) 48*b1cdbd2cSJim JagielskiEnd Function 49*b1cdbd2cSJim Jagielski 50*b1cdbd2cSJim Jagielski 51*b1cdbd2cSJim Jagielski' Note: the following algorithm is valid only till the Year 2100. 52*b1cdbd2cSJim Jagielski' 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) = "" 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 <> CalTypeOfBankHoliday(iDay) Then 83*b1cdbd2cSJim Jagielski If iLevel < 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) = "" Then 91*b1cdbd2cSJim Jagielski CalBankHolidayName(iDay) = EventName 92*b1cdbd2cSJim Jagielski Else 93*b1cdbd2cSJim Jagielski CalBankHolidayName(iDay) = CalBankHolidayName(iDay) & " / " & 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' 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 <= nMonth And 12 >= 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 ' 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 ' 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) <> 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' Finds eg the first,second Monday in a month 158*b1cdbd2cSJim Jagielski' 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 ' 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' Finds the next weekday after a fixed date 177*b1cdbd2cSJim Jagielski' 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 <> 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