Your IP : 3.143.254.46


Current Path : /home/bitrix/ext_www/crm.klimatlend.ua/bitrix/modules/tasks/
Upload File :
Current File : /home/bitrix/ext_www/crm.klimatlend.ua/bitrix/modules/tasks/tools.php

<?php
IncludeModuleLangFile(__FILE__);

/**
 * @deprecated
 */
class TasksException extends \Bitrix\Tasks\Exception
{
	const TE_TASK_NOT_FOUND_OR_NOT_ACCESSIBLE  = 0x000001;
	const TE_ACCESS_DENIED                     = 0x100002;
	const TE_ACTION_NOT_ALLOWED                = 0x000004;
	const TE_ACTION_FAILED_TO_BE_PROCESSED     = 0x000008;
	const TE_TRYED_DELEGATE_TO_WRONG_PERSON    = 0x000010;
	const TE_FILE_NOT_ATTACHED_TO_TASK         = 0x000020;
	const TE_UNKNOWN_ERROR                     = 0x000040;
	const TE_FILTER_MANIFEST_MISMATCH          = 0x000080;
	const TE_WRONG_ARGUMENTS                   = 0x000100;
	const TE_ITEM_NOT_FOUND_OR_NOT_ACCESSIBLE  = 0x000200;
	const TE_SQL_ERROR                         = 0x000400;

	const TE_FLAG_SERIALIZED_ERRORS_IN_MESSAGE = 0x100000;

	private static $errSymbolsMap = array(
		'TE_TASK_NOT_FOUND_OR_NOT_ACCESSIBLE'  => 0x000001,
		'TE_ACCESS_DENIED'                     => 0x100002,
		'TE_ACTION_NOT_ALLOWED'                => 0x000004,
		'TE_ACTION_FAILED_TO_BE_PROCESSED'     => 0x000008,
		'TE_TRYED_DELEGATE_TO_WRONG_PERSON'    => 0x000010,
		'TE_FILE_NOT_ATTACHED_TO_TASK'         => 0x000020,
		'TE_UNKNOWN_ERROR'                     => 0x000040,
		'TE_FILTER_MANIFEST_MISMATCH'          => 0x000080,
		'TE_WRONG_ARGUMENTS'                   => 0x000100,
		'TE_ITEM_NOT_FOUND_OR_NOT_ACCESSIBLE'  => 0x000200,
		'TE_SQL_ERROR'                         => 0x000400,

		'TE_FLAG_SERIALIZED_ERRORS_IN_MESSAGE' => 0x100000
	);

	public function checkIsActionNotAllowed()
	{
		return $this->checkOfType(self::TE_ACTION_NOT_ALLOWED);
	}

	public function checkOfType($type)
	{
		return $this->getCode() & $type;
	}

	protected function dumpAuxError()
	{
		// if case of do not dump AUX ERROR, because we can not add trailing ID to a serialized message
		return !(intval($this->additional['CODE']) & self::TE_FLAG_SERIALIZED_ERRORS_IN_MESSAGE);
	}

	public function __construct($message = false, $code = 0)
	{
		$parameters = array();

		if(!$message)
		{
			$message = $GLOBALS['APPLICATION']->GetException();
		}

		// exception extra data goes to log
		if($this->checkOfType(self::TE_FLAG_SERIALIZED_ERRORS_IN_MESSAGE) && $message !== false)
		{
			$parameters['AUX']['ERROR'] = unserialize($message);
		}

		parent::__construct(
			$message, 
			$parameters,
			array(
				'CODE' => $code
			)
		);
	}

	/**
	 * @deprecated
	 */
	public static function renderErrorCode($e)
	{
		$errCode    = $e->getCode();
		$strErrCode = $errCode . '/';

		if ($e instanceof TasksException)
		{
			$strErrCode .= 'TE';

			foreach (self::$errSymbolsMap as $symbol => $code)
			{
				if ($code & $errCode)
					$strErrCode .= '/'.mb_substr($symbol, 3);
			}
		}
		elseif ($e instanceof CTaskAssertException)
			$strErrCode .= 'CTAE';
		else
			$strErrCode .= 'Unknown';

		return ($strErrCode);
	}
}


class CTasksPerHitOption
{
	public static function set($moduleId, $optionName, $value)
	{
		self::managePerHitOptions('write', $moduleId, $optionName, $value);
	}


	public static function get($moduleId, $optionName)
	{
		return (self::managePerHitOptions('read', $moduleId, $optionName));
	}


	public static function getHitTimestamp()
	{
		static $t = null;

		if ($t === null)
			$t = time();

		return ($t);
	}


	private static function managePerHitOptions($operation, $moduleId, $optionName, $value = null)
	{
		static $arOptions = array();

		$oName = $moduleId . '::' . $optionName;

		if ( ! array_key_exists($oName, $arOptions) )
			$arOptions[$oName] = null;

		$rc = null;

		if ($operation === 'read')
			$rc = $arOptions[$oName];
		elseif ($operation === 'write')
			$arOptions[$oName] = $value;
		else
			CTaskAssert::assert(false);

		return ($rc);
	}
}


function tasksFormatDate($in_date)
{
	$date = $in_date;
	$strDate = false;

	if (!is_int($in_date))
		$date = MakeTimeStamp($in_date);

	if ( ($date === false) || ($date === -1) || ($date === 0) )
		$date = MakeTimeStamp ($in_date);

	// It can be other date on server (relative to client), ...
	$bTzWasDisabled = ! CTimeZone::enabled();

	if ($bTzWasDisabled)
		CTimeZone::enable();

	$ts = time() + CTimeZone::getOffset();		// ... so shift cur timestamp to compensate it.

	if ($bTzWasDisabled)
		CTimeZone::disable();

	$curDateStrAtClient       = date('d.m.Y', $ts);
	$yesterdayDateStrAtClient = date('d.m.Y', strtotime('-1 day', $ts));


	if ($curDateStrAtClient === date('d.m.Y', $date))
	{
		$strDate = FormatDate("today", $date);
	}
	elseif ($yesterdayDateStrAtClient === date('d.m.Y', $date))
	{
		$strDate = FormatDate("yesterday", $date);
	}
	//	disabled, since it is not clear for foreigners
	//	elseif (date("Y", $now) == date("Y", $date))
	//	{
	//		$strDate = ToLower(FormatDate("j F", $date));
	//	}
	else
	{
		if (defined('FORMAT_DATE'))
		{
			$strDate = \Bitrix\Tasks\UI::formatDateTime($date, FORMAT_DATE);
		}
		else
			$strDate = FormatDate("d.m.Y", $date);
	}

	return $strDate;
}

/**
 * @param $arParams
 * @return mixed|string
 * @deprecated
 */
function tasksPeriodToStr($arParams)
{
	return \Bitrix\Tasks\UI\Task\Template::makeReplicationPeriodString($arParams);
}


function taskMessSuffix($number)
{
	switch ($number)
	{
		case 2:
			return "_ND";
		case 3:
			return "_RD";
		default:
			return "_TH";
	}
}

function tasksFormatName($name, $lastName, $login, $secondName = "", $nameTemplate = "", $bEscapeSpecChars = false)
{
	if ($nameTemplate != "")
	{
		$result = CUser::FormatName($nameTemplate, array(	"NAME" 			=> $name, 
															"LAST_NAME" 	=> $lastName, 
															"SECOND_NAME" 	=> $secondName, 
															"LOGIN"			=> $login),
			true,
			$bEscapeSpecChars);

		return $result;
	}

	if ($name || $lastName)
	{
		$rc = $name.($name && $lastName ? " " : "").$lastName;
	}
	else
	{
		$rc = $login;
	}

	if ($bEscapeSpecChars)
		$rc = htmlspecialcharsbx($rc);

	return ($rc);
}

