%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /home/bitrix/www/bitrix/modules/socialnetwork/classes/general/
Upload File :
Create Path :
Current File : //home/bitrix/www/bitrix/modules/socialnetwork/classes/general/log_destination.php

<?
use Bitrix\Main\ModuleManager;

class CSocNetLogDestination
{
	const LIST_USER_LIMIT = 11;

	/**
	* Retrieves last used users from socialnetwork/log_destination UserOption
	* @deprecated
	*/
	public static function GetLastUser()
	{
		global $USER;

		static $resultCache = array();

		$userId = intval($USER->GetID());

		if(!isset($resultCache[$userId]))
		{
			$arLastSelected = CUserOptions::GetOption("socialnetwork", "log_destination", array());
			$arLastSelected = (
				is_array($arLastSelected)
				&& strlen($arLastSelected['users']) > 0
				&& $arLastSelected['users'] != '"{}"'
					? array_reverse(CUtil::JsObjectToPhp($arLastSelected['users']))
					: array()
			);

			if (is_array($arLastSelected))
			{
				if (!isset($arLastSelected[$userId]))
				{
					$arLastSelected['U'.$userId] = 'U'.$userId;
				}
			}
			else
			{
				$arLastSelected['U'.$userId] = 'U'.$userId;
			}

			$count = 0;
			$arUsers = Array();
			foreach ($arLastSelected as $userId)
			{
				if ($count < 5)
				{
					$count++;
				}
				else
				{
					break;
				}

				$arUsers[$userId] = $userId;
			}
			$resultCache[$userId] = array_reverse($arUsers);
		}

		return $resultCache[$userId];
	}

	/**
	* Retrieves last used sonet groups from socialnetwork/log_destination UserOption
	* @deprecated
	*/
	public static function GetLastSocnetGroup()
	{
		$arLastSelected = CUserOptions::GetOption("socialnetwork", "log_destination", array());
		$arLastSelected = (
			is_array($arLastSelected)
			&& strlen($arLastSelected['sonetgroups']) > 0
			&& $arLastSelected['sonetgroups'] != '"{}"'
				? array_reverse(CUtil::JsObjectToPhp($arLastSelected['sonetgroups']))
				: array()
		);

		$count = 0;
		$arSocnetGroups = Array();
		foreach ($arLastSelected as $sgId)
		{
			if ($count <= 4)
			{
				$count++;
			}
			else
			{
				break;
			}

			$arSocnetGroups[$sgId] = $sgId;
		}
		return array_reverse($arSocnetGroups);
	}

	/**
	* Retrieves last used department from socialnetwork/log_destination UserOption
	* @deprecated
	*/
	public static function GetLastDepartment()
	{
		$arLastSelected = CUserOptions::GetOption("socialnetwork", "log_destination", array());
		$arLastSelected = (
			is_array($arLastSelected)
			&& strlen($arLastSelected['department']) > 0
			&& $arLastSelected['department'] != '"{}"'
				? array_reverse(CUtil::JsObjectToPhp($arLastSelected['department']))
				: array()
		);

		$count = 0;
		$arDepartment = Array();
		foreach ($arLastSelected as $depId)
		{
			if ($count < 4)
			{
				$count++;
			}
			else
			{
				break;
			}

			$arDepartment[$depId] = $depId;
		}

		return array_reverse($arDepartment);
	}

	public static function GetStucture($arParams = Array())
	{
		$bIntranetEnabled = false;
		if(
			IsModuleInstalled('intranet')
			&& IsModuleInstalled('iblock')
		)
		{
			$bIntranetEnabled = true;
		}

		$result = array(
			"department" => array(),
			"department_relation" => array(),
			"department_relation_head" => array(),
		);

		$department_id = (
			isset($arParams["DEPARTMENT_ID"])
			&& intval($arParams["DEPARTMENT_ID"]) > 0
				? intval($arParams["DEPARTMENT_ID"])
				: false
		);

		if($bIntranetEnabled)
		{
			if (!(CModule::IncludeModule('extranet') && !CExtranet::IsIntranetUser()))
			{
				if(($iblock_id = COption::GetOptionInt('intranet', 'iblock_structure', 0)) > 0)
				{
					global $CACHE_MANAGER;

					$ttl = (
						defined("BX_COMP_MANAGED_CACHE")
							? 2592000
							: 600
					);

					$cache_id = 'sonet_structure_new4_'.$iblock_id.(intval($department_id) > 0 ? "_".$department_id : "");
					$obCache = new CPHPCache;
					$cache_dir = '/sonet/structure';

					if($obCache->InitCache($ttl, $cache_id, $cache_dir))
					{
						$result = $obCache->GetVars();
					}
					else
					{
						CModule::IncludeModule('iblock');

						if(defined("BX_COMP_MANAGED_CACHE"))
						{
							$CACHE_MANAGER->StartTagCache($cache_dir);
						}

						$arFilter = array(
							"IBLOCK_ID" => $iblock_id,
							"ACTIVE" => "Y"
						);

						if (intval($department_id) > 0)
						{
							$rsSectionDepartment = CIBlockSection::GetList(
								array(),
								array(
									"ID" => intval($department_id)
								),
								false,
								array("ID", "LEFT_MARGIN", "RIGHT_MARGIN")
							);

							if ($arSectionDepartment = $rsSectionDepartment->Fetch())
							{
								$arFilter[">=LEFT_MARGIN"] = $arSectionDepartment["LEFT_MARGIN"];
								$arFilter["<=RIGHT_MARGIN"] = $arSectionDepartment["RIGHT_MARGIN"];
							}
						}

						$dbRes = CIBlockSection::GetList(
							array("left_margin"=>"asc"),
							$arFilter,
							false,
							array("ID", "IBLOCK_SECTION_ID", "NAME")
						);
						while ($ar = $dbRes->Fetch())
						{
							$result["department"]['DR'.$ar['ID']] = array(
								'id' => 'DR'.$ar['ID'],
								'entityId' => $ar["ID"],
								'name' => htmlspecialcharsbx($ar['NAME']),
								'parent' => 'DR'.intval($ar['IBLOCK_SECTION_ID']),
							);
						}
						if(defined("BX_COMP_MANAGED_CACHE"))
						{
							$CACHE_MANAGER->RegisterTag('iblock_id_'.$iblock_id);
							$CACHE_MANAGER->EndTagCache();
						}

						if($obCache->StartDataCache())
						{
							$obCache->EndDataCache($result);
						}
					}
				}
			}
		}

		if (
			!empty( $result["department"])
			&& !isset($arParams["LAZY_LOAD"])
		)
		{
			$result["department_relation"] = self::GetTreeList('DR'.(intval($department_id) > 0 ? $department_id : 0), $result["department"], true);
			if (intval($arParams["HEAD_DEPT"]) > 0)
			{
				$result["department_relation_head"] = self::GetTreeList('DR'.intval($arParams["HEAD_DEPT"]), $result["department"], true);
			}
		}

		return $result;
	}

	public static function GetExtranetUser(array $arParams = array())
	{
		global $USER, $CACHE_MANAGER;

		static $resultCache = array();

		$userId = intval($USER->getID());

		if(!isset($resultCache[$userId]))
		{
			$arUsers = Array();

			$arFilter = Array();
			if (CModule::IncludeModule('extranet') && !CExtranet::IsIntranetUser())
			{
				$cacheTtl = 3153600;
				$cacheId = 'socnet_destination_getusers_'.md5(serialize($arParams)).'_'.$userId;
				$cacheDir = '/socnet/dest_extranet/'.intval($userId / 100).'/';

				$obCache = new CPHPCache;
				if($obCache->initCache($cacheTtl, $cacheId, $cacheDir))
				{
					$arUsers = $obCache->getVars();
				}
				else
				{
					$obCache->startDataCache();
					if(defined("BX_COMP_MANAGED_CACHE"))
					{
						$CACHE_MANAGER->StartTagCache($cacheDir);
					}

					$arSelect = Array($userId);
					$arSocnetGroups = array();

					if(defined("BX_COMP_MANAGED_CACHE"))
					{
						$CACHE_MANAGER->registerTag("sonet_user2group_U".$userId);
					}

					$rsRelation = CSocNetUserToGroup::GetList(
						array("GROUP_NAME" => "ASC"),
						array(
							"USER_ID" => $userId,
							"<=ROLE" => SONET_ROLES_USER,
							"GROUP_SITE_ID" => SITE_ID,
							"GROUP_ACTIVE" => "Y",
							"!GROUP_CLOSED" => "Y"
						),
						false,
						array("nTopCount" => 500),
						array("ID", "GROUP_ID")
					);
					while($arRelation = $rsRelation->Fetch())
					{
						$arGroupTmp = array(
							"id" => $arRelation["GROUP_ID"],
							"entityId" => $arRelation["GROUP_ID"]
						);
						$arSocnetGroups[$arRelation["GROUP_ID"]] = $arGroupTmp;

						if(defined("BX_COMP_MANAGED_CACHE"))
						{
							$CACHE_MANAGER->registerTag("sonet_user2group_G".$arRelation["GROUP_ID"]);
						}
					}

					if (count($arSocnetGroups) > 0)
					{
						$arUserSocNetGroups = Array();
						foreach ($arSocnetGroups as $groupId => $ar)
						{
							$arUserSocNetGroups[] = $groupId;
						}

						$dbRelation = CSocNetUserToGroup::GetList(
							array(),
							array(
								"GROUP_ID" => $arUserSocNetGroups,
								"<=ROLE" => SONET_ROLES_USER,
								"USER_ACTIVE" => "Y"
							),
							false,
							false,
							array("ID", "USER_ID", "GROUP_ID")
						);
						while ($arRelation = $dbRelation->fetch())
						{
							$arSelect[] = intval($arRelation["USER_ID"]);
						}
					}
					$arFilter['ID'] = implode('|', $arSelect);

					if (!empty($arFilter['ID']))
					{
						$arExtParams = Array(
							"FIELDS" => Array("ID", "LAST_NAME", "NAME", "SECOND_NAME", "LOGIN", "EMAIL", "PERSONAL_PHOTO", "WORK_POSITION", "PERSONAL_PROFESSION", "IS_ONLINE")
						);

						$dbUsers = CUser::GetList(($sort_by = Array('last_name'=>'asc', 'IS_ONLINE'=>'desc')), ($dummy=''), $arFilter, $arExtParams);
						while ($arUser = $dbUsers->GetNext())
						{
							$sName = trim(CUser::FormatName(CSite::GetNameFormat(), $arUser, true, false));

							if (empty($sName))
							{
								$sName = $arUser["~LOGIN"];
							}

							$arFileTmp = CFile::ResizeImageGet(
								$arUser["PERSONAL_PHOTO"],
								array(
									"width" => (intval($arParams["THUMBNAIL_SIZE_WIDTH"]) > 0 ? $arParams["THUMBNAIL_SIZE_WIDTH"] : 100),
									"height" => (intval($arParams["THUMBNAIL_SIZE_HEIGHT"]) > 0 ? $arParams["THUMBNAIL_SIZE_HEIGHT"] : 100)
								),
								BX_RESIZE_IMAGE_EXACT,
								false
							);

							$arUsers['U'.$arUser["ID"]] = Array(
								'id' => 'U'.$arUser["ID"],
								'entityId' => $arUser["ID"],
								'email' => $arUser["EMAIL"],
								'name' => $sName,
								'avatar' => empty($arFileTmp['src'])? '': $arFileTmp['src'],
								'desc' => $arUser['WORK_POSITION'] ? $arUser['WORK_POSITION'] : ($arUser['PERSONAL_PROFESSION']?$arUser['PERSONAL_PROFESSION']:'&nbsp;'),
							);

							if (defined("BX_COMP_MANAGED_CACHE"))
							{
								$CACHE_MANAGER->registerTag("USER_NAME_".intval($arUser["ID"]));
							}
						}
					}

					$obCache->endDataCache($arUsers);
				}
			}

			$resultCache[$userId] = $arUsers;
		}

		return $resultCache[$userId];
	}

