Your IP : 18.117.158.174


Current Path : /var/www/axolotl/data/www/yar.axolotls.ru/bitrix/modules/mobile/classes/general/
Upload File :
Current File : /var/www/axolotl/data/www/yar.axolotls.ru/bitrix/modules/mobile/classes/general/mobile_helper.php

<?

use Bitrix\Socialnetwork\LogTable;
use Bitrix\Main\Loader;

class CMobileHelper
{
	public static function InitFileStorage()
	{
		static $bInited = false;

		$arResult = array();

		if (!$bInited)
		{
			$bDiskEnabled = (
				\Bitrix\Main\Config\Option::get('disk', 'successfully_converted', false)
				&& CModule::includeModule('disk')
			);

			if ($bDiskEnabled)
			{
				$storage = \Bitrix\Disk\Driver::getInstance()->getStorageByUserId($GLOBALS["USER"]->GetID());
				if (!$storage)
				{
					$arResult = array(
						"ERROR_CODE" => "NO_DISC_STORAGE",
						"ERROR_MESSAGE" => "No disk storage"
					);
				}
				else
				{
					$folder = $storage->getFolderForUploadedFiles($GLOBALS["USER"]->GetID());
					if (!$folder)
					{
						$arResult = array(
							"ERROR_CODE" => "NO_DISC_FOLDER",
							"ERROR_MESSAGE" => "No disk folder"
						);
					}
					else
					{
						$arResult = array(
							"DISC_STORAGE" => $storage,
							"DISC_FOLDER" => $folder
						);
					}
				}
			}
			elseif (CModule::IncludeModule("webdav"))
			{
				$data = CWebDavIblock::getRootSectionDataForUser($GLOBALS["USER"]->GetID());
				if (is_array($data))
				{
					$ob = new CWebDavIblock($data["IBLOCK_ID"], "", array(
						"ROOT_SECTION_ID" => $data["SECTION_ID"],
						"DOCUMENT_TYPE" => array("webdav", 'CIBlockDocumentWebdavSocnet', 'iblock_'.$data['SECTION_ID'].'_user_'.intval($GLOBALS["USER"]->GetID()))
					));
				}

				if (!$ob)
				{
					$arResult = array(
						"ERROR_CODE" => "NO_WEBDAV_SECTION",
						"ERROR_MESSAGE" => "No webdav section"
					);
				}
				else
				{
					$arResult = array(
						"WEBDAV_DATA" => $data,
						"WEBDAV_IBLOCK_OBJECT" => $ob
					);
				}
			}

			$bInited = true;
		}

		return $arResult;
	}