function tasksFormatNameShort($name, $lastName, $login, $secondName = "", $nameTemplate = "", $bEscapeSpecChars = false)
{
	if ($nameTemplate != "")
	{
		$result = CUser::FormatName($nameTemplate, array(	"NAME" 			=> $name, 
															"LAST_NAME" 	=> $lastName, 
															"SECOND_NAME" 	=> $secondName, 
															"LOGIN"			=> $login),
			true,
			$bEscapeSpecChars);

		return $result;
	}

	if ($name && $lastName)
	{
		if ( ! $bEscapeSpecChars )
			$rc = $lastName." ".mb_substr(htmlspecialcharsBack($name), 0, 1).".";
		else
			$rc = $lastName." ".mb_substr($name, 0, 1).".";
	}
	elseif ($lastName)
	{
		$rc = $lastName;
	}
	elseif ($name)
	{
		$rc = $name;
	}
	else
	{
		$rc = $login;
	}

	if ($bEscapeSpecChars)
		$rc = htmlspecialcharsbx($rc);

	return ($rc);
}


function tasksFormatHours($hours)
{
	$hoursOriginal = $hours = intval($hours);

	$hours %= 100;
	if ($hours >= 5 && $hours <= 20)
		return $hoursOriginal. " ".GetMessage("TASKS_HOURS_P");

	$hours %= 10;
	if ($hours == 1)
		return $hoursOriginal. " ".GetMessage("TASKS_HOURS_N");

	if ($hours >= 2 && $hours <= 4)
		return $hoursOriginal. " ".GetMessage("TASKS_HOURS_G");

	return $hoursOriginal. " ".GetMessage("TASKS_HOURS_P");

}


function tasksTimeCutZeros($time)
{
	if (IsAmPmMode())
	{
		return trim(mb_substr($time, 11, 11) == "12:00:00 am"? mb_substr($time, 0, 10) : mb_substr($time, 0, 22));
	}
	else
	{
		return mb_substr($time, 11, 8) == "00:00:00"? mb_substr($time, 0, 10) : mb_substr($time, 0, 16);
	}

}

/**@deprecated
 *
 * @param $task
 * @param $arPaths
 * @param string $site_id
 * @param bool $bGantt
 * @param bool $top
 * @param bool $bSkipJsMenu
 * @param array $params
 */