	public static function GetUsers($arParams = Array(), $bSelf = true)
	{
		global $USER, $CACHE_MANAGER;

		$userId = intval($USER->GetID());
		$extranetUserIdList = \Bitrix\Socialnetwork\ComponentHelper::getExtranetUserIdList();

		if (
			isset($arParams['all'])
			&& $arParams['all'] == 'Y'
		)
		{
			if (IsModuleInstalled("intranet"))
			{
				return self::getUsersAll($arParams);
			}
			else
			{
				$arParamsNew = $arParams;
				$arParamsNew["id"] = array($userId);
				unset($arParamsNew["all"]);
				return CSocNetLogDestination::GetUsers($arParamsNew, $bSelf);
			}
		}

		$bExtranet = false;
		$arFilter = array();
		if (
			!isset($arParams['IGNORE_ACTIVITY'])
			|| $arParams['IGNORE_ACTIVITY'] != 'Y'
		)
		{
			$arFilter['ACTIVE'] = 'Y';
		}

		$arExternalAuthId = self::getExternalAuthIdBlackList();

		if (!empty($arExternalAuthId))
		{
			$arFilter['!EXTERNAL_AUTH_ID'] = $arExternalAuthId;
		}

		if (
			(
				!isset($arParams['IGNORE_ACTIVITY'])
				|| $arParams['IGNORE_ACTIVITY'] != 'Y'
			)
			&& (
				IsModuleInstalled("intranet")
				|| COption::GetOptionString("main", "new_user_registration_email_confirmation", "N") == "Y"
			)
		)
		{
			$arFilter["CONFIRM_CODE"] = false;
		}

		$arExtParams = Array(
			"FIELDS" => array("ID", "LAST_NAME", "NAME", "SECOND_NAME", "LOGIN", "EMAIL", "PERSONAL_PHOTO", "WORK_POSITION", "PERSONAL_PROFESSION", "IS_ONLINE", "EXTERNAL_AUTH_ID"),
			"SELECT" => array()
		);

		if (
			isset($arParams["CRM_ENTITY"])
			&& $arParams["CRM_ENTITY"] == "Y"
			&& ModuleManager::isModuleInstalled('crm')
		)
		{
			$arExtParams['SELECT'][] = 'UF_USER_CRM_ENTITY';
		}

		if (array_key_exists('id', $arParams))
		{
			if (empty($arParams['id']))
			{
				$arFilter['ID'] = $userId;
			}
			else
			{
				$arSelect = array($userId);
				foreach ($arParams['id'] as $value)
				{
					if (
						intval($value) > 0
						&& !in_array($value, $arSelect)
					)
					{
						$arSelect[] = intval($value);
					}
				}
				sort($arSelect);
				$arFilter['ID'] = implode('|', $arSelect);
			}
		}
		elseif (isset($arParams['deportament_id']))
		{
			if (is_array($arParams['deportament_id']))
			{
				$arFilter['UF_DEPARTMENT'] = $arParams['deportament_id'];
			}
			else
			{
				if ($arParams['deportament_id'] == 'EX')
				{
					$bExtranet = true;
				}
				else
				{
					$arFilter['UF_DEPARTMENT'] = intval($arParams['deportament_id']);
				}
			}

			$arExtParams['SELECT'][] = 'UF_DEPARTMENT';
		}

		$avatarSize = array(
			"width" => (intval($arParams["THUMBNAIL_SIZE_WIDTH"]) > 0 ? $arParams["THUMBNAIL_SIZE_WIDTH"] : 100),
			"height" => (intval($arParams["THUMBNAIL_SIZE_HEIGHT"]) > 0 ? $arParams["THUMBNAIL_SIZE_HEIGHT"] : 100)
		);

		$cacheTtl = 3153600;
		$cacheId = 'socnet_destination_getusers_'.md5(serialize($arFilter)).$bSelf.CSocNetUser::IsCurrentUserModuleAdmin().($bExtranet ? '_ex_'.$userId : '').md5(serialize($avatarSize));
		$cacheDir = '/socnet/dest/'.(
			isset($arParams['id'])
				? 'user'
				: 'dept'
		).'/';

		$obCache = new CPHPCache;
		if($obCache->InitCache($cacheTtl, $cacheId, $cacheDir))
		{
			$arUsers = $obCache->GetVars();
		}
		else
		{
			$obCache->StartDataCache();
			if(defined("BX_COMP_MANAGED_CACHE"))
			{
				$CACHE_MANAGER->StartTagCache($cacheDir);
			}

			if (
				$bExtranet
				&& CModule::IncludeModule("extranet")
			)
			{
				$extranetSiteId = CExtranet::GetExtranetSiteID();

				// get all extranet groups and set tags
				$rsSonetGroup = CSocNetUserToGroup::GetList(
					array(),
					array(
						"USER_ID" => $USER->GetId(),
						"GROUP_SITE_ID" => $extranetSiteId
					),
					false,
					false,
					array("GROUP_ID")
				);
				while($arSonetGroup = $rsSonetGroup->Fetch())
				{
					$CACHE_MANAGER->RegisterTag("sonet_user2group_G".$arSonetGroup["GROUP_ID"]);
				}

				$CACHE_MANAGER->RegisterTag("sonet_user2group_U".$USER->GetId());

				$arUsers = Array();
				$arExtranetUsers = CExtranet::GetMyGroupsUsersFull($extranetSiteId, $bSelf);
				foreach($arExtranetUsers as $arUserTmp)
				{
					if (!empty($arUserTmp['UF_DEPARTMENT']))
					{
						continue;
					}

					$sName = trim(CUser::FormatName(empty($arParams["NAME_TEMPLATE"]) ? CSite::GetNameFormat(false) : $arParams["NAME_TEMPLATE"], $arUserTmp, true, false));
					if (empty($sName))
					{
						$sName = $arUserTmp["~LOGIN"];
					}

					$arFileTmp = CFile::ResizeImageGet(
						$arUserTmp["PERSONAL_PHOTO"],
						$avatarSize,
						BX_RESIZE_IMAGE_EXACT,
						false
					);

					$arUsers['U'.$arUserTmp["ID"]] = Array(
						'id' => 'U'.$arUserTmp["ID"],
						'entityId' => $arUserTmp["ID"],
						'email' => $arUserTmp["EMAIL"] ? $arUserTmp["EMAIL"] : '',
						'name' => $sName,
						'avatar' => empty($arFileTmp['src'])? '': $arFileTmp['src'],
						'desc' => $arUserTmp['WORK_POSITION'] ? $arUserTmp['WORK_POSITION'] : ($arUserTmp['PERSONAL_PROFESSION'] ? $arUserTmp['PERSONAL_PROFESSION'] : '&nbsp;'),
					);
					if (defined("BX_COMP_MANAGED_CACHE"))
					{
						$CACHE_MANAGER->RegisterTag("USER_NAME_".IntVal($arUserTmp["ID"]));
					}
				}
			}
			else
			{
				$bExtranetInstalled = CModule::IncludeModule("extranet");
				CSocNetTools::InitGlobalExtranetArrays();

				if (
					!isset($arFilter['UF_DEPARTMENT'])
					&& $bExtranetInstalled
				)
				{
					$arUserIdVisible = CExtranet::GetMyGroupsUsersSimple(SITE_ID);
				}

				$arUsers = Array();

				$dbUsers = CUser::GetList(
					($sort_by = array('last_name'=> 'asc', 'IS_ONLINE'=>'desc')),
					($dummy=''),
					$arFilter,
					$arExtParams
				);

				while ($arUser = $dbUsers->GetNext())
				{
					if (
						!$bSelf
						&& is_object($USER)
						&& $userId == $arUser["ID"]
					)
					{
						continue;
					}

					if (
						!isset($arFilter['UF_DEPARTMENT']) // all users
						&& $bExtranetInstalled
					)
					{
						if (
							isset($arUser["UF_DEPARTMENT"])
							&& (
								!is_array($arUser["UF_DEPARTMENT"])
								|| empty($arUser["UF_DEPARTMENT"])
								|| intval($arUser["UF_DEPARTMENT"][0]) <= 0
							) // extranet user
							&& (
								empty($arUserIdVisible)
								|| !is_array($arUserIdVisible)
								|| !in_array($arUser["ID"], $arUserIdVisible)
							)
						)
						{
							continue;
						}
					}

					$sName = trim(CUser::FormatName(empty($arParams["NAME_TEMPLATE"]) ? CSite::GetNameFormat(false) : $arParams["NAME_TEMPLATE"], $arUser, true, false));

					if (empty($sName))
					{
						$sName = $arUser["~LOGIN"];
					}

					$arFileTmp = CFile::ResizeImageGet(
						$arUser["PERSONAL_PHOTO"],
						$avatarSize,
						BX_RESIZE_IMAGE_EXACT,
						false
					);

					$arUsers['U'.$arUser["ID"]] = Array(
						'id' => 'U'.$arUser["ID"],
						'entityId' => $arUser["ID"],
						'email' => $arUser["EMAIL"],
						'name' => $sName,
						'avatar' => empty($arFileTmp['src'])? '': $arFileTmp['src'],
						'desc' => $arUser['WORK_POSITION'] ? $arUser['WORK_POSITION'] : ($arUser['PERSONAL_PROFESSION'] ? $arUser['PERSONAL_PROFESSION'] : '&nbsp;'),
						'isExtranet' => (in_array($arUser["ID"], $extranetUserIdList) ? "Y" : "N"),
						'isEmail' => ($arUser['EXTERNAL_AUTH_ID'] == 'email' ? 'Y' : 'N'),
						'isCrmEmail' => (
							$arUser['EXTERNAL_AUTH_ID'] == 'email'
							&& !empty($arUser['UF_USER_CRM_ENTITY'])
								? 'Y'
								: 'N'
						)
					);

					if ($arUser['EXTERNAL_AUTH_ID'] == 'email')
					{
						$arUsers['U'.$arUser["ID"]]['email'] = $arUser['EMAIL'];
					}

					$arUsers['U'.$arUser["ID"]]['checksum'] = md5(serialize($arUsers['U'.$arUser["ID"]]));

					if (defined("BX_COMP_MANAGED_CACHE"))
					{
						$CACHE_MANAGER->RegisterTag("USER_NAME_".IntVal($arUser["ID"]));
					}
				}
			}

			if (defined("BX_COMP_MANAGED_CACHE"))
			{
				$CACHE_MANAGER->RegisterTag("USER_NAME");
				if (!empty($arFilter['UF_DEPARTMENT']))
				{
					$CACHE_MANAGER->RegisterTag('intranet_department_'.$arFilter['UF_DEPARTMENT']);
				}
				$CACHE_MANAGER->EndTagCache();
			}

			$obCache->EndDataCache($arUsers);
		}

		return $arUsers;
	}

	public static function GetGratMedalUsers($arParams = Array())
	{
		global $USER;

		static $resultCache = array();

		$userId = intval($USER->GetID());

		if(!isset($resultCache[$userId]))
		{
			$arSubordinateDepts = array();

			if (CModule::IncludeModule("intranet"))
			{
				$arSubordinateDepts = CIntranetUtils::GetSubordinateDepartments($userId, true);
			}

			$arFilter = Array(
				"ACTIVE" => "Y",
				"!UF_DEPARTMENT" => false
			);

			$arExtParams = Array(
				"FIELDS" => Array("ID", "LAST_NAME", "NAME", "SECOND_NAME", "LOGIN", "EMAIL", "PERSONAL_PHOTO", "WORK_POSITION", "PERSONAL_PROFESSION", "IS_ONLINE"),
				"SELECT" => Array("UF_DEPARTMENT")
			);

			if (isset($arParams["id"]))
			{
				if (empty($arParams["id"]))
				{
					$arFilter["ID"] = $userId;
				}
				else
				{
					$arSelect = array();
					foreach ($arParams["id"] as $value)
					{
						$arSelect[] = intval($value);
					}
					$arFilter["ID"] = implode("|", $arSelect);
				}
			}

			$arGratUsers = Array();
			$arMedalUsers = Array();

			$dbUsers = CUser::GetList(($sort_by = Array("last_name" => "asc", "IS_ONLINE" => "desc")), ($dummy=''), $arFilter, $arExtParams);
			while ($arUser = $dbUsers->GetNext())
			{
				$sName = trim(CUser::FormatName(empty($arParams["NAME_TEMPLATE"]) ? CSite::GetNameFormat(false) : $arParams["NAME_TEMPLATE"], $arUser));

				if (empty($sName))
				{
					$sName = $arUser["~LOGIN"];
				}

				$arFileTmp = CFile::ResizeImageGet(
					$arUser["PERSONAL_PHOTO"],
					array("width" => 100, "height" => 100),
					BX_RESIZE_IMAGE_EXACT,
					false
				);

				$arGratUsers['U'.$arUser["ID"]] = Array(
					"id" => "U".$arUser["ID"],
					"entityId" => $arUser["ID"],
					"email" => $arUser["EMAIL"],
					"name" => $sName,
					"avatar" => empty($arFileTmp["src"]) ? '' : $arFileTmp["src"],
					"desc" => $arUser["WORK_POSITION"] ? $arUser["WORK_POSITION"] : ($arUser["PERSONAL_PROFESSION"] ? $arUser["PERSONAL_PROFESSION"] : "&nbsp;"),
				);

				if (
					count($arSubordinateDepts) > 0
					&& count(array_intersect($arSubordinateDepts, $arUser["UF_DEPARTMENT"])) > 0
				)
				{
					$arMedalUsers['U'.$arUser["ID"]] = $arGratUsers['U'.$arUser["ID"]];
				}
			}
			$resultCache[$userId] = array("GRAT" => $arGratUsers, "MEDAL" => $arMedalUsers);
		}

		return $resultCache[$userId];
	}

