Your IP : 18.221.234.102


Current Path : /home/bitrix/ext_www/crm.klimatlend.ua/bitrix/components/bitrix/mobile.tasks.detail/
Upload File :
Current File : /home/bitrix/ext_www/crm.klimatlend.ua/bitrix/components/bitrix/mobile.tasks.detail/ajax.php

<?php
define('NO_AGENT_CHECK', true);
define('DisableEventsCheck', true); 
define('NO_KEEP_STATISTIC', true);
define('BX_STATISTIC_BUFFER_USED', false);
define('NO_LANG_FILES', true);
define('NOT_CHECK_PERMISSIONS', true);
define('BX_PUBLIC_TOOLS', true);

use \Bitrix\Main\Security\Sign\Signer;

global $APPLICATION;

$site_id = '';
if (isset($_REQUEST['site']) && is_string($_REQUEST['site']))
{
	$site_id = isset($_REQUEST['site'])? trim($_REQUEST['site']): '';
	$site_id = substr(preg_replace('/[^a-z0-9_]/i', '', $site_id), 0, 2);

	define('SITE_ID', $site_id);
}

define("SITE_TEMPLATE_ID", "mobile_app");

require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/bx_root.php');
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php');

CUtil::JSPostUnescape();

if ( ! (isset($GLOBALS['USER']) && is_object($GLOBALS['USER']) && $GLOBALS['USER']->IsAuthorized()) )
	exit(json_encode(array('status' => 'failed')));

$action = isset($_REQUEST['action']) ? trim($_REQUEST['action']): '';

$lng = isset($_REQUEST['lang'])? trim($_REQUEST['lang']): 'en';
$lng = substr(preg_replace('/[^a-z0-9_]/i', '', $lng), 0, 2);

if ( ! defined('LANGUAGE_ID') )
{
	$rsSite = CSite::GetByID($site_id);
	if ($arSite = $rsSite->Fetch())
		define('LANGUAGE_ID', $arSite['LANGUAGE_ID']);
	else
		define('LANGUAGE_ID', 'en');
}

$langFilename = dirname(__FILE__) . '/lang/' . $lng . '/ajax.php';
if (file_exists($langFilename))
	__IncludeLang($langFilename);

if (CModule::IncludeModule('compression'))
	CCompress::Disable2048Spaces();

// write and close session to prevent lock;
session_write_close();