function tasksGetItemMenu($task, $arPaths, $site_id = SITE_ID, $bGantt = false, $top = false, $bSkipJsMenu = false, array $params = array())
{
	$userId = \Bitrix\Tasks\Util\User::getId();

	$arAllowedTaskActions = array();
	if (isset($task['META:ALLOWED_ACTIONS']))
		$arAllowedTaskActions = $task['META:ALLOWED_ACTIONS'];
	elseif ($task['ID'])
	{
		$oTask = CTaskItem::getInstanceFromPool($task['ID'], $userId);
		$arAllowedTaskActions = $oTask->getAllowedTaskActionsAsStrings();
		$task['META:ALLOWED_ACTIONS'] = $arAllowedTaskActions;
	}

	$viewUrl = CComponentEngine::makePathFromTemplate($arPaths["PATH_TO_TASKS_TASK"], array("task_id" => $task["ID"], 'user_id'=>$userId, 'group_id'=>$task['GROUP_ID'], "action" => "view"));
	$editUrl = CComponentEngine::makePathFromTemplate($arPaths["PATH_TO_TASKS_TASK"], array("task_id" => $task["ID"], 'user_id'=>$userId, 'group_id'=>$task['GROUP_ID'], "action" => "edit"));
	$copyUrl = CComponentEngine::makePathFromTemplate($arPaths["PATH_TO_TASKS_TASK"], array("task_id" => 0, "action" => "edit", 'user_id'=>$userId, 'group_id'=>$task['GROUP_ID']));
	$createUrl = CComponentEngine::makePathFromTemplate($arPaths["PATH_TO_TASKS_TASK"], array("task_id" => 0, "action" => "edit", 'user_id'=>$userId, 'group_id'=>$task['GROUP_ID']));
	$createUrl = $createUrl.(mb_strpos($createUrl, "?") === false ? "?" : "&")."PARENT_ID=".$task["ID"];

	$inFavorite = false;
	if(is_array($params['VIEW_STATE']) && $params['VIEW_STATE']['SECTION_SELECTED']['CODENAME'] == 'VIEW_SECTION_ADVANCED_FILTER' && $params['VIEW_STATE']['SPECIAL_PRESET_SELECTED']['CODENAME'] == 'FAVORITE')
	{
		$inFavorite = true;
	}
	?>
		{
			text : "<?=GetMessage("TASKS_VIEW_TASK")?>",
			title : "<?=GetMessage("TASKS_VIEW_TASK_EX")?>",
			className : "menu-popup-item-view",
			href : "<? echo CUtil::JSEscape($viewUrl)?>"
			<?
			if ($bGantt && !$params['DISABLE_IFRAME_POPUP'])
			{
				?>,
				onclick : BX.CJSTask.fixWindow(function(window, top, event) {

					var fn = (window && window.ShowPopupTask) || (top && top.ShowPopupTask) || BX.DoNothing;
					fn(<?=intval($task["ID"])?>, event);
					this.popupWindow.close();}
				)
				<?
			}
			else
			{
				?>,
				onclick : function(window, top, event) {
					this.popupWindow.close();
				}
				<?
			}?>
		},

		<? if ($arAllowedTaskActions['ACTION_EDIT']):?>
		{
			text : "<?=GetMessage("TASKS_EDIT_TASK")?>",
			title : "<?=GetMessage("TASKS_EDIT_TASK_EX")?>",
			className : "menu-popup-item-edit",
			href : "<? echo CUtil::JSEscape($editUrl)?>"
			<?
			if ($bGantt && !$params['DISABLE_IFRAME_POPUP'])
			{
				?>,
				onclick : BX.CJSTask.fixWindow(function(window, top, event) {
					var fn = (window && window.EditPopupTask) || (top && top.EditPopupTask) || BX.DoNothing;
					fn(<?=intval($task["ID"])?>, event);
					this.popupWindow.close();}
				)
				<?
			}
			else
			{
				?>,
				onclick : function(window, top, event) {
					this.popupWindow.close();
				}
				<?
			}?>
		},
		<? endif?>

		{
			text : "<?=GetMessage("TASKS_ADD_SUBTASK"); ?>",
			title : "<?=GetMessage("TASKS_ADD_SUBTASK"); ?>",
			className : "menu-popup-item-create",
			href : "<? echo CUtil::JSEscape($createUrl)?>"
			<?
			if ($bGantt && !$params['DISABLE_IFRAME_POPUP'])
			{
				?>,
				onclick : BX.CJSTask.fixWindow(function(window, top, event) {
					var fn = (window && window.AddPopupSubtask) || (top && top.AddPopupSubtask) || BX.DoNothing;
					fn(<?=intval($task["ID"])?>, event);
					this.popupWindow.close();}
				)
				<?
			}
			else
			{
				?>,
				onclick : function(window, top, event) {
					this.popupWindow.close();
				}
				<?
			}?>
		},

		<?

		if ($bGantt && ($arAllowedTaskActions['ACTION_EDIT'] || $arAllowedTaskActions['ACTION_CHANGE_DEADLINE']))
		{
			?>
			{
				text : "<? if(!$task["DEADLINE"]):?><?=GetMessage("TASKS_ADD_DEADLINE")?><? else:?><?=GetMessage("TASKS_REMOVE_DEADLINE")?><? endif?>",
				title : "<? if(!$task["DEADLINE"]):?><?=GetMessage("TASKS_ADD_DEADLINE")?><? else:?><?=GetMessage("TASKS_REMOVE_DEADLINE")?><? endif?>",
				className : "<? if(!$task["DEADLINE"]):?>task-menu-popup-item-add-deadline<? else:?>task-menu-popup-item-remove-deadline<? endif?>",
				onclick : BX.CJSTask.fixWindow(function(window, top, event, item)
				{
					var BX = top.BX;

					if (BX.hasClass(item.layout.item, "task-menu-popup-item-add-deadline"))
					{
						BX.removeClass(item.layout.item, "task-menu-popup-item-add-deadline");
						BX.addClass(item.layout.item, "task-menu-popup-item-remove-deadline");
						item.layout.text.innerHTML = "<?=GetMessage("TASKS_REMOVE_DEADLINE")?>";

						var deadline = BX.GanttChart.convertDateFromUTC(this.params.task.dateEnd);
						deadline.setDate(deadline.getDate() + 3);

						if(typeof top.COMPANY_WORKTIME != 'undefined')
							deadline = BX.CJSTask.addTimeToDate(deadline, top.COMPANY_WORKTIME);

						this.params.task.setDateDeadline(deadline);
						this.params.task.redraw();
						this.popupWindow.close();

						// this should pass through
						var data = {
							mode : "deadline",
							sessid : BX.message("bitrix_sessid"),
							id : this.params.task.id,
							deadline : top.tasksFormatDate(deadline)
						};
						BX.ajax.post(top.ajaxUrl, data);
					}
					else
					{
						BX.removeClass(item.layout.item, "task-menu-popup-item-remove-deadline");
						BX.addClass(item.layout.item, "task-menu-popup-item-add-deadline");
						item.layout.text.innerHTML = "<?=GetMessage("TASKS_ADD_DEADLINE")?>";
						this.params.task.setDateDeadline(null);
						this.params.task.redraw();
						this.popupWindow.close();

						var data = {
							mode : "deadline",
							sessid : BX.message("bitrix_sessid"),
							id : this.params.task.id,
							deadline : ""
						};
						BX.ajax.post(top.ajaxUrl, data);
					}
				})
			},
			<?
		}

		if ($arAllowedTaskActions['ACTION_ADD_FAVORITE'])
		{
			?>{
				text : "<?=GetMessage("ACTION_ADD_FAVORITE")?>",
				title : "<?=GetMessage("ACTION_ADD_FAVORITE")?>",
				className : "task-menu-popup-item-favorite",
				onclick : BX.CJSTask.fixWindow(function(window, top, event) {
					var fn = (window && window.AddToFavorite) || (top && top.AddToFavorite) || BX.DoNothing;
					fn(<?=intval($task["ID"])?>);
					this.popupWindow.close();
				})
			},
			<?
		}

		if ($arAllowedTaskActions['ACTION_DELETE_FAVORITE'])
		{
			?>{
				text : "<?=GetMessage("ACTION_DELETE_FAVORITE")?>",
				title : "<?=GetMessage("ACTION_DELETE_FAVORITE")?>",
				className : "task-menu-popup-item-favorite",
				onclick : BX.CJSTask.fixWindow(function(window, top, event) {
					var fn = (window && window.DeleteFavorite) || (top && top.DeleteFavorite) || BX.DoNothing;
					fn(<?=intval($task["ID"])?>, {mode: 'delete-subtree', rowDelete: <?=($inFavorite ? 'true' : 'false')?>});
					this.popupWindow.close();
				})
			},
			<?
		}

		if ($arAllowedTaskActions['ACTION_COMPLETE'])
		{
			?>{
				text : "<?=GetMessage("TASKS_CLOSE_TASK")?>",
				title : "<?=GetMessage("TASKS_CLOSE_TASK")?>",
				className : "menu-popup-item-complete",
				onclick : BX.CJSTask.fixWindow(function(window, top, event) {
					var fn = (window && window.CloseTask) || (top && top.CloseTask) || BX.DoNothing;
					fn(<?=intval($task["ID"])?>);
					this.popupWindow.close();
				})
			},<?
		}

		if ($arAllowedTaskActions['ACTION_START'])
		{
			?>{
				text : "<?=GetMessage("TASKS_START_TASK")?>",
				title : "<?=GetMessage("TASKS_START_TASK")?>",
				className : "menu-popup-item-begin",
				onclick : BX.CJSTask.fixWindow(function(window, top, event) {
					var fn = (window && window.StartTask) || (top && top.StartTask) || BX.DoNothing;
					fn(<?=intval($task["ID"])?>);
					this.popupWindow.close();
				})
			},<?
		}

		if ($arAllowedTaskActions['ACTION_PAUSE'])
		{
			?>{
				text : "<?=GetMessage("TASKS_PAUSE_TASK")?>",
				title : "<?=GetMessage("TASKS_PAUSE_TASK")?>",
				className : "task-menu-popup-item-pause",
				onclick : BX.CJSTask.fixWindow(function(window, top, event) {
					var fn = (window && window.PauseTask) || (top && top.PauseTask) || BX.DoNothing;
					fn(<?=intval($task["ID"])?>);
					this.popupWindow.close();
				})
			},<?
		}

		if ($arAllowedTaskActions['ACTION_RENEW'])
		{
			?>{
				text : "<?=GetMessage("TASKS_RENEW_TASK")?>",
				title : "<?=GetMessage("TASKS_RENEW_TASK")?>",
				className : "menu-popup-item-reopen",
				onclick : BX.CJSTask.fixWindow(function(window, top, event) {
					var fn = (window && window.RenewTask) || (top && top.RenewTask) || BX.DoNothing;
					fn(<?=intval($task["ID"])?>);
					this.popupWindow.close();
				})
			},<?
		}

		if ($arAllowedTaskActions['ACTION_DEFER'])
		{
			?>{
				text : "<?=GetMessage("TASKS_DEFER_TASK")?>",
				title : "<?=GetMessage("TASKS_DEFER_TASK")?>",
				className : "menu-popup-item-hold",
				onclick : BX.CJSTask.fixWindow(function(window, top, event) {
					var fn = (window && window.DeferTask) || (top && top.DeferTask) || BX.DoNothing;
					fn(<?=intval($task["ID"])?>);
					this.popupWindow.close();
				})
			},<?
		}

		if ($arAllowedTaskActions['ACTION_APPROVE'])
		{
			?>{
				text : "<?=GetMessage("TASKS_APPROVE_TASK")?>",
				title : "<?=GetMessage("TASKS_APPROVE_TASK")?>",
				className : "menu-popup-item-accept",
				onclick : BX.CJSTask.fixWindow(function(window, top, event) {
					var fn = (window && window.tasksListNS) || (top && top.tasksListNS) || BX.DoNothing;
					fn.approveTask(<?=intval($task["ID"])?>);
					this.popupWindow.close();
				})
			},<?
		}

		if ($arAllowedTaskActions['ACTION_DISAPPROVE'])
		{
			?>{
				text : "<?=GetMessage("TASKS_REDO_TASK")?>",
				title : "<?=GetMessage("TASKS_REDO_TASK")?>",
				className : "menu-popup-item-remake",
				onclick : BX.CJSTask.fixWindow(function(window, top, event) {
					var fn = (window && window.tasksListNS) || (top && top.tasksListNS) || BX.DoNothing;
					fn.disapproveTask(<?=intval($task["ID"])?>);
					this.popupWindow.close();
				})
			},<?
		}

		?>

		{
			text : "<?=GetMessage("TASKS_COPY_TASK")?>",
			title : "<?=GetMessage("TASKS_COPY_TASK_EX")?>",
			className : "menu-popup-item-copy",
			href : "<? echo $copyUrl.(mb_strpos($copyUrl, "?") === false ? "?" : "&")."COPY=".$task["ID"]?>"
			<?
			if ($bGantt)
			{
				?>,
				onclick : BX.CJSTask.fixWindow(function(window, top, event) {
					var fn = (window && window.CopyPopupTask) || (top && top.CopyPopupTask) || BX.DoNothing;
					fn(<?=intval($task["ID"])?>, event);
					this.popupWindow.close();
				})
				<?
			}
			?>
		},

		<?

		// Only responsible person and accomplices can add task to day plan
		// And we must be not at extranet site
		if (
			(
			$task["RESPONSIBLE_ID"] == $userId
			|| (
				is_array($task['ACCOMPLICES'])
				&& in_array($userId, $task['ACCOMPLICES'])
				)
			)
			&& (!CModule::IncludeModule('extranet') || !CExtranet::IsExtranetSite())
		)
		{
			$arTasksInPlan = CTaskPlannerMaintance::getCurrentTasksList();

			// If not in day plan already
			if (!(is_array($arTasksInPlan) && in_array($task["ID"], $arTasksInPlan)))
			{
				?>
				{
					text : "<?=GetMessage("TASKS_ADD_TASK_TO_TIMEMAN")?>",
					title : "<?=GetMessage("TASKS_ADD_TASK_TO_TIMEMAN_EX")?>",
					className : "menu-popup-item-add-to-tm",
					onclick : BX.CJSTask.fixWindow(function(window, top, event, item) {
						var fn = (window && window.Add2Timeman) || (top && top.Add2Timeman) || BX.DoNothing;
						fn(this, <?=intval($task["ID"])?>);
					})
				},<?
			}
		}

		if ($arAllowedTaskActions['ACTION_REMOVE'])
		{
			?>
			{
				text : "<?=GetMessage("TASKS_DELETE_TASK")?>",
				title : "<?=GetMessage("TASKS_DELETE_TASK")?>",
				className : "menu-popup-item-delete",
				onclick : BX.CJSTask.fixWindow(function(window, top, event)
				{
					var fn = (window && window.DeleteTask) || (top && top.DeleteTask) || BX.DoNothing;
					this.menuItems = [];
					this.bindElement.onclick = function() { return (false); };
					fn(<?=intval($task["ID"])?>);
					this.popupWindow.close();
				})
			},<?
		}
		?>
		{}
	<?
}