	public function __percent_walk(&$val)
	{
		$val = str_replace('%', '', $val)."%";
	}

	public static function SearchUsers($search, &$nt = "", $bSelf = true, $bEmployeesOnly = false, $bExtranetOnly = false, $departmentId = false)
	{
		global $USER, $DB;

		CUtil::JSPostUnescape();

		if (is_array($search))
		{
			$arParams = $search;
			$search = $arParams["SEARCH"];
			$nameTemplate = (isset($arParams["NAME_TEMPLATE"]) ? $arParams["NAME_TEMPLATE"] : '');
			$bSelf = (isset($arParams["SELF"]) ? $arParams["SELF"] : true);
			$bEmployeesOnly = (isset($arParams["EMPLOYEES_ONLY"]) ? $arParams["EMPLOYEES_ONLY"] : false);
			$bExtranetOnly = (isset($arParams["EXTRANET_ONLY"]) ? $arParams["EXTRANET_ONLY"] : false);
			$departmentId = (isset($arParams["DEPARTAMENT_ID"]) ? $arParams["DEPARTAMENT_ID"] : false);
			$bEmailUsers = (isset($arParams["EMAIL_USERS"]) ? $arParams["EMAIL_USERS"] : false);
			$bCrmEmailUsers = (isset($arParams["CRMEMAIL_USERS"]) && ModuleManager::isModuleInstalled('crm') ? $arParams["CRMEMAIL_USERS"] : false);
			$bActiveOnly = (isset($arParams["CHECK_ACTIVITY"]) && $arParams["CHECK_ACTIVITY"] === false ? false : true);
			$bNetworkSearch = (isset($arParams["NETWORK_SEARCH"]) ? $arParams["NETWORK_SEARCH"] : false);
			$bSearchOnlyWithEmail = (isset($arParams["ONLY_WITH_EMAIL"]) ? $arParams["ONLY_WITH_EMAIL"] : false);
		}
		else
		{
			$nameTemplate = $nt;
			$bEmailUsers = false;
			$bCrmEmailUsers = false;
			$bActiveOnly = true;
			$bNetworkSearch = false;
			$bSearchOnlyWithEmail = false;
		}

		$arUsers = array();
		$search = trim($search);
		if (
			strlen($search) <= 0
			|| !GetFilterQuery("TEST", $search)
		)
		{
			return $arUsers;
		}

		$bSearchByEmail = false;

		if (preg_match('/^([^<]+)\s<([^>]+)>$/i', $search, $matches)) // email
		{
			$search = $matches[2];
			$nt = $search;
			$bSearchByEmail = true;
		}

		$bIntranetEnabled = IsModuleInstalled('intranet');
		$bExtranetEnabled = CModule::IncludeModule('extranet');
		$bMailEnabled = IsModuleInstalled('mail');
		$bBitrix24Enabled = IsModuleInstalled('bitrix24');

		$bEmailUsersAll = ($bMailEnabled && \Bitrix\Main\Config\Option::get('socialnetwork', 'email_users_all', 'N') == 'Y');
		$bExtranetUser = ($bExtranetEnabled && !CExtranet::IsIntranetUser());

		$current_user_id = intval($USER->GetID());

		if ($bExtranetEnabled)
		{
			CSocNetTools::InitGlobalExtranetArrays();
		}

		$arSearchValue = preg_split('/\s+/', trim(ToUpper($search)));
		array_walk($arSearchValue, array('CSocNetLogDestination', '__percent_walk'));

		$arMyUserId = array();

		if ($bIntranetEnabled)
		{
			if (count($arSearchValue) == 2)
			{
				$arLogicFilter = array(
					'LOGIC' => 'OR',
					array('LOGIC' => 'AND', 'NAME' => $arSearchValue[0], 'LAST_NAME' => $arSearchValue[1]),
					array('LOGIC' => 'AND', 'NAME' => $arSearchValue[1], 'LAST_NAME' => $arSearchValue[0]),
				);
			}
			else
			{
				$arLogicFilter = array(
					'LOGIC' => 'OR',
					'NAME' => $arSearchValue,
					'LAST_NAME' => $arSearchValue,
				);

				if (
					count($arSearchValue) == 1
					&& strlen($arSearchValue[0]) > 2
				)
				{
					$arLogicFilter['LOGIN'] = $arSearchValue[0];
				}
			}

			$arFilter = array(
				$arLogicFilter
			);

			if ($bActiveOnly)
			{
				$arFilter['=ACTIVE'] = 'Y';
			}

			$arExternalAuthId = self::getExternalAuthIdBlackList(array(
				"NETWORK_SEARCH" => $bNetworkSearch
			));

			if (!empty($arExternalAuthId))
			{
				$arFilter['!=EXTERNAL_AUTH_ID'] = $arExternalAuthId;
			}

			if (
				($bEmailUsers || $bCrmEmailUsers)
				&& $bMailEnabled
				&& !$bEmailUsersAll
			)
			{
				$finderDestFilter = array(
					"USER_ID" => $current_user_id,
					"=CODE_TYPE" => "U",
					"=CODE_USER.EXTERNAL_AUTH_ID" => 'email'
				);
				$finderDestSelect = array(
					'CODE_USER_ID'
				);

				if ($bCrmEmailUsers)
				{
					$finderDestFilter['!=CODE_USER.UF_USER_CRM_ENTITY'] = false;
					$finderDestSelect[] = 'CODE_USER.UF_USER_CRM_ENTITY';
				}

				$rsUser = \Bitrix\Main\FinderDestTable::getList(array(
					'order' => array(),
					'filter' => $finderDestFilter,
					'group' => array("CODE_USER_ID"),
					'select' => $finderDestSelect
				));

				while ($arUser = $rsUser->fetch())
				{
					$arMyUserId[] = $arUser['CODE_USER_ID'];
				}
			}
		}
		else
		{
			if (count($arSearchValue) == 2)
			{
				$arFilter = array(
					array(
						'LOGIC' => 'OR',
						array('LOGIC' => 'AND', 'NAME' => $arSearchValue[0], 'LAST_NAME' => $arSearchValue[1]),
						array('LOGIC' => 'AND', 'NAME' => $arSearchValue[1], 'LAST_NAME' => $arSearchValue[0]),
					)
				);
			}
			else
			{
				$arFilter = array(
					array(
						'LOGIC' => 'OR',
						'NAME' => $arSearchValue,
						'LAST_NAME' => $arSearchValue,
					)
				);
			}

			if ($bActiveOnly)
			{
				$arFilter['=ACTIVE'] = 'Y';
			}
		}

		if (
			!$bNetworkSearch
			&& (
				$bIntranetEnabled
				|| COption::GetOptionString("main", "new_user_registration_email_confirmation", "N") == "Y"
			)
		)
		{
			$arFilter["CONFIRM_CODE"] = false;
		}

		$bFilteredByMyUserId = false;

		if(
			$bIntranetEnabled
			&& $bExtranetEnabled
			&& !$bCrmEmailUsers
		) // consider extranet collaboration
		{
			CExtranet::fillUserListFilterORM(
				array(
					"CURRENT_USER_ID" => $current_user_id,
					"EXTRANET_USER" => $bExtranetUser,
					"INTRANET_ONLY" => ($bEmployeesOnly || ($bBitrix24Enabled && !$bExtranetEnabled)),
					"EXTRANET_ONLY" => $bExtranetOnly,
					"EMAIL_USERS_ALL" => $bEmailUsersAll,
					"MY_USERS" => $arMyUserId
				),
				$arFilter,
				$bFilteredByMyUserId
			);

			if (!$arFilter)
			{
				return $arUsers;
			}

			if ($bNetworkSearch)
			{
				end($arFilter);
				$arFilter[key($arFilter)]["=EXTERNAL_AUTH_ID"] = "replica";
			}
		}

		if (
			!empty($arMyUserId)
			&& !$bFilteredByMyUserId
		)
		{
			$arFilter[] = array(
				'LOGIC' => 'OR',
				'!=EXTERNAL_AUTH_ID' => 'email',
				'ID' => $arMyUserId,
			);
		}

		if ($bSearchOnlyWithEmail)
		{
			$arFilter["!EMAIL"] = false;
		}

		$arSelect = array(
			"ID",
			"ACTIVE",
			"NAME",
			"LAST_NAME",
			"SECOND_NAME",
			"EMAIL",
			"LOGIN",
			"WORK_POSITION",
			"PERSONAL_PROFESSION",
			"PERSONAL_PHOTO",
			"PERSONAL_GENDER",
			"EXTERNAL_AUTH_ID",
			new \Bitrix\Main\Entity\ExpressionField('MAX_LAST_USE_DATE', 'MAX(%s)', array('\Bitrix\Main\FinderDest:CODE_USER_CURRENT.LAST_USE_DATE'))
		);

		if ($bCrmEmailUsers)
		{
			$arSelect[] = "UF_USER_CRM_ENTITY";
		}

		if (!$bActiveOnly)
		{
			$arSelect[] = "ACTIVE";
		}

		$db_events = GetModuleEvents("socialnetwork", "OnSocNetLogDestinationSearchUsers");
		while ($arEvent = $db_events->Fetch())
		{
			ExecuteModuleEventEx($arEvent, array($arSearchValue, &$arFilter, &$arSelect));
		}

		$rsUser = \Bitrix\Main\UserTable::getList(array(
			'order' => array(
				"MAX_LAST_USE_DATE" => 'DESC',
				'LAST_NAME' => 'ASC'
			),
			'filter' => $arFilter,
			'select' => $arSelect,
			'limit' => 100,
			'data_doubling' => false
		));

		$queryResultCnt = 0;
		$bUseLogin = (strlen($search) > 3 && strpos($search, '@') > 0);
		$params = array(
			"NAME_TEMPLATE" => $nameTemplate,
			"USE_EMAIL" => $bSearchByEmail,
			"USE_LOGIN" => $bUseLogin
		);
		while ($arUser = $rsUser->fetch())
		{
			$queryResultCnt++;
			if (
				!$bSelf
				&& $current_user_id == $arUser['ID']
			)
			{
				continue;
			}

			if (intval($departmentId) > 0)
			{
				$arUserGroupCode = CAccess::GetUserCodesArray($arUser["ID"]);

				if (!in_array("DR".intval($departmentId), $arUserGroupCode))
				{
					continue;
				}
			}

			$arUser = (
				$arUser["EXTERNAL_AUTH_ID"] == "replica"
					? self::formatNetworkUser($arUser, $params)
					: self::formatUser($arUser, $params)
			);

			$arUsers[$arUser["id"]] = $arUser;
		}

		if (
			($bEmailUsers || $bCrmEmailUsers)
			&& !$queryResultCnt
			&& check_email($search, true)
		)
		{
			$arEmailFilter = array(
				'ACTIVE' => 'Y',
				'=EMAIL_OK' => 1
			);

			if (!empty($arExternalAuthId))
			{
				$arEmailFilter['!=EXTERNAL_AUTH_ID'] = $arExternalAuthId;
			}

			$rsUser = \Bitrix\Main\UserTable::getList(array(
				'order' => array(),
				'filter' => $arEmailFilter,
				'select' => array(
					"ID",
					"NAME",
					"LAST_NAME",
					"SECOND_NAME",
					"EMAIL",
					"LOGIN",
					"WORK_POSITION",
					"PERSONAL_PROFESSION",
					"PERSONAL_PHOTO",
					"PERSONAL_GENDER",
					"EXTERNAL_AUTH_ID",
					new \Bitrix\Main\Entity\ExpressionField('EMAIL_OK', 'CASE WHEN UPPER(%s) = "'.$DB->ForSql(strtoupper(str_replace('%', '%%', $search))).'" THEN 1 ELSE 0 END', 'EMAIL')
				),
				'limit' => 10
			));

			while ($arUser = $rsUser->fetch())
			{
				$arUsers['U'.$arUser["ID"]] = self::formatUser($arUser, array(
					"NAME_TEMPLATE" => $nameTemplate,
					"USE_EMAIL" => true
				));
			}
		}

		return $arUsers;
	}

