Your IP : 18.117.184.173


Current Path : /home/bitrix/ext_www/dev.klimatlend.ua/bitrix/modules/socialnetwork/classes/general/
Upload File :
Current File : /home/bitrix/ext_www/dev.klimatlend.ua/bitrix/modules/socialnetwork/classes/general/log.php

<?
IncludeModuleLangFile(__FILE__);

class CAllSocNetLog
{
	/***************************************/
	/********  DATA MODIFICATION  **********/
	/***************************************/
	function CheckFields($ACTION, &$arFields, $ID = 0)
	{
		static $arSiteWorkgroupsPage;

		global $DB, $APPLICATION, $USER_FIELD_MANAGER;

		if (!$arSiteWorkgroupsPage && IsModuleInstalled("extranet") && $arFields["ENTITY_TYPE"] == SONET_ENTITY_GROUP)
		{
			$rsSite = CSite::GetList($by="sort", $order="desc", Array("ACTIVE" => "Y"));
			while($arSite = $rsSite->Fetch())
			{
				$arSiteWorkgroupsPage[$arSite["ID"]] = COption::GetOptionString("socialnetwork", "workgroups_page", $arSite["DIR"]."workgroups/", $arSite["ID"]);
			}
		}

		if ($ACTION != "ADD" && IntVal($ID) <= 0)
		{
			$APPLICATION->ThrowException("System error 870164", "ERROR");
			return false;
		}

		$newEntityType = "";

		if ((is_set($arFields, "ENTITY_TYPE") || $ACTION=="ADD") && StrLen($arFields["ENTITY_TYPE"]) <= 0)
		{
			$APPLICATION->ThrowException(GetMessage("SONET_GL_EMPTY_ENTITY_TYPE"), "EMPTY_ENTITY_TYPE");
			return false;
		}
		elseif (is_set($arFields, "ENTITY_TYPE"))
		{
			if (!in_array($arFields["ENTITY_TYPE"], CSocNetAllowed::GetAllowedEntityTypes()))
			{
				$APPLICATION->ThrowException(GetMessage("SONET_GL_ERROR_NO_ENTITY_TYPE"), "ERROR_NO_ENTITY_TYPE");
				return false;
			}

			$newEntityType = $arFields["ENTITY_TYPE"];
		}

		if ((is_set($arFields, "ENTITY_ID") || $ACTION=="ADD") && IntVal($arFields["ENTITY_ID"]) <= 0)
		{
			$APPLICATION->ThrowException(GetMessage("SONET_GL_EMPTY_ENTITY_ID"), "EMPTY_ENTITY_ID");
			return false;
		}
		elseif (is_set($arFields, "ENTITY_ID"))
		{
			if (StrLen($newEntityType) <= 0 && $ID > 0)
			{
				$arRe = CAllSocNetLog::GetByID($ID);
				if ($arRe)
				{
					$newEntityType = $arRe["ENTITY_TYPE"];
				}
			}
			if (StrLen($newEntityType) <= 0)
			{
				$APPLICATION->ThrowException(GetMessage("SONET_GL_ERROR_CALC_ENTITY_TYPE"), "ERROR_CALC_ENTITY_TYPE");
				return false;
			}

			if ($newEntityType == SONET_ENTITY_GROUP)
			{
				$arResult = CSocNetGroup::GetByID($arFields["ENTITY_ID"]);
				if ($arResult == false)
				{
					$APPLICATION->ThrowException(GetMessage("SONET_GL_ERROR_NO_ENTITY_ID"), "ERROR_NO_ENTITY_ID");
					return false;
				}
			}
			elseif ($newEntityType == SONET_ENTITY_USER)
			{
				$dbResult = CUser::GetByID($arFields["ENTITY_ID"]);
				if (!$dbResult->Fetch())
				{
					$APPLICATION->ThrowException(GetMessage("SONET_GL_ERROR_NO_ENTITY_ID"), "ERROR_NO_ENTITY_ID");
					return false;
				}
			}
		}

		if (
			$ACTION == "ADD"
			&& (
				!is_set($arFields, "SITE_ID")
				|| (
					(is_array($arFields["SITE_ID"]) && count($arFields["SITE_ID"]) <= 0)
					|| (!is_array($arFields["SITE_ID"]) && StrLen($arFields["SITE_ID"]) <= 0)
				)
			)
		)
		{
			if ($newEntityType == SONET_ENTITY_GROUP)
			{
				$arSites = array();
				$rsGroupSite = CSocNetGroup::GetSite($arFields["ENTITY_ID"]);
				while($arGroupSite = $rsGroupSite->Fetch())
				{
					$arSites[] = $arGroupSite["LID"];
				}
				$arFields["SITE_ID"] = $arSites;
			}
			else
			{
				$arFields["SITE_ID"] = array(SITE_ID);
			}
		}

		if (
			isset($arFields["TAG"])
			&& !is_array($arFields["TAG"])
		)
		{
			$arFields["TAG"] = array($arFields["TAG"]);
		}

		if ((is_set($arFields, "EVENT_ID") || $ACTION=="ADD") && StrLen($arFields["EVENT_ID"]) <= 0)
		{
			$APPLICATION->ThrowException(GetMessage("SONET_GL_EMPTY_EVENT_ID"), "EMPTY_EVENT_ID");
			return false;
		}
		elseif (is_set($arFields, "EVENT_ID"))
		{
			$arFields["EVENT_ID"] = strtolower($arFields["EVENT_ID"]);
			$arEvent = CSocNetLogTools::FindLogEventByID($arFields["EVENT_ID"], $arFields["ENTITY_TYPE"]);
			if (!$arEvent)
			{
				$APPLICATION->ThrowException(GetMessage("SONET_GL_ERROR_NO_FEATURE_ID"), "ERROR_NO_FEATURE");
				return false;
			}
		}

		if (is_set($arFields, "USER_ID"))
		{
			$dbResult = CUser::GetByID($arFields["USER_ID"]);
			if (!$dbResult->Fetch())
			{
				$APPLICATION->ThrowException(GetMessage("SONET_GL_ERROR_NO_USER_ID"), "ERROR_NO_USER_ID");
				return false;
			}
		}

		if (is_set($arFields, "LOG_DATE") && (!$DB->IsDate($arFields["LOG_DATE"], false, LANG, "FULL")))
		{
			$APPLICATION->ThrowException(GetMessage("SONET_GL_EMPTY_DATE_CREATE"), "EMPTY_LOG_DATE");
			return false;
		}

		if ((is_set($arFields, "TITLE") || $ACTION=="ADD") && StrLen($arFields["TITLE"]) <= 0)
		{
			$APPLICATION->ThrowException(GetMessage("SONET_GL_EMPTY_TITLE"), "EMPTY_TITLE");
			return false;
		}

		if (
			isset($arFields["CONTEXT_USER_ID"])
			&& intval($arFields["CONTEXT_USER_ID"]) > 0
		)
		{
			$contextUserId = intval($arFields["CONTEXT_USER_ID"]);
		}
		elseif (
			isset($arFields["USER_ID"])
			&& intval($arFields["USER_ID"]) > 0
		)
		{
			$contextUserId = intval($arFields["USER_ID"]);
		}
		else
		{
			$contextUserId = false;
		}

		if (!$USER_FIELD_MANAGER->CheckFields("SONET_LOG", $ID, $arFields, $contextUserId))
		{
			return false;
		}

		if (is_set($arFields["URL"]) && is_array($arSiteWorkgroupsPage))
		{
			foreach($arSiteWorkgroupsPage as $groups_page)
			{
				if (strpos($arFields["URL"], $groups_page) === 0)
				{
					$arFields["URL"] = "#GROUPS_PATH#".substr($arFields["URL"], strlen($groups_page), strlen($arFields["URL"])-strlen($groups_page));
				}
			}
		}

		return True;
	}