class MBTasksCptDetailAjax
{
	public static function PrepareCommentsData(
		$arAvatarSize, 
		$pathSmile,
		$forumId,
		$taskId,
		$userId,
		$pathToUser,
		$nameTemplate,
		$lastViewedDate,
		$dateTimeFormat,
		$arAlreadyLoadedComments,
		$newComment,
		$defMessagesCount = 3
	)
	{
		global $APPLICATION;

		$bUtf = true;
		//if (ToUpper(SITE_CHARSET) !== 'UTF-8')
		//	$bUtf = false;

		$arComponentParams = array(
			//'CACHE_TYPE'                 => $arParams['CACHE_TYPE'],
			//'CACHE_TIME'                 => $arParams['CACHE_TIME'],
			'DEFAULT_MESSAGES_COUNT'     => $defMessagesCount,
			'PATH_TO_SMILE'              => $pathSmile,
			'FORUM_ID'                   => (int) $forumId,
			'TASK_ID'                    => (int) $taskId,
			'USER_ID'                    => (int) $userId,
			'SHOW_RATING'                => 'Y',
			'RATING_TYPE'                => 'like',
			'URL_TEMPLATES_PROFILE_VIEW' => $pathToUser,
			'NAME_TEMPLATE'              => $nameTemplate,
			'TASK_LAST_VIEWED_DATE'      => $lastViewedDate,
			'AVATAR_SIZE'                => $arAvatarSize,
			'DATE_TIME_FORMAT'           => $dateTimeFormat,
			'SHOW_TEMPLATE'              => 'N',
			'MESSAGES_PER_PAGE'          => 10 // need for links in "Big tasks", must be equal to tasks.topic.reviews params
		);

		if ($newComment !== false)
		{
			$arComponentParams['ACTION'] = 'ADD_COMMENT';
			$arComponentParams['ACTION:MESSAGE'] = $newComment;
		}

		$rc = $GLOBALS['APPLICATION']->IncludeComponent(
			'bitrix:mobile.tasks.topic.reviews',
			'',
			$arComponentParams,
			false,
			array("HIDE_ICONS" => "Y")
		);

		if (is_array($arAlreadyLoadedComments))
		{
			foreach ($arAlreadyLoadedComments as $msgId)
			{
				if (isset($rc['MESSAGES'][$msgId]))
					unset($rc['MESSAGES'][$msgId]);
			}
		}

		if ( ! $bUtf )
		{
			$arFieldsShouldBeConverted = array(
				'POST_MESSAGE_TEXT', 'AUTHOR_PHOTO',
				'META:FORMATTED_DATA' => array(
					'AUTHOR_NAME', 'AUTHOR_URL', 'DATETIME_SEXY'
				)
			);

			$arMessages = '';
			if (is_array($rc['MESSAGES']))
			{
				foreach ($rc['MESSAGES'] as $k => $mess)
				{
					foreach ($arFieldsShouldBeConverted as $kk => $filedName)
					{
						if ( ! is_array($filedName) )
						{
							$rc['MESSAGES'][$k][$filedName] = $APPLICATION->ConvertCharset(
								$rc['MESSAGES'][$k][$filedName], 
								SITE_CHARSET, 
								'utf-8'
							);
						}
						else
						{
							foreach ($filedName as $fieldName)
							{
								$rc['MESSAGES'][$k][$kk][$fieldName] = 
									$APPLICATION->ConvertCharset(
										$rc['MESSAGES'][$k][$kk][$fieldName], 
										SITE_CHARSET, 
										'utf-8'
								);
							}
						}
					}
				}
			}
		}
		global $APPLICATION;
		ob_start();
		$APPLICATION->IncludeComponent("bitrix:forum.comments", "", array(
				"FORUM_ID" => $arComponentParams['FORUM_ID'],
				"ENTITY_TYPE" => "TK",
				"ENTITY_ID" => $arComponentParams['TASK_ID'],
				"ENTITY_XML_ID" => "TASK_".$arComponentParams['TASK_ID'],
				"URL_TEMPLATES_PROFILE_VIEW" => $arComponentParams['URL_TEMPLATES_PROFILE_VIEW'],
				"CACHE_TYPE" => "Y",
				"CACHE_TIME" => 3600,
				"IMAGE_HTML_SIZE" => 400,
				"DATE_TIME_FORMAT" => $arComponentParams["DATE_TIME_FORMAT"],
				"SHOW_RATING" => $arComponentParams['SHOW_RATING'],
				"RATING_TYPE" => $arComponentParams['RATING_TYPE'],
				'PREORDER' => 'N',
				"PERMISSION" => "M",
				"NAME_TEMPLATE" => $arComponentParams["NAME_TEMPLATE"]
			),
			null,
			array('HIDE_ICONS' => 'Y')
		);
		$html = ob_get_clean();
		return (
			array(
				'task_id'       => (int) $taskId,
				'commentsHTML' => \Bitrix\Main\Page\Asset::getInstance()->getJs().$html,
				'arComments'    => $rc['MESSAGES'],
				'totalComments' => $rc['MESSAGES_COUNT'],
				'givenComments' => count($rc['MESSAGES'])
			)
		);
	}

	public static function ToggleFavorite($taskId, $way)
	{
		if ( ! $GLOBALS['USER']->IsAuthorized() || !($taskId = intval($taskId)))
			return (false);

		$task = new CTaskItem($taskId, $GLOBALS['USER']->GetId());
		if($way)
		{
			$task->addToFavorite();
		}
		else
		{
			$task->deleteFromFavorite();
		}
	}