	public static function SaveFile($arFile, $arFileStorage)
	{
		$arResult = array();

		if (empty($arFile))
		{
			$arResult = array(
				"ERROR_CODE" => "EMPTY_FILE",
				"ERROR_MESSAGE" => "File is empty"
			);
		}

		if (!empty($arFileStorage["DISC_FOLDER"]))
		{
			$file = $arFileStorage["DISC_FOLDER"]->uploadFile(
				$arFile,
				array(
					'NAME' => $arFile["name"],
					'CREATED_BY' => $GLOBALS["USER"]->GetID()
				),
				array(),
				true
			);

			$arResult["ID"] = $file->getId();
		}
		elseif (
			!empty($arFileStorage["WEBDAV_DATA"])
			&& !empty($arFileStorage["WEBDAV_IBLOCK_OBJECT"])
		)
		{
			$dropTargetID = $arFileStorage["WEBDAV_IBLOCK_OBJECT"]->GetMetaID("DROPPED");
			$arParent = $arFileStorage["WEBDAV_IBLOCK_OBJECT"]->GetObject(array("section_id" => $dropTargetID));
			if (!$arParent["not_found"])
			{
				$path = $arFileStorage["WEBDAV_IBLOCK_OBJECT"]->_get_path($arParent["item_id"], false);
				$tmpName = str_replace(array(":", ".", "/", "\\"), "_", ConvertTimeStamp(time(), "FULL"));
				$tmpOptions = array("path" => str_replace("//", "/", $path."/".$tmpName));
				$arParent = $arFileStorage["WEBDAV_IBLOCK_OBJECT"]->GetObject($tmpOptions);
				if ($arParent["not_found"])
				{
					$rMKCOL = $arFileStorage["WEBDAV_IBLOCK_OBJECT"]->MKCOL($tmpOptions);
					if (intval($rMKCOL) == 201)
					{
						$arFileStorage["WEBDAV_DATA"]["SECTION_ID"] = $arFileStorage["WEBDAV_IBLOCK_OBJECT"]->arParams["changed_element_id"];
					}
				}
				else
				{
					$arFileStorage["WEBDAV_DATA"]["SECTION_ID"] = $arParent['item_id'];
					if (!$arFileStorage["WEBDAV_IBLOCK_OBJECT"]->CheckUniqueName($tmpName, $arFileStorage["WEBDAV_DATA"]["SECTION_ID"], $tmpRes))
					{
						$path = $arFileStorage["WEBDAV_IBLOCK_OBJECT"]->_get_path($arFileStorage["WEBDAV_DATA"]["SECTION_ID"], false);
						$tmpName = randString(6);
						$tmpOptions = array("path" => str_replace("//", "/", $path."/".$tmpName));
						$rMKCOL = $arFileStorage["WEBDAV_IBLOCK_OBJECT"]->MKCOL($tmpOptions);
						if (intval($rMKCOL) == 201)
						{
							$arFileStorage["WEBDAV_DATA"]["SECTION_ID"] = $arFileStorage["WEBDAV_IBLOCK_OBJECT"]->arParams["changed_element_id"];
						}
					}
				}
			}

			$options = array(
				"new" => true,
				'dropped' => true,
				"arFile" => $arFile,
				"arDocumentStates" => false,
				"arUserGroups" => array_merge($arFileStorage["WEBDAV_IBLOCK_OBJECT"]->USER["GROUPS"], array("Author")),
				"FILE_NAME" => $arFile["name"],
				"IBLOCK_ID" => $arFileStorage["WEBDAV_DATA"]["IBLOCK_ID"],
				"IBLOCK_SECTION_ID" => $arFileStorage["WEBDAV_DATA"]["SECTION_ID"],
				"USER_FIELDS" => array()
			);

			$GLOBALS['USER_FIELD_MANAGER']->EditFormAddFields($arFileStorage["WEBDAV_IBLOCK_OBJECT"]->GetUfEntity(), $options['USER_FIELDS']);

			$GLOBALS["DB"]->StartTransaction();

			if (!$arFileStorage["WEBDAV_IBLOCK_OBJECT"]->put_commit($options))
			{
				$arResult = array(
					"ERROR_CODE" => "error_put",
					"ERROR_MESSAGE" => $arFileStorage["WEBDAV_IBLOCK_OBJECT"]->LAST_ERROR
				);
				$GLOBALS["DB"]->Rollback();
			}
			else
			{
				$GLOBALS["DB"]->Commit();
				$arResult["ID"] = $options['ELEMENT_ID'];
			}
		}
		else
		{
			$arResult["ID"] = CFile::SaveFile($arFile, $arFile["MODULE_ID"]);
		}

		return $arResult;
	}