function tasksRenderListItem($task, $childrenCount, $arPaths, $depth = 0, 
	$plain = false, $defer = false, $site_id = SITE_ID, $updatesCount = 0, 
	$projectExpanded = true, $taskAdded = false, 
	$componentName = "bitrix:tasks.list.item", $componentTemplate = ".default", 
	$userNameTemplate = "", $arAllowedTaskActions = null, $ynIframe = 'N'
)
{
	global $APPLICATION;

	$APPLICATION->IncludeComponent(
		$componentName, $componentTemplate, array(
			"TASK" => $task,
			"CHILDREN_COUNT" => $childrenCount,
			"PATHS" => $arPaths,
			"DEPTH" => $depth,
			"PLAIN" => $plain,
			"DEFER" => $defer,
			"SITE_ID" => $site_id,
			"UPDATES_COUNT" => $updatesCount,
			"PROJECT_EXPANDED" => $projectExpanded,
			"TASK_ADDED" => $taskAdded,
			'ALLOWED_ACTIONS' => $arAllowedTaskActions,
			'IFRAME'          => $ynIframe,
			"NAME_TEMPLATE" => $userNameTemplate
		), null, array("HIDE_ICONS" => "Y")
	);
}

function templatesGetListItemActions($template, $arPaths)
{
	$addTaskUrl = CComponentEngine::MakePathFromTemplate($arPaths["PATH_TO_TASKS_TASK_ADD_BY_TEMPLATE"], array("task_id" => 0, "action" => "edit"));
	$addTaskUrl .= (mb_strpos($addTaskUrl, "?") === false ? "?" : "&")."TEMPLATE=".$template["ID"];

	$viewUrl = CComponentEngine::MakePathFromTemplate($arPaths["PATH_TO_TEMPLATES_TEMPLATE"], array("template_id" => $template["ID"], "action" => "view"));
	$editUrl = CComponentEngine::MakePathFromTemplate($arPaths["PATH_TO_TEMPLATES_TEMPLATE"], array("template_id" => $template["ID"], "action" => "edit"));
	$addSubTmplUrl = CComponentEngine::MakePathFromTemplate($arPaths["PATH_TO_TASKS_TASK"], array("task_id" => 0, "action" => "edit"))."?BASE_TEMPLATE=".intval($template["ID"]);
	$copyUrl = CComponentEngine::MakePathFromTemplate($arPaths["PATH_TO_TASKS_TASK"], array("task_id" => 0, "action" => "edit"))."?COPY=".intval($template["ID"]);
	?>

	{ text : "<?php echo GetMessage("TASKS_VIEW_TASK")?>", title : "<?php echo GetMessage("TASKS_VIEW_TASK")?>", className : "menu-popup-item-view", href : "<?php echo CUtil::JSEscape($viewUrl)?>" },

	<?if(!intval($template['BASE_TEMPLATE_ID']) && $template['TPARAM_TYPE'] != CTaskTemplates::TYPE_FOR_NEW_USER):?>
		{ text : "<?php echo GetMessage("TASKS_ADD_TEMPLATE_TASK")?>", title : "<?php echo GetMessage("TASKS_ADD_TEMPLATE_TASK")?>", className : "menu-popup-item-create", href : "<?php echo CUtil::JSEscape($addTaskUrl)?>" },
	<?endif?>

	<?if($template['TPARAM_TYPE'] != CTaskTemplates::TYPE_FOR_NEW_USER):?>
		{ text : "<?=GetMessage("TASKS_ADD_SUB_TEMPLATE")?>", title : "<?php echo GetMessage("TASKS_ADD_SUB_TEMPLATE")?>", className : "menu-popup-item-create", href : "<?=CUtil::JSEscape($addSubTmplUrl)?>" },
	<?endif?>

	{ text : "<?=GetMessage("TASKS_TEMPLATE_COPY")?>", title : "<?php echo GetMessage("TASKS_TEMPLATE_COPY")?>", className : "menu-popup-item-copy", href : "<?=CUtil::JSEscape($copyUrl)?>" },

	<?if($template['ALLOWED_ACTIONS']['UPDATE']):?>
		{ text : "<?php echo GetMessage("TASKS_EDIT_TASK")?>", title : "<?php echo GetMessage("TASKS_EDIT_TASK")?>", className : "menu-popup-item-edit", href : "<?php echo CUtil::JSEscape($editUrl)?>" },
	<?endif?>
	<?if($template['ALLOWED_ACTIONS']['DELETE']):?>
		{ text : "<?php echo GetMessage("TASKS_DELETE_TASK")?>", title : "<?php echo GetMessage("TASKS_DELETE_TASK")?>", className : "menu-popup-item-delete", onclick : function() { if(confirm("<?php echo GetMessage("TASKS_DELETE_TASKS_CONFIRM")?>")){this.menuItems = []; DeleteTemplate(<?php echo $template["ID"]?>);} this.popupWindow.close(); } },
	<?endif?>

	<?
}

