public function Request($action)
{
global $APPLICATION;
$sectionId = ($_REQUEST['section_id'] == 'none') ? 'none' : intval($_REQUEST['section_id']);
CUtil::JSPostUnEscape();
// Export calendar
if ($action == 'export')
{
// We don't need to check access couse we will check security SIGN from the URL
$bCheck = $_GET['check'] == 'Y';
$calendarId = $_GET['calendar_id'];
if ($bCheck) // Just for access check from calendar interface
{
$GLOBALS['APPLICATION']->RestartBuffer();
if ($this->CheckSign($_GET['sign'], intval($_GET['user_id']), $calendarId > 0 ? $calendarId : 'superposed_calendars'))
echo 'BEGIN:VCALENDAR';
die();
}
if (!isset($calendarId) || intval($calendarId) <= 0) // Export entire view
{
$this->ReturnICal_SP(array(
'userId' => intval($_GET['user_id']),
'sign' => $_GET['sign']
));
}
else // Export calendar
{
$this->ReturnICal(array(
'calendarId' => intval($calendarId),
'userId' => intval($_GET['user_id']),
'sign' => $_GET['sign'],
'ownerType' => $_GET['owner_type'],
'ownerId' => $_GET['owner_id'],
'iblockId' => $_GET['ibl']
));
}
}
else
{
// First of all - CHECK ACCESS
$this->GetPermissions(array('userId' => $curUserId));
if (!$this->bAccess)
return $APPLICATION->ThrowException(GetMessage("EC_ACCESS_DENIED"));
$APPLICATION->RestartBuffer();
if (!check_bitrix_sessid())
{
echo '';
return;
}
switch ($action)
{
// * * * * * Add and Edit event * * * * *
case 'add':
case 'edit':
if ($this->bReadOnly)
return $this->ThrowError(GetMessage('EC_ACCESS_DENIED'));
$id = intval($_POST['id']);
// If other calendar was selected for event
if ($_POST['b_recreate'] == 'Y' && intval($_POST['old_calendar']))
{
$old_id = $id;
$id = 0;
$action = 'add';
}
$from_ts = MakeTimeStamp($_POST['from'], getTSFormat());
$to_ts = MakeTimeStamp($_POST['to'], getTSFormat());
$arGuests = isset($_POST['guest']) ? $_POST['guest'] : false;
$bPeriodic = isset($_POST['per_type']) && $_POST['per_type'] != 'none';
if($bPeriodic)
{
$per_type = trim($_POST['per_type']);
$per_count = intval($_POST['per_count']);
$per_from_ts = MakeTimeStamp($_POST['per_from'], getTSFormat());
if ($per_from_ts < $from_ts)
$per_from_ts = mktime(date("H", $from_ts), date("i", $from_ts), date("s", $from_ts), date("m", $per_from_ts), date("d", $per_from_ts), date("Y", $per_from_ts)); // Set time of current event for all events in period
else
$per_from_ts = $from_ts;
$per_from = date(getDateFormat(), $per_from_ts);
$per_ts = ($_POST['per_to'] == 'no_limit') ? 2145938400 : MakeTimeStamp($_POST['per_to'], getTSFormat());
$per_to = date(getDateFormat(), $per_ts);
$per_week_days = ($per_type == 'weekly') ? trim($_POST['per_week_days']) : '';
$per_len = intval($to_ts - $from_ts);
$from = $per_from;
$to = $per_to;
$PROP = Array(
'PERIOD_TYPE' => mb_strtoupper($per_type),
'PERIOD_COUNT' => $per_count,
'EVENT_LENGTH' => $per_len,
'PERIOD_ADDITIONAL' => $per_week_days,
);
}
else
{
$from = date(getDateFormat(), $from_ts);
$to = date(getDateFormat(), $to_ts);
$PROP = Array('PERIOD_TYPE' => 'NONE');
}
if ($_POST['rem'] == 'Y' && floatval($_POST['rem_count']) > 0 && in_array($_POST['rem_type'], array('min','hour','day')))
$arRem = array('count' => floatval($_POST['rem_count']), 'type' => $_POST['rem_type']);
else
$arRem = false;
$PROP['ACCESSIBILITY'] = ($_POST['accessibility'] && in_array($_POST['accessibility'], array('quest', 'free','absent'))) ? $_POST['accessibility'] : 'busy';
$PROP['IMPORTANCE'] = ($_POST['importance'] && in_array($_POST['importance'], array('high', 'low'))) ? $_POST['importance'] : 'normal';
$PROP['PRIVATE'] = ($_POST['private_event'] == true) ? $_POST['private_event'] : false;
if (isset($_POST['host']) && intval($_POST['host']) > 0)
$PROP['PARENT'] = intval($_POST['host']);
$isMeeting = !!$_POST['is_meeting'];
$arParams = array(
'iblockId' => $this->iblockId,
'ownerType' => $this->ownerType,
'ownerId' => $this->ownerId,
'sectionId' => $sectionId,
'calendarId' => $_POST['calendar'],
'bNew' => $action == 'add',
'id' => $id,
'name' => trim($_POST['name']),
'desc' => trim($_POST['desc']),
'dateFrom' => cutZeroTime($from),
'dateTo' => cutZeroTime($to),
'isMeeting' => $isMeeting,
'prop' => $PROP,
'remind' => $arRem,
'fullUrl' => $this->fullUrl,
'userId' => $this->userId,
'pathToUserCalendar' => $this->pathToUserCalendar,
'pathToGroupCalendar' => $this->pathToGroupCalendar,
'userIblockId' => $this->userIblockId,
'location' => array(
'old' => trim($_POST['location_old']),
'new' => trim($_POST['location_new']),
'change' => $_POST['location_change'] == 'Y'
),
'RMiblockId' => $this->allowResMeeting ? $this->RMiblockId : 0,
'allowResMeeting' => $this->allowResMeeting,
'RMPath' => $this->RMPath,
'VMiblockId' => $this->allowVideoMeeting ? $this->VMiblockId : 0,
'allowVideoMeeting' => $this->allowVideoMeeting,
'VMPath' => $this->VMPath,
'VMPathDetail' => $this->VMPathDetail
);
if ($isMeeting)
{
$arParams['guests'] = $arGuests;
$arParams['meetingText'] = trim($_POST['meeting_text']);
$arParams['setSpecialNotes'] = !!$_POST['setSpecialNotes'];
if(isset($_POST['status']))
$arParams['status'] = $_POST['status'];
$arParams['reinviteParamsList'] = $this->reinviteParamsList;
}
$eventId = $this->SaveEvent($arParams);
// We successfully create new event and have to delete old
if (is_int($eventId) && $eventId > 0 && $_POST['b_recreate'] == 'Y' && intval($_POST['old_calendar']))
{
// delete original event
$res = CECEvent::Delete(array(
'id' => $old_id,
'iblockId' => $this->iblockId,
'ownerType' => $this->ownerType,
'ownerId' => $this->ownerId,
'userId' => $this->userId,
'pathToUserCalendar' => $this->pathToUserCalendar,
'pathToGroupCalendar' => $this->pathToGroupCalendar,
'userIblockId' => $this->userIblockId,
'RMiblockId' => $this->allowResMeeting ? $this->RMiblockId : 0,
'allowResMeeting' => $this->allowResMeeting,
'VMiblockId' => $this->allowVideoMeeting ? $this->VMiblockId : 0,
'allowVideoMeeting' => $this->allowVideoMeeting,
));
if ($res !== true)
return $this->ThrowError($res <> '' ? $res : GetMessage('EC_EVENT_DEL_ERROR'));
}
break;
// * * * * * Delete event * * * * *
case 'delete':
if ($this->bReadOnly)
return $this->ThrowError(GetMessage('EC_ACCESS_DENIED'));
$res = CECEvent::Delete(array(
'id' => intval($_POST['id']),
'iblockId' => $this->iblockId,
'ownerType' => $this->ownerType,
'ownerId' => $this->ownerId,
'userId' => $this->userId,
'pathToUserCalendar' => $this->pathToUserCalendar,
'pathToGroupCalendar' => $this->pathToGroupCalendar,
'userIblockId' => $this->userIblockId,
'RMiblockId' => $this->allowResMeeting ? $this->RMiblockId : 0,
'allowResMeeting' => $this->allowResMeeting,
'VMiblockId' => $this->allowVideoMeeting ? $this->VMiblockId : 0,
'allowVideoMeeting' => $this->allowVideoMeeting,
));
if ($res !== true)
return $this->ThrowError($res <> '' ? $res : GetMessage('EC_EVENT_DEL_ERROR'));
?>
$this->ClearCache($this->cachePath.'events/'.$this->iblockId.'/');
break;
// * * * * * Load events for some time limits * * * * *
case 'load_events':
$this->SetLoadLimits(intval($_POST['month']), intval($_POST['year']));
$cl = ($_POST['usecl'] == 'Y' && !isset($_POST['cl'])) ? Array() : $_POST['cl'];
$this->arCalendarIds = $cl;
$this->arHiddenCals_ = is_array($_POST['hcl']) ? $_POST['hcl'] : Array();
$ev = $this->GetEventsEx(array("bJS" => true, 'bCheckSPEvents' => true));
if ($this->allowSuperpose && !$this->bListMode)
{
$this->HandleSuperpose($this->arSPIblIds);
$spev = $this->GetSuperposedEvents(array('bJS' => true));
if ($spev != '[]')
{
if ($ev == '[]')
$ev = $spev;
else
$ev = mb_substr($ev, 0, -1).','.mb_substr($spev, 1);
}
}
?>
break;
// * * * * * Edit calendar * * * * *
case 'calendar_edit':
if ($this->bReadOnly)
return $this->ThrowError(GetMessage('EC_ACCESS_DENIED'));
$id = intval($_POST['id']);
$bNew = (!isset($id) || $id == 0);
$arFields = Array(
'ID' => $id,
'NAME' => trim($_POST['name']),
'DESCRIPTION' => trim($_POST['desc']),
'COLOR' => colorReplace($_POST['color']),
'EXPORT' => isset($_POST['export']) && $_POST['export'] == 'Y',
'EXPORT_SET' => (isset($_POST['exp_set']) && in_array($_POST['exp_set'], array('all', '3_9', '6_12'))) ? $_POST['exp_set'] : 'all',
'PRIVATE_STATUS' => (isset($_POST['private_status']) && in_array($_POST['private_status'], array('private', 'time','title'))) ? $_POST['private_status'] : 'full'
);
if ($bNew)
$arFields['IS_EXCHANGE'] = $_POST['is_exchange'] == 'Y';
$id = $this->SaveCalendar(array('sectionId' => $sectionId, 'arFields' => $arFields));
if (intval($id) <= 0)
return $this->ThrowError($res <> '' ? $res : GetMessage('EC_CALENDAR_SAVE_ERROR'));
$export_link = $arFields['EXPORT'] ? $this->GetExportLink($id, $this->ownerType, $this->ownerId, $this->iblockId) : '';
$outlookJs = CECCalendar::GetOutlookLink(array(
'ID' => $id,
'PREFIX' => $this->GetOwnerName(array('iblockId' => $this->iblockId, 'ownerType' => $this->ownerType, 'ownerId' => $this->ownerId))
));
if ($this->ownerType == 'USER' && $_POST['is_def_meet_calendar'] == 'Y')
{
$SET = $this->GetUserSettings();
$SET['MeetCalId'] = $id;
$this->SetUserSettings($SET);
}
?>
// Clear cache
$this->ClearCache($this->cachePath.$this->iblockId."/calendars/".($this->bOwner ? $this->ownerId : 0)."/");
$this->ClearCache($this->cachePath.'events/'.$this->iblockId.'/');
if ($this->ownerType == 'GROUP')
$this->ClearCache($this->cachePath.'sp_groups/');
elseif($this->ownerType == 'USER')
$this->ClearCache($this->cachePath.'sp_user/');
else
$this->ClearCache($this->cachePath.'sp_common/');
break;
// * * * * * Delete calendar * * * * *
case 'calendar_delete':
if ($this->bReadOnly)
return $this->ThrowError(GetMessage('EC_ACCESS_DENIED'));
$id = intval($_POST['id']);
if (!$this->CheckCalendar(array('calendarId' => $id, 'sectionId' => $sectionId)))
return $this->ThrowError(GetMessage('EC_CALENDAR_DEL_ERROR').' '.GetMessage('EC_CAL_INCORRECT_ERROR'));
$res = $this->DeleteCalendar($id);
if ($res !== true)
return $this->ThrowError($res <> '' ? $res : GetMessage('EC_CALENDAR_DEL_ERROR'));
// Clear cache
$this->ClearCache($this->cachePath.$this->iblockId."/calendars/".($this->bOwner ? $this->ownerId : 0)."/");
if ($this->ownerType == 'GROUP')
$this->ClearCache($this->cachePath.'sp_groups/');
elseif($this->ownerType == 'USER')
$this->ClearCache($this->cachePath.'sp_user/');
else
$this->ClearCache($this->cachePath.'sp_common/');
?>
break;
// * * * * * Append superposed calendar * * * * *
case 'spcal_disp_save':
$spcl = is_array($_POST['spcl']) ? $_POST['spcl'] : Array();
if (!$this->SaveDisplayedSPCalendars($spcl))
return $this->ThrowError('Error! Cant save displayed superposed calendars');
?>
break;
// * * * * * Hide superposed calendar * * * * *
case 'spcal_hide':
$this->HideSPCalendar(intval($_POST['id']));
?>
break;
// * * * * * Return info about user, and user calendars * * * * *
case 'spcal_user_cals':
$name = trim($_POST['name']);
if ($res = $this->HandleSPUserCals($name))
{
?>
}
else
{
?>
}
break;
// * * * * * Return info about user, and user calendars * * * * *
case 'spcal_del_user':
if (!$this->DeleteTrackingUser(intval($_POST['id'])))
return $this->ThrowError('Error! Cant delete tracking user!');
?>
break;
// * * * * * Delete all tracking users * * * * *
case 'spcal_del_all_user':
$this->DeleteTrackingUser();
?>
break;
// * * * * * Add calendar to Superposed * * * * *
case 'add_cal2sp':
if (!$this->AddCalendar2SP())
return $this->ThrowError('Error! Cant add calendar');
$this->ClearCache($this->cachePath.'sp_handle/'.($this->curUserId % 1000)."/");
?>
break;
// * * * * * Save user settings * * * * *
case 'set_settings':
if (isset($_POST['clear_all']) && $_POST['clear_all'] == true)
{
// Del user options
$res = $this->SetUserSettings(false);
?>
}
else
{
$Set = array(
'tab_id' => $_POST['tab_id'],
'cal_sec' => $_POST['cal_sec'],
'sp_cal_sec' => $_POST['sp_cal_sec'],
'planner_scale' => isset($_POST['planner_scale']) ? intval($_POST['planner_scale']) : false,
'planner_width' => isset($_POST['planner_width']) ? intval($_POST['planner_width']) : false,
'planner_height' => isset($_POST['planner_height']) ? intval($_POST['planner_height']) : false
);
if (isset($_POST['meet_cal_id']))
$Set['MeetCalId'] = intval($_POST['meet_cal_id']);
$Set['blink'] = $_POST['blink'] !== 'false';
if (isset($_POST['show_ban']))
$Set['ShowBanner'] = (bool) $_POST['show_ban'];
$this->SetUserSettings($Set);
}
break;
// * * * * * Find guests for event by name * * * * *
case 'get_guests':
if (isset($_POST['from']))
{
$from = date(getDateFormat(), MakeTimeStamp($_POST['from'], getTSFormat()));
$to = isset($_POST['to']) ? date(getDateFormat(), MakeTimeStamp($_POST['to'], getTSFormat())) : $from;
}
else
{
$from = false;
$to = false;
}
$bAddCurUser = false;
$res = $this->HandleUserSearch(trim($_POST['name']), $from, $to, false, $_POST['event_id'], $bAddCurUser);
?>
break;
// * * * * * Confirm user part in event * * * * *
case 'confirm_event':
$this->ClearCache($this->cachePath.'events/'.$this->iblockId.'/');
$this->ConfirmEvent(array('id' => intval($_POST['id'])));
?>
break;
// * * * * * Check users accessibility * * * * *
case 'check_guests':
$res = $this->CheckGuestsAccessibility(array('arGuests' => $_POST['guests'], 'from' => $_POST['from'], 'to' => $_POST['to'], 'eventId' => $_POST['event_id']));
?>
break;
// * * * * * Get list of group members * * * * *
case 'get_group_members':
if ($this->ownerType == 'GROUP')
{
if (isset($_POST['from']))
{
$from = date(getDateFormat(), MakeTimeStamp($_POST['from'], getTSFormat()));
$to = isset($_POST['to']) ? date(getDateFormat(), MakeTimeStamp($_POST['to'], getTSFormat())) : $from;
}
else
{
$from = false;
$to = false;
}
$bAddCurUser = false;
$res = $this->GetGroupMembers(array('groupId' => $this->ownerId, 'from' => $from, 'to' => $to), $bAddCurUser);
?>
}
break;
// * * * * * Get intranet company structure * * * * *
case 'get_company_structure':
CEventCalendar::GetIntranetStructure();
break;
// * * * * * Get Guests Accessability * * * * *
case 'get_guests_accessability':
$this->GetGuestsAccessability(array(
'users' => $_POST['users'],
'from' => date(getDateFormat(), MakeTimeStamp($_POST['from'], getTSFormat())),
'to' => date(getDateFormat(), MakeTimeStamp($_POST['to'], getTSFormat())),
'curEventId' => intval($_POST['cur_event_id'])
));
break;
// * * * * * Get meeting room accessibility * * * * *
case 'get_mr_accessability':
$this->GetMRAccessability(array(
'id' => intval($_POST['id']),
'from' => date(getDateFormat(), MakeTimeStamp($_POST['from'], getTSFormat())),
'to' => date(getDateFormat(), MakeTimeStamp($_POST['to'], getTSFormat())),
'curEventId' => intval($_POST['cur_event_id'])
));
break;
// * * * * * Get meeting room accessibility * * * * *
case 'check_mr_vr_accessability':
$check = false;
$from = date(getDateFormat(), MakeTimeStamp($_POST['from'], getTSFormat()));
$to = date(getDateFormat(), MakeTimeStamp($_POST['to'], getTSFormat()));
$loc_old = $_POST['location_old'] ? CEventCalendar::ParseLocation(trim($_POST['location_old'])) : false;
$loc_new = CEventCalendar::ParseLocation(trim($_POST['location_new']));
$Params = array(
'dateFrom' => cutZeroTime($from),
'dateTo' => cutZeroTime($to),
'regularity' => isset($_POST['per_type']) && $_POST['per_type'] <> ''? mb_strtoupper($_POST['per_type']) : 'NONE',
'members' => isset($_POST['guest']) ? $_POST['guest'] : false,
);
$tst = MakeTimeStamp($Params['dateTo']);
if (date("H:i", $tst) == '00:00')
$Params['dateTo'] = CIBlockFormatProperties::DateFormat(getDateFormat(true), $tst + (23 * 60 + 59) * 60);
if (intval($_POST['id']) > 0)
$Params['ID'] = intval($_POST['id']);
if($loc_new['mrid'] == $this->VMiblockId) // video meeting
{
$Params['allowVideoMeeting'] = $this->allowVideoMeeting;
$Params['VMiblockId'] = $this->VMiblockId;
$check = CEventCalendar::CheckVR($Params);
}
else
{
$Params['allowResMeeting'] = $this->allowResMeeting;
$Params['RMiblockId'] = $this->RMiblockId;
$Params['mrid'] = $loc_new['mrid'];
$Params['mrevid_old'] = $loc_old ? $loc_old['mrevid'] : 0;
$check = CEventCalendar::CheckMR($Params);
}
?>
break;
case 'connections_edit':
if ($this->bReadOnly || $this->ownerType != 'USER')
return $this->ThrowError(GetMessage('EC_ACCESS_DENIED'));
if (CEventCalendar::IsCalDAVEnabled())
{
$i = 0;
$l = count($_POST['connections']);
for ($i = 0; $i < $l; $i++)
{
$con = $_POST['connections'][$i];
if ($con['id'] <= 0) // It's new connection
{
if ($con['del'] === 'Y')
{
continue;
}
if (!CEventCalendar::CheckCalDavUrl($con['link'], $con['user_name'], $con['pass']))
{
return CEventCalendar::ThrowError(GetMessage("EC_CALDAV_URL_ERROR"));
}
$id = CDavConnection::Add(array(
"ENTITY_TYPE" => 'user',
"ENTITY_ID" => $this->ownerId,
"ACCOUNT_TYPE" => 'caldav',
"NAME" => $con['name'],
"SERVER" => $con['link'],
"SERVER_USERNAME" => $con['user_name'],
"SERVER_PASSWORD" => $con['pass']
));
}
elseif ($con['del'] !== 'Y') // Edit connection
{
$arFields = array(
"NAME" => $con['name'],
"SERVER" => $con['link'],
"SERVER_USERNAME" => $con['user_name']
);
// TODO
//if (!CEventCalendar::CheckCalDavUrl($con['link'], $con['user_name'], $con['pass']))
// return CEventCalendar::ThrowError(GetMessage("EC_CALDAV_URL_ERROR", Array('#CALDAV_URL#' => $con['link'])));
if ($con['pass'] !== 'bxec_not_modify_pass')
$arFields["SERVER_PASSWORD"] = $con['pass'];
CDavConnection::Update($con['id'], $arFields);
}
else
{
CDavConnection::Delete($con['id']);
$db_res = CUserTypeEntity::GetList(['ID'=>'ASC'], [
"ENTITY_ID" => "IBLOCK_".$this->iblockId."_SECTION",
"FIELD_NAME" => "UF_BXDAVEX_CDAV_COL"]
);
if ($db_res && ($r = $db_res->GetNext()))
{
$arSelectFields = array("IBLOCK_ID", "ID", "IBLOCK_SECTION_ID", "UF_BXDAVEX_CDAV_COL");
$rsData = CIBlockSection::GetList(Array('ID' => 'ASC'),
Array(
"IBLOCK_ID" => $this->iblockId,
"CHECK_PERMISSIONS" => 'N',
"UF_BXDAVEX_CDAV_COL" => intval($con['id']),
"CREATED_BY" => $this->ownerId,
"SECTION_ID" => $this->GetSectionIDByOwnerId($this->ownerId, 'USER', $this->iblockId)
), false, $arSelectFields);
while($arRes = $rsData->Fetch())
{
if ($con['del_calendars'] == 'Y')
CIBlockSection::Delete($arRes['ID']);
else
$GLOBALS["USER_FIELD_MANAGER"]->Update("IBLOCK_".$this->iblockId."_SECTION", $arRes['ID'], array("UF_BXDAVEX_CDAV_COL" => ""));
}
}
}
}
if($err = $APPLICATION->GetException())
{
CEventCalendar::ThrowError($err->GetString());
}
else
{
// Manually synchronize calendars
CDavGroupdavClientCalendar::DataSync("user", $this->ownerId);
// Clear cache
$this->ClearCache($this->cachePath.$this->iblockId."/calendars/".($this->bOwner ? $this->ownerId : 0)."/");
$this->ClearCache($this->cachePath.'events/'.$this->iblockId.'/');
if ($this->ownerType == 'GROUP')
$this->ClearCache($this->cachePath.'sp_groups/');
elseif($this->ownerType == 'USER')
$this->ClearCache($this->cachePath.'sp_user/');
else
$this->ClearCache($this->cachePath.'sp_common/');
}
}
break;
case 'exchange_sync':
if ($this->ownerType == 'USER' && CEventCalendar::IsExchangeEnabled())
{
$error = "";
$res = CDavExchangeCalendar::DoDataSync($this->ownerId, $error);
if ($res === true):?>
ownerType == 'GROUP' && $action != 'load_events' && class_exists('CSocNetGroup'))
CSocNetGroup::SetLastActivity($this->ownerId);
}
return true;
}