	public static function SendPullComment($type, $arFields)
	{
		if (!CModule::IncludeModule("pull"))
		{
			return;
		}

		if ($type == "blog")
		{
			$arCommentParams = Array(
				"ID" => $arFields["COMMENT_ID"],
				"ENTITY_XML_ID" => "BLOG_".$arFields["POST_ID"],
				"FULL_ID" => array(
					"BLOG_".$arFields["POST_ID"],
					$arFields["COMMENT_ID"]
				),
				"ACTION" => "REPLY",
				"APPROVED" => "Y",
				"PANELS" => array(
					"EDIT" => "N",
					"MODERATE" => "N",
					"DELETE" => "N"
				),
				"NEW" => "Y",
				"AUTHOR" => array(
					"ID" => $GLOBALS["USER"]->GetID(),
					"NAME" => $arFields["arAuthor"]["NAME_FORMATED"],
					"URL" => $arFields["arAuthor"]["url"],
					"E-MAIL" => $arFields["arComment"]["AuthorEmail"],
					"AVATAR" => $arFields["arAuthor"]["PERSONAL_PHOTO_resized"]["src"],
					"IS_EXTRANET" => (is_array($GLOBALS["arExtranetUserID"]) && in_array($GLOBALS["USER"]->GetID(), $GLOBALS["arExtranetUserID"])),
				),
				"POST_TIMESTAMP" => $arFields["arComment"]["DATE_CREATE_TS"],
				"POST_TIME" => $arFields["arComment"]["DATE_CREATE_TIME"],
				"POST_DATE" => $arFields["arComment"]["DateFormated"],
				"POST_MESSAGE_TEXT" => $arFields["arComment"]["TextFormated"],
				"POST_MESSAGE_TEXT_MOBILE" => $arFields["arComment"]["TextFormatedMobile"],
				"URL" => array(
					"LINK" => str_replace(
						array("##comment_id#", "#comment_id#"),
						array("", $arFields["COMMENT_ID"]),
						$arFields["arUrl"]["LINK"]
					),
					"EDIT" => "__blogEditComment('".$arFields["COMMENT_ID"]."', '".$arFields["POST_ID"]."');",
					"MODERATE" => str_replace(
						array("#source_post_id#", "#post_id#", "#comment_id#", "&".bitrix_sessid_get()),
						array($arFields["POST_ID"], $arFields["POST_ID"], $arFields["COMMENT_ID"], ""),
						($arFields["arComment"]["CAN_SHOW"] == "Y"
							? $arFields["arUrl"]["SHOW"]
							: ($arFields["arComment"]["CAN_HIDE"] == "Y"
								? $arFields["arUrl"]["HIDE"]
								: ""
							)
						)
					),
					"DELETE" => str_replace(
						array("#source_post_id#", "#post_id#", "#comment_id#", "&".bitrix_sessid_get()),
						array($arFields["POST_ID"], $arFields["POST_ID"], $arFields["COMMENT_ID"], ""),
						$arFields["arUrl"]["DELETE"]
					)
				),
				"AFTER" => "",
				"BEFORE_ACTIONS_MOBILE" => "",
				"AFTER_MOBILE" => ""
			);

			if ($arFields["SHOW_RATING"] == "Y")
			{
				ob_start();
				$GLOBALS["APPLICATION"]->IncludeComponent(
					"bitrix:rating.vote", $arFields["RATING_TYPE"],
					Array(
						"ENTITY_TYPE_ID" => "BLOG_COMMENT",
						"ENTITY_ID" => $arFields["arComment"]["ID"],
						"OWNER_ID" => $arFields["arComment"]["AUTHOR_ID"],
						"USER_VOTE" => $arFields["arRating"][$arFields["arComment"]["ID"]]["USER_VOTE"],
						"USER_HAS_VOTED" => $arFields["arRating"][$arFields["arComment"]["ID"]]["USER_HAS_VOTED"],
						"TOTAL_VOTES" => $arFields["arRating"][$arFields["arComment"]["ID"]]["TOTAL_VOTES"],
						"TOTAL_POSITIVE_VOTES" => $arFields["arRating"][$arFields["arComment"]["ID"]]["TOTAL_POSITIVE_VOTES"],
						"TOTAL_NEGATIVE_VOTES" => $arFields["arRating"][$arFields["arComment"]["ID"]]["TOTAL_NEGATIVE_VOTES"],
						"TOTAL_VALUE" => $arFields["arRating"][$arFields["arComment"]["ID"]]["TOTAL_VALUE"],
						"PATH_TO_USER_PROFILE" => $arFields["arUrl"]["USER"]
					),
					false,
					array("HIDE_ICONS" => "Y")
				);
				$arCommentParams["BEFORE_ACTIONS"] = ob_get_clean();

				ob_start();
				$GLOBALS["APPLICATION"]->IncludeComponent(
					"bitrix:rating.vote", "mobile_comment_".$arFields["RATING_TYPE"],
					Array(
						"ENTITY_TYPE_ID" => "BLOG_COMMENT",
						"ENTITY_ID" => $arFields["arComment"]["ID"],
						"OWNER_ID" => $arFields["arComment"]["AUTHOR_ID"],
						"USER_VOTE" => $arFields["arRating"][$arFields["arComment"]["ID"]]["USER_VOTE"],
						"USER_HAS_VOTED" => $arFields["arRating"][$arFields["arComment"]["ID"]]["USER_HAS_VOTED"],
						"TOTAL_VOTES" => $arFields["arRating"][$arFields["arComment"]["ID"]]["TOTAL_VOTES"],
						"TOTAL_POSITIVE_VOTES" => $arFields["arRating"][$arFields["arComment"]["ID"]]["TOTAL_POSITIVE_VOTES"],
						"TOTAL_NEGATIVE_VOTES" => $arFields["arRating"][$arFields["arComment"]["ID"]]["TOTAL_NEGATIVE_VOTES"],
						"TOTAL_VALUE" => $arFields["arRating"][$arFields["arComment"]["ID"]]["TOTAL_VALUE"],
						"PATH_TO_USER_PROFILE" => $arFields["arUrl"]["USER"]
					),
					false,
					array("HIDE_ICONS" => "Y")
				);
				$arCommentParams["BEFORE_ACTIONS_MOBILE"] = ob_get_clean();
			}

			$arComment["UF"] = $GLOBALS["USER_FIELD_MANAGER"]->GetUserFields("BLOG_COMMENT", $arFields["arComment"]["ID"], LANGUAGE_ID);
			$arUFResult = self::BuildUFFields($arComment["UF"]);
			$arCommentParams["AFTER"] .= $arUFResult["AFTER"];
			$arCommentParams["AFTER_MOBILE"] .= $arUFResult["AFTER_MOBILE"];

			if($arFields["arComment"]["CAN_EDIT"] == "Y")
			{
				ob_start();

				?><script>
					top.text<?=$arFields["arComment"]["ID"]?> = text<?=$arFields["arComment"]["ID"]?> = '<?=CUtil::JSEscape(\Bitrix\Main\Text\Emoji::decode(htmlspecialcharsBack($arFields["arComment"]["POST_TEXT"])))?>';
					top.title<?=$arFields["arComment"]["ID"]?> = title<?=$arFields["arComment"]["ID"]?> = '<?=(isset($arFields["arComment"]["TITLE"]) ? CUtil::JSEscape(\Bitrix\Main\Text\Emoji::decode($arFields["arComment"]["TITLE"])) : '')?>';
					top.arComFiles<?=$arFields["arComment"]["ID"]?> = [];<?
				?></script><?
				$arCommentParams["AFTER"] .= ob_get_clean();
			}

			CPullWatch::AddToStack('UNICOMMENTSBLOG_'.$arFields["POST_ID"],
				array(
					'module_id' => 'unicomments',
					'command' => 'comment',
					'params' => $arCommentParams
				)
			);
		}
	}