	public static function SaveTask($tasksData)
	{
		$rc = false;

		if ( ! $GLOBALS['USER']->IsAuthorized() )
			return (false);

		$delegateToUser = false;
		if (isset($tasksData['META::DELEGATE_TO_USER']))
			$delegateToUser = (int) $tasksData['META::DELEGATE_TO_USER'];

		$bDelegate = false;
		if ($delegateToUser > 0)
			$bDelegate = true;

		$curUserId = (int) $GLOBALS['USER']->GetID();

		if ( ! CModule::IncludeModule('socialnetwork') )
			return (false);

		$arNewTaskFields = false;
		$bErrorOccuredOnTaskCreation = false;
		if (isset($tasksData['TASK_ID']) && check_bitrix_sessid())
		{
			$bCreateMode = true;
			if ($tasksData['TASK_ID'] > 0)
			{
				$bCreateMode = false;	// We are in edit mode
			}

			if ($bCreateMode && $bDelegate)
				throw new Exception('$bCreateMode && $bDelegate');

			if ( ( ! $bCreateMode ) && $bDelegate )
			{
				$arNewTaskFields = array();

				if (intval($delegateToUser) !== $curUserId)
				{
					$arNewTaskFields['RESPONSIBLE_ID'] = $delegateToUser;
					$arNewTaskFields['STATUS'] = CTasks::STATE_PENDING;

					// this will throw an exception in case of bad permissions
					$task = new CTaskItem($tasksData['TASK_ID'], $curUserId);
					$arTask = $task->getData(false);

					if ((!$arTask) || (!isset($arTask['ID'])))
						return (false);

					if (sizeof($arTask['AUDITORS'] > 0))
					{
						if ( ! in_array($curUserId, $arTask['AUDITORS']) )
						{
							$arNewTaskFields['AUDITORS'] = $arTask['AUDITORS'];
							$arNewTaskFields['AUDITORS'][] = $curUserId;
						}
					}
					else
						$arNewTaskFields['AUDITORS'] = array($curUserId);
				}
				else
					return (false);
			}
			else
			{
				$arNewTaskFields = array(
					'TITLE'          => $tasksData['TITLE'],
					'DESCRIPTION'    => $tasksData['DESCRIPTION'],
					'RESPONSIBLE_ID' => $tasksData['RESPONSIBLE_ID'],
					'PRIORITY'       => $tasksData['PRIORITY'],
					'DEADLINE'       => CAllDatabase::FormatDate(
						str_replace('T', ' ', $tasksData['DEADLINE']), 
						'YYYY-MM-DD HH:MI:SS', 
						FORMAT_DATETIME
					)
				);

				if (isset($tasksData['ACCOMPLICES']))
				{
					if ($tasksData['ACCOMPLICES'] == -1)
						$arNewTaskFields['ACCOMPLICES'] = array();
					else
						$arNewTaskFields['ACCOMPLICES'] = $tasksData['ACCOMPLICES'];
				}

				if (isset($tasksData['AUDITORS']))
				{
					if ($tasksData['AUDITORS'] == -1)
						$arNewTaskFields['AUDITORS'] = array();
					else
						$arNewTaskFields['AUDITORS'] = $tasksData['AUDITORS'];
				}

				$arNewTaskFields['GROUP_ID'] = 0;
				if (isset($tasksData['GROUP_ID']) && (intval($tasksData['GROUP_ID']) > 0))
				{
					if (CSocNetFeaturesPerms::CurrentUserCanPerformOperation(
							SONET_ENTITY_GROUP,
							(int) $tasksData['GROUP_ID'], 
							'tasks', 
							'create_tasks'
						)
					)
					{
						$arNewTaskFields['GROUP_ID'] = (int) $tasksData['GROUP_ID'];
					}
					else
						unset($arNewTaskFields['GROUP_ID']);
				}

				if ($bCreateMode)
					$arNewTaskFields['CREATED_BY'] = $curUserId;
			}

			if (isset($tasksData['META::EVENT_GUID']))
				$arNewTaskFields['META::EVENT_GUID'] = $tasksData['META::EVENT_GUID'];

			if ($bCreateMode)
				$arNewTaskFields['ID'] = 0;
			else
				$arNewTaskFields['ID'] = (int) $tasksData['TASK_ID'];

			$oTask = new CTasks();

			if ( ! $bCreateMode )	// in edit existing task mode
			{
				$rc = $oTask->Update($arNewTaskFields['ID'], $arNewTaskFields);
			}
			else	// in create new task mode
			{
				$arNewTaskFields['MULTITASK']  = 'N';
				$arNewTaskFields['DESCRIPTION_IN_BBCODE'] = 'Y';

				// Only creator or priveleged user can set responsible person.
				$arNewTaskFields['RESPONSIBLE_ID'] = $curUserId;
				if (
					($arNewTaskFields['CREATED_BY'] === $curUserId)
					|| $GLOBALS['USER']->IsAdmin() 
					|| CTasksTools::IsPortalB24Admin()
				)
				{
					$arNewTaskFields['RESPONSIBLE_ID'] = (int) $tasksData['RESPONSIBLE_ID'];
				}

				$arNewTaskFields['SITE_ID'] = SITE_ID;

				$rc = $oTask->Add($arNewTaskFields);
				if ($rc > 0)
					$arNewTaskFields['ID'] = $rc;
				else
					$bErrorOccuredOnTaskCreation = true;
			}

			$rc = $arNewTaskFields['ID'];
		}

		if ($bErrorOccuredOnTaskCreation)
			return (false);

		return ($rc);
	}