	public static function searchSonetGroups($params = array())
	{
		global $USER;

		$result = array();

		CUtil::JSPostUnescape();

		$search = is_array($params) && isset($params['SEARCH']) ? trim($params['SEARCH']) : '';
		if (empty($search))
		{
			return $result;
		}
		
		if (
			strlen($search) <= 0
			|| !getFilterQuery("TEST", $search)
		)
		{
			return $result;
		}

		$siteId = (
			isset($params['SITE_ID'])
			&& strlen($params['SITE_ID']) > 0
				? $params['SITE_ID']
				: SITE_ID
		);

		$currentUserAdmin = \CSocNetUser::isCurrentUserModuleAdmin($siteId);

		$tmpList = array();

		$filter = array(
			'%NAME' => $search,
			"SITE_ID" => $siteId,
			"ACTIVE" => "Y",
		);

		if (!$currentUserAdmin)
		{
			$filter["CHECK_PERMISSIONS"] = $USER->getId();
		}

		$res = \CSocnetGroup::getList(
			array("NAME" => "ASC"),
			$filter,
			false,
			array("nTopCount" => 50),
			array("ID", "NAME", "DESCRIPTION", "IMAGE_ID")
		);

		while ($group = $res->fetch())
		{
			$tmp = array(
				"id" => $group["ID"],
				"entityId" => $group["ID"],
				"name" => htmlspecialcharsbx($group["NAME"]),
				"desc" => htmlspecialcharsbx($group["DESCRIPTION"]),
			);

			if($group["IMAGE_ID"])
			{
				$imageFile = CFile::getFileArray($group["IMAGE_ID"]);
				if ($imageFile !== false)
				{
					$arFileTmp = CFile::resizeImageGet(
						$imageFile,
						array(
							"width" => (intval($params["THUMBNAIL_SIZE_WIDTH"]) > 0 ? $params["THUMBNAIL_SIZE_WIDTH"] : 100),
							"height" => (intval($params["THUMBNAIL_SIZE_HEIGHT"]) > 0 ? $params["THUMBNAIL_SIZE_HEIGHT"] : 100)
						),
						BX_RESIZE_IMAGE_PROPORTIONAL,
						false
					);
					$tmp["avatar"] = $arFileTmp["src"];
				}
			}
			unset($group["IMAGE_ID"]);
			$tmpList[$tmp['id']] = $tmp;
		}

		if (
			!$currentUserAdmin
			&& isset($params['FEATURES'])
			&& is_array($params['FEATURES'])
			&& !empty($params['FEATURES'])
		)
		{
			self::getSocnetGroupFilteredByFeaturePerms($tmpList, $params['FEATURES']);
		}

		if (
			!$currentUserAdmin
			&& isset($params['INITIATE'])
			&& $params['INITIATE'] == 'Y'
		)
		{
			self::getSocnetGroupFilteredByInitiatePerms($tmpList);
		}

		foreach ($tmpList as $value)
		{
			$value['id'] = 'SG'.$value['id'];
			$result[$value['id']] = $value;
		}

		return $result;
	}

	public static function SearchCrmEntities($arParams)
	{
		$result = array();

		$search = (!empty($arParams['SEARCH']) ? $arParams['SEARCH'] : false);
		if (
			$search
			&& CModule::IncludeModule('crm')
		)
		{
			if (check_email($search, true))
			{
				$result = array();

				if (
					empty($arParams['ENTITIES'])
					|| in_array('CONTACT', $arParams['ENTITIES'])
				)
				{
					$dbRes = CCrmContact::GetListEx(
						array(),
						array(
							'CHECK_PERMISSIONS' => 'Y',
							'FM' => array(
								'EMAIL' => array(
									'VALUE' => $search
								)
							)
						),
						false,
						false,
						array('ID', 'NAME', 'SECOND_NAME', 'LAST_NAME', 'PHOTO')
					);
					while($ar = $dbRes->Fetch())
					{
						$formatted = self::formatCrmEmailEntity($ar, array(
							'TYPE' => 'CONTACT',
							'NAME_TEMPLATE' => $arParams["NAME_TEMPLATE"],
							'EMAIL' => $search
						));
						if (!empty($formatted))
						{
							$result[$formatted['id']] = $formatted;
						}
					}
				}

				if (
					empty($arParams['ENTITIES'])
					|| in_array('COMPANY', $arParams['ENTITIES'])
				)
				{
					$dbRes = CCrmCompany::GetListEx(
						array(),
						array(
							'CHECK_PERMISSIONS' => 'Y',
							'FM' => array(
								'EMAIL' => array(
									'VALUE' => $search
								)
							)
						),
						false,
						false,
						array('ID', 'TITLE', 'LOGO')
					);
					while($ar = $dbRes->Fetch())
					{
						$formatted = self::formatCrmEmailEntity($ar, array(
							'TYPE' => 'COMPANY',
							'EMAIL' => $search
						));
						if (!empty($formatted))
						{
							$result[$formatted['id']] = $formatted;
						}
					}
				}

				if (
					empty($arParams['ENTITIES'])
					|| in_array('LEAD', $arParams['ENTITIES'])
				)
				{
					$dbRes = CCrmLead::GetListEx(
						array(),
						array(
							'CHECK_PERMISSIONS' => 'Y',
							'FM' => array(
								'EMAIL' => array(
									'VALUE' => $search
								)
							)
						),
						false,
						false,
						array('ID', 'TITLE', 'NAME', 'SECOND_NAME', 'LAST_NAME')
					);
					while($ar = $dbRes->Fetch())
					{
						$formatted = self::formatCrmEmailEntity($ar, array(
							'TYPE' => 'LEAD',
							'EMAIL' => $search
						));
						if (!empty($formatted))
						{
							$result[$formatted['id']] = $formatted;
						}
					}
				}
			}
			elseif (
				!isset($arParams['SEARCH_BY_EMAIL_ONLY'])
				|| $arParams['SEARCH_BY_EMAIL_ONLY'] != 'Y'
			)
			{
				$contacts = CCrmActivity::FindContactCommunications($search, 'EMAIL', 50);
				if (!empty($contacts))
				{
					$arId = $arEmail = array();
					foreach($contacts as $contact)
					{
						$arEmail[intval($contact["ENTITY_ID"])] = $contact["VALUE"];
						$arId[] = intval($contact["ENTITY_ID"]);
					}

					$dbRes = CCrmContact::GetListEx(
						array(),
						array(
							'CHECK_PERMISSIONS' => 'Y',
							'ID' => $arId
						),
						false,
						array('nTopCount' => 10),
						array('ID', 'NAME', 'SECOND_NAME', 'LAST_NAME', 'PHOTO')
					);
					while($ar = $dbRes->fetch())
					{
						$formatted = self::formatCrmEmailEntity($ar, array(
							'TYPE' => 'CONTACT',
							'NAME_TEMPLATE' => $arParams["NAME_TEMPLATE"],
							'EMAIL' => $arEmail[$ar['ID']]
						));
						if (!empty($formatted))
						{
							$result[$formatted['id']] = $formatted;
						}
					}
				}

				$companies = CCrmActivity::FindCompanyCommunications($search, 'EMAIL', 50);
				if (!empty($companies))
				{
					$arId = $arEmail = array();
					foreach($companies as $company)
					{
						$arEmail[intval($company["ENTITY_ID"])] = $company["VALUE"];
						$arId[] = intval($company["ENTITY_ID"]);
					}

					$dbRes = CCrmCompany::GetListEx(
						array(),
						array(
							'CHECK_PERMISSIONS' => 'Y',
							'ID' => $arId
						),
						false,
						array('nTopCount' => 10),
						array('ID', 'TITLE', 'LOGO')
					);
					while($ar = $dbRes->Fetch())
					{
						$formatted = self::formatCrmEmailEntity($ar, array(
							'TYPE' => 'COMPANY',
							'EMAIL' => $arEmail[$ar['ID']]
						));
						if (!empty($formatted))
						{
							$result[$formatted['id']] = $formatted;
						}
					}
				}

				$leads = CCrmActivity::FindLeadCommunications($search, 'EMAIL', 50);
				if (!empty($leads))
				{
					$arId = $arEmail = array();
					foreach($leads as $lead)
					{
						$arEmail[intval($lead["ENTITY_ID"])] = $lead["VALUE"];
						$arId[] = intval($lead["ENTITY_ID"]);
					}

					$dbRes = CCrmLead::GetListEx(
						array(),
						array(
							'CHECK_PERMISSIONS' => 'Y',
							'ID' => $arId
						),
						false,
						array('nTopCount' => 10),
						array('ID', 'TITLE', 'NAME', 'SECOND_NAME', 'LAST_NAME')
					);
					while($ar = $dbRes->Fetch())
					{
						$formatted = self::formatCrmEmailEntity($ar, array(
							'TYPE' => 'LEAD',
							'EMAIL' => $arEmail[$ar['ID']]
						));
						if (!empty($formatted))
						{
							$result[$formatted['id']] = $formatted;
						}
					}
				}
			}
		}

		return $result;
	}

	public static function getSocnetGroup($arParams = array(), &$limitReached = false)
	{
		global $USER;
		static $staticCache = array();

		$userId = intval($USER->GetID());

		$arSocnetGroups = array();
		$arSelect = Array();
		if (isset($arParams['id']))
		{
			if (empty($arParams['id']))
			{
				return $arSocnetGroups;
			}
			else
			{
				foreach ($arParams['id'] as $value)
				{
					$arSelect[] = intval($value);
				}
			}
		}

		$siteId = (
			isset($arParams['site_id'])
			&& strlen($arParams['site_id']) > 0
				? $arParams['site_id']
				: SITE_ID
		);

		$limit = (isset($arParams["limit"]) && intval($arParams["limit"]) > 0 ? intval($arParams["limit"]) : 500);

		$hash = md5(serialize($arParams).$userId.$siteId);
		if (isset($staticCache[$hash]))
		{
			$arSocnetGroups = $staticCache[$hash];
		}
		else
		{
			$arSocnetGroupsTmp = array();
			$tmpList = array();

			if (
				!isset($arParams["ALL"])
				|| $arParams["ALL"] != "Y"
			)
			{
				$filter = array(
					"USER_ID" => $userId,
					"GROUP_ID" => $arSelect,
					"<=ROLE" => \Bitrix\Socialnetwork\UserToGroupTable::ROLE_USER,
					"GROUP_SITE_ID" => $siteId,
					"GROUP_ACTIVE" => "Y"
				);

				if(isset($arParams['GROUP_CLOSED']))
				{
					$filter['GROUP_CLOSED'] = $arParams['GROUP_CLOSED'];
				}

				$res = CSocNetUserToGroup::getList(
					array("GROUP_NAME" => "ASC"),
					$filter,
					false,
					array("nTopCount" => $limit),
					array("ID", "GROUP_ID", "GROUP_NAME", "GROUP_DESCRIPTION", "GROUP_IMAGE_ID")
				);
				while($relation = $res->fetch())
				{
					$tmpList[] = array(
						"id" => $relation["GROUP_ID"],
						"entityId" => $relation["GROUP_ID"],
						"name" => htmlspecialcharsbx($relation["GROUP_NAME"]),
						"desc" => htmlspecialcharsbx($relation["GROUP_DESCRIPTION"]),
						"imageId" => $relation["GROUP_IMAGE_ID"]
					);
				}
			}
			else
			{
				$filter = array(
					"CHECK_PERMISSIONS" => $USER->GetID(),
					"SITE_ID" => $siteId,
					"ACTIVE" => "Y",
					"ID" => $arSelect,
				);
				if(isset($arParams['GROUP_CLOSED']))
				{
					$filter['CLOSED'] = $arParams['GROUP_CLOSED'];
				}

				$res = CSocnetGroup::GetList(
					array("NAME" => "ASC"),
					$filter,
					false,
					array("nTopCount" => $limit),
					array("ID", "NAME", "DESCRIPTION", "IMAGE_ID", "PROJECT")
				);

				while ($group = $res->Fetch())
				{
					$tmpList[] = array(
						"id" => $group["ID"],
						"entityId" => $group["ID"],
						"name" => htmlspecialcharsbx($group["NAME"]),
						"desc" => htmlspecialcharsbx($group["DESCRIPTION"]),
						"imageId" => $group["IMAGE_ID"],
						"project" => ($group["PROJECT"] == 'Y' ? 'Y' : 'N')
					);
				}
			}

			$limitReached = (count($tmpList) == $limit);

			foreach ($tmpList as $key => $group)
			{
				if($group["imageId"])
				{
					$imageFile = CFile::GetFileArray($group["imageId"]);
					if ($imageFile !== false)
					{
						$arFileTmp = CFile::ResizeImageGet(
							$imageFile,
							array(
								"width" => (intval($arParams["THUMBNAIL_SIZE_WIDTH"]) > 0 ? $arParams["THUMBNAIL_SIZE_WIDTH"] : 100),
								"height" => (intval($arParams["THUMBNAIL_SIZE_HEIGHT"]) > 0 ? $arParams["THUMBNAIL_SIZE_HEIGHT"] : 100)
							),
							BX_RESIZE_IMAGE_PROPORTIONAL,
							false
						);
						$group["avatar"] = $arFileTmp["src"];
					}
				}
				unset($group["imageId"]);
				$arSocnetGroupsTmp[$group['id']] = $group;
			}

			if (isset($arParams['features']) && !empty($arParams['features']))
			{
				self::getSocnetGroupFilteredByFeaturePerms($arSocnetGroupsTmp, $arParams['features']);
			}

			if (isset($arParams['initiate']) && $arParams['initiate'] == 'Y')
			{
				self::getSocnetGroupFilteredByInitiatePerms($arSocnetGroupsTmp);
			}

			foreach ($arSocnetGroupsTmp as $value)
			{
				$value['id'] = 'SG'.$value['id'];
				$arSocnetGroups[$value['id']] = $value;
			}

			$staticCache[$hash] = $arSocnetGroups;
		}

		if (isset($arParams['useProjects']) && $arParams['useProjects'] == 'Y')
		{
			$groupsList = $projectsList = array();
			foreach($arSocnetGroups as $key => $value)
			{
				if (
					isset($value['project'])
					&& $value['project'] == 'Y'
				)
				{
					$projectsList[$key] = $value;
				}
				else
				{
					$groupsList[$key] = $value;
				}
			}

			return array(
				'SONETGROUPS' => $groupsList,
				'PROJECTS' => $projectsList
			);
		}

		return $arSocnetGroups;
	}