	/***************************************/
	/**********  DATA SELECTION  ***********/
	/***************************************/
	public static function GetByID($ID)
	{
		global $APPLICATION;

		$ID = IntVal($ID);
		if ($ID <= 0)
		{
			$APPLICATION->ThrowException(GetMessage("SONET_GL_WRONG_PARAMETER_ID"), "ERROR_NO_ID");
			return false;
		}

		$dbResult = CSocNetLog::GetList(Array(), Array("ID" => $ID));
		if ($arResult = $dbResult->GetNext())
		{
			return $arResult;
		}

		return False;
	}

	function MakeTitle($titleTemplate, $title, $url = "", $bHtml = true)
	{
		if (StrLen($url) > 0)
			$title = ($bHtml ? "<a href=\"".$url."\">".$title."</a>" : $title." [".$url."]");

		if (StrLen($titleTemplate) > 0)
		{
			if (StrPos($titleTemplate, "#TITLE#") !== false)
				return Str_Replace("#TITLE#", $title, $titleTemplate);
			else
				return $titleTemplate." \"".$title."\"";
		}
		else
		{
			return $title;
		}
	}

	/***************************************/
	/**********  SEND EVENTS  **************/
	/***************************************/
	function __InitUserTmp($userID)
	{
		$title = "";

		$dbUser = CUser::GetByID($userID);
		if ($arUser = $dbUser->GetNext())
			$title .= CSocNetUser::FormatName($arUser["NAME"], $arUser["LAST_NAME"], $arUser["LOGIN"]);

		return $title;
	}

	function __InitUsersTmp($message, $titleTemplate1, $titleTemplate2)
	{
		$arUsersID = explode(",", $message);

		$title = "";

		$bFirst = true;
		$count = 0;
		foreach ($arUsersID as $userID)
		{
			$titleTmp = CSocNetLog::__InitUserTmp($userID);

			if (StrLen($titleTmp) > 0)
			{
				if (!$bFirst)
					$title .= ", ";
				$title .= $titleTmp;
				$count++;
			}

			$bFirst = false;
		}

		return Str_Replace("#TITLE#", $title, (($count > 1) ? $titleTemplate2 : $titleTemplate1));
	}

	function __InitGroupTmp($groupID)
	{
		$title = "";

		$arGroup = CSocNetGroup::GetByID($groupID);
		if ($arGroup)
			$title .= $arGroup["NAME"];

		return $title;
	}

	function __InitGroupsTmp($message, $titleTemplate1, $titleTemplate2)
	{
		$arGroupsID = explode(",", $message);

		$title = "";

		$bFirst = true;
		$count = 0;
		foreach ($arGroupsID as $groupID)
		{
			$titleTmp = CSocNetLog::__InitGroupTmp($groupID);

			if (StrLen($titleTmp) > 0)
			{
				if (!$bFirst)
					$title .= ", ";
				$title .= $titleTmp;
				$count++;
			}

			$bFirst = false;
		}

		return Str_Replace("#TITLE#", $title, (($count > 1) ? $titleTemplate2 : $titleTemplate1));
	}

	function SendEventAgent($ID, $mailTemplate = "SONET_NEW_EVENT", $tmp_id = false)
	{
		if (CSocNetLog::SendEvent($ID, $mailTemplate, $tmp_id, true))
			return "";
		else
			return "CSocNetLog::SendEventAgent(".$ID.", '".$mailTemplate."', ".($tmp_id ? $tmp_id : 'false').");";
	}

