• Модуль: dav
  • Путь к файлу: ~/bitrix/modules/dav/classes/general/calendarhandler.php
  • Класс: CDavCalendarHandler
  • Вызов: CDavCalendarHandler::GetPeriodicEventTime
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;
	}