	public static function GetTreeList($id, $relation, $compat = false)
	{
		if ($compat)
		{
			$tmp = array();
			foreach($relation as $iid => $rel)
			{
				$p = $rel["parent"];
				if (!isset($tmp[$p]))
				{
					$tmp[$p] = array();
				}
				$tmp[$p][] = $iid;
			}
			$relation = $tmp;
		}

		$arRelations = Array();
		if (is_array($relation[$id]))
		{
			foreach ($relation[$id] as $relId)
			{
				$arItems = Array();
				if (
					isset($relation[$relId])
					&& !empty($relation[$relId])
				)
				{
					$arItems = self::GetTreeList($relId, $relation);
				}

				$arRelations[$relId] = Array('id'=>$relId, 'type' => 'category', 'items' => $arItems);
			}
		}

		return $arRelations;
	}

	private static function GetSocnetGroupFilteredByFeaturePerms(&$arGroups, $arFeaturePerms)
	{
		$arGroupsIDs = array();
		foreach($arGroups as $value)
		{
			$arGroupsIDs[] = $value["id"];
		}

		if (sizeof($arGroupsIDs) <= 0)
		{
			return;
		}

		$feature = $arFeaturePerms[0];
		$operations = $arFeaturePerms[1];
		if (!is_array($operations))
		{
			$operations = explode(",", $operations);
		}
		$arGroupsPerms = array();
		foreach($operations as $operation)
		{
			$tmpOps = CSocNetFeaturesPerms::CurrentUserCanPerformOperation(SONET_ENTITY_GROUP, $arGroupsIDs, $feature, $operation);
			if (is_array($tmpOps))
			{
				foreach ($tmpOps as $key=>$val)
				{
					if (!$arGroupsPerms[$key])
					{
						$arGroupsPerms[$key] = $val;
					}
				}
			}
		}
		$arGroupsActive = CSocNetFeatures::IsActiveFeature(SONET_ENTITY_GROUP, $arGroupsIDs, $arFeaturePerms[0]);
		foreach ($arGroups as $key=>$group)
		{
			if (
				!$arGroupsActive[$group["id"]]
				|| !$arGroupsPerms[$group["id"]]
			)
			{
				unset($arGroups[$key]);
			}
		}
	}

	private static function GetSocnetGroupFilteredByInitiatePerms(&$arGroups)
	{
		global $USER;

		$arGroupsIDs = array();
		foreach($arGroups as $value)
		{
			$arGroupsIDs[] = $value["id"];
		}

		if (sizeof($arGroupsIDs) <= 0)
		{
			return;
		}

		if (
			$USER->IsAdmin()
			|| CSocNetUser::IsCurrentUserModuleAdmin(CSite::GetDefSite())
		)
		{
			return;
		}

		$groupsList = array();
		$userRolesList = array();

		$res = \Bitrix\Socialnetwork\WorkgroupTable::getList(array(
			'filter' => array(
				'@ID' => $arGroupsIDs
			),
			'select' => array('ID', 'OWNER_ID', 'INITIATE_PERMS')
		));

		while ($group = $res->fetch())
		{
			$groupsList[$group['ID']] = array(
				'OWNER_ID' => $group['OWNER_ID'],
				'INITIATE_PERMS' => $group['INITIATE_PERMS']
			);
		}

		$res = \Bitrix\Socialnetwork\UserToGroupTable::getList(array(
			'filter' => array(
				'USER_ID' => $USER->getId(),
				'@GROUP_ID' => $arGroupsIDs
			),
			'select' => array('GROUP_ID', 'ROLE')
		));

		while ($relation = $res->fetch())
		{
			$userRolesList[$relation['GROUP_ID']] = $relation['ROLE'];
		}

		$userId = $USER->getId();

		foreach ($arGroups as $key => $group)
		{
			$groupId = $group["id"];

			$canInitiate = (
				(
					isset($groupsList[$groupId])
					&& $groupsList[$groupId]["INITIATE_PERMS"] == \Bitrix\Socialnetwork\UserToGroupTable::ROLE_OWNER
					&& $userId == $groupsList[$groupId]["OWNER_ID"]
				)
				|| (
					isset($groupsList[$groupId])
					&& $groupsList[$groupId]["INITIATE_PERMS"] == \Bitrix\Socialnetwork\UserToGroupTable::ROLE_MODERATOR
					&& isset($userRolesList[$groupId])
					&& in_array($userRolesList[$groupId], array(
						\Bitrix\Socialnetwork\UserToGroupTable::ROLE_OWNER,
						\Bitrix\Socialnetwork\UserToGroupTable::ROLE_MODERATOR
					))
				)
				|| (
					isset($groupsList[$groupId])
					&& $groupsList[$groupId]["INITIATE_PERMS"] == \Bitrix\Socialnetwork\UserToGroupTable::ROLE_USER
					&& isset($userRolesList[$groupId])
					&& in_array($userRolesList[$groupId], array(
						\Bitrix\Socialnetwork\UserToGroupTable::ROLE_OWNER,
						\Bitrix\Socialnetwork\UserToGroupTable::ROLE_MODERATOR,
						\Bitrix\Socialnetwork\UserToGroupTable::ROLE_USER
					))
				)
			);

			if (!$canInitiate)
			{
				unset($arGroups[$key]);
			}
		}
	}

	public static function GetDestinationUsers($arCodes, $fetchUsers = false)
	{
		$userIds = array();
		$users = array();
		$fields = $fetchUsers ? array('ID', 'LOGIN', 'NAME', 'LAST_NAME', 'SECOND_NAME', 'EMAIL', 'PERSONAL_PHOTO', 'WORK_POSITION') : array('ID');

		$usersToFetch = array();
		foreach($arCodes as $code)
		{
			// All users
			if ($code === 'UA')
			{
				$dbRes = CUser::GetList($by = 'ID', $order = 'ASC', array('INTRANET_USERS' => true), array('FIELDS' => $fields));
				while ($user = $dbRes->Fetch())
				{
					if (!in_array($user['ID'], $userIds))
					{
						$userIds[] = $user['ID'];
						if ($fetchUsers)
						{
							$user['USER_ID'] = $user['ID'];
							$users[] = $user;
						}
					}
				}
				$usersToFetch = array();
				break;
			}
			elseif (substr($code, 0, 1) === 'U')
			{
				$userId = intval(substr($code, 1));
				if (!in_array($userId, $userIds))
				{
					$usersToFetch[] = $userId;
					if (!$fetchUsers)
					{
						$userIds[] = $userId;
					}
				}
			}
			elseif (substr($code, 0, 2) === 'SG')
			{
				$groupId = intval(substr($code, 2));
				$dbMembers = CSocNetUserToGroup::GetList(
					array("RAND" => "ASC"),
					array("GROUP_ID" => $groupId, "<=ROLE" => SONET_ROLES_USER, "USER_ACTIVE" => "Y"),
					false,
					false,
					array("ID", "USER_ID", "ROLE", "USER_NAME", "USER_LAST_NAME", "USER_SECOND_NAME", "USER_LOGIN", "USER_EMAIL", "USER_PERSONAL_PHOTO", "USER_WORK_POSITION")
				);

				if ($dbMembers)
				{
					while ($user = $dbMembers->GetNext())
					{
						if (!in_array($user["USER_ID"], $userIds))
						{
							$userIds[] = $user["USER_ID"];
							$users[] = array(
								'ID' => $user["USER_ID"],
								'USER_ID' => $user["USER_ID"],
								'LOGIN' => $user["USER_LOGIN"],
								'NAME' => $user["USER_NAME"],
								'LAST_NAME' => $user["USER_LAST_NAME"],
								'SECOND_NAME' => $user["USER_SECOND_NAME"],
								'EMAIL' => $user["USER_EMAIL"],
								'PERSONAL_PHOTO' => $user["USER_PERSONAL_PHOTO"],
								'WORK_POSITION' => $user["USER_WORK_POSITION"]
							);
						}
					}
				}
			}
			elseif (substr($code, 0, 2) === 'DR')
			{
				$depId = intval(substr($code, 2));

				$res = \Bitrix\Intranet\Util::getDepartmentEmployees(array(
					'DEPARTMENTS' => $depId,
					'RECURSIVE' => 'Y',
					'ACTIVE' => 'Y',
					'SELECT' => $fields
				));

				while ($user = $res->Fetch())
				{
					if (!in_array($user['ID'], $userIds))
					{
						$userIds[] = $user['ID'];
						if ($fetchUsers)
						{
							$user['USER_ID'] = $user['ID'];
							$users[] = $user;
						}
					}
				}
			}
		}

		if (count($usersToFetch) > 0 && $fetchUsers)
		{
			$dbRes = CUser::GetList($by = 'ID', $order = 'ASC',
				array(
					'INTRANET_USERS' => true,
					'ID' => implode('|', $usersToFetch)
				), array('FIELDS' => $fields));

			while ($user = $dbRes->Fetch())
			{
				if (!in_array($user['ID'], $userIds))
				{
					$userIds[] = $user['ID'];
					$user['USER_ID'] = $user['ID'];
					$users[] = $user;
				}
			}
		}

		return $fetchUsers ? $users : $userIds;
	}