function templatesRenderListItem($template, $arPaths, $depth = 0, $plain = false, $defer = false, $nameTemplate = "")
{
	$anchor_id = RandString(8);

	$addUrl = CComponentEngine::MakePathFromTemplate($arPaths["PATH_TO_TASKS_TASK"], array("task_id" => 0, "action" => "edit"));
	$addUrl .= (mb_strpos($addUrl, "?") === false ? "?" : "&")."TEMPLATE=".$template["ID"];
	$editUrl = CComponentEngine::MakePathFromTemplate($arPaths["PATH_TO_TEMPLATES_TEMPLATE"], array("template_id" => $template["ID"], "action" => "edit"));
	?>
	<script type="text/javascript"<?php echo $defer ? "  defer=\"defer\"" : ""?>>
		tasksMenuPopup[<?php echo $template["ID"]?>] = [
			<?templatesGetListItemActions($template, $arPaths)?>
		];
	</script>
	<tr class="task-list-item task-depth-<?php echo $depth?>" id="template-<?php echo $template["ID"]?>" ondblclick="jsUtils.Redirect([], '<?php echo CUtil::JSEscape(CComponentEngine::MakePathFromTemplate($arPaths["PATH_TO_TEMPLATES_TEMPLATE"], array("template_id" => $template["ID"], "action" => "edit")))?>');" title="<?php echo GetMessage("TASKS_DOUBLE_CLICK")?>">
		<td class="task-title-column">
			<div class="task-title-container">
				<div class="task-title-info">
					<?php if ($template["MULTITASK"] == "Y"):?><span class="task-title-multiple" title="<?php echo GetMessage("TASKS_MULTITASK")?>"></span><?php endif?><a href="<?php echo CComponentEngine::MakePathFromTemplate($arPaths["PATH_TO_TEMPLATES_TEMPLATE"], array("template_id" => $template["ID"], "action" => "edit"))?>" class="task-title-link" title=""><?php echo $template["TITLE"]?></a>
				</div>
			</div>
		</td>
		<td class="task-menu-column"><a href="javascript: void(0)" class="task-menu-button" onclick="return ShowMenuPopup(<?php echo $template["ID"]?>, this);" title="<?php echo GetMessage("TASKS_MENU")?>"><i class="task-menu-button-icon"></i></a></td>
		<td class="task-flag-column">&nbsp;</td>
		<td class="task-priority-column">
			<i class="task-priority-icon task-priority-<?php if ($template["PRIORITY"] == 0):?>low<?php elseif ($template["PRIORITY"] == 2):?>high<?php else:?>medium<?php endif?>" title="<?php echo GetMessage("TASKS_PRIORITY")?>: <?php echo GetMessage("TASKS_PRIORITY_".$template["PRIORITY"])?>"></i>
		</td>
		<td class="task-deadline-column"><?php if ($template["DEADLINE"]):?><span class="task-deadline-datetime"><span class="task-deadline-date"><?php echo tasksFormatDate($template["DEADLINE"])?></span></span><?php if(date("H:i", strtotime($template["DEADLINE"])) != "00:00"):?> <span class="task-deadline-time"><?php echo date("H:i", strtotime($template["DEADLINE"]))?></span><?php endif?><?php else:?>&nbsp;<?php endif?></td>
		<td class="task-responsible-column"><a class="task-responsible-link" href="<?php echo CComponentEngine::MakePathFromTemplate($arPaths["PATH_TO_USER_PROFILE"], array("user_id" => $template["RESPONSIBLE_ID"]))?>" id="anchor_responsible_<?php echo $anchor_id?>" bx-tooltip-user-id="<?=$template["RESPONSIBLE_ID"]?>"><?php echo tasksFormatNameShort($template["RESPONSIBLE_NAME"], $template["RESPONSIBLE_LAST_NAME"], $template["RESPONSIBLE_LOGIN"], $template["RESPONSIBLE_SECOND_NAME"], $nameTemplate)?></a></td>
		<td class="task-director-column"><a class="task-director-link" href="<?php echo CComponentEngine::MakePathFromTemplate($arPaths["PATH_TO_USER_PROFILE"], array("user_id" => $template["CREATED_BY"]))?>" id="anchor_created_<?php echo $anchor_id?>" bx-tooltip-user-id="<?=$template["CREATED_BY"]?>"><?php echo tasksFormatNameShort($template["CREATED_BY_NAME"], $template["CREATED_BY_LAST_NAME"], $template["CREATED_BY_LOGIN"], $template["CREATED_BY_SECOND_NAME"], $nameTemplate)?></a></td>
		<td class="task-grade-column">&nbsp;</td>
		<td class="task-complete-column">&nbsp;</td>
	</tr>
	<?php
}

/**@deprecated
 *
 * @param $arTask
 * @param $childrenCount
 * @param $arPaths
 * @param bool $bParent
 * @param bool $bGant
 * @param bool $top
 * @param string $nameTemplate
 * @param array $arAdditionalFields
 * @param bool $bSkipJsMenu
 * @param array $params
 *
 */