	public static function PrepareBaseData($task_id, $arRes)
	{
		global $APPLICATION;

		$bUtf = true;
		//if (ToUpper(SITE_CHARSET) !== 'UTF-8')
		//	$bUtf = false;

		if ($bUtf)
		{
			$title        = (string) $arRes['TASK']['TITLE'];
			$description  = (string) $arRes['TASK']['DESCRIPTION'];
			$respName     = (string) $arRes['TASK']['META::RESPONSIBLE_FORMATTED_NAME'];
			$respWork     = (string) $arRes['TASK']['RESPONSIBLE_WORK_POSITION'];
			$origName     = (string) $arRes['TASK']['META::ORIGINATOR_FORMATTED_NAME'];
			$origWork     = (string) $arRes['TASK']['CREATED_BY_WORK_POSITION'];
			$statusName   = (string) $arRes['TASK']['META::STATUS_FORMATTED_NAME'];
			$groupName    = (string) $arRes['TASK']['META:GROUP_NAME'];
			$deadlineText = (string) $arRes['TASK']['META:DEADLINE_FORMATTED'];
			$photoOrig    = (string) $arRes['TASK']['META::ORIGINATOR_PHOTO_SRC'];
			$photoResp    = (string) $arRes['TASK']['META::RESPONSIBLE_PHOTO_SRC'];
		}
		else
		{
			$title        = $APPLICATION->ConvertCharset((string) $arRes['TASK']['TITLE'], SITE_CHARSET, 'utf-8');
			$description  = $APPLICATION->ConvertCharset((string) $arRes['TASK']['DESCRIPTION'], SITE_CHARSET, 'utf-8');
			$respName     = $APPLICATION->ConvertCharset((string) $arRes['TASK']['META::RESPONSIBLE_FORMATTED_NAME'], SITE_CHARSET, 'utf-8');
			$respWork     = $APPLICATION->ConvertCharset((string) $arRes['TASK']['RESPONSIBLE_WORK_POSITION'], SITE_CHARSET, 'utf-8');
			$origName     = $APPLICATION->ConvertCharset((string) $arRes['TASK']['META::ORIGINATOR_FORMATTED_NAME'], SITE_CHARSET, 'utf-8');
			$origWork     = $APPLICATION->ConvertCharset((string) $arRes['TASK']['CREATED_BY_WORK_POSITION'], SITE_CHARSET, 'utf-8');
			$statusName   = $APPLICATION->ConvertCharset((string) $arRes['TASK']['META::STATUS_FORMATTED_NAME'], SITE_CHARSET, 'utf-8');
			$groupName    = $APPLICATION->ConvertCharset((string) $arRes['TASK']['META:GROUP_NAME'], SITE_CHARSET, 'utf-8');
			$deadlineText = $APPLICATION->ConvertCharset((string) $arRes['TASK']['META:DEADLINE_FORMATTED'], SITE_CHARSET, 'utf-8');
			$photoOrig    = $APPLICATION->ConvertCharset((string) $arRes['TASK']['META::ORIGINATOR_PHOTO_SRC'], SITE_CHARSET, 'utf-8');
			$photoResp    = $APPLICATION->ConvertCharset((string) $arRes['TASK']['META::RESPONSIBLE_PHOTO_SRC'], SITE_CHARSET, 'utf-8');
		}

		$arTaskData['baseData'] = array(
			'task_id'                    => (int) $task_id,
			'title'                      => $title,
			'description'                => $description,
			'responsible_id'             => (int) $arRes['TASK']['RESPONSIBLE_ID'],
			'responsible_formatted_name' => $respName,
			'responsible_work_position'  => $respWork,
			'responsible_photo_src'      => $photoResp,
			'originator_id'              => (int) $arRes['TASK']['CREATED_BY'],
			'originator_formatted_name'  => $origName,
			'originator_work_position'   => $origWork,
			'originator_photo_src'       => $photoOrig,
			'priority'                   => (int) $arRes['TASK']['PRIORITY'],
			'status_id'                  => (int) $arRes['TASK']['STATUS'],
			'status_formatted_name'      => $statusName,
			'group_id'                   => $arRes['TASK']['GROUP_ID'],
			'group_name'                 => $groupName,
			'deadline'                   => (string) $arRes['TASK']['DEADLINE'],
			'deadline_formatted'         => $deadlineText,
			'comments_count'             => '1'
		);

		return ($arTaskData['baseData']);
	}