	public static function BuildUFFields($arUF)
	{
		$arResult = array(
			"AFTER" => "",
			"AFTER_MOBILE" => ""
		);

		if (
			is_array($arUF)
			&& count($arUF) > 0
		)
		{
			ob_start();

			$eventHandlerID = false;
			$eventHandlerID = AddEventHandler("main", "system.field.view.file", Array("CSocNetLogTools", "logUFfileShow"));

			foreach ($arUF as $FIELD_NAME => $arUserField)
			{
				if(!empty($arUserField["VALUE"]))
				{
					$GLOBALS["APPLICATION"]->IncludeComponent(
						"bitrix:system.field.view",
						$arUserField["USER_TYPE"]["USER_TYPE_ID"],
						array(
							"arUserField" => $arUserField,
							"MOBILE" => "Y"
						),
						null,
						array("HIDE_ICONS"=>"Y")
					);
				}
			}
			if (
				$eventHandlerID !== false
				&& intval($eventHandlerID) > 0
			)
			{
				RemoveEventHandler('main', 'system.field.view.file', $eventHandlerID);
			}

			$arResult["AFTER_MOBILE"] = ob_get_clean();

			ob_start();

			$eventHandlerID = false;
			$eventHandlerID = AddEventHandler("main", "system.field.view.file", Array("CSocNetLogTools", "logUFfileShow"));

			foreach ($arUF as $FIELD_NAME => $arUserField)
			{
				if(!empty($arUserField["VALUE"]))
				{
					$GLOBALS["APPLICATION"]->IncludeComponent(
						"bitrix:system.field.view",
						$arUserField["USER_TYPE"]["USER_TYPE_ID"],
						array(
							"arUserField" => $arUserField
						),
						null,
						array("HIDE_ICONS"=>"Y")
					);
				}
			}
			if (
				$eventHandlerID !== false
				&& intval($eventHandlerID) > 0
			)
			{
				RemoveEventHandler('main', 'system.field.view.file', $eventHandlerID);
			}

			$arResult["AFTER"] .= ob_get_clean();
		}

		return $arResult;
	}