	public static function GetDestinationSort($arParams = array(), &$dataAdditional = false)
	{
		global $USER;

		$arResult = array();

		$userId = (
			isset($arParams["USER_ID"])
			&& intval($arParams["USER_ID"]) > 0
				? intval($arParams["USER_ID"])
				: false
		);

		$arContextFilter = (
			isset($arParams["CONTEXT_FILTER"])
			&& is_array($arParams["CONTEXT_FILTER"])
				? $arParams["CONTEXT_FILTER"]
				: false
		);

		$arCodeFilter = (
			isset($arParams["CODE_FILTER"])
				? $arParams["CODE_FILTER"]
				: false
		);

		if (
			$arCodeFilter
			&& !is_array($arCodeFilter)
		)
		{
			$arCodeFilter = array($arCodeFilter);
		}

		if (!$userId)
		{
			if ($USER->IsAuthorized())
			{
				$userId = $USER->GetId();
			}
			else
			{
				return $arResult;
			}
		}

		$cacheTtl = defined("BX_COMP_MANAGED_CACHE") ? 3153600 : 3600*4;
		$cacheId = 'dest_sort'.(!is_array($dataAdditional) ? '' : '_2').$userId.serialize($arParams);
		$cacheDir = '/sonet/log_dest_sort/'.intval($userId / 100);

		$obCache = new CPHPCache;
		if($obCache->InitCache($cacheTtl, $cacheId, $cacheDir))
		{
			$cacheData = $obCache->GetVars();
			$arDestAll = isset($cacheData['DEST_ALL']) ? $cacheData['DEST_ALL'] : array();
			$dataAdditionalUsers = isset($cacheData['DATA_ADDITIONAL_USERS']) ? $cacheData['DATA_ADDITIONAL_USERS'] : array();
		}
		else
		{
			$dataAdditionalUsers = array();

			$obCache->StartDataCache();
			$arFilter = array(
				"USER_ID" => $USER->GetId()
			);

			if (
				IsModuleInstalled('mail')
				&& IsModuleInstalled('intranet')
				&& (
					!isset($arParams["ALLOW_EMAIL_INVITATION"])
					|| !$arParams["ALLOW_EMAIL_INVITATION"]
				)
			)
			{
				$arFilter["!=CODE_USER.EXTERNAL_AUTH_ID"] = 'email';
			}

			if (!empty($arParams["CODE_TYPE"]))
			{
				$arFilter["=CODE_TYPE"] = strtoupper($arParams["CODE_TYPE"]);
			}
			elseif (
				!empty($arParams["DEST_CONTEXT"])
				&& strtoupper($arParams["DEST_CONTEXT"]) != 'CRM_POST'
			)
			{
				$arFilter["!=CODE_TYPE"] = "CRM";
			}

			if (
				is_array($arContextFilter)
				&& !empty($arContextFilter)
			)
			{
				$arFilter["CONTEXT"] = $arContextFilter;
			}

			if (
				is_array($arCodeFilter)
				&& !empty($arCodeFilter)
			)
			{
				$arFilter["CODE"] = $arCodeFilter;
			}

			$arRuntime = array();
			$arOrder = array();

			if (!empty($arParams["DEST_CONTEXT"]))
			{
				$conn = \Bitrix\Main\Application::getConnection();
				$helper = $conn->getSqlHelper();

				$arRuntime = array(
					new \Bitrix\Main\Entity\ExpressionField('CONTEXT_SORT', "CASE WHEN CONTEXT = '".$helper->forSql($arParams["DEST_CONTEXT"])."' THEN 1 ELSE 0 END")
				);

				$arOrder = array(
					'CONTEXT_SORT' => 'DESC'
				);
			}

			$arOrder['LAST_USE_DATE'] = 'DESC';

			$emailUserCodeList = $emailCrmUserCodeList = array();

			if (
				IsModuleInstalled('mail')
				&& IsModuleInstalled('intranet')
				&& isset($arParams["ALLOW_EMAIL_INVITATION"])
				&& $arParams["ALLOW_EMAIL_INVITATION"]
			)
			{
				$rsDest = \Bitrix\Main\FinderDestTable::getList(array(
					'order' => $arOrder,
					'filter' => array(
						"USER_ID" => $USER->getId(),
						"=CODE_USER.EXTERNAL_AUTH_ID" => 'email',
						"=CODE_TYPE" => 'U'
					),
					'select' => array('CODE'),
					'runtime' => $arRuntime,
					'limit' => self::LIST_USER_LIMIT
				));
				while($arDest = $rsDest->fetch())
				{
					$emailUserCodeList[] = $arDest['CODE'];
				}
				$dataAdditionalUsers['UE'] = $emailUserCodeList;
			}

			if (
				!empty($arParams["DEST_CONTEXT"])
				&& $arParams["DEST_CONTEXT"] == "CRM_POST"
			)
			{
				$rsDest = \Bitrix\Main\FinderDestTable::getList(array(
					'order' => $arOrder,
					'filter' => array(
						"USER_ID" => $USER->getId(),
						"!=CODE_USER.UF_USER_CRM_ENTITY" => false,
						"=CODE_TYPE" => 'U'
					),
					'select' => array('CODE'),
					'runtime' => $arRuntime,
					'limit' => self::LIST_USER_LIMIT
				));
				while($arDest = $rsDest->fetch())
				{
					$emailCrmUserCodeList[] = $arDest['CODE'];
				}
				$dataAdditionalUsers['UCRM'] = $emailCrmUserCodeList;
			}

			$rsDest = \Bitrix\Main\FinderDestTable::getList(array(
				'order' => $arOrder,
				'filter' => $arFilter,
				'select' => array(
					'CONTEXT',
					'CODE',
					'LAST_USE_DATE'
				),
				'runtime' => $arRuntime
			));

			$arDestAll = array();

			while($arDest = $rsDest->Fetch())
			{
				$arDest["LAST_USE_DATE"] = MakeTimeStamp($arDest["LAST_USE_DATE"]->toString());
				$arDestAll[] = $arDest;
			}

			$obCache->EndDataCache(array(
				"DEST_ALL" => $arDestAll,
				"DATA_ADDITIONAL_USERS" => $dataAdditionalUsers
			));
		}

		if (!is_array($dataAdditional))
		{
			$dataAdditional = array();
		}
		$dataAdditional = array_merge($dataAdditional, $dataAdditionalUsers);

		foreach ($arDestAll as $arDest)
		{
			if(!isset($arResult[$arDest["CODE"]]))
			{
				$arResult[$arDest["CODE"]] = array();
			}

			$contextType = (
				isset($arParams["DEST_CONTEXT"])
				&& $arParams["DEST_CONTEXT"] == $arDest["CONTEXT"]
					? "Y"
					: "N"
			);

			if (
				$contextType == "Y"
				|| !isset($arResult[$arDest["CODE"]]["N"])
				|| $arDest["LAST_USE_DATE"] > $arResult[$arDest["CODE"]]["N"]
			)
			{
				$arResult[$arDest["CODE"]][$contextType] = $arDest["LAST_USE_DATE"];
			}
		}

		return $arResult;
	}

	public static function CompareDestinations($a, $b)
	{
		if(!is_array($a) && !is_array($b))
		{
			return 0;
		}
		elseif(is_array($a) && !is_array($b))
		{
			return -1;
		}
		elseif(!is_array($a) && is_array($b))
		{
			return 1;
		}
		else
		{
			if(isset($a["SORT"]["Y"]) && !isset($b["SORT"]["Y"]))
			{
				return -1;
			}
			elseif(!isset($a["SORT"]["Y"]) && isset($b["SORT"]["Y"]))
			{
				return 1;
			}
			elseif(isset($a["SORT"]["Y"]) && isset($b["SORT"]["Y"]))
			{
				if(intval($a["SORT"]["Y"]) > intval($b["SORT"]["Y"]))
				{
					return -1;
				}
				elseif(intval($a["SORT"]["Y"]) < intval($b["SORT"]["Y"]))
				{
					return 1;
				}
				else
				{
					return 0;
				}
			}
			else
			{
				if(intval($a["SORT"]["N"]) > intval($b["SORT"]["N"]))
				{
					return -1;
				}
				elseif(intval($a["SORT"]["N"]) < intval($b["SORT"]["N"]))
				{
					return 1;
				}
				else
				{
					return 0;
				}
			}
		}
	}

	public static function SortDestinations(&$arAllDest, $arSort)
	{
		foreach($arAllDest as $type => $arLastDest)
		{
			if (is_array($arLastDest))
			{
				foreach($arLastDest as $key => $value)
				{
					if (isset($arSort[$key]))
					{
						$arAllDest[$type][$key] = array(
							"VALUE" => $value,
							"SORT" => $arSort[$key]
						);
					}
				}

				uasort($arAllDest[$type], array(__CLASS__, 'CompareDestinations'));
			}
		}

		foreach($arAllDest as $type => $arLastDest)
		{
			if (is_array($arLastDest))
			{
				foreach($arLastDest as $key => $val)
				{
					if (is_array($val))
					{
						$arAllDest[$type][$key] = $val["VALUE"];
					}
				}
			}
		}
	}