function tasksRenderJSON(
	$arTask, $childrenCount, $arPaths, $bParent = false, $bGant = false, 
	$top = false, $nameTemplate = "", $arAdditionalFields = array(), $bSkipJsMenu = false, array $params = array()
)
{
	$userId = \Bitrix\Tasks\Util\User::getId();

	if (array_key_exists('USER_ID', $params))
	{
		$profileUserId = (int)$params['USER_ID'];
	}
	else
	{
		$profileUserId = $userId;
	}

	$arAllowedTaskActions = array();
	if (isset($arTask['META:ALLOWED_ACTIONS']))
		$arAllowedTaskActions = $arTask['META:ALLOWED_ACTIONS'];
	elseif ($arTask['ID'])
	{
		$oTask = CTaskItem::getInstanceFromPool($arTask['ID'], $userId);
		$arAllowedTaskActions = $oTask->getAllowedTaskActionsAsStrings();
		$arTask['META:ALLOWED_ACTIONS'] = $arAllowedTaskActions;
	}

	$runningTaskId = $runningTaskTimer = null;
	if ($arTask['ALLOW_TIME_TRACKING'] === 'Y')
	{
		$oTimer           = CTaskTimerManager::getInstance($userId);
		$runningTaskData  = $oTimer->getRunningTask(false);
		$runningTaskId    = $runningTaskData['TASK_ID'];
		$runningTaskTimer = time() - $runningTaskData['TIMER_STARTED_AT'];
	}

	$canCreateTasks = false;
	$canEditTasks = false;
	if ($arTask["GROUP_ID"])
	{
		$canCreateTasks = \CSocNetFeaturesPerms::CurrentUserCanPerformOperation(SONET_ENTITY_GROUP, $arTask["GROUP_ID"], "tasks", "create_tasks");
		$canEditTasks = \CSocNetFeaturesPerms::CurrentUserCanPerformOperation(SONET_ENTITY_GROUP, $arTask["GROUP_ID"], "tasks", "edit_tasks");
	}
	?>
	{
		id : <?=intval($arTask["ID"])?>,
		name : "<?=CUtil::JSEscape($arTask["TITLE"])?>",
		<?if ($arTask["GROUP_ID"]):?>
			projectId : <?=intval($arTask["GROUP_ID"])?>,
			projectName : '<?=CUtil::JSEscape($arTask['GROUP_NAME'])?>',
			projectCanCreateTasks: <?=CUtil::PhpToJSObject($canCreateTasks)?>,
			projectCanEditTasks: <?=CUtil::PhpToJSObject($canEditTasks)?>,
		<?else:?>
			projectId : 0,
		<?endif?>
		status : "<?=tasksStatus2String($arTask["STATUS"])?>",
		realStatus : "<?=intval($arTask["REAL_STATUS"])?>",
		url: '<?=CUtil::JSEscape(CComponentEngine::MakePathFromTemplate(
				$arPaths["PATH_TO_TASKS_TASK"],
				array(
					"task_id" => $arTask["ID"],
					"user_id" => $profileUserId,
					"action" => "view",
					"group_id" => $arTask["GROUP_ID"]
				)
			));?>',
		priority : <?=intval($arTask["PRIORITY"])?>,
		mark : <?php echo !$arTask["MARK"] ? "null" : "'".CUtil::JSEscape($arTask["MARK"])."'"?>,
		responsible: '<?=CUtil::JSEscape(tasksFormatNameShort($arTask["RESPONSIBLE_NAME"], $arTask["RESPONSIBLE_LAST_NAME"], $arTask["RESPONSIBLE_LOGIN"], $arTask["RESPONSIBLE_SECOND_NAME"], $nameTemplate))?>',
		director: '<?=CUtil::JSEscape(tasksFormatNameShort($arTask["CREATED_BY_NAME"], $arTask["CREATED_BY_LAST_NAME"], $arTask["CREATED_BY_LOGIN"], $arTask["CREATED_BY_SECOND_NAME"], $nameTemplate))?>',
		responsibleId : <?=intval($arTask["RESPONSIBLE_ID"])?>,
		directorId : <?=intval($arTask["CREATED_BY"])?>,
		responsible_name: '<?=CUtil::JSEscape($arTask["RESPONSIBLE_NAME"]); ?>',
		responsible_second_name: '<?=CUtil::JSEscape($arTask["RESPONSIBLE_SECOND_NAME"]); ?>',
		responsible_last_name: '<?=CUtil::JSEscape($arTask["RESPONSIBLE_LAST_NAME"]); ?>',
		responsible_login: '<?=CUtil::JSEscape($arTask["RESPONSIBLE_LOGIN"]); ?>',
		director_name: '<?=CUtil::JSEscape($arTask["CREATED_BY_NAME"]); ?>',
		director_second_name: '<?=CUtil::JSEscape($arTask["CREATED_BY_SECOND_NAME"]); ?>',
		director_last_name: '<?=CUtil::JSEscape($arTask["CREATED_BY_LAST_NAME"]); ?>',
		director_login: '<?=CUtil::JSEscape($arTask["CREATED_BY_LOGIN"]); ?>',
		dateCreated : <?tasksJSDateObject($arTask["CREATED_DATE"], $top)?>,

		links: <?=CUtil::PhpToJSObject($arTask['LINKS'], false, false, true)?>,

		<?php if ($arTask["START_DATE_PLAN"]):?>dateStart : <?php tasksJSDateObject($arTask["START_DATE_PLAN"], $top)?>,<?php else:?>dateStart: null,<?php endif?>

		<?php if ($arTask["END_DATE_PLAN"]):?>dateEnd : <?php tasksJSDateObject($arTask["END_DATE_PLAN"], $top)?>,<?php else:?>dateEnd: null,<?php endif?>

		<?php if ($arTask["DATE_START"]):?>dateStarted: <?php tasksJSDateObject($arTask["DATE_START"], $top)?>,<?php endif?>

		dateCompleted : <?php if ($arTask["CLOSED_DATE"]):?><?php tasksJSDateObject($arTask["CLOSED_DATE"], $top)?><?php else:?>null<?php endif?>,

		<?php if ($arTask["DEADLINE"]):?>dateDeadline : <?php tasksJSDateObject($arTask["DEADLINE"], $top)?>,<?php else:?>dateDeadline: null,<?php endif?>

		canEditPlanDates : <?php if ($arAllowedTaskActions['ACTION_CHANGE_DEADLINE']):?>true<?php else:?>false<?php endif?>,

		canEdit: <?=(isset($arTask["META:ALLOWED_ACTIONS"]) && $arTask["META:ALLOWED_ACTIONS"]["ACTION_EDIT"] ? "true" : "false")?>,

		<?if ($arTask["PARENT_ID"] && $bParent):?>
			parentTaskId : <?=intval($arTask["PARENT_ID"])?>,
		<?else:?>
			parentTaskId : 0,
		<?endif?>

		<?php
			if ($arTask["FILES"] && sizeof($arTask["FILES"])):
				$i = 0;
		?>
			files: [
				<?php
					foreach($arTask["FILES"] as $file):
						$i++;
				?>
				{ name : '<?php echo CUtil::JSEscape($file["ORIGINAL_NAME"])?>', url : '/bitrix/components/bitrix/tasks.task.detail/show_file.php?fid=<?=intval($file["ID"])?>', size : '<?php echo CUtil::JSEscape(CFile::FormatSize($file["FILE_SIZE"]))?>' }<?php if ($i != sizeof($arTask["FILES"])):?>,<?php endif?>
				<?php endforeach?>
			],
		<?php endif?>

		<?php
		if ($arTask['ACCOMPLICES'] && is_array($arTask['ACCOMPLICES']))
		{
			$i = 0;
			echo 'accomplices: [';
			foreach($arTask['ACCOMPLICES'] as $ACCOMPLICE_ID)
			{
				if ($i++)
					echo ',';

				echo '{ id: ' . (int) $ACCOMPLICE_ID . ' }';
			}
			echo '], ';
		}
		?>

		<?php
		if ($arTask['AUDITORS'] && is_array($arTask['AUDITORS']))
		{
			$i = 0;
			echo 'auditors: [';
			foreach($arTask['AUDITORS'] as $AUDITOR_ID)
			{
				if ($i++)
					echo ',';

				echo '{ id: ' . (int) $AUDITOR_ID . ' }';
			}
			echo '], ';
		}
		?>

		isSubordinate: <?php echo $arTask["SUBORDINATE"] == "Y" ? "true" : "false"?>,
		isInReport: <?php echo $arTask["ADD_IN_REPORT"] == "Y" ? "true" : "false"?>,
		hasChildren : <?php
			if (((int) $childrenCount) > 0)
				echo 'true';
			else
				echo 'false';
		?>,
		childrenCount : <?php echo (int) $childrenCount; ?>,
		canEditDeadline : <?php 
			if ($arAllowedTaskActions['ACTION_CHANGE_DEADLINE'])
				echo 'true';
			else
				echo 'false';
		?>,
		canStartTimeTracking : <?php if ($arAllowedTaskActions['ACTION_START_TIME_TRACKING']):?>true<?php else:?>false<?php endif?>,
		ALLOW_TIME_TRACKING : <?php 
			if (isset($arTask['ALLOW_TIME_TRACKING']) && ($arTask['ALLOW_TIME_TRACKING'] === 'Y'))
				echo 'true';
			else
				echo 'false';
		?>,
		matchWorkTime: <?=($arTask['MATCH_WORK_TIME'] == 'Y' ? 'true' : 'false')?>,
		TIMER_RUN_TIME : <?php if ($runningTaskId == $arTask['ID']) echo (int) $runningTaskTimer; else echo 'false'; ?>,
		TIME_SPENT_IN_LOGS : <?php echo (int) $arTask['TIME_SPENT_IN_LOGS']; ?>,
		TIME_ESTIMATE : <?php echo (int) $arTask['TIME_ESTIMATE']; ?>,
		IS_TASK_TRACKING_NOW : <?php if ($runningTaskId == $arTask['ID']) echo 'true'; else echo 'false'; ?>,
		menuItems: [<?php tasksGetItemMenu($arTask, $arPaths, SITE_ID, $bGant, $top, $bSkipJsMenu, $params)?>],

		<?$arTask['SE_PARAMETER'] = is_array($arTask['SE_PARAMETER']) ? $arTask['SE_PARAMETER'] : array();?>
		<?$seParameters = array();?>
		<?foreach($arTask['SE_PARAMETER'] as $k => $v):?>
			<?if($v['VALUE'] == 'Y' || $v['VALUE'] == 'N'):?>
				<?
				$code = $v['CODE'];
				if($code == \CTasks::PARAMETER_COMPLETE_TASK_FROM_SUBTASKS)
				{
					$code = 'completeTasksFromSubTasks';
				}
				elseif($code == \CTasks::PARAMETER_PROJECT_PLAN_FROM_SUBTASKS)
				{
					$code = 'projectPlanFromSubTasks';
				}
				?>
				<?$seParameters[$code] = $v['VALUE'] == 'Y';?>
			<?endif?>
		<?endforeach?>
		parameters: <?=json_encode($seParameters)?>

		<?php
		foreach ($arAdditionalFields as $key => $value)
			echo ', ' . $key . ' : ' . $value . "\n";
		?>
	}
<?php
}


function tasksJSDateObject($date, $top = false)
{
	$ts = MakeTimeStamp($date);
	?>
	new <?php if ($top):?>top.<?php endif?>Date(<?php 
		echo date("Y", $ts); ?>, <?php
		echo date("n", $ts) - 1; ?>, <?php 
		echo date("j", $ts); ?>, <?php 
		echo date("G", $ts); ?>, <?php 
		echo (date("i", $ts) + 0); ?>, <?php 
		echo (date("s", $ts) + 0); ?>)
	<?php
}


function tasksStatus2String($status)
{
	$arMap = array(
		CTasks::METASTATE_EXPIRED          => 'overdue',
		CTasks::METASTATE_VIRGIN_NEW       => 'new',
		CTasks::STATE_NEW                  => 'accepted',
		CTasks::METASTATE_EXPIRED_SOON     => 'overdue-soon',
		CTasks::STATE_PENDING              => 'accepted',
		CTasks::STATE_IN_PROGRESS          => 'in-progress',
		CTasks::STATE_SUPPOSEDLY_COMPLETED => 'waiting',
		CTasks::STATE_COMPLETED            => 'completed',
		CTasks::STATE_DEFERRED             => 'delayed',
		CTasks::STATE_DECLINED             => 'declined'
	);

	$strStatus = "";
	if (isset($arMap[$status]))
		$strStatus = $arMap[$status];

	return $strStatus;
}