	public static function getUFForPostForm($arParams)
	{
		$arFileData = array();

		$arUF = $GLOBALS["USER_FIELD_MANAGER"]->GetUserFields($arParams["ENTITY_TYPE"], $arParams["ENTITY_ID"], LANGUAGE_ID);
		$ufCode = $arParams["UF_CODE"];

		if (
			!empty($arUF[$ufCode])
			&& !empty($arUF[$ufCode]["VALUE"])
		)
		{
			if ($arParams["IS_DISK_OR_WEBDAV_INSTALLED"])
			{
				if (
					\Bitrix\Main\Config\Option::get('disk', 'successfully_converted', false)
					&& CModule::IncludeModule('disk')
				)
				{
					$userFieldManager = \Bitrix\Disk\Driver::getInstance()->getUserFieldManager();
					$urlManager = \Bitrix\Disk\Driver::getInstance()->getUrlManager();
					$userFieldManager->loadBatchAttachedObject($arUF[$ufCode]["VALUE"]);

					foreach($arUF[$ufCode]["VALUE"] as $attachedId)
					{
						$attachedObject = $userFieldManager->getAttachedObjectById($attachedId);
						if($attachedObject)
						{
							$file = $attachedObject->getObject();

							$fileName = $file->getName();

							$fileUrl = $urlManager->getUrlUfController('download', array('attachedId' => $attachedId));
							$fileUrl = str_replace("/bitrix/tools/disk/uf.php", SITE_DIR."mobile/ajax.php", $fileUrl);
							$fileUrl = $fileUrl.(strpos($fileUrl, "?") === false ? "?" : "&")."mobile_action=disk_uf_view&filename=".$fileName;

							if (
								\Bitrix\Disk\TypeFile::isImage($file)
								&& ($realFile = $file->getFile())
							)
							{
								$previewImageUrl = $urlManager->getUrlUfController(
									'show',
									array(
										'attachedId' => $attachedId,
										'width' => 144,
										'height' => 144,
										'exact' => 'Y',
										'signature' => \Bitrix\Disk\Security\ParameterSigner::getImageSignature($attachedId, 144, 144)
									)
								);
							}
							else
							{
								$previewImageUrl = false;
							}

							$icon = CMobileHelper::mobileDiskGetIconByFilename($fileName);
							$iconUrl = CComponentEngine::makePathFromTemplate('/bitrix/components/bitrix/mobile.disk.file.detail/images/'.$icon);

							$fileFata = array(
								'type' => $file->getExtension(),
								'ufCode' => $ufCode,
								'id' => $attachedId,
								'objectId' => \Bitrix\Disk\Uf\FileUserType::NEW_FILE_PREFIX.$file->GetId(),
								'extension' => $file->getExtension(),
								'name' => $fileName,
								'url' => $fileUrl,
								'iconUrl' => $iconUrl
							);

							if ($previewImageUrl)
							{
								$fileFata['previewImageUrl'] = CHTTP::URN2URI($previewImageUrl);
							}

							$arFileData[] = $fileFata;
						}
					}
				}
				else // webdav
				{
					$data = CWebDavIblock::getRootSectionDataForUser($GLOBALS["USER"]->GetID());
					if (is_array($data))
					{
						$ibe = new CIBlockElement();
						$dbWDFile = $ibe->GetList(
							array(),
							array(
								'ID' => $arUF[$ufCode]["VALUE"],
								'IBLOCK_ID' => $data["IBLOCK_ID"]
							),
							false,
							false,
							array('ID', 'IBLOCK_ID', 'PROPERTY_FILE')
						);
						while ($arWDFile = $dbWDFile->Fetch())
						{
							if ($arFile = CFile::GetFileArray($arWDFile["PROPERTY_FILE_VALUE"]))
							{
								if (CFile::IsImage($arFile["FILE_NAME"], $arFile["CONTENT_TYPE"]))
								{
									$imageResized = CFile::ResizeImageGet(
										$arFile["ID"],
										array(
											"width" => 144,
											"height" => 144
										),
										BX_RESIZE_IMAGE_EXACT,
										false,
										true
									);
									$previewImageUrl = $imageResized["src"];
								}
								else
								{
									$previewImageUrl = false;
								}

								$fileExtension = GetFileExtension($arFile["FILE_NAME"]);

								$fileData = array(
									'type' => $fileExtension,
									'ufCode' => $ufCode,
									'id' => $arWDFile["ID"],
									'extension' => $fileExtension,
									'name' => $arFile["FILE_NAME"],
									'url' => $arFile["SRC"],
								);

								if ($previewImageUrl)
								{
									$fileData['previewImageUrl'] = CHTTP::URN2URI($previewImageUrl);
								}

								$arFileData[] = $fileData;
							}
						}
					}
				}
			}
			else // get just files
			{
				$dbRes = CFile::GetList(
					array(),
					array(
						"@ID" => implode(",", $arUF[$ufCode]["VALUE"])
					)
				);

				while ($arFile = $dbRes->GetNext())
				{
					if (CFile::IsImage($arFile["FILE_NAME"], $arFile["CONTENT_TYPE"]))
					{
						$imageResized = CFile::ResizeImageGet(
							$arFile["ID"],
							array(
								"width" => 144,
								"height" => 144
							),
							BX_RESIZE_IMAGE_EXACT,
							false,
							true
						);
						$previewImageUrl = $imageResized["src"];
					}
					else
					{
						$previewImageUrl = false;
					}

					$fileExtension = GetFileExtension($arFile["FILE_NAME"]);

					$fileData = array(
						'type' => $fileExtension,
						'ufCode' => $ufCode,
						'id' => $arFile["ID"],
						'extension' => $fileExtension,
						'name' => $arFile["FILE_NAME"],
						'downloadUrl' => $arFile["SRC"],
					);

					if ($previewImageUrl)
					{
						$fileData['previewImageUrl'] = CHTTP::URN2URI($previewImageUrl);
					}

					$arFileData[] = $fileData;
				}
			}
		}

		return $arFileData;
	}

	public static function mobileDiskGetIconByFilename($name)
	{
		if(CFile::isImage($name))
		{
			return 'img.png';
		}
		$icons = [
			'pdf' => 'pdf.png',
			'jpg' => 'img.png',
			'doc' => 'doc.png',
			'docx' => 'doc.png',
			'ppt' => 'ppt.png',
			'pptx' => 'ppt.png',
			'rar' => 'rar.png',
			'xls' => 'xls.png',
			'csv' => 'xls.png',
			'xlsx' => 'xls.png',
			'zip' => 'zip.png',
			'txt' => 'txt.png',
			'avi' => 'movie.png',
			'mov' => 'movie.png',
			'mpeg' => 'movie.png',
			'mp4' => 'movie.png',
		];
		$ext = strtolower(getFileExtension($name));

		return isset($icons[strtolower($ext)]) ? $icons[$ext] : 'blank.png';
	}