	public static function fillLastDestination($arDestinationSort, &$arLastDestination, $arParams = array())
	{
		global $USER;

		$result = array();

		$iUCounter = $iSGCounter = $iDCounter = 0;
		$iCRMContactCounter = $iCRMCompanyCounter = $iCRMDealCounter = $iCRMLeadCounter = 0;
		$bCrm = (
			is_array($arParams)
			&& isset($arParams["CRM"])
			&& $arParams["CRM"] == "Y"
		);
		$bAllowEmail = (
			is_array($arParams)
			&& isset($arParams["EMAILS"])
			&& $arParams["EMAILS"] == "Y"
		);
		$bAllowCrmEmail = (
			is_array($arParams)
			&& isset($arParams["CRMEMAILS"])
			&& $arParams["CRMEMAILS"] == "Y"
			&& ModuleManager::isModuleInstalled('crm')
		);
		$bAllowProject = (
			is_array($arParams)
			&& isset($arParams["PROJECTS"])
			&& $arParams["PROJECTS"] == "Y"
		);
		$dataAdditional = (
			is_array($arParams)
			&& isset($arParams["DATA_ADDITIONAL"])
			&& is_array($arParams["DATA_ADDITIONAL"])
				? $arParams["DATA_ADDITIONAL"]
				: array()
		);

		if (is_array($arDestinationSort))
		{
			$userIdList = $sonetGroupIdList = array();
			$userLimit = self::LIST_USER_LIMIT;
			$sonetGroupLimit = 6;
			$departmentLimit = 6;
			$crmContactLimit = $crmCompanyLimit = $crmDealLimit = $crmLeadLimit = 6;

			foreach ($arDestinationSort as $code => $sortInfo)
			{
				if (
					!$bAllowEmail
					&& !$bAllowCrmEmail
					&& !$bAllowProject
					&& ($iUCounter >= $userLimit)
					&& $iSGCounter >= $sonetGroupLimit
					&& $iDCounter >= $departmentLimit
					&& $iCRMContactCounter >= $crmContactLimit
					&& $iCRMCompanyCounter >= $crmCompanyLimit
					&& $iCRMDealCounter >= $crmDealLimit
					&& $iCRMLeadCounter >= $crmLeadLimit
				)
				{
					break;
				}

				if (preg_match('/^U(\d+)$/i', $code, $matches))
				{
					if (
						!$bAllowEmail
						&& !$bAllowCrmEmail
						&& $iUCounter >= $userLimit
					)
					{
						continue;
					}
					if (!isset($arLastDestination['USERS']))
					{
						$arLastDestination['USERS'] = array();
					}
					$arLastDestination['USERS'][$code] = $code;
					$userIdList[] = intval($matches[1]);
					$iUCounter++;
				}
				elseif (preg_match('/^SG(\d+)$/i', $code, $matches))
				{
					if (
						!$bAllowProject
						&& $iSGCounter >= $sonetGroupLimit
					)
					{
						continue;
					}
					if (!isset($arLastDestination['SONETGROUPS']))
					{
						$arLastDestination['SONETGROUPS'] = array();
					}
					$arLastDestination['SONETGROUPS'][$code] = $code;
					$sonetGroupIdList[] = intval($matches[1]);
					$iSGCounter++;
				}
				elseif (
					preg_match('/^D(\d+)$/i', $code, $matches)
					|| preg_match('/^DR(\d+)$/i', $code, $matches)
				)
				{
					if ($iDCounter >= $departmentLimit)
					{
						continue;
					}
					if (!isset($arLastDestination['DEPARTMENT']))
					{
						$arLastDestination['DEPARTMENT'] = array();
					}
					$arLastDestination['DEPARTMENT'][$code] = $code;
					$iDCounter++;
				}
				elseif (
					$bCrm
					&& preg_match('/^CRMCONTACT(\d+)$/i', $code, $matches)
				)
				{
					if ($iCRMContactCounter >= $crmContactLimit)
					{
						continue;
					}
					if (!isset($arLastDestination['CONTACTS']))
					{
						$arLastDestination['CONTACTS'] = array();
					}
					$arLastDestination['CONTACTS'][$code] = $code;
					$iCRMContactCounter++;
				}
				elseif (
					$bCrm
					&& preg_match('/^CRMCOMPANY(\d+)$/i', $code, $matches)
				)
				{
					if ($iCRMCompanyCounter >= $crmCompanyLimit)
					{
						continue;
					}
					if (!isset($arLastDestination['COMPANIES']))
					{
						$arLastDestination['COMPANIES'] = array();
					}
					$arLastDestination['COMPANIES'][$code] = $code;
					$iCRMCompanyCounter++;
				}
				elseif (
					$bCrm
					&& preg_match('/^CRMDEAL(\d+)$/i', $code, $matches)
				)
				{
					if ($iCRMDealCounter >= $crmDealLimit)
					{
						continue;
					}
					if (!isset($arLastDestination['DEALS']))
					{
						$arLastDestination['DEALS'] = array();
					}
					$arLastDestination['DEALS'][$code] = $code;
					$iCRMDealCounter++;
				}
				elseif (
					$bCrm
					&& preg_match('/^CRMLEAD(\d+)$/i', $code, $matches)
				)
				{
					if ($iCRMLeadCounter >= $crmLeadLimit)
					{
						continue;
					}
					if (!isset($arLastDestination['LEADS']))
					{
						$arLastDestination['LEADS'] = array();
					}
					$arLastDestination['LEADS'][$code] = $code;
					$iCRMLeadCounter++;
				}
			}

			if (
				(
					$bAllowEmail
					|| $bAllowCrmEmail
				)
				&& !empty($userIdList)
			)
			{
				$iUCounter = $iUECounter = $iUCRMCounter = 0;
				$emailLimit = $crmLimit = 10;
				$userId = $USER->getId();
				$destUList = $destUEList = $destUCRMList = array();

				if (
					(
						isset($dataAdditional['UE'])
						&& is_array($dataAdditional['UE'])
					)
					|| (
						isset($dataAdditional['UCRM'])
						&& is_array($dataAdditional['UCRM'])
					)
				)
				{
					if (
						empty($dataAdditional['UE'])
						&& empty($dataAdditional['UCRM'])
					)
					{
						foreach($userIdList as $uId)
						{
							$code = 'U'.$uId;
							$destUList[$code] = $code;
						}
					}
					else
					{
						foreach($userIdList as $uId)
						{
							if (
								$iUCounter >= $userLimit
								&& $iUECounter >= $emailLimit
								&& $iUCRMCounter >= $crmLimit
							)
							{
								break;
							}

							$code = 'U'.$uId;

							if (
								$bAllowEmail
								&& in_array($code, $dataAdditional['UE'])
							)
							{
								if ($iUECounter >= $emailLimit)
								{
									continue;
								}
								$destUEList[$code] = $code;
								$iUECounter++;
							}
							elseif (
								$bAllowCrmEmail
								&& in_array($code, $dataAdditional['UCRM'])
							)
							{
								if ($iUCRMCounter >= $crmLimit)
								{
									continue;
								}
								$destUCRMList[$code] = $code;
								$iUCRMCounter++;
							}
							else
							{
								if ($iUCounter >= $userLimit)
								{
									continue;
								}
								$destUList[$code] = $code;
								$iUCounter++;
							}
						}
					}
				}
				else // old method
				{
					$cacheTtl = defined("BX_COMP_MANAGED_CACHE") ? 3153600 : 3600*4;
					$cacheId = 'dest_sort_users'.$userId.serialize($arParams).intval($bAllowCrmEmail);
					$cacheDir = '/sonet/log_dest_sort/'.intval($userId / 100);
					$obCache = new CPHPCache;

					if($obCache->InitCache($cacheTtl, $cacheId, $cacheDir))
					{
						$cacheVars = $obCache->GetVars();
						$destUList = $cacheVars['U'];
						$destUEList = $cacheVars['UE'];
						$destUCRMList = $cacheVars['UCRM'];
					}
					else
					{
						$obCache->StartDataCache();

						$selectList = array('ID', 'EXTERNAL_AUTH_ID');
						if ($bAllowCrmEmail)
						{
							$selectList[] = 'UF_USER_CRM_ENTITY';
						}
						$selectList[] = new \Bitrix\Main\Entity\ExpressionField('MAX_LAST_USE_DATE', 'MAX(%s)', array('\Bitrix\Main\FinderDest:CODE_USER_CURRENT.LAST_USE_DATE'));

						$res = \Bitrix\Main\UserTable::getList(array(
							'order' => array(
								"MAX_LAST_USE_DATE" => 'DESC',
							),
							'filter' => array(
								'@ID' => $userIdList
							),
							'select' => $selectList
						));

						while($destUser = $res->fetch())
						{
							if (
								$iUCounter >= $userLimit
								&& $iUECounter >= $emailLimit
								&& $iUCRMCounter >= $crmLimit
							)
							{
								break;
							}

							$code = 'U'.$destUser['ID'];

							if ($bAllowEmail && $destUser['EXTERNAL_AUTH_ID'] == 'email')
							{
								if ($iUECounter >= $emailLimit)
								{
									continue;
								}
								$destUEList[$code] = $code;
								$iUECounter++;
							}
							elseif (
								$bAllowCrmEmail
								&& !empty($destUser['UF_USER_CRM_ENTITY'])
							)
							{
								if ($iUCRMCounter >= $crmLimit)
								{
									continue;
								}
								$destUCRMList[$code] = $code;
								$iUCRMCounter++;
							}
							else
							{
								if ($iUCounter >= $userLimit)
								{
									continue;
								}
								$destUList[$code] = $code;
								$iUCounter++;
							}
						}

						$obCache->EndDataCache(array(
							'U' => $destUList,
							'UE' => $destUEList,
							'UCRM' => $destUCRMList
						));
					}
				}

				$arLastDestination['USERS'] = array_merge($destUList, $destUEList, $destUCRMList);
				$tmp = array('USERS' => $arLastDestination['USERS']);
				CSocNetLogDestination::sortDestinations($tmp, $arDestinationSort);
				$arLastDestination['USERS'] = $tmp['USERS'];
			}

			if (
				$bAllowProject
				&& !empty($sonetGroupIdList)
			)
			{
				$iSGCounter = $iSGPCounter = 0;
				$projectLimit = 10;
				$userId = $USER->getId();

				$destSGList = $destSGPList = array();

				$cacheTtl = defined("BX_COMP_MANAGED_CACHE") ? 3153600 : 3600*4;
				$cacheId = 'dest_sort_sonetgroups'.$userId.serialize($arParams);
				$cacheDir = '/sonet/log_dest_sort/'.intval($userId / 100);
				$obCache = new CPHPCache;

				if($obCache->InitCache($cacheTtl, $cacheId, $cacheDir))
				{
					$cacheVars = $obCache->GetVars();
					$destSGList = $cacheVars['SG'];
					$destSGPList = $cacheVars['SGP'];
				}
				else
				{
					$obCache->StartDataCache();

					$res = \Bitrix\Socialnetwork\WorkgroupTable::getList(array(
						'filter' => array(
							'@ID' => $sonetGroupIdList
						),
						'select' => array('ID', 'PROJECT')
					));

					while($destSonetGroup = $res->fetch())
					{
						if (
							$iSGCounter >= $sonetGroupLimit
							&& $iSGPCounter >= $projectLimit
						)
						{
							break;
						}

						$code = 'SG'.$destSonetGroup['ID'];

						if ($destSonetGroup['PROJECT'] == 'Y')
						{
							if ($iSGPCounter >= $projectLimit)
							{
								continue;
							}
							$destSGPList[$code] = $code;
							$iSGPCounter++;
						}
						else
						{
							if ($iSGCounter >= $sonetGroupLimit)
							{
								continue;
							}
							$destSGList[$code] = $code;
							$iSGCounter++;
						}
					}

					$obCache->EndDataCache(array(
						'SG' => $destSGList,
						'SGP' => $destSGPList
					));
				}

				$tmp = array(
					'SONETGROUPS' => $destSGList,
					'PROJECTS' => $destSGPList
				);

				CSocNetLogDestination::sortDestinations($tmp, $arDestinationSort);

				$arLastDestination['SONETGROUPS'] = $tmp['SONETGROUPS'];
				$arLastDestination['PROJECTS'] = $tmp['PROJECTS'];
			}
		}

		foreach($arLastDestination as $groupKey => $entitiesList)
		{
			$result[$groupKey] = array();

			if (is_array($entitiesList))
			{
				$tmp = array();
				$sort = 0;
				foreach($entitiesList as $key => $value)
				{
					$tmp[$key] = $sort++;
				}
				$result[$groupKey] = $tmp;
			}
		}

		return $result;
	}

	public static function fillEmails(&$arDest)
	{
		$arDest["EMAILS"] = array();
		$arDest["LAST"]["EMAILS"] = array();

		if (
			!empty($arDest)
			&& !empty($arDest["LAST"])
			&& !empty($arDest["LAST"]["USERS"])
			&& !empty($arDest["USERS"])
		)
		{
			foreach($arDest["LAST"]["USERS"] as $key => $value)
			{
				if (
					isset($arDest["USERS"][$key])
					&& is_array($arDest["USERS"][$key])
					&& isset($arDest["USERS"][$key]["isEmail"])
					&& $arDest["USERS"][$key]["isEmail"] == "Y"
				)
				{
					$arDest["EMAILS"][$key] = $arDest["USERS"][$key];
					$arDest["LAST"]["EMAILS"][$key] = $value;
				}
			}
		}
	}

	public static function fillCrmEmails(&$arDest)
	{
		$arDest["CRMEMAILS"] = array();
		$arDest["LAST"]["CRMEMAILS"] = array();

		if (
			!empty($arDest)
			&& !empty($arDest["LAST"])
			&& !empty($arDest["LAST"]["USERS"])
			&& !empty($arDest["USERS"])
		)
		{
			foreach($arDest["LAST"]["USERS"] as $key => $value)
			{
				if (
					isset($arDest["USERS"][$key])
					&& is_array($arDest["USERS"][$key])
					&& isset($arDest["USERS"][$key]["isCrmEmail"])
					&& $arDest["USERS"][$key]["isCrmEmail"] == "Y"
				)
				{
					$arDest["CRMEMAILS"][$key] = $arDest["USERS"][$key];
					$arDest["LAST"]["CRMEMAILS"][$key] = $value;
				}
			}
		}
	}

	public static function getUsersAll($arParams)
	{
		global $DB, $USER;

		static $arFields = array(
			"ID" => Array("FIELD" => "U.ID", "TYPE" => "int"),
			"ACTIVE" => Array("FIELD" => "U.ACTIVE", "TYPE" => "string"),
			"NAME" => Array("FIELD" => "U.NAME", "TYPE" => "string"),
			"EMAIL" => Array("FIELD" => "U.EMAIL", "TYPE" => "string"),
			"LAST_NAME" => Array("FIELD" => "U.LAST_NAME", "TYPE" => "string"),
			"SECOND_NAME" => Array("FIELD" => "U.SECOND_NAME", "TYPE" => "string"),
			"LOGIN" => Array("FIELD" => "U.LOGIN", "TYPE" => "string"),
			"PERSONAL_PHOTO" => Array("FIELD" => "U.PERSONAL_PHOTO", "TYPE" => "int"),
			"WORK_POSITION" => Array("FIELD" => "U.WORK_POSITION", "TYPE" => "string"),
			"CONFIRM_CODE" =>  Array("FIELD" => "U.CONFIRM_CODE", "TYPE" => "string"),
			"PERSONAL_PROFESSION" => Array("FIELD" => "U.PERSONAL_PROFESSION", "TYPE" => "string"),
			"EXTERNAL_AUTH_ID" => Array("FIELD" => "U.EXTERNAL_AUTH_ID", "TYPE" => "string")
		);

		$currentUserId = $USER->GetId();
		$extranetUserIdList = \Bitrix\Socialnetwork\ComponentHelper::getExtranetUserIdList();

		if (!$currentUserId)
		{
			return array();
		}

		$bExtranetEnabled = CModule::includeModule("extranet");

		$bExtranetUser = (
			$bExtranetEnabled
			&& !CExtranet::IsIntranetUser()
		);

		$bExtranetWorkgroupsAllowed = (
			$bExtranetEnabled
			&& CExtranet::WorkgroupsAllowed()
		);

		$bShowAllContactsAllowed = (
			$bExtranetEnabled
			&& CExtranet::ShowAllContactsAllowed()
		);

		$rsData = CUserTypeEntity::GetList(
			array("ID" => "ASC"),
			array(
				"FIELD_NAME" => "UF_DEPARTMENT",
				"ENTITY_ID" => "USER"
			)
		);
		if($arRes = $rsData->Fetch())
		{
			$UFId = intval($arRes["ID"]);
		}
		else
		{
			return array();
		}

		if (
			$bExtranetUser
			&& !$bExtranetWorkgroupsAllowed
		) // limited extranet
		{
			return false;
		}

		$arOrder = array("ID" => "ASC");
		$arFilter = array('ACTIVE' => 'Y');

		if (
			IsModuleInstalled("intranet")
			|| COption::GetOptionString("main", "new_user_registration_email_confirmation", "N") == "Y"
		)
		{
			$arFilter["CONFIRM_CODE"] = false;
		}

		$arExternalAuthId = self::getExternalAuthIdBlackList();

		if (!empty($arExternalAuthId))
		{
			$arFilter['!EXTERNAL_AUTH_ID'] = $arExternalAuthId;
		}

		$arGroupBy = false;
		$arSelectFields = array("ID", "NAME", "LAST_NAME", "SECOND_NAME", "LOGIN", "PERSONAL_PHOTO", "WORK_POSITION", "PERSONAL_PROFESSION", "EXTERNAL_AUTH_ID", "EMAIL");

		$arSqls = CSocNetGroup::PrepareSql($arFields, $arOrder, $arFilter, $arGroupBy, $arSelectFields);
		$arSqls["SELECT"] = str_replace("%%_DISTINCT_%%", "DISTINCT", $arSqls["SELECT"]);
		$strJoin = $strJoin2 = $arSqls2 = false;

		if ($bExtranetEnabled)
		{
			if ($bExtranetWorkgroupsAllowed)
			{
				if (!$bExtranetUser)
				{
					$strJoin = "
						INNER JOIN b_utm_user UM ON UM.VALUE_ID = U.ID and FIELD_ID = ".intval($UFId)."
					";

					$tmp = $arSqls;

					$arSqls["WHERE"] .= (strlen($arSqls["WHERE"]) > 0 ? " AND " : "")."
						(UM.VALUE_INT > 0)";

					if (!$bShowAllContactsAllowed)
					{
						// select all the users (intranet and extranet from my groups)
						$strJoin2 = "
							INNER JOIN b_sonet_user2group UG ON UG.USER_ID = U.ID
							INNER JOIN b_sonet_user2group UG_MY ON UG_MY.GROUP_ID = UG.GROUP_ID AND UG_MY.USER_ID = ".intval($currentUserId)."
						";
						$arSqls2 = $tmp;
					}
				}
				else
				{
					$strJoin = "
						INNER JOIN b_sonet_user2group UG ON UG.USER_ID = U.ID
						INNER JOIN b_sonet_user2group UG_MY ON UG_MY.GROUP_ID = UG.GROUP_ID AND UG_MY.USER_ID = ".intval($currentUserId)."
					";
				}
			}
			elseif (!$bShowAllContactsAllowed) // limited extranet, only for intranet users, don't show extranet
			{
				$strJoin = "INNER JOIN b_utm_user UM ON UM.VALUE_ID = U.ID and FIELD_ID = ".intval($UFId);
				$arSqls["WHERE"] .= (strlen($arSqls["WHERE"]) > 0 ? " AND " : "")."UM.VALUE_INT > 0";
			}
		}

		$strSql =
			"SELECT
				".$arSqls["SELECT"]."
			FROM b_user U
				".$arSqls["FROM"]." ";

		if ($strJoin)
		{
			$strSql .= $strJoin." ";
		}

		if (strlen($arSqls["WHERE"]) > 0)
		{
			$strSql .= "WHERE ".$arSqls["WHERE"]." ";
		}

		if ($strJoin2)
		{
			$strSql .=
				"UNION SELECT
					".$arSqls2["SELECT"]."
				FROM b_user U
					".$arSqls2["FROM"]." ";

				$strSql .= $strJoin2." ";

			if (strlen($arSqls2["WHERE"]) > 0)
			{
				$strSql .= "WHERE ".$arSqls2["WHERE"]." ";
			}

			$strSql .= "ORDER BY ID ASC"; // cannot use alias
		}
		else // only without union
		{
			if (strlen($arSqls["ORDERBY"]) > 0)
			{
				$strSql .= "ORDER BY ".$arSqls["ORDERBY"]." ";
			}
		}

		//echo "!1!=".htmlspecialcharsbx($strSql)."<br>";

		$dbRes = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__);

