Hi Dana,
The following code illustrates the possibilities, where _ is a weekend day of public holiday and X is a workday - my postulate the longest possible weekend/public holiday period is three days long, maybe Easter is a problem Good Friday & Easter Monday for you:
a. ___XXX
b. __XXX
c. _XXX
d. X_XX
e. X__XX
f. X___XX
g. XX__X
h. XX___X
i. XXX
Now we have integrated support for first, second, and third day of the month, first, second, third workday of the month (non-weekend day, non-public holiday), the only problem I see is, if the 4th day of a month is a public holiday/weekend day and the third workday (excl weekends and public holidays) falls on the 5th (g.), f. (2nd, 3rd, 4th day are public holidays/weekend days, here 4th is a problem) and h. (3rd, 4th, and 5th day are public holidays/weekend days).
We can create a time window that's open on the 3rd, checks if it's a public holiday/weekend day and shift to the 4th day and a second time window that uses this first one and checks to see if it also falls on a public holiday/weekend day, then shift one day more.
This is all pretty complex, I will come up with a time window combination after work ... my boss will kill me if I make this during work hours ... ;-), unless I can find a use for it internally, which I cannot for now.
Just my thoughts, try and build on that.
Regards,
HP