	public static function PrepareDetailData($task_id, $arRes, $parameters)
	{
		global $APPLICATION;

		$bUtf = true;
		//if (ToUpper(SITE_CHARSET) !== 'UTF-8')
		//	$bUtf = false;

		$arTaskData['detailsData'] = array(
			'task_id'     => $task_id,
			'files'       => array(),
			'accomplices' => array(),
			'auditors'    => array(),
			'forum_files' => array(),
			'user_fields' => array(),
			'actions'     => $arRes['TASK']['META::ALLOWED_ACTIONS']
		);

		if (isset($arRes['TASK']['FILES']) && is_array($arRes['TASK']['FILES']))
		{
			foreach ($arRes['TASK']['FILES'] as $arFileData)
			{
				if ($bUtf)
				{
					$fileName = (string) $arFileData['ORIGINAL_NAME'];
					$fileSize = (string) $arFileData['META::SIZE_FORMATTED'];
				}
				else
				{
					$fileName = $APPLICATION->ConvertCharset(
						(string) $arFileData['ORIGINAL_NAME'], SITE_CHARSET, 'utf-8');
					$fileSize = $APPLICATION->ConvertCharset(
						(string) $arFileData['META::SIZE_FORMATTED'], SITE_CHARSET, 'utf-8');
				}

				$arTaskData['detailsData']['files'][] = array(
					'id'             => (int) $arFileData['ID'],
					'name'           => $fileName,
					'size_formatted' => $fileSize
				);
			}
		}

		if (isset($arRes['TASK']['FORUM_FILES']) && is_array($arRes['TASK']['FORUM_FILES']))
		{
			foreach ($arRes['TASK']['FORUM_FILES'] as $arFileData)
			{
				if ($bUtf)
				{
					$fileName = (string) $arFileData['ORIGINAL_NAME'];
					$fileSize = (string) $arFileData['META::SIZE_FORMATTED'];
				}
				else
				{
					$fileName = $APPLICATION->ConvertCharset(
						(string) $arFileData['ORIGINAL_NAME'], SITE_CHARSET, 'utf-8');
					$fileSize = $APPLICATION->ConvertCharset(
						(string) $arFileData['META::SIZE_FORMATTED'], SITE_CHARSET, 'utf-8');
				}

				$arTaskData['detailsData']['forum_files'][] = array(
					'id'             => (int) $arFileData['ID'],
					'name'           => $fileName,
					'size_formatted' => $fileSize
				);
			}
		}

		if (isset($arRes['TASK']['ACCOMPLICES']) && is_array($arRes['TASK']['ACCOMPLICES']))
		{
			foreach ($arRes['TASK']['ACCOMPLICES'] as $memberId)
			{
				if ($bUtf)
					$userName = (string) $arRes['TASK']['META:SOME_USERS_EXTRA_DATA'][(int) $memberId]['META:NAME_FORMATTED'];
				else
				{
					$userName = $APPLICATION->ConvertCharset(
						(string) $arRes['TASK']['META:SOME_USERS_EXTRA_DATA'][(int) $memberId]['META:NAME_FORMATTED'],
						SITE_CHARSET, 
						'utf-8'
					);
				}

				$arTaskData['detailsData']['accomplices'][] = array(
					'user_id'        => (int) $memberId,
					'name_formatted' => $userName
				);
			}
		}

		if (isset($arRes['TASK']['AUDITORS']) && is_array($arRes['TASK']['AUDITORS']))
		{
			foreach ($arRes['TASK']['AUDITORS'] as $memberId)
			{
				if ($bUtf)
					$userName = (string) $arRes['TASK']['META:SOME_USERS_EXTRA_DATA'][(int) $memberId]['META:NAME_FORMATTED'];
				else
				{
					$userName = $APPLICATION->ConvertCharset(
						(string) $arRes['TASK']['META:SOME_USERS_EXTRA_DATA'][(int) $memberId]['META:NAME_FORMATTED'],
						SITE_CHARSET, 
						'utf-8'
					);
				}

				$arTaskData['detailsData']['auditors'][] = array(
					'user_id'        => (int) $memberId,
					'name_formatted' => $userName
				);
			}
		}

		// fetch user fields (in read-only mode currently)
		if(is_array($parameters['USER_FIELDS']))
		{
			foreach($parameters['USER_FIELDS'] as $field => $desc)
			{
				if(empty($arRes['TASK'][$field]))
					continue;

				ob_start();

				$APPLICATION->IncludeComponent(
					"bitrix:system.field.view",
					$desc["USER_TYPE"]["USER_TYPE_ID"],
					array("arUserField" => $desc, 'MOBILE' => 'Y'),
					null,
					array("HIDE_ICONS"=>"Y")
				);

				$html = ob_get_contents();
				ob_end_clean();

				if($field == 'UF_CRM_TASK')
				{
					// desktop version of CRM UF is slightly not sutable for using in mobile, but we can do some changes here until the MOBILE VERSION is ready

					// replace urls
					$html = preg_replace(
						'#/crm/(deal|lead|company|contact){1}/show/(\d+)/#',
						'/mobile/crm/$1/view.php?$1_id=$2',
						$html
					);

					// cut off scripts
					$html = preg_replace(
						'#<script[^<>]*>.*</script>#s',
						'',
						$html
					);
				}
				elseif($field == 'UF_TASK_WEBDAV_FILES')
				{
					// for disk files we add absent title
					if((string) $desc['LIST_COLUMN_LABEL'] == '')
					{
						$desc['LIST_COLUMN_LABEL'] = GetMessage('MB_UF_TASK_WEBDAV_FILES_TITLE');
					}
				}

				$arTaskData['detailsData']['user_fields'][$field] = array(
					'TITLE' => $desc['LIST_COLUMN_LABEL'],
					'HTML' => trim($html)
				);
			}
		}

		return($arTaskData['detailsData']);
	}


