Вычисление повторяемости событий в календаре
м.б., поможет habrahabr.ru/blogs/infosphere/120870/
Удобней всего наверно сделать определенные промежутки, и для каждого делать отдельную функцию возвращающую следующую дату:
getNextWorkDay(date), getNextWeekDay(date), getNextFirstDayOfMonth(date) итд.
+ Простые задачи на много проще универсальных
+ Это будет быстрей универсальной задачи
+ Это легче поддерживать
 — Все промежутки нужно будет описывать отдельно