function tasksServerName($server_name = false)
{
	if (!$server_name)
	{
		if (defined("SITE_SERVER_NAME") && SITE_SERVER_NAME)
		{
			$server_name = SITE_SERVER_NAME;
		}
		else
		{
			$server_name = COption::GetOptionString("main", "server_name", $_SERVER['HTTP_HOST']);
		}
	}

	if (
		(mb_substr(mb_strtolower($server_name), 0, 8) !== 'https://')
		&& (mb_substr(mb_strtolower($server_name), 0, 7) !== 'http://')
	)
	{
		if (CMain::IsHTTPS())
			$server_name = 'https://' . $server_name;
		else
			$server_name = 'http://' . $server_name;
	}

	$server_name_wo_protocol = str_replace(
		array('http://', 'https://', 'HTTP://', 'HTTPS://'), 	// Yeah, I know: 'hTtpS://', ...
		array('', '', '', ''), 
		$server_name
	);

	// Cutoff all what is after '/' (include '/' itself)
	$slashPos = mb_strpos($server_name_wo_protocol, '/');
	if ($slashPos >= 1)
	{
		$length = $slashPos;
		$server_name_wo_protocol = mb_substr(0, $length);
	}

	$isServerPortAlreadyGiven = false;
	if (mb_strpos($server_name_wo_protocol, ':') !== false)
		$isServerPortAlreadyGiven = true;

	$server_port = '';

	if (
		( ! $isServerPortAlreadyGiven )
		&& ($_SERVER['SERVER_PORT'] <> '')
		&& ($_SERVER['SERVER_PORT'] != '80')
		&& ($_SERVER['SERVER_PORT'] != '443')
	)
	{
		$server_port = ':' . $_SERVER['SERVER_PORT'];
	}

	if ( ! $isServerPortAlreadyGiven )
		$server_name .= $server_port;

	return ($server_name);
}


function tasksGetLastSelected($arManagers, $bSubordinateOnly = false, $nameTemplate = "")
{
	static $arLastUsers;

	$userId = \Bitrix\Tasks\Util\User::getId();

	if (!isset($arLastUsers))
	{
		$arSubDeps = CTasks::GetSubordinateDeps();

		if (!class_exists('CUserOptions'))
			include_once($_SERVER['DOCUMENT_ROOT']."/bitrix/modules/main/classes/".$GLOBALS['DBType']."/favorites.php");

		$arLastSelected = CUserOptions::GetOption("tasks", "user_search", array());
		if (is_array($arLastSelected) && $arLastSelected['last_selected'] <> '')
			$arLastSelected = array_unique(explode(',', $arLastSelected['last_selected']));
		else
			$arLastSelected = false;

		if (is_array($arLastSelected))
		{
			$currentUser = array_search($userId, $arLastSelected);
			if ($currentUser !== false)
			{
				unset($arLastSelected[$currentUser]);
			}
			array_unshift($arLastSelected, $userId);
		}
		else
		{
			$arLastSelected[] = $userId;
		}

		$arFilter = array('ACTIVE' => 'Y');
		if ($bSubordinateOnly)
		{
			$arFilter["UF_DEPARTMENT"] = $arSubDeps;
		}
		else
		{
			$arFilter['!UF_DEPARTMENT'] = false;
		}
		$arFilter['ID'] = is_array($arLastSelected) ? implode('|', array_slice($arLastSelected, 0, 10)) : '-1';
		$dbRes = CUser::GetList($by = 'last_name', $order = 'asc', $arFilter, array('SELECT' => array('UF_DEPARTMENT')));
		$arLastUsers = array();
		while ($arRes = $dbRes->GetNext())
		{
			$arPhoto = array('IMG' => '');

			if (!$arRes['PERSONAL_PHOTO'])
			{
				switch ($arRes['PERSONAL_GENDER'])
				{
					case "M":
						$suffix = "male";
						break;
					case "F":
						$suffix = "female";
						break;
					default:
						$suffix = "unknown";
				}
				$arRes['PERSONAL_PHOTO'] = COption::GetOptionInt("socialnetwork", "default_user_picture_".$suffix, false, isset($arParams['SITE_ID']) ? $arParams['SITE_ID'] : SITE_ID);
			}

			if ($arRes['PERSONAL_PHOTO'] > 0)
				$arPhoto = CIntranetUtils::InitImage($arRes['PERSONAL_PHOTO'], 30, 0, BX_RESIZE_IMAGE_EXACT);

			$arLastUsers[$arRes['ID']] = array(
				'ID' => $arRes['ID'],
				'NAME' => CUser::FormatName(empty($nameTemplate) ? CSite::GetNameFormat() : $nameTemplate, $arRes, true, false),
				'LOGIN' => $arRes['LOGIN'],
				'EMAIL' => $arRes['EMAIL'],
				'WORK_POSITION' => htmlspecialcharsBack($arRes['WORK_POSITION'] ? $arRes['WORK_POSITION'] : $arRes['PERSONAL_PROFESSION']),
				'PHOTO' => isset($arPhoto['CACHE']['src']) ? $arPhoto['CACHE']['src'] : "",
				'HEAD' => false,
				'SUBORDINATE' => is_array($arSubDeps) && is_array($arRes['UF_DEPARTMENT']) && array_intersect($arRes['UF_DEPARTMENT'], $arSubDeps) ? 'Y' : 'N',
				'SUPERORDINATE' => in_array($arRes["ID"], $arManagers) ? 'Y' : 'N'
			);
		}
	}

	return $arLastUsers;
}


define("TASKS_FILTER_SESSION_INDEX", "FILTER");


function tasksGetFilter($fieldName)
{
	if (isset($_GET[$fieldName]))
	{
		$_SESSION[TASKS_FILTER_SESSION_INDEX][$fieldName] = $_GET[$fieldName];
	}

	return $_SESSION[TASKS_FILTER_SESSION_INDEX][$fieldName];
}


