private function GetPeriodicEventTime($eventDate, $arParams, $number)
{
$number = intval($number);
if ($number < 1)
$number = 1;
if (!isset($arParams["interval"]))
$arParams["interval"] = 1;
$arParams["interval"] = intval($arParams["interval"]);
if (!isset($arParams["freq"]) || !in_array(mb_strtoupper($arParams["freq"]), array('DAILY', 'WEEKLY', 'MONTHLY', 'YEARLY')))
$arParams["freq"] = "DAILY";
$arParams["freq"] = mb_strtoupper($arParams["freq"]);
if ($arParams["freq"] == 'WEEKLY')
{
if (isset($arParams["byday"]))
{
$arOld = explode(",", $arParams["byday"]);
$arNew = array();
foreach ($arOld as $v)
{
$v = trim($v);
if (is_numeric($v))
{
$v = intval($v);
if ($v >= 0 && $v < 7)
$arNew[] = intval($v);
}
}
if (count($arNew) > 0)
{
sort($arNew, SORT_NUMERIC);
$arParams["byday"] = implode(",", $arNew);
}
else
{
unset($arParams["byday"]);
}
}
if (!isset($arParams["byday"]))
{
$arParams["byday"] = date("w", $eventDate) - 1;
if ($arParams["byday"] < 0)
$arParams["byday"] = 6;
}
}
$newEventDate = $eventDate;
switch ($arParams["freq"])
{
case 'DAILY':
$newEventDate = mktime(date("H", $newEventDate), date("i", $newEventDate), date("s", $newEventDate), date("m", $newEventDate), date("d", $newEventDate) + $arParams["interval"] * ($number - 1), date("Y", $newEventDate));
break;
case 'WEEKLY':
$newEventDateDay = date("w", $newEventDate) - 1;
if ($newEventDateDay < 0)
$newEventDateDay = 6;
$bStartFound = false;
$arDays = explode(",", $arParams["byday"]);
foreach ($arDays as $day)
{
if ($day >= $newEventDateDay)
{
$bStartFound = true;
if ($day > $newEventDateDay)
{
$newEventDate = mktime(date("H", $newEventDate), date("i", $newEventDate), date("s", $newEventDate), date("m", $newEventDate), date("d", $newEventDate) + ($day - $newEventDateDay), date("Y", $newEventDate));
$newEventDateDay = $day;
}
break;
}
}
if (!$bStartFound)
{
$newEventDate = mktime(date("H", $newEventDate), date("i", $newEventDate), date("s", $newEventDate), date("m", $newEventDate), date("d", $newEventDate) + (($arParams["interval"] - 1) * 7 + (6 - $newEventDateDay) + $arDays[0] + 1), date("Y", $newEventDate));
$newEventDateDay = $arDays[0];
}
$d = $i = 0;
$priorDay = $newEventDateDay;
foreach ($arDays as $day)
{
if ($newEventDateDay >= $day)
continue;
$d += $day - $priorDay;
$priorDay = $day;
$i++;
if ($i >= $number - 1)
break;
}
while ($i < $number - 1)
{
$bFirst = true;
foreach ($arDays as $day)
{
if ($bFirst)
$d += ($arParams["interval"] - 1) * 7 + (6 - $priorDay) + $day + 1;
else
$d += $day - $priorDay;
$bFirst = false;
$priorDay = $day;
$i++;
if ($i >= $number - 1)
break;
}
}
$newEventDate = mktime(date("H", $newEventDate), date("i", $newEventDate), date("s", $newEventDate), date("m", $newEventDate), date("d", $newEventDate) + $d, date("Y", $newEventDate));
break;
case 'MONTHLY':
$newEventDate = mktime(date("H", $newEventDate), date("i", $newEventDate), date("s", $newEventDate), date("m", $newEventDate) + $arParams["interval"] * ($number - 1), date("d", $newEventDate), date("Y", $newEventDate));
break;
case 'YEARLY':
$newEventDate = mktime(date("H", $newEventDate), date("i", $newEventDate), date("s", $newEventDate), date("m", $newEventDate), date("d", $newEventDate), date("Y", $newEventDate) + $arParams["interval"] * ($number - 1));
break;
}
return $newEventDate;
}