	public static function SendEvent($ID, $mailTemplate = "SONET_NEW_EVENT", $tmp_id = false, $bAgent = false, $bTransport = false)
	{
		$arSocNetAllowedSubscribeEntityTypesDesc = CSocNetAllowed::GetAllowedEntityTypesDesc();

		$ID = IntVal($ID);
		$tmp_id = IntVal($tmp_id);

		if ($ID <= 0)
		{
			return false;
		}

		if ($tmp_id > 0)
		{
			$arFilter = array("ID" => $tmp_id);
		}
		else
		{
			$arFilter = array("ID" => $ID);
		}

		$dbLog = CSocNetLog::GetList(
			array(),
			$arFilter,
			false,
			false,
			array("ID", "ENTITY_TYPE", "ENTITY_ID", "USER_ID", "USER_NAME", "USER_LAST_NAME", "USER_SECOND_NAME", "USER_LOGIN", "EVENT_ID", "LOG_DATE", "TITLE_TEMPLATE", "TITLE", "MESSAGE", "TEXT_MESSAGE", "URL", "MODULE_ID", "CALLBACK_FUNC", "SITE_ID", "PARAMS", "SOURCE_ID", "GROUP_NAME", "CREATED_BY_NAME", "CREATED_BY_SECOND_NAME", "CREATED_BY_LAST_NAME", "CREATED_BY_LOGIN", "LOG_SOURCE_ID"),
			array("MIN_ID_JOIN" => true)
		);
		$arLog = $dbLog->Fetch();
		if (!$arLog)
		{
			return $bAgent;
		}

		if (MakeTimeStamp($arLog["LOG_DATE"]) > (time() + CTimeZone::GetOffset()))
		{
			$agent = "CSocNetLog::SendEventAgent(".$ID.", '".CUtil::addslashes($mailTemplate)."', ".($tmp_id ? $tmp_id : 'false').");";
			$rsAgents = CAgent::GetList(array("ID"=>"DESC"), array("NAME" => $agent));
			if(!$rsAgents->Fetch())
			{
				$res = CAgent::AddAgent($agent, "socialnetwork", "N", 0, $arLog["LOG_DATE"], "Y", $arLog["LOG_DATE"]);
				if(!$res)
					$GLOBALS["APPLICATION"]->ResetException();
			}
			elseif ($bAgent)
			{
				CAgent::RemoveAgent($agent, "socialnetwork");
				CAgent::AddAgent($agent, "socialnetwork", "N", 0, $arLog["LOG_DATE"], "Y", $arLog["LOG_DATE"]);
				return true;
			}
			return false;
		}

		$arEvent = CSocNetLogTools::FindLogEventByID($arLog["EVENT_ID"], $arLog["ENTITY_TYPE"]);
		if (
			$arEvent
			&& array_key_exists("CLASS_FORMAT", $arEvent)
			&& array_key_exists("METHOD_FORMAT", $arEvent)
		)
		{
			$dbSiteCurrent = CSite::GetByID(SITE_ID);
			if (
				($arSiteCurrent = $dbSiteCurrent->Fetch())
				&& $arSiteCurrent["LANGUAGE_ID"] != LANGUAGE_ID
			)
			{
				$arLog["MAIL_LANGUAGE_ID"] = $arSiteCurrent["LANGUAGE_ID"];
			}

			$arLog["FIELDS_FORMATTED"] = call_user_func(array($arEvent["CLASS_FORMAT"], $arEvent["METHOD_FORMAT"]), $arLog, array(), true);
		}

		if (
			array_key_exists($arLog["ENTITY_TYPE"], $arSocNetAllowedSubscribeEntityTypesDesc)
			&& array_key_exists("HAS_MY", $arSocNetAllowedSubscribeEntityTypesDesc[$arLog["ENTITY_TYPE"]])
			&& $arSocNetAllowedSubscribeEntityTypesDesc[$arLog["ENTITY_TYPE"]]["HAS_MY"] == "Y"
			&& array_key_exists("CLASS_OF", $arSocNetAllowedSubscribeEntityTypesDesc[$arLog["ENTITY_TYPE"]])
			&& array_key_exists("METHOD_OF", $arSocNetAllowedSubscribeEntityTypesDesc[$arLog["ENTITY_TYPE"]])
			&& strlen($arSocNetAllowedSubscribeEntityTypesDesc[$arLog["ENTITY_TYPE"]]["CLASS_OF"]) > 0
			&& strlen($arSocNetAllowedSubscribeEntityTypesDesc[$arLog["ENTITY_TYPE"]]["METHOD_OF"]) > 0
			&& method_exists($arSocNetAllowedSubscribeEntityTypesDesc[$arLog["ENTITY_TYPE"]]["CLASS_OF"], $arSocNetAllowedSubscribeEntityTypesDesc[$arLog["ENTITY_TYPE"]]["METHOD_OF"])
		)
		{
			$arOfEntities = call_user_func(array($arSocNetAllowedSubscribeEntityTypesDesc[$arLog["ENTITY_TYPE"]]["CLASS_OF"], $arSocNetAllowedSubscribeEntityTypesDesc[$arLog["ENTITY_TYPE"]]["METHOD_OF"]), $arLog["ENTITY_ID"]);
		}
		else
		{
			$arOfEntities = false;
		}

		if ($bTransport)
		{
			$arListParams = array(
				"USE_SUBSCRIBE" => "Y",
				"ENTITY_TYPE" => $arLog["ENTITY_TYPE"],
				"ENTITY_ID" => $arLog["ENTITY_ID"],
				"EVENT_ID" => $arLog["EVENT_ID"],
				"USER_ID" => $arLog["USER_ID"],
				"OF_ENTITIES" => $arOfEntities,
				"TRANSPORT" => array("M", "X")
			);

			$arLogSites = array();
			$rsLogSite = CSocNetLog::GetSite($ID);

			while($arLogSite = $rsLogSite->Fetch())
			{
				$arLogSites[] = $arLogSite["LID"];
			}

			if (CModule::IncludeModule("extranet"))
			{
				$arSites = array();
				$dbSite = CSite::GetList($by="sort", $order="desc", array("ACTIVE" => "Y"));
				while($arSite = $dbSite->Fetch())
				{
					$arSites[$arSite["ID"]] = array(
						"DIR" => (strlen(trim($arSite["DIR"])) > 0 ? $arSite["DIR"] : "/"),
						"SERVER_NAME" => (strlen(trim($arSite["SERVER_NAME"])) > 0 ? $arSite["SERVER_NAME"] : COption::GetOptionString("main", "server_name", $_SERVER["HTTP_HOST"]))
					);
				}

				$extranet_site_id = CExtranet::GetExtranetSiteID();
				$intranet_site_id = CSite::GetDefSite();

				$arIntranetUsers = CExtranet::GetIntranetUsers();
			}

			$dbSubscribers = CSocNetLogEvents::GetList(
				array("TRANSPORT" => "DESC"),
				array(
					"USER_ACTIVE" => "Y",
					"SITE_ID" => array_merge($arLogSites, array(false))
				),
				false,
				false,
				array("USER_ID", "SITE_ID", "ENTITY_TYPE", "ENTITY_ID", "ENTITY_CB", "ENTITY_MY", "USER_NAME", "USER_LAST_NAME", "USER_LOGIN", "USER_LID", "USER_EMAIL", "TRANSPORT"),
				$arListParams
			);

			$arListParams = array(
				"USE_SUBSCRIBE" => "Y",
				"ENTITY_TYPE" => $arLog["ENTITY_TYPE"],
				"ENTITY_ID" => $arLog["ENTITY_ID"],
				"EVENT_ID" => $arLog["EVENT_ID"],
				"USER_ID" => $arLog["USER_ID"],
				"OF_ENTITIES" => $arOfEntities,
				"TRANSPORT" => "N"
			);

			$dbUnSubscribers = CSocNetLogEvents::GetList(
				array("TRANSPORT" => "DESC"),
				array(
					"USER_ACTIVE" => "Y",
					"SITE_ID" => array_merge($arLogSites, array(false))
				),
				false,
				false,
				array("USER_ID", "SITE_ID", "ENTITY_TYPE", "ENTITY_ID", "ENTITY_CB", "ENTITY_MY", "TRANSPORT", "EVENT_ID"),
				$arListParams
			);

			$arUnSubscribers = array();
			while ($arUnSubscriber = $dbUnSubscribers->Fetch())
			{
				$arUnSubscribers[] = $arUnSubscriber["USER_ID"]."_".$arUnSubscriber["ENTITY_TYPE"]."_".$arUnSubscriber["ENTITY_ID"]."_".$arUnSubscriber["ENTITY_MY"]."_".$arUnSubscriber["ENTITY_CB"]."_".$arUnSubscriber["EVENT_ID"];
			}

			$bHasAccessAll = CSocNetLogRights::CheckForUserAll($arLog["ID"]);

			$arSentUserID = array("M" => array(), "X" => array());
			while ($arSubscriber = $dbSubscribers->Fetch())
			{
				if (
					is_array($arIntranetUsers)
					&& !in_array($arSubscriber["USER_ID"], $arIntranetUsers)
					&& !in_array($extranet_site_id, $arLogSites)
				)
				{
					continue;
				}

				if (
					array_key_exists($arSubscriber["TRANSPORT"], $arSentUserID)
					&& in_array($arSubscriber["USER_ID"], $arSentUserID[$arSubscriber["TRANSPORT"]])
				)
				{
					continue;
				}

				if (
					intval($arSubscriber["ENTITY_ID"]) != 0
					&& $arSubscriber["EVENT_ID"] == "all"
					&& (
						in_array($arSubscriber["USER_ID"]."_".$arSubscriber["ENTITY_TYPE"]."_".$arSubscriber["ENTITY_ID"]."_N_".$arSubscriber["ENTITY_CB"]."_".$arLog["EVENT_ID"], $arUnSubscribers)
						|| in_array($arSubscriber["USER_ID"]."_".$arSubscriber["ENTITY_TYPE"]."_".$arSubscriber["ENTITY_ID"]."_Y_".$arSubscriber["ENTITY_CB"]."_".$arLog["EVENT_ID"], $arUnSubscribers)
					)
				)
				{
					continue;
				}
				elseif (
					intval($arSubscriber["ENTITY_ID"]) == 0
					&& $arSubscriber["ENTITY_CB"] == "N"
					&& $arSubscriber["EVENT_ID"] != "all"
					&&
					(
						in_array($arSubscriber["USER_ID"]."_".$arSubscriber["ENTITY_TYPE"]."_".$arLog["ENTITY_ID"]."_Y_N_all", $arUnSubscribers)
						|| in_array($arSubscriber["USER_ID"]."_".$arSubscriber["ENTITY_TYPE"]."_".$arLog["ENTITY_ID"]."_N_N_all", $arUnSubscribers)
						|| in_array($arSubscriber["USER_ID"]."_".$arSubscriber["ENTITY_TYPE"]."_".$arLog["ENTITY_ID"]."_Y_N_".$arLog["EVENT_ID"], $arUnSubscribers)
						|| in_array($arSubscriber["USER_ID"]."_".$arSubscriber["ENTITY_TYPE"]."_".$arLog["ENTITY_ID"]."_N_N_".$arLog["EVENT_ID"], $arUnSubscribers)
					)
				)
				{
					continue;
				}

				$arSentUserID[$arSubscriber["TRANSPORT"]][] = $arSubscriber["USER_ID"];

				if (!$bHasAccessAll)
				{
					$bHasAccess = CSocNetLogRights::CheckForUserOnly($arLog["ID"], $arSubscriber["USER_ID"]);
					if (!$bHasAccess)
					{
						continue;
					}
				}

				if (CModule::IncludeModule("extranet"))
				{
					$server_name = $arSites[((!in_array($arSubscriber["USER_ID"], $arIntranetUsers) && $extranet_site_id) ? $extranet_site_id : $intranet_site_id)]["SERVER_NAME"];
					$arLog["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["URL_TO_SEND"] = str_replace(
						array("#SERVER_NAME#", "#GROUPS_PATH#"),
						array(
							$server_name,
							COption::GetOptionString("socialnetwork", "workgroups_page", false, ((!in_array($arSubscriber["USER_ID"], $arIntranetUsers) && $extranet_site_id) ? $extranet_site_id : $intranet_site_id))
						),
						$arLog["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["URL"]
					);
					$arLog["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["MESSAGE_TO_SEND"] = str_replace(
						array("#SERVER_NAME#", "#GROUPS_PATH#"),
						array(
							$server_name,
							COption::GetOptionString("socialnetwork", "workgroups_page", false, ((!in_array($arSubscriber["USER_ID"], $arIntranetUsers) && $extranet_site_id) ? $extranet_site_id : $intranet_site_id))
						),
						$arLog["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["MESSAGE"]
					);
				}
				else
				{
					$arLog["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["MESSAGE_TO_SEND"] = $arLog["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["MESSAGE"];
				}

				switch ($arSubscriber["TRANSPORT"])
				{
					case "X":

						if (
							array_key_exists("URL_TO_SEND", $arLog["FIELDS_FORMATTED"]["EVENT_FORMATTED"])
							&& strlen($arLog["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["URL_TO_SEND"]) > 0
						)
							$link = GetMessage("SONET_GL_SEND_EVENT_LINK").$arLog["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["URL_TO_SEND"];
						elseif (
							array_key_exists("URL", $arLog["FIELDS_FORMATTED"]["EVENT_FORMATTED"])
							&& strlen($arLog["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["URL"]) > 0
						)
							$link = GetMessage("SONET_GL_SEND_EVENT_LINK").$arLog["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["URL"];
						else
							$link = "";

						$arMessageFields = array(
							"FROM_USER_ID" => (intval($arLog["USER_ID"]) > 0 ? $arLog["USER_ID"] : 1),
							"TO_USER_ID" => $arSubscriber["USER_ID"],
							"MESSAGE" => $arLog["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["TITLE"]." #BR#".$arLog["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["MESSAGE_TO_SEND"].(strlen($link) > 0 ? "#BR# ".$link : ""),
							"=DATE_CREATE" => $GLOBALS["DB"]->CurrentTimeFunction(),
							"MESSAGE_TYPE" => SONET_MESSAGE_SYSTEM,
							"IS_LOG" => "Y"
						);
						CSocNetMessages::Add($arMessageFields);
						break;
					case "M":
						$arFields["SUBSCRIBER_ID"] = $arSubscriber["USER_ID"];
						$arFields["SUBSCRIBER_NAME"] = $arSubscriber["USER_NAME"];
						$arFields["SUBSCRIBER_LAST_NAME"] = $arSubscriber["USER_LAST_NAME"];
						$arFields["SUBSCRIBER_LOGIN"] = $arSubscriber["USER_LOGIN"];
						$arFields["SUBSCRIBER_EMAIL"] = $arSubscriber["USER_EMAIL"];
						$arFields["EMAIL_TO"] = $arSubscriber["USER_EMAIL"];
						$arFields["TITLE"] = str_replace("#BR#", "\n", $arLog["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["TITLE"]);
						$arFields["MESSAGE"] = str_replace("#BR#", "\n", $arLog["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["MESSAGE_TO_SEND"]);
						$arFields["ENTITY"] = $arLog["FIELDS_FORMATTED"]["ENTITY"]["FORMATTED"];
						$arFields["ENTITY_TYPE"] = $arLog["FIELDS_FORMATTED"]["ENTITY"]["TYPE_MAIL"];

						if (
							array_key_exists("URL_TO_SEND", $arLog["FIELDS_FORMATTED"]["EVENT_FORMATTED"])
							&& strlen($arLog["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["URL_TO_SEND"]) > 0
						)
							$arFields["URL"] = $arLog["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["URL_TO_SEND"];
						elseif (
							array_key_exists("URL", $arLog["FIELDS_FORMATTED"]["EVENT_FORMATTED"])
							&& strlen($arLog["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["URL"]) > 0
						)
							$arFields["URL"] = $arLog["FIELDS_FORMATTED"]["EVENT_FORMATTED"]["URL"];
						else
							$arFields["URL"] = $arLog["URL"];

						if (CModule::IncludeModule("extranet"))
							$arUserGroup = CUser::GetUserGroup($arSubscriber["USER_ID"]);

						foreach ($arLogSites as $site_id_tmp)
						{
							if (IsModuleInstalled("extranet"))
							{
								if (
									(
										CExtranet::IsExtranetSite($site_id_tmp)
										&& in_array(CExtranet::GetExtranetUserGroupID(), $arUserGroup)
									)
									||
									(
										!CExtranet::IsExtranetSite($site_id_tmp)
										&& !in_array(CExtranet::GetExtranetUserGroupID(), $arUserGroup)
									)
								)
								{
									$siteID = $site_id_tmp;
									break;
								}
								else
									continue;
							}
							else
							{
								$siteID = $site_id_tmp;
								break;
							}
						}

						if (!$siteID)
						{
							$siteID = (defined("SITE_ID") ? SITE_ID : $arSubscriber["SITE_ID"]);
						}

						if (StrLen($siteID) <= 0)
							$siteID = $arSubscriber["USER_LID"];
						if (StrLen($siteID) <= 0)
							continue;

						$event = new CEvent;
						$event->Send($mailTemplate, $siteID, $arFields, "N");
						break;
					default:
				}
			}
		}

		if (!$bHasAccessAll)
		{
			$arUserIdToPush = array();

			$dbRight = CSocNetLogRights::GetList(array(), array("LOG_ID" => $arLog["ID"]));
			while ($arRight = $dbRight->Fetch())
			{
				if (preg_match('/^U(\d+)$/', $arRight["GROUP_CODE"], $matches))
				{
					$arUserIdToPush[] = $matches[1];
				}
				elseif (!in_array($arRight["GROUP_CODE"], array("SA")))
				{
					$arUserIdToPush = array();
					break;
				}
			}
		}

		$arUserIdToPush = (isset($arFields["USERS_TO_PUSH"]) ? $arFields["USERS_TO_PUSH"] : array());

		CSocNetLog::CounterIncrement(array(
			'ENTITY_ID' => $arLog["ID"],
			'EVENT_ID' => $arLog["EVENT_ID"],
			'OF_ENTITIES' => $arOfEntities,
			'TYPE' => 'L',
			'FOR_ALL_ACCESS' => $bHasAccessAll,
			'USERS_TO_PUSH' => (
				$bHasAccessAll
				|| empty($arUserIdToPush)
				|| count($arUserIdToPush) > 20
					? array()
					: $arUserIdToPush
			)
		));

		return true;
	}

	public static function CounterIncrement($entityId, $event_id = false, $arOfEntities = false, $type = "L", $bForAllAccess = false, $arUserIdToPush = array())
	{
		if (
			is_array($entityId)
			&& isset($entityId["ENTITY_ID"])
		)
		{
			$arFields = $entityId;
			$entityId = $arFields["ENTITY_ID"];
			$event_id = (isset($arFields["EVENT_ID"]) ? $arFields["EVENT_ID"] : false);
			$arOfEntities = (isset($arFields["OF_ENTITIES"]) ? $arFields["OF_ENTITIES"] : false);
			$type = (isset($arFields["TYPE"]) ? $arFields["TYPE"] : 'L');
			$bForAllAccess = (isset($arFields["FOR_ALL_ACCESS"]) ? $arFields["FOR_ALL_ACCESS"] : false);
			$arUserIdToPush = (isset($arFields["USERS_TO_PUSH"]) ? $arFields["USERS_TO_PUSH"] : array());
			$bSendToAuthor = (
				!isset($arFields["SEND_TO_AUTHOR"])
				|| $arFields["SEND_TO_AUTHOR"] != 'Y'
					? false
					: true
			);
		}
		else
		{
			$bSendToAuthor = false;
		}

		if (intval($entityId) <= 0)
		{
			return false;
		}

		if (
			!$bForAllAccess
			|| strtolower($GLOBALS["DB"]->type) != "mysql"
		)
		{
			$arParams = array(
				"SET_TIMESTAMP" => "Y"
			);

			if (!empty($arUserIdToPush))
			{
				$arParams["USERS_TO_PUSH"] = $arUserIdToPush;
			}

			CUserCounter::IncrementWithSelect(
				CSocNetLogCounter::GetSubSelect2(
					$entityId,
					array(
						"TYPE" => $type,
						"FOR_ALL_ACCESS" => $bForAllAccess,
						"MULTIPLE" => "Y",
						"SET_TIMESTAMP" => "Y",
						"SEND_TO_AUTHOR" => ($bSendToAuthor ? 'Y' : 'N')
					)
				),
				true,
				$arParams
			);
		}
		else // for all, mysql only
		{
			$tag = time();

			CUserCounter::IncrementWithSelect(
				CSocNetLogCounter::GetSubSelect2(
					$entityId,
					array(
						"TYPE" => $type,
						"FOR_ALL_ACCESS_ONLY" => true,
						"TAG_SET" => $tag,
						"MULTIPLE" => "Y",
						"SET_TIMESTAMP" => "Y",
						"SEND_TO_AUTHOR" => ($bSendToAuthor ? 'Y' : 'N')
					)
				),
				false, // sendpull
				array(
					"SET_TIMESTAMP" => "Y",
					"TAG_SET" => $tag
				)
			);

			CUserCounter::IncrementWithSelect(
				CSocNetLogCounter::GetSubSelect2(
					$entityId,
					array(
						"TYPE" => $type,
						"FOR_ALL_ACCESS_ONLY" => false,
						"MULTIPLE" => "Y",
						"SET_TIMESTAMP" => "Y",
						"SEND_TO_AUTHOR" => ($bSendToAuthor ? 'Y' : 'N')
					)
				),
				true, // sendpull
				array(
					"SET_TIMESTAMP" => "Y",
					"TAG_CHECK" => $tag
				)
			);
		}

		if ($event_id == "blog_post_important")
		{
			CUserCounter::IncrementWithSelect(
				CSocNetLogCounter::GetSubSelect2(
					$entityId,
					array(
						"TYPE" => "L", 
						"CODE" => "'BLOG_POST_IMPORTANT'",
						"FOR_ALL_ACCESS" => $bForAllAccess,
						"MULTIPLE" => "N",
						"SEND_TO_AUTHOR" => ($bSendToAuthor ? 'Y' : 'N')
					)
				)
			);
		}
	}

	function CounterDecrement($log_id, $event_id = false, $type = "L", $bForAllAccess = false)
	{
		if (intval($log_id) <= 0)
			return false;

		CUserCounter::IncrementWithSelect(
			CSocNetLogCounter::GetSubSelect2(
				$log_id, 
				array(
					"TYPE" => $type,
					"DECREMENT" => true,
					"FOR_ALL_ACCESS" => $bForAllAccess
				)
			)
		);

		if ($event_id == "blog_post_important")
		{
			CUserCounter::IncrementWithSelect(
				CSocNetLogCounter::GetSubSelect2(
					$log_id, 
					array(
						"TYPE" => "L",
						"CODE" => "'BLOG_POST_IMPORTANT'",
						"DECREMENT" => true,
						"FOR_ALL_ACCESS" => $bForAllAccess
					)
				)
			);
		}
	}

	function ClearOldAgent()
	{
		return "";
	}

	function GetSign($url, $userID = false, $site_id = false)
	{
		if (!$url || strlen(trim($url)) <= 0)
			return false;

		if (!$userID)
			$userID = $GLOBALS["USER"]->GetID();

		if ($hash = CUser::GetHitAuthHash($url, $userID))
			return $hash;
		else
		{
			$hash = CUser::AddHitAuthHash($url, $userID, $site_id);
			return $hash;
		}
	}

	function CheckSign($sign, $userId)
	{
		return (md5($userId."||".CSocNetLog::GetUniqLogID()) == $sign);
	}

	function OnSocNetLogFormatEvent($arEvent, $arParams)
	{
		if ($arEvent["EVENT_ID"] == "system" || $arEvent["EVENT_ID"] == "system_friends" || $arEvent["EVENT_ID"] == "system_groups")
		{
			$arEvent["TITLE_TEMPLATE"] = "";
			$arEvent["URL"] = "";

			switch ($arEvent["TITLE"])
			{
				case "join":
					list($titleTmp, $messageTmp) = CSocNetLog::InitUsersTmp($arEvent["MESSAGE"], GetMessage("SONET_GL_TITLE_JOIN1"), GetMessage("SONET_GL_TITLE_JOIN2"), $arParams);
					$arEvent["TITLE"] = $titleTmp;
					$arEvent["MESSAGE_FORMAT"] = $messageTmp;
					break;
				case "unjoin":
					list($titleTmp, $messageTmp) = CSocNetLog::InitUsersTmp($arEvent["MESSAGE"], GetMessage("SONET_GL_TITLE_UNJOIN1"), GetMessage("SONET_GL_TITLE_UNJOIN2"), $arParams);
					$arEvents["TITLE"] = $titleTmp;
					$arEvents["MESSAGE_FORMAT"] = $messageTmp;
					break;
				case "moderate":
					list($titleTmp, $messageTmp) = CSocNetLog::InitUsersTmp($arEvent["MESSAGE"], GetMessage("SONET_GL_TITLE_MODERATE1"), GetMessage("SONET_GL_TITLE_MODERATE2"), $arParams);
					$arEvent["TITLE"] = $titleTmp;
					$arEvent["MESSAGE_FORMAT"] = $messageTmp;
					break;
				case "unmoderate":
					list($titleTmp, $messageTmp) = CSocNetLog::InitUsersTmp($arEvent["MESSAGE"], GetMessage("SONET_GL_TITLE_UNMODERATE1"), GetMessage("SONET_GL_TITLE_UNMODERATE2"), $arParams);
					$arEvent["TITLE"] = $titleTmp;
					$arEvent["MESSAGE_FORMAT"] = $messageTmp;
					break;
				case "owner":
					list($titleTmp, $messageTmp) = CSocNetLog::InitUsersTmp($arEvent["MESSAGE"], GetMessage("SONET_GL_TITLE_OWNER1"), GetMessage("SONET_GL_TITLE_OWNER1"), $arParams);
					$arEvent["TITLE"] = $titleTmp;
					$arEvent["MESSAGE_FORMAT"] = $messageTmp;
					break;
				case "friend":
					list($titleTmp, $messageTmp) = CSocNetLog::InitUsersTmp($arEvent["MESSAGE"], GetMessage("SONET_GL_TITLE_FRIEND1"), GetMessage("SONET_GL_TITLE_FRIEND1"), $arParams);
					$arEvent["TITLE"] = $titleTmp;
					$arEvent["MESSAGE_FORMAT"] = $messageTmp;
					break;
				case "unfriend":
					list($titleTmp, $messageTmp) = CSocNetLog::InitUsersTmp($arEvent["MESSAGE"], GetMessage("SONET_GL_TITLE_UNFRIEND1"), GetMessage("SONET_GL_TITLE_UNFRIEND1"), $arParams);
					$arEvent["TITLE"] = $titleTmp;
					$arEvent["MESSAGE_FORMAT"] = $messageTmp;
					break;
				case "group":
					list($titleTmp, $messageTmp) = CSocNetLog::InitGroupsTmp($arEvent["MESSAGE"], GetMessage("SONET_GL_TITLE_GROUP1"), GetMessage("SONET_GL_TITLE_GROUP1"), $arParams);
					$arEvent["TITLE"] = $titleTmp;
					$arEvent["MESSAGE_FORMAT"] = $messageTmp;
					break;
				case "ungroup":
					list($titleTmp, $messageTmp) = CSocNetLog::InitGroupsTmp($arEvent["MESSAGE"], GetMessage("SONET_GL_TITLE_UNGROUP1"), GetMessage("SONET_GL_TITLE_UNGROUP1"), $arParams);
					$arEvent["TITLE"] = $titleTmp;
					$arEvent["MESSAGE_FORMAT"] = $messageTmp;
					break;
				case "exclude_user":
					list($titleTmp, $messageTmp) = CSocNetLog::InitGroupsTmp($arEvent["MESSAGE"], GetMessage("SONET_GL_TITLE_EXCLUDE_USER1"), GetMessage("SONET_GL_TITLE_EXCLUDE_USER1"), $arParams);
					$arEvent["TITLE"] = $titleTmp;
					$arEvent["MESSAGE_FORMAT"] = $messageTmp;
					break;
				case "exclude_group":
					list($titleTmp, $messageTmp) = CSocNetLog::InitUsersTmp($arEvent["MESSAGE"], GetMessage("SONET_GL_TITLE_EXCLUDE_GROUP1"), GetMessage("SONET_GL_TITLE_EXCLUDE_GROUP1"), $arParams);
					$arEvent["TITLE"] = $titleTmp;
					$arEvent["MESSAGE_FORMAT"] = $messageTmp;
					break;
				default:
					continue;
					break;
			}
		}
		return $arEvent;
	}

	function InitUserTmp($userID, $arParams, $bCurrentUserIsAdmin = "unknown", $bRSS = false)
	{
		$title = "";
		$message = "";
		$bUseLogin = $arParams['SHOW_LOGIN'] != "N" ? true : false;

		$dbUser = CUser::GetByID($userID);
		if ($arUser = $dbUser->Fetch())
		{
			if ($bCurrentUserIsAdmin == "unknown")
				$bCurrentUserIsAdmin = CSocNetUser::IsCurrentUserModuleAdmin();

			$canViewProfile = CSocNetUserPerms::CanPerformOperation($GLOBALS["USER"]->GetID(), $arUser["ID"], "viewprofile", $bCurrentUserIsAdmin);
			$pu = CComponentEngine::MakePathFromTemplate($arParams["PATH_TO_USER"], array("user_id" => $arUser["ID"]));

			if (!$bRSS && $canViewProfile)
				$title .= "<a href=\"".$pu."\">";
			$title .= CUser::FormatName($arParams['NAME_TEMPLATE'], $arUser, $bUseLogin);
			if (!$bRSS && $canViewProfile)
				$title .= "</a>";

			if (intval($arUser["PERSONAL_PHOTO"]) <= 0)
			{
				switch ($arUser["PERSONAL_GENDER"])
				{
					case "M":
						$suffix = "male";
						break;
					case "F":
						$suffix = "female";
							break;
					default:
						$suffix = "unknown";
				}
				$arUser["PERSONAL_PHOTO"] = COption::GetOptionInt("socialnetwork", "default_user_picture_".$suffix, false, SITE_ID);
			}
			$arImage = CSocNetTools::InitImage($arUser["PERSONAL_PHOTO"], 100, "/bitrix/images/socialnetwork/nopic_user_100.gif", 100, $pu, $canViewProfile);

			$message = $arImage["IMG"];
		}

		return array($title, $message);
	}

	function InitUsersTmp($message, $titleTemplate1, $titleTemplate2, $arParams, $bCurrentUserIsAdmin = "unknown", $bRSS = false)
	{
		$arUsersID = explode(",", $message);

		$message = "";
		$title = "";

		$bFirst = true;
		$count = 0;

		if ($bCurrentUserIsAdmin == "unknown")
			$bCurrentUserIsAdmin = CSocNetUser::IsCurrentUserModuleAdmin();

		foreach ($arUsersID as $userID)
		{
			list($titleTmp, $messageTmp) = CSocNetLog::InitUserTmp($userID, $arParams, $bCurrentUserIsAdmin, $bRSS);

			if (StrLen($titleTmp) > 0)
			{
				if (!$bFirst)
					$title .= ", ";
				$title .= $titleTmp;
				$count++;
			}

			if (StrLen($messageTmp) > 0)
			{
				if (!$bFirst)
					$message .= " ";
				$message .= $messageTmp;
			}

			$bFirst = false;
		}
		return array(Str_Replace("#TITLE#", $title, (($count > 1) ? $titleTemplate2 : $titleTemplate1)), $message);
	}

	function InitGroupTmp($groupID, $arParams, $bRSS = false)
	{
		$title = "";
		$message = "";

		$arGroup = CSocNetGroup::GetByID($groupID);
		if ($arGroup)
		{
			$pu = CComponentEngine::MakePathFromTemplate($arParams["PATH_TO_GROUP"], array("group_id" => $arGroup["ID"]));

			if (!$bRSS)
				$title .= "<a href=\"".$pu."\">";
			$title .= $arGroup["NAME"];
			if (!$bRSS)
				$title .= "</a>";

			if (intval($arGroup["IMAGE_ID"]) <= 0)
				$arGroup["IMAGE_ID"] = COption::GetOptionInt("socialnetwork", "default_group_picture", false, SITE_ID);

			$arImage = CSocNetTools::InitImage($arGroup["IMAGE_ID"], 100, "/bitrix/images/socialnetwork/nopic_group_100.gif", 100, $pu, true);

			$message = $arImage["IMG"];
		}

		return array($title, $message);
	}

	function InitGroupsTmp($message, $titleTemplate1, $titleTemplate2, $arParams, $bRSS = false)
	{
		$arGroupsID = explode(",", $message);

		$message = "";
		$title = "";

		$bFirst = true;
		$count = 0;
		foreach ($arGroupsID as $groupID)
		{
			list($titleTmp, $messageTmp) = CSocNetLog::InitGroupTmp($groupID, $arParams, $bRSS);

			if (StrLen($titleTmp) > 0)
			{
				if (!$bFirst)
					$title .= ", ";
				$title .= $titleTmp;
				$count++;
			}

			if (StrLen($messageTmp) > 0)
			{
				if (!$bFirst)
					$message .= " ";
				$message .= $messageTmp;
			}

			$bFirst = false;
		}

		return array(Str_Replace("#TITLE#", $title, (($count > 1) ? $titleTemplate2 : $titleTemplate1)), $message);
	}

	function ShowGroup($arEntityDesc, $strEntityURL, $arParams)
	{
		return CSocNetLogTools::ShowGroup($arEntityDesc, $strEntityURL, $arParams);
	}

	function ShowUser($arEntityDesc, $strEntityURL, $arParams)
	{
		return CSocNetLogTools::ShowUser($arEntityDesc, $strEntityURL, $arParams);
	}

	function FormatEvent_FillTooltip($arFields, $arParams)
	{
		return CSocNetLogTools::FormatEvent_FillTooltip($arFields, $arParams);
	}

	public static function FormatEvent_CreateAvatar($arFields, $arParams, $source = "CREATED_BY_")
	{
		return CSocNetLogTools::FormatEvent_CreateAvatar($arFields, $arParams, $source);
	}

	function FormatEvent_IsMessageShort($message, $short_message = false)
	{
		return CSocNetLogTools::FormatEvent_IsMessageShort($message, $short_message);
	}

	function FormatEvent_BlogPostComment($arFields, $arParams, $bMail = false)
	{
		return CSocNetLogTools::FormatEvent_Blog($arFields, $arParams, $bMail);
	}

	function FormatEvent_Forum($arFields, $arParams, $bMail = false)
	{
		return CSocNetLogTools::FormatEvent_Forum($arFields, $arParams, $bMail);
	}

	function FormatEvent_Photo($arFields, $arParams, $bMail = false)
	{
		return CSocNetLogTools::FormatEvent_Photo($arFields, $arParams, $bMail);
	}

	function FormatEvent_Files($arFields, $arParams, $bMail = false)
	{
		return CSocNetLogTools::FormatEvent_Files($arFields, $arParams, $bMail);
	}

	function FormatEvent_Task($arFields, $arParams, $bMail = false)
	{
		return CSocNetLogTools::FormatEvent_Task($arFields, $arParams, $bMail);
	}

	function FormatEvent_SystemGroups($arFields, $arParams, $bMail = false)
	{
		return CSocNetLogTools::FormatEvent_SystemGroups($arFields, $arParams, $bMail);
	}

	function FormatEvent_SystemFriends($arFields, $arParams, $bMail = false)
	{
		return CSocNetLogTools::FormatEvent_SystemFriends($arFields, $arParams, $bMail);
	}

	function FormatEvent_System($arFields, $arParams, $bMail = false)
	{
		return CSocNetLogTools::FormatEvent_System($arFields, $arParams, $bMail);
	}

	function FormatEvent_Microblog($arFields, $arParams, $bMail = false)
	{
		return CSocNetLogTools::FormatEvent_Microblog($arFields, $arParams, $bMail);
	}

	function SetCacheLastLogID($id)
	{
		CSocNetLogTools::SetCacheLastLogID("log", $id);
	}

	function GetCacheLastLogID()
	{
		return CSocNetLogTools::GetCacheLastLogID("log");
	}

	function SetUserCache($user_id, $max_id, $max_viewed_id, $count)
	{
		CSocNetLogTools::SetUserCache("log", $user_id, $max_id, $max_viewed_id, $count);
	}

	function GetUserCache($user_id)
	{
		return CSocNetLogTools::GetUserCache("log", $user_id);
	}

	public static function GetSite($log_id)
	{
		global $DB;
		$strSql = "SELECT L.*, LS.* FROM b_sonet_log_site LS, b_lang L WHERE L.LID=LS.SITE_ID AND LS.LOG_ID=".IntVal($log_id);
		return $DB->Query($strSql);
	}
	
	function GetSimpleOrQuery($val, $key, $strOperation, $strNegative, $OrFields, &$arFields, &$arFilter)
	{
		global $DB;

		if ($strNegative != "Y")
		{
			$arOrFields = explode("|", $OrFields);
			if (count($arOrFields) > 1)
			{
				$strOrFields = "";
				foreach($arOrFields as $i => $field)
				{
					if ($i > 0)
						$strOrFields .= " OR ";
					$strOrFields .= "(".$field." ".$strOperation." '".$DB->ForSql($val)."')";
				}
				return $strOrFields;
			}
			else
				return false;
		}
		else
			return false;
	}
}
?>