function tasksPredefinedFilters($userID, $roleFilterSuffix = "")
{
	return array(
		"ROLE" => array(
			array("TITLE" => GetMessage("TASKS_FILTER_MY".$roleFilterSuffix), "FILTER" => array("DOER" => $userID), "CLASS" => "inbox", "COUNT" => "-", "STATUS_FILTER" => 0),
			array("TITLE" => GetMessage("TASKS_FILTER_RESPONSIBLE".$roleFilterSuffix), "FILTER" => array("RESPONSIBLE_ID" => $userID), "CLASS" => "my-responsibility", "COUNT" => "-", "STATUS_FILTER" => 0),
			array("TITLE" => GetMessage("TASKS_FILTER_ACCOMPLICE".$roleFilterSuffix), "FILTER" => array("ACCOMPLICE" => $userID), "CLASS" => "my-complicity", "COUNT" => "-", "STATUS_FILTER" => 0),
			array("TITLE" => GetMessage("TASKS_FILTER_IN_REPORT".$roleFilterSuffix), "FILTER" => array("RESPONSIBLE_ID" => $userID, "ADD_IN_REPORT" => "Y"), "CLASS" => "my-report", "COUNT" => "-", "STATUS_FILTER" => 0),
			array("TITLE" => GetMessage("TASKS_FILTER_CREATOR".$roleFilterSuffix), "FILTER" => array("CREATED_BY" => $userID), "CLASS" => "outbox", "COUNT" => "-", "STATUS_FILTER" => 1),
			array("TITLE" => GetMessage("TASKS_FILTER_FOR_REPORT".$roleFilterSuffix), "FILTER" => array("CREATED_BY" => $userID, "ADD_IN_REPORT" => "Y"), "CLASS" => "my-report", "COUNT" => "-", "STATUS_FILTER" => 1),
			array("TITLE" => GetMessage("TASKS_FILTER_AUDITOR".$roleFilterSuffix), "FILTER" => array("AUDITOR" => $userID), "CLASS" => "under-control", "COUNT" => "-", "STATUS_FILTER" => 0),
			array("TITLE" => GetMessage("TASKS_FILTER_ALL"), "FILTER" => array("MEMBER" => $userID), "CLASS" => "anybox", "COUNT" => "-", "STATUS_FILTER" => 0)
		),
		"STATUS" => array(
			array(
				array("TITLE" => GetMessage("TASKS_FILTER_ACTIVE"), "FILTER" => array("STATUS" => array(-2, -1, 1, 2, 3)), "CLASS" => "open", "COUNT" => "-"),
				array("TITLE" => GetMessage("TASKS_FILTER_NEW"), "FILTER" => array("STATUS" => array(-2, 1)), "CLASS" => "new", "COUNT" => "-"),
				array("TITLE" => GetMessage("TASKS_FILTER_IN_PROGRESS"), "FILTER" => array("STATUS" => 3), "CLASS" => "in-progress", "COUNT" => "-"),
				array("TITLE" => GetMessage("TASKS_FILTER_ACCEPTED"), "FILTER" => array("STATUS" => 2), "CLASS" => "accepted", "COUNT" => "-"),
				array("TITLE" => GetMessage("TASKS_FILTER_OVERDUE"), "FILTER" => array("STATUS" => -1), "CLASS" => "overdue", "COUNT" => "-"),
				array("TITLE" => GetMessage("TASKS_FILTER_DELAYED"), "FILTER" => array("STATUS" => 6), "CLASS" => "delayed", "COUNT" => "-"),
				array("TITLE" => GetMessage("TASKS_FILTER_CLOSED"), "FILTER" => array("STATUS" => array(4, 5)), "CLASS" => "completed", "COUNT" => "-"),
				array("TITLE" => GetMessage("TASKS_FILTER_ALL"), "FILTER" => array(), "CLASS" => "any", "COUNT" => "-")
			),
			array(
				array("TITLE" => GetMessage("TASKS_FILTER_ACTIVE"), "FILTER" => array("STATUS" => array(-1, 1, 2, 3, 4, 7)), "CLASS" => "open", "COUNT" => "-"),
				array("TITLE" => GetMessage("TASKS_FILTER_NOT_ACCEPTED"), "FILTER" => array("STATUS" => 1), "CLASS" => "new", "COUNT" => "-"),
				array("TITLE" => GetMessage("TASKS_FILTER_IN_CONTROL"), "FILTER" => array("STATUS" => array(4, 7)), "CLASS" => "waiting", "COUNT" => "-"),
				array("TITLE" => GetMessage("TASKS_FILTER_IN_PROGRESS"), "FILTER" => array("STATUS" => 3), "CLASS" => "in-progress", "COUNT" => "-"),
				array("TITLE" => GetMessage("TASKS_FILTER_ACCEPTED"), "FILTER" => array("STATUS" => 2), "CLASS" => "accepted", "COUNT" => "-"),
				array("TITLE" => GetMessage("TASKS_FILTER_OVERDUE"), "FILTER" => array("STATUS" => -1), "CLASS" => "overdue", "COUNT" => "-"),
				array("TITLE" => GetMessage("TASKS_FILTER_DELAYED"), "FILTER" => array("STATUS" => 6), "CLASS" => "delayed", "COUNT" => "-"),
				array("TITLE" => GetMessage("TASKS_FILTER_CLOSED"), "FILTER" => array("STATUS" => array(4, 5)), "CLASS" => "completed", "COUNT" => "-"),
				array("TITLE" => GetMessage("TASKS_FILTER_ALL"), "FILTER" => array(), "CLASS" => "any", "COUNT" => "-")
			)
		)
	);
}

/**
 * @param $component
 * @param bool $bShowError
 * @param string $errText
 *
 * @deprecated
 */
function ShowInFrame(&$component, $bShowError = false, $errText = '')
{
	global $APPLICATION;

	$APPLICATION->RestartBuffer();
	?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
	<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?=LANGUAGE_ID?>" lang="<?=LANGUAGE_ID?>">
		<head><?php
			$APPLICATION->ShowHead();
			$APPLICATION->AddHeadString('
				<style>
				body {background: #fff !important; text-align: left !important; color: #000 !important;}
				div.bx-core-dialog-overlay {opacity: 0 !important; -moz-opacity: 0 !important; -khtml-opacity: 0 !important; filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0) !important;}
				div#tasks-content-outer {padding: 15px;}
				.task-comment-content{ font-family:Verdana, sans-serif; padding-top:6px; word-wrap: break-word; width: 620px; overflow: hidden;}
				.task-detail-description { font-size:13px; color:#222; padding: 0 0 5px; word-wrap: break-word; width: 585px; overflow: hidden;}
				</style>
			', false, true);
		?></head>
		<body class="<?$APPLICATION->ShowProperty("BodyClass");?>" onload="if (window.top.BX.TasksIFrameInst) window.top.BX.TasksIFrameInst.onTaskLoaded();">
			<div id="tasks-content-outer">
				<table cellpadding="0" cellspading="0" width="100%">
					<tr>
						<td valign="top"><?php
							if ($bShowError)
							{
								?><div id="task-reminder-link"><?php
									ShowError($errText);
								?></div><?php
							}
							else
								$component->IncludeComponentTemplate();
						?></td>
						<?php if($APPLICATION->GetViewContent("sidebar_tools_1") <> ''): ?>
							<td width="10"></td>
							<td valign="top" width="230"><?php $APPLICATION->ShowViewContent("sidebar_tools_1") ?></td>
						<?php endif?>
					</tr>
				</table>
			</div>
		</body>
	</html><?
	require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/epilog_after.php');
	die();
}


function __checkForum($forumID)
{
	if (!($settingsForumID = COption::GetOptionString("tasks", "task_forum_id")))
	{
		if ( (int) $forumID > 0 )
			COption::SetOptionString("tasks", "task_forum_id", intval($forumID));
	}

	if (IsModuleInstalled('extranet'))
	{
		if (-1 === COption::GetOptionString('tasks', 'task_extranet_forum_id', -1, $siteId = ''))
		{
			try
			{
				$extranetForumID = CTasksTools::GetForumIdForExtranet();
				COption::SetOptionString('tasks', 'task_extranet_forum_id', $extranetForumID, '', $siteId = '');
			}
			catch (TasksException $e)
			{
				COption::SetOptionString('tasks', 'task_extranet_forum_id', (int) $forumID, '', $siteId = '');
			}
		}
	}

	if (CModule::IncludeModule("forum") && $forumID && COption::GetOptionString("tasks", "forum_checked", false))
	{
		$arGroups = array();
		$rs = CGroup::GetList($order = 'id', $by = 'asc', array());
		while($ar = $rs->Fetch())
			$arGroups[$ar['ID']] = 'A';

		CForumNew::Update($forumID, array("GROUP_ID"=>$arGroups, "INDEXATION" => "Y"));
		COption::RemoveOption("tasks", "forum_checked");
	}
}


/**
 * This function is deprecated. See CTaskFiles::removeTemporaryFile()
 * 
 * @deprecated
 */
function deleteUploadedFiles($arFileIDs)
{
	$arFileIDs = (array) $arFileIDs;
	foreach($arFileIDs as $fileID)
	{
		$key = array_search(intval($fileID), $_SESSION["TASKS_UPLOADED_FILES"]);
		if ($key !== false)
		{
			unset($_SESSION["TASKS_UPLOADED_FILES"][$key]);
		}
	}
}


/**
 * This function is deprecated. See CTaskFiles::saveFileTemporary()
 * 
 * @deprecated
 */
function addUploadedFiles($arFileIDs)
{
	$arFileIDs = (array) $arFileIDs;
	if (!is_array($_SESSION["TASKS_UPLOADED_FILES"]))
		$_SESSION["TASKS_UPLOADED_FILES"] = array();
	$_SESSION["TASKS_UPLOADED_FILES"] = array_merge($_SESSION["TASKS_UPLOADED_FILES"], $arFileIDs);
}


/**
 * This function is deprecated.
 * 
 * @deprecated
 */
function cleanupUploadedFiles()
{
	if (isset($_SESSION["TASKS_UPLOADED_FILES"]) && is_array($_SESSION["TASKS_UPLOADED_FILES"]))
	{
		foreach($_SESSION["TASKS_UPLOADED_FILES"] as $fileID)
		{
			CFile::Delete($fileID);
		}
		$_SESSION["TASKS_UPLOADED_FILES"] = array();
	}
}


if ( ! function_exists('tasksFormatFileSize') )
{
	function tasksFormatFileSize($in)
	{
		return(CFile::FormatSize($in));
	}
}