	public static function ChangeTaskStatus($action_name, $curUserId, $arTask, $task_id, $arParams)
	{
		$newStatus = null;
		switch ($action_name)
		{
			case 'close':
				if (($arTask['CREATED_BY'] == $curUserId) || ($arTask['TASK_CONTROL'] == 'N'))
					$newStatus = CTasks::STATE_COMPLETED;
				else
					$newStatus = CTasks::STATE_SUPPOSEDLY_COMPLETED;
			break;

			case 'start':
				$newStatus = CTasks::STATE_IN_PROGRESS;
			break;

			case 'accept':
				$newStatus = CTasks::STATE_PENDING;
			break;

			case 'renew':
				$newStatus = CTasks::STATE_NEW;
			break;

			case 'defer':
				$newStatus = CTasks::STATE_DEFERRED;
			break;

			case 'decline':
				$newStatus = CTasks::STATE_DECLINED;
			break;

			default:
				throw new Exception();
			break;
		}

		$arFields = array(
			'STATUS' => $newStatus
		);

		if ($arFields)
		{
			$oTask = new CTasks();
			$oTask->Update(
				$task_id,
				$arFields
			);
		}

		return array(
			'bResultInJson' => false,
			'result'        => array(
				'rc'   => 'executed',
				'action_perfomed' => (string) $action_name,
				'data' => static::getTaskData($task_id, $arParams)
			)
		);
	}

	public static function getTaskData($taskId, $arParams)
	{
		$arRes = $GLOBALS['APPLICATION']->IncludeComponent(
			'bitrix:mobile.tasks.detail', 
			'.default', 
			$arParams, 
			false
		);

		$parameters = array();

		// user fields...
		$parameters["USER_FIELDS"] = $GLOBALS["USER_FIELD_MANAGER"]->GetUserFields("TASKS_TASK", $taskId, LANGUAGE_ID);

		$arTaskData = array(
			'task_id' => $taskId
		);

		$arTaskData['detailsData'] = MBTasksCptDetailAjax::PrepareDetailData($taskId, $arRes, $parameters);
		
		$status_formatted_name = (string) $arRes['TASK']['META::STATUS_FORMATTED_NAME'];
		/*
		if (ToUpper(SITE_CHARSET) !== 'UTF-8')
		{
			$status_formatted_name = $GLOBALS['APPLICATION']->ConvertCharset(
				$status_formatted_name,
				SITE_CHARSET, 
				'utf-8'
			);
		}
		*/

		$arTaskData['baseData'] = array(
			'task_id' => $taskId,
			'status_id' => $arRes['TASK']['STATUS'],
			'status_formatted_name' => $status_formatted_name
		);

		return $arTaskData;
	}


	public static function RemoveTask($task_id)
	{
		$rc = CTasks::Delete($task_id);

		$executed = 'failed';
		if ($rc)
			$executed = 'executed';

		$arResult = array(
			'bResultInJson' => false,
			'result' => array(
				'rc'              => $executed,
				'action_perfomed' => 'remove',
				'data'            => array('task_id' => (int) $task_id)
			)
		);

		return ($arResult);
	}
}
	
$arResult = array(
	'bResultInJson' => false,
	'result'        => array()
);