		$maxCount = (IsModuleInstalled('bitrix24') ? 200 : 500);
		$resultCount = 0;
		$countExceeded = false;
		$arUsers = array();

		if ($bExtranetEnabled)
		{
			CSocNetTools::InitGlobalExtranetArrays();
		}

		while ($arUser = $dbRes->GetNext())
		{
			if ($resultCount > $maxCount)
			{
				$countExceeded = true;
				break;
			}

			$sName = trim(CUser::FormatName(empty($arParams["NAME_TEMPLATE"]) ? CSite::GetNameFormat(false) : $arParams["NAME_TEMPLATE"], $arUser, true, false));

			if (empty($sName))
			{
				$sName = $arUser["~LOGIN"];
			}

			$arFileTmp = CFile::ResizeImageGet(
				$arUser["PERSONAL_PHOTO"],
				array('width' => 100, 'height' => 100),
				BX_RESIZE_IMAGE_EXACT,
				false
			);

			$arUsers['U'.$arUser["ID"]] = Array(
				'id' => 'U'.$arUser["ID"],
				'entityId' => $arUser["ID"],
				'email' => $arUser["EMAIL"],
				'name' => $sName,
				'avatar' => empty($arFileTmp['src'])? '': $arFileTmp['src'],
				'desc' => $arUser['WORK_POSITION'] ? $arUser['WORK_POSITION'] : ($arUser['PERSONAL_PROFESSION'] ? $arUser['PERSONAL_PROFESSION'] : '&nbsp;'),
				'isExtranet' => (in_array($arUser["ID"], $extranetUserIdList) ? "Y" : "N"),
				'isEmail' => ($arUser['EXTERNAL_AUTH_ID'] == 'email' ? 'Y' : 'N'),
				'active' => 'Y'
			);

			if ($arUser['EXTERNAL_AUTH_ID'] == 'email')
			{
				$arUsers['U'.$arUser["ID"]]['email'] = $arUser['EMAIL'];
			}

			$arUsers['U'.$arUser["ID"]]['checksum'] = md5(serialize($arUsers['U'.$arUser["ID"]]));
			$arUsers['U'.$arUser["ID"]]['login'] = '';

			$resultCount++;
		}

		if ($countExceeded)
		{
			return CSocNetLogDestination::GetUsers(
				array(
					"id" => array($currentUserId)
				),
				true
			);
		}

		return $arUsers;
	}

	public static function formatUser($arUser, $arParams = array())
	{
		static $siteNameFormat = false;
		static $isIntranetInstalled = false;
		static $extranetUserIdList = false;

		if ($siteNameFormat === false)
		{
			$siteNameFormat = CSite::GetNameFormat(false);
		}

		if ($isIntranetInstalled === false)
		{
			$isIntranetInstalled = (IsModuleInstalled('intranet') ? 'Y' : 'N');
		}

		if ($extranetUserIdList === false)
		{
			$extranetUserIdList = \Bitrix\Socialnetwork\ComponentHelper::getExtranetUserIdList();
		}

		$arFileTmp = CFile::ResizeImageGet(
			$arUser["PERSONAL_PHOTO"],
			array('width' => 100, 'height' => 100),
			BX_RESIZE_IMAGE_EXACT,
			false
		);

		$arRes = array(
			'id' => 'U'.$arUser["ID"],
			'entityId' => $arUser["ID"],
			'name' => CUser::FormatName(
				(
					!empty($arParams["NAME_TEMPLATE"])
						? $arParams["NAME_TEMPLATE"]
						: $siteNameFormat
				),
				$arUser,
				true,
				true
			),
			'avatar' => (
				empty($arFileTmp['src'])
					? ''
					: $arFileTmp['src']
			),
			'desc' => (
				$arUser['WORK_POSITION']
					? $arUser['WORK_POSITION']
					: (
						$arUser['PERSONAL_PROFESSION']
							? $arUser['PERSONAL_PROFESSION']
							: '&nbsp;'
				)
			),
			'isExtranet' => (
				in_array($arUser["ID"], $extranetUserIdList)
					? "Y"
					: "N"
			),
			'isEmail' => (
				isset($arUser['EXTERNAL_AUTH_ID'])
				&& $arUser['EXTERNAL_AUTH_ID'] == 'email'
					? 'Y'
					: 'N'
			)
		);

		if (!empty($arUser["UF_USER_CRM_ENTITY"]))
		{
			$arRes['crmEntity'] = $arUser["UF_USER_CRM_ENTITY"];
		}

		if (!empty($arUser["ACTIVE"]))
		{
			$arRes['active'] = $arUser["ACTIVE"];
		}

		$arRes["email"] = $arUser['EMAIL'];
		if (
			(
				isset($arParams['USE_EMAIL'])
				&& $arParams['USE_EMAIL']
			)
			|| $arRes['isEmail'] == 'Y'
		)
		{
			if (
				strlen($arUser["NAME"]) > 0
				|| strlen($arUser["NAME"]) > 0
			)
			{
				$arRes['showEmail'] = "Y";
			}
		}

		$db_events = GetModuleEvents("socialnetwork", "OnSocNetLogDestinationFormatUser");
		while ($arEvent = $db_events->Fetch())
		{
			ExecuteModuleEventEx($arEvent, array($arUser, &$arRes));
		}

		$checksum = md5(serialize($arRes));
		$arRes['checksum'] = $checksum;

		$arRes['login'] = (
			$isIntranetInstalled == 'Y'
			&& isset($arParams['USE_LOGIN'])
			&& $arParams['USE_LOGIN']
				? $arUser["LOGIN"]
				: ''
		);

		return $arRes;
	}

	public static function formatCrmEmailEntity($fields, $params = array())
	{
		static $siteNameFormat = false;

		$result = array();
		$userParams = array();

		if (
			is_array($params)
			&& isset($params["TYPE"])
			&& in_array($params["TYPE"], array('CONTACT', 'COMPANY', 'LEAD'))
		)
		{
			if ($siteNameFormat === false)
			{
				$siteNameFormat = (
					!empty($params["NAME_TEMPLATE"])
						? $params["NAME_TEMPLATE"]
						: CSite::GetNameFormat(false)
				);
			}

			$prefix = '';
			if ($params["TYPE"] == 'CONTACT')
			{
				$prefix = 'C_';
				$imageField = 'PHOTO';
				$userParams = array(
					'name' => $fields['NAME'],
					'lastName' => $fields['LAST_NAME']
				);
				$name = CUser::FormatName(
					$siteNameFormat,
					$fields,
					true,
					true
				);
			}
			elseif ($params["TYPE"] == 'COMPANY')
			{
				$prefix = 'CO_';
				$imageField = 'LOGO';
				$name = $fields['TITLE'];
				$userParams = array(
					'name' => '',
					'lastName' => $fields['TITLE']
				);
			}
			elseif ($params["TYPE"] == 'LEAD')
			{
				$prefix = 'L_';
				$imageField = false;
				$name = $fields['TITLE'];
				$userParams = array(
					'name' => $fields['NAME'],
					'lastName' => $fields['LAST_NAME']
				);
				$username = CUser::FormatName(
					$siteNameFormat,
					$fields,
					true,
					true
				);
				if (!empty($username))
				{
					$name .= ', '.$username;
				}
			}

			if (
				$imageField
				&& isset($fields[$imageField])
			)
			{
				$arFileTmp = CFile::ResizeImageGet(
					$fields[$imageField],
					array('width' => 100, 'height' => 100),
					BX_RESIZE_IMAGE_EXACT,
					false
				);
			}
			else
			{
				$arFileTmp = array();
			}

			$result = array(
				'id' => $prefix.$fields["ID"],
				'crmEntity' => $prefix.$fields["ID"],
				'entityId' => $fields['ID'],
				'name' => $name,
				'avatar' => (
					empty($arFileTmp['src'])
						? ''
						: $arFileTmp['src']
				),
				'desc' => (!empty($params['EMAIL']) ? $params['EMAIL'] : ''),
				'email' => (!empty($params['EMAIL']) ? $params['EMAIL'] : ''),
				'isExtranet' => 'N',
				'isEmail' => 'Y',
				'isCrmEmail' => 'Y',
				'params' => $userParams
			);
		}

		return $result;
	}

	public static function formatNetworkUser($fields, $params = array())
	{
		static $siteNameFormat = false;

		$result = array();
		$userParams = array();

		if ($siteNameFormat === false)
		{
			$siteNameFormat = (
				!empty($params["NAME_TEMPLATE"])
					? $params["NAME_TEMPLATE"]
					: CSite::GetNameFormat(false)
			);
		}

		$name = CUser::FormatName(
			$siteNameFormat,
			$fields,
			true,
			true
		);

		if (isset($fields["EXTERNAL_AUTH_ID"]) && $fields["EXTERNAL_AUTH_ID"] == "replica")
			list(,$domain) = explode("@", $fields["LOGIN"], 2);
		else
			$domain = $fields["CLIENT_DOMAIN"];

		if ($fields["PERSONAL_PHOTO"])
		{
			$arFileTmp = CFile::ResizeImageGet(
				$fields["PERSONAL_PHOTO"],
				array('width' => 32, 'height' => 32),
				BX_RESIZE_IMAGE_EXACT,
				false
			);
		}

		$userParams = array(
			'name' => $fields['NAME'],
			'lastName' => $fields['LAST_NAME'],
			'domain' => $domain,
		);

		$result = array(
			'id' => isset($fields['ID'])? $fields['ID']: $fields['XML_ID'],
			'entityId' => isset($fields['ID'])? $fields['ID']: $fields['XML_ID'],
			'name' => $name,
			'avatar' => $fields["PERSONAL_PHOTO"] && !empty($arFileTmp['src'])? $arFileTmp['src']: '',
			'desc' => $domain,
			'showDesc' => true,
			'email' => (!empty($fields['EMAIL']) ? $fields['EMAIL'] : ''),
			'networkId' => $fields['NETWORK_ID'],
			'isExtranet' => 'N',
			'isEmail' => 'N',
			'isNetwork' => 'Y',
			'params' => $userParams
		);

		return $result;
	}

	private static function getExternalAuthIdBlackList($params = array())
	{
		$result = array(
			"bot",
			"imconnector"
		);

		if (
			!is_array($params)
			|| !isset($params["NETWORK_SEARCH"])
			|| !$params["NETWORK_SEARCH"]
		)
		{
			$result[] = 'replica';
		}

		return $result;
	}


}
?>

Zerion Mini Shell 1.0