	public static function getDeviceResizeWidth()
	{
		$max_dimension = false;

		if (
			CModule::IncludeModule('mobileapp')
			&& CMobile::getInstance()->getApiVersion() > 1
		)
		{
			$max_dimension = max(array(intval(CMobile::getInstance()->getDevicewidth()), intval(CMobile::getInstance()->getDeviceheight())));

			if ($max_dimension < 650)
			{
				$max_dimension = 650;
			}
			elseif ($max_dimension < 1300)
			{
				$max_dimension = 1300;
			}
			else
			{
				$max_dimension = 2050;
			}
		}

		return $max_dimension;
	}

	public static function getPageAdditionals()
	{
		global $APPLICATION;

		$arCSSListNew = $APPLICATION->sPath2css;
		$arCSSNew = array();

		foreach ($arCSSListNew as $i => $css_path)
		{
			if(
				strtolower(substr($css_path, 0, 7)) != 'http://'
				&& strtolower(substr($css_path, 0, 8)) != 'https://'
			)
			{
				$css_file = (
					($p = strpos($css_path, "?")) > 0
						? substr($css_path, 0, $p)
						: $css_path
				);

				if(file_exists($_SERVER["DOCUMENT_ROOT"].$css_file))
				{
					$arCSSNew[] = $css_path;
				}
			}
			else
			{
				$arCSSNew[] = $css_path;
			}
		}

		$arCSSNew = array_unique($arCSSNew);

		$arHeadScriptsNew = $APPLICATION->arHeadScripts;

		if(!$APPLICATION->oAsset->optimizeJs())
		{
			$arHeadScriptsNew = array_merge(CJSCore::GetScriptsList(), $arHeadScriptsNew);
		}

		$arAdditionalData["CSS"] = array();
		foreach($arCSSNew as $style)
		{
			$arAdditionalData["CSS"][] = CUtil::GetAdditionalFileURL($style);
		}

		$arAdditionalData['SCRIPTS'] = array();
		$arHeadScriptsNew = array_unique($arHeadScriptsNew);

		foreach($arHeadScriptsNew as $script)
		{
			$arAdditionalData["SCRIPTS"][] = CUtil::GetAdditionalFileURL($script);
		}

		return $arAdditionalData;
	}