if (
	( ! CModule::IncludeModule('tasks') )
	|| ( ! $GLOBALS["USER"]->IsAuthorized() )
	|| ( ! check_bitrix_sessid() )
)
{
	$arResult = array(
		'bResultInJson' => false,
		'result'        => array()
	);
}
elseif (
	isset($_POST['user_id'])
	&& ($_POST['action'] === 'save task')
	&& isset($_POST['tasksData'])
)
{
	$rc = MBTasksCptDetailAjax::SaveTask($_POST['tasksData']);

	$arResult = array(
		'bResultInJson' => false,
		'result' => array(
			'action_done' => 'save task',
			'rc' => $rc
		)
	);
}
elseif (
isset($_REQUEST['user_id'])
	&& isset($_REQUEST['task_id'])
	&& isset($_REQUEST['subject'])
	&& in_array(
		$_REQUEST['subject'],
		array(
			'BASE',
			'BASE_AND_DETAIL_AND_COMMENTS', 
			'DETAIL_AND_COMMENTS', 
			'DETAIL', 
			'COMMENTS'
		), 
		true
	)
	&& isset($_REQUEST['DATE_TIME_FORMAT'])
	&& (
		($action === 'get_task_data')
		|| (
			($action === 'perfom_action')
			&& isset($_REQUEST['action_name'])
			&& (
				(
					($_REQUEST['action_name'] === 'edit')
					&& isset($_REQUEST['taskData'])
				)
				||
				(
					($_REQUEST['action_name'] === 'delegate')
					&& isset($_REQUEST['taskData'])
				)
				||
				(
					($_REQUEST['action_name'] === 'add_comment')
					&& isset($_REQUEST['NEW_COMMENT_TEXT'])
				)
			)
		)
	)
)
{
//s oundex('Detail ajax: begin work;');
//s oundex($_REQUEST['subject']);
	$userId = (int) $_REQUEST['user_id'];
	$taskId = $task_id = (int) $_REQUEST['task_id'];
	$action_name = 'view';
	$newComment = false;
	if (
		($action === 'perfom_action')
		&& (
			($_REQUEST['action_name'] === 'edit')
			|| ($_REQUEST['action_name'] === 'delegate')
		)
	)
	{
		$action_name = $_REQUEST['action_name'];

		$rc = MBTasksCptDetailAjax::SaveTask($_REQUEST['taskData']);

		if ($rc > 0)
			$taskId = (int) $rc;
	}
	elseif (
		($_REQUEST['action_name'] === 'add_comment')
		&& isset($_REQUEST['NEW_COMMENT_TEXT'])
	)
	{
		$action_name = 'add_comment';
		$newComment = (string) $_REQUEST['NEW_COMMENT_TEXT'];
	}

	$bLoadBaseData     = false;
	$bLoadDetailData   = false;
	$bLoadCommentsData = false;

	if ($taskId > 0)
	{

		if ($_REQUEST['subject'] === 'BASE')
			$bLoadBaseData = true;

		if ($_REQUEST['subject'] === 'BASE_AND_DETAIL_AND_COMMENTS')
		{
			$bLoadBaseData     = true;
			$bLoadDetailData   = true;
			$bLoadCommentsData = true;
		}
		elseif ($_REQUEST['subject'] === 'DETAIL_AND_COMMENTS')
		{
			$bLoadDetailData   = true;
			$bLoadCommentsData = true;
		}
		elseif ($_REQUEST['subject'] === 'DETAIL')
			$bLoadDetailData = true;
		elseif ($_REQUEST['subject'] === 'COMMENTS')
			$bLoadCommentsData = true;

		$arParams = array(
			'USER_ID'          => $userId,
			'TASK_ID'          => $taskId,
			'DATE_TIME_FORMAT' => $_REQUEST['DATE_TIME_FORMAT'],
			'SHOW_TEMPLATE'    => 'N',
			'PATH_TO_USER_TASKS_EDIT' => '...'
		);

		$arRes = $APPLICATION->IncludeComponent(
			'bitrix:mobile.tasks.detail', 
			'.default', 
			$arParams, 
			false
		);

		$filterCheckResult = 'not checked';
		$arFilter = false;
		if (isset($_REQUEST['CHECK_FILTER_ID']))
		{
			$filterPresetId = (int) $_REQUEST['CHECK_FILTER_ID'];
			$oFilter = CTaskFilterCtrl::GetInstance($userId);
			$arFilter = $oFilter->GetFilterPresetConditionById($filterPresetId);
		}
		elseif((string) $_REQUEST['CHECK_FILTER'] != '')
		{
			try
			{
				$signer = new Signer();
				$arFilter = unserialize(base64_decode($signer->unsign($_REQUEST['CHECK_FILTER'])));
			}
			catch(\Bitrix\Main\Security\Sign\BadSignatureException $e)
			{
			}
		}

		if ($arFilter !== false)
		{
			$arFilter['ID'] = (int) $taskId;
			$rsTasks = CTasks::GetList(
				$arOrder = array(),
				$arFilter,
				$arSelect = array('ID')
			);

			if ($rsTasks->Fetch())
				$filterCheckResult = 'match filter';
			else
				$filterCheckResult = 'dismatch filter';
		}

		$parameters = array();

		// user fields...
		$parameters["USER_FIELDS"] = $GLOBALS["USER_FIELD_MANAGER"]->GetUserFields("TASKS_TASK", $task_id, LANGUAGE_ID);

		$arTaskData = array(
			'task_id' => $task_id,
			'filter_check_result' => $filterCheckResult
		);

		if ($bLoadBaseData)
			$arTaskData['baseData'] = MBTasksCptDetailAjax::PrepareBaseData($task_id, $arRes);

		if ($bLoadDetailData)
			$arTaskData['detailsData'] = MBTasksCptDetailAjax::PrepareDetailData($task_id, $arRes, $parameters);

		if ($bLoadCommentsData
			&& isset($_REQUEST['PATH_TO_FORUM_SMILE'])
			&& isset($_REQUEST['PATH_TEMPLATE_TO_USER_PROFILE'])
//			&& isset($_REQUEST['AVA_WIDTH'])
//			&& isset($_REQUEST['AVA_HEIGHT'])
		)
		{
			$arAlreadyLoadedComments = false;
			// Unset messages, that are already loaded in interface
			if (isset($_REQUEST['comments_already_loaded'])
				&& (strlen($_REQUEST['comments_already_loaded']) > 0)
			)
			{
				$arAlreadyLoadedComments = explode('|', $_REQUEST['comments_already_loaded']);
			}
		
			$arAvatarSize = array(
				'width'  => (int) $_REQUEST['AVA_WIDTH'], 
				'height' => (int) $_REQUEST['AVA_HEIGHT']
			);

			if (
				isset($_REQUEST['DEFAULT_MESSAGES_COUNT'])
				&& ($_REQUEST['DEFAULT_MESSAGES_COUNT'] > 0)
			)
			{
				$defMessagesCount = (int) $_REQUEST['DEFAULT_MESSAGES_COUNT'];
			}
			else
				$defMessagesCount = 3;

			$arTaskData['commentsData'] = MBTasksCptDetailAjax::PrepareCommentsData(
				$arAvatarSize, 
				$_REQUEST['PATH_TO_FORUM_SMILE'], 
				$arRes['FORUM_ID'],
				$_REQUEST['task_id'],
				$_REQUEST['user_id'],
				$_REQUEST['PATH_TEMPLATE_TO_USER_PROFILE'],
				$arRes['NAME_TEMPLATE'],
				$lastViewedDate,
				$_REQUEST['DATE_TIME_FORMAT'],
				$arAlreadyLoadedComments,
				$newComment,
				$defMessagesCount
			);
		}

		if (($action_name === 'edit') || ($action_name === 'delegate'))
		{
			$arResult = array(
				'bResultInJson' => false,
				'result'        => array(
					'rc'   => 'executed',
					'action_perfomed' => $action_name,
					'data' => $arTaskData
				)
			);
		}
		else
		{
			$arResult = array(
				'bResultInJson' => false,
				'result'        => $arTaskData
			);
		}
	}
	else
	{
		if ($action_name === 'edit')
		{
			$arResult = array(
				'bResultInJson' => false,
				'result'        => array(
					'rc'   => 'failed',
					'action_perfomed' => $action_name,
					'data' => false
				)
			);
		}
		else
		{
			$arResult = array(
				'bResultInJson' => false,
				'result'        => false
			);
		}
	}
}
elseif (
	isset($_POST['user_id'])
	&& isset($_POST['task_id'])
	&& isset($_POST['action_name'])
	&& isset($_POST['DATE_TIME_FORMAT'])
	&& in_array(
		(string) $_POST['action_name'],
		array(
			'close',
			'start',
			'accept',
			'renew',
			'defer',
			'decline',
			'remove',
			'add_favorite',
			'delete_favorite'
		),
		true
	)	
	&& ($action === 'perfom_action')
)
{
	$arParams = array(
		'USER_ID'                 => (int) $_POST['user_id'],
		'TASK_ID'                 => (int) $_POST['task_id'],
		'DATE_TIME_FORMAT'        => $_POST['DATE_TIME_FORMAT'],
		'SHOW_TEMPLATE'           => 'N',
		'PATH_TO_USER_TASKS_EDIT' => '...'
	);

	$arRes = $GLOBALS['APPLICATION']->IncludeComponent(
		'bitrix:mobile.tasks.detail', 
		'.default', 
		$arParams, 
		false
	);

	$arTask = $arRes['TASK'];
	$arAllowedActions = $arRes['TASK']['META::ALLOWED_ACTIONS'];

	// Check, that action is allowed
	$bActionAllowed = false;
	foreach ($arAllowedActions as $arAllowedActionData)
	{
		if ($_POST['action_name'] === $arAllowedActionData['system_name'])
		{
			$bActionAllowed = true;
			break;
		}
	}

	$curUserId = $GLOBALS['USER']->GetID();

	if ($bActionAllowed)
	{
		$taskIdPost = (int) $_POST['task_id'];

		if ($_POST['action_name'] === 'remove')
		{
			$arResult = MBTasksCptDetailAjax::RemoveTask($taskIdPost);
		}
		elseif($_POST['action_name'] === 'add_favorite' || $_POST['action_name'] === 'delete_favorite')
		{
			MBTasksCptDetailAjax::ToggleFavorite($taskIdPost, $_POST['action_name'] === 'add_favorite');

			$arResult = array(
				'bResultInJson' => false,
				'result'        => array(
					'rc'   => 'executed',
					'action_perfomed' => (string) $_POST['action_name'],
					'data' => MBTasksCptDetailAjax::getTaskData($taskIdPost, $arParams)
				)
			);
		}
		else
		{
			$arResult = MBTasksCptDetailAjax::ChangeTaskStatus(
				$_POST['action_name'], 
				$curUserId, 
				$arTask, 
				(int) $_POST['task_id'], 
				$arParams
			);
		}
	}
	else
	{
		$arResult = array(
			'bResultInJson' => false,
			'result' => array(
				'rc'              => 'action_not_allowed',
				'action_perfomed' => $_POST['action_name']
			)
		);
	}
}
else
{
	$arResult = array(
		'bResultInJson' => false,
		'result'        => array()
	);
}

$APPLICATION->RestartBuffer();

header('Content-Type: application/x-javascript; charset=' . LANG_CHARSET);
if ($arResult['bResultInJson'])
{
	echo $arResult['result'];
}
else
{
	echo CUtil::PhpToJsObject($arResult['result']);
}

define('PUBLIC_AJAX_MODE', true);

require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/epilog_after.php');

exit();