	public static function createLink($tag)
	{
		global $USER;

		$link = SITE_DIR.'mobile/log/?ACTION=CONVERT';
		$result = false;
		$unique = false;
		$uniqueParams = "{}";

		if (
			substr($tag, 0, 10) == 'BLOG|POST|'
			|| substr($tag, 0, 18) == 'BLOG|POST_MENTION|'
			|| substr($tag, 0, 11) == 'BLOG|SHARE|'
			|| substr($tag, 0, 17) == 'BLOG|SHARE2USERS|'
			|| substr($tag, 0, 25) == 'RATING_MENTION|BLOG_POST|'
		)
		{
			$params = explode("|", $tag);
			$result = $link."&ENTITY_TYPE_ID=BLOG_POST&ENTITY_ID=".$params[2];
		}
		elseif (
			substr($tag, 0, 13) == 'BLOG|COMMENT|'
			|| substr($tag, 0, 21) == 'BLOG|COMMENT_MENTION|'
		)
		{
			$params = explode("|", $tag);
			if (!empty($params[3]))
			{
				$result = $link."&ENTITY_TYPE_ID=BLOG_COMMENT&ENTITY_ID=".$params[3].'#com'.$params[3];
			}
			else
			{
				$result = $link."&ENTITY_TYPE_ID=BLOG_POST&ENTITY_ID=".$params[2];
			}
		}
		else if (substr($tag, 0, 28) == 'RATING_MENTION|BLOG_COMMENT|')
		{
			$params = explode("|", $tag);
			$result = $link."&ENTITY_TYPE_ID=BLOG_COMMENT&ENTITY_ID=".$params[2];
		}
		else if (substr($tag, 0, 10) == 'RATING|IM|')
		{
			$params = explode("|", $tag);
			return "BX.MobileTools.openChat(".($params[2] == 'P'? $params[3]: "'chat".$params[3]."'").");";
		}
		else if (substr($tag, 0, 11) == 'IM|MENTION|')
		{
			$params = explode("|", $tag);
			return "BX.MobileTools.openChat('chat".$params[2]."');";
		}
		else if (substr($tag, 0, 10) == 'RATING|DL|')
		{
			$params = explode("|", $tag);
			$result = $link."&ENTITY_TYPE_ID=".$params[2]."&ENTITY_ID=".$params[3];
		}
		else if (substr($tag, 0, 7) == 'RATING|')
		{
			$params = explode("|", $tag);
			if ($params[1] == 'TASK')
			{
				if (!empty(($taskId = $params[2]) && Loader::includeModule('tasks')))
				{
					return self::getTaskLink($taskId);
				}
			}
			elseif ($params[1] == 'BLOG_COMMENT')
			{
				$result = $link."&ENTITY_TYPE_ID=".$params[1]."&ENTITY_ID=".$params[2].'#com'.$params[2];
			}
			else
			{
				$result = $link."&ENTITY_TYPE_ID=".$params[1]."&ENTITY_ID=".$params[2];
			}
		}
		else if (substr($tag, 0, 15) == 'CALENDAR|INVITE' ||
			substr($tag, 0, 16) == 'CALENDAR|COMMENT' ||
			substr($tag, 0, 15) == 'CALENDAR|STATUS'
		)
		{
			$params = explode("|", $tag);
			if (count($params) >= 5 && $params[4] == 'cancel')
				$result = false;
			else
				$result = SITE_DIR.'mobile/calendar/view_event.php?event_id='.$params[2];
		}
		else if (substr($tag, 0, 21) == 'FORUM|COMMENT_MENTION')
		{
			$params = explode("|", $tag);
			$result = $link."&ENTITY_TYPE_ID=LOG_COMMENT&ENTITY_ID=".$params[2];
		}
		else if (
			substr($tag, 0, 13) == 'FORUM|COMMENT'
			|| substr($tag, 0, 26) == 'RATING_MENTION|FORUM_POST|'
		)
		{
			$params = explode("|", $tag);
			if (
				!empty($params[1])
				&& !empty($params[2])
				&& Loader::includeModule('socialnetwork')
			)
			{
				$liveFeedEntity = Bitrix\SocialNetwork\Livefeed\Provider::init([
					'ENTITY_TYPE' => \Bitrix\Socialnetwork\Livefeed\Provider::DATA_ENTITY_TYPE_FORUM_POST,
					'ENTITY_ID' => $params[2]
				]);

				$suffix = $liveFeedEntity->getSuffix();
				if ($suffix == 'TASK')
				{
					$res = LogTable::getList(array(
						'filter' => array(
							'ID' => $liveFeedEntity->getLogId()
						),
						'select' => array('SOURCE_ID')
					));
					if($logEntryFields = $res->fetch())
					{
						return self::getTaskLink($logEntryFields['SOURCE_ID']);
					}
				}
			}

			if (!$result)
			{
				$result = $link."&ENTITY_TYPE_ID=FORUM_POST&ENTITY_ID=".$params[2];
			}
		}
		else if (substr($tag, 0, 7) == 'VOTING|')
		{
			$params = explode("|", $tag);
			$result = $link."&ENTITY_TYPE_ID=VOTING&ENTITY_ID=".$params[1];
		}
		else if (
			substr($tag, 0, 13) == 'PHOTO|COMMENT'
			|| substr($tag, 0, 12) == 'WIKI|COMMENT'
		)
		{
			$params = explode("|", $tag);
			$result = $link."&ENTITY_TYPE_ID=IBLOCK_ELEMENT&ENTITY_ID=".$params[2];
		}
		else if (
			substr($tag, 0, 34) == 'INTRANET_NEW_USER|COMMENT_MENTION|'
			|| substr($tag, 0, 22) == 'LISTS|COMMENT_MENTION|'
			|| substr($tag, 0, 27) == 'RATING_MENTION|LOG_COMMENT|'
		)
		{
			$params = explode("|", $tag);
			$result = $link."&ENTITY_TYPE_ID=LOG_COMMENT&ENTITY_ID=".$params[2];
		}
		else if (
			substr($tag, 0, 12) == 'SONET|EVENT|'
		)
		{
			$params = explode("|", $tag);
			$result = $link."&ENTITY_TYPE_ID=LOG_ENTRY&ENTITY_ID=".$params[2];
		}
		else if (
			substr($tag, 0, 11) == 'TASKS|TASK|' || substr($tag, 0, 14) == 'TASKS|COMMENT|'
		)
		{
			// the format is:
			// for task modifications:
			// TASKS|TASK|%task_id%|%user_id%
			// for task comments:
			// TASKS|TASK_COMMENT|%task_id%|%user_id%|%comment_id%

			$params = explode("|", $tag);
			if (!empty(($taskId = $params[2]) && Loader::includeModule('tasks')))
			{
				return self::getTaskLink($taskId);
			}

			// after task detail page supports reloading only by TASK_ID, use the following:
			//$result = SITE_DIR.'mobile/tasks/snmrouter/?routePage=__ROUTE_PAGE__&USER_ID='.intval($GLOBALS['USER']->GetId());
			//$uniqueParams = "{task_id:".intval($params[2]).", params_emitter: 'tasks_list'}";
			//$unique = true;
		}
		else if (
			substr($tag, 0, 6) == 'ROBOT|'
		)
		{
			$params = explode("|", $tag);
			if ($params[1] == 'CRM' && isset($params[3]))
			{
				list($entityTypeName, $entityId) = explode('_', $params[3]);
				$entityTypeName = strtolower($entityTypeName);
				$entityId = (int)$entityId;

				if ($entityTypeName === 'lead' || $entityTypeName === 'deal')
				{
					$result = SITE_DIR.'mobile/crm/'.$entityTypeName.'/?page=view&'.$entityTypeName.'_id='.$entityId;
				}
			}
		}
		else if (
			strpos($tag, 'BIZPROC|TASK|') === 0
		)
		{
			$params = explode("|", $tag);
			if (isset($params[2]))
			{
				$result = SITE_DIR.'mobile/bp/detail.php?task_id='.(int)$params[2];
			}
		}

		if ($result)
		{
		    if ($unique)
			{
				$result = "BXMobileApp.PageManager.loadPageUnique({'url' : '".$result."','bx24ModernStyle' : true, 'data': ".$uniqueParams."});";
			}
			else
			{
				$result = "app.loadPageBlank({url: '".$result."', 'unique': ".($unique? 'true': 'false').", 'bx24ModernStyle': true})";
			}
		}
		return $result;
	}

	public static function getUserInfo($userId)
	{
		if (!intval($userId))
			return;

		$dbUser = CUser::GetList($by="", $order="", array("ID_EQUAL_EXACT" => $userId), array("FIELDS" => array("NAME", "LAST_NAME", "SECOND_NAME", "LOGIN", "PERSONAL_PHOTO")));
		if ($arUser = $dbUser->Fetch())
		{
			$userPhoto = CFile::ResizeImageGet(
				$arUser["PERSONAL_PHOTO"], array('width' => 50, 'height' => 50), BX_RESIZE_IMAGE_EXACT);

			$userName = CUser::FormatName(
				CSite::GetNameFormat(false),
				array(
					'LOGIN' => isset($arUser['LOGIN']) ? $arUser['LOGIN'] : '',
					'NAME' => isset($arUser['NAME']) ? $arUser['NAME'] : '',
					'LAST_NAME' => isset($arUser['LAST_NAME']) ? $arUser['LAST_NAME'] : '',
					'SECOND_NAME' => isset($arUser['SECOND_NAME']) ? $arUser['SECOND_NAME'] : ''
				),
				true, false
			);

			return array(
				"id" => $userId,
				"name" => $userName,
				"avatar" => $userPhoto["src"]
			);
		}

		return;
	}

	/**
	 * @param $taskId
	 * @return string
	 */
	public static function getTaskLink($taskId): string
	{
		$taskId = (int)$taskId;

		try
		{
			if (!Loader::includeModule('tasks'))
			{
				return '';
			}
			$taskData = \CTaskItem::getInstanceFromPool($taskId, $GLOBALS["USER"]->GetID())->getData(false);

			$creatorIcon = Bitrix\Tasks\UI\Avatar::getPerson($taskData['CREATED_BY_PHOTO']);
			$responsibleIcon = Bitrix\Tasks\UI\Avatar::getPerson($taskData['RESPONSIBLE_PHOTO']);
			$title = addslashes(htmlspecialcharsbx($taskData['TITLE']));

			$eventName = "'taskbackground::task::action'";
			$taskInfoParameter = "{title: '{$title}', creatorIcon: '{$creatorIcon}', responsibleIcon: '{$responsibleIcon}'}";
			$taskDataParameter = "{id: {$taskId}, title: 'TASK', taskInfo: {$taskInfoParameter}}";

			return 'BXMobileApp.Events.postToComponent('
				.$eventName.', '
				.'['
					.$taskDataParameter.', '
					.$taskId.', '
					.'{taskId: '.$taskId.', getTaskInfo: true}'
				.']'
			.');';
		}
		catch (TasksException $exception)
		{
			return '';
		}
	}

	/**
	 * @param $text
	 * @param $tag
	 * @return string
	 */
	public static function prepareNotificationText($text, $tag)
	{
		$preparedText = $text;

		if (strpos($tag, 'TASKS|TASK|') === 0 || strpos($tag, 'TASKS|COMMENT|') === 0)
		{
			$preparedText = strip_tags($text, '<br>');
		}

		return $preparedText;
	}

	public static function getCurrentSiteData()
	{
		$result = array(
			'SITE_ID' => SITE_ID,
			'SITE_DIR' => SITE_DIR
		);
		if (
			Loader::includeModule('extranet')
			&& !CExtranet::isIntranetUser()
		) // current extranet user
		{
			$extranetSiteId = \CExtranet::getExtranetSiteId();
			if ($extranetSiteId)
			{
				$res = \CSite::getById($extranetSiteId);
				if(
					($extranetSiteFields = $res->fetch())
					&& ($extranetSiteFields["ACTIVE"] != "N")
				)
				{
					$result = array(
						'SITE_ID' => $extranetSiteId,
						'SITE_DIR' => $extranetSiteFields["DIR"]
					);
				}
			}
		}

		return $result;
	}
}
?>