Your IP : 3.14.86.70


Current Path : /home/bitrix/ext_www/crm.klimatlend.ua/bitrix/components/bitrix/lists.live.feed/
Upload File :
Current File : /home/bitrix/ext_www/crm.klimatlend.ua/bitrix/components/bitrix/lists.live.feed/ajax.php

<?php
use Bitrix\Lists\Internals\Error\Error;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\Loader;
use Bitrix\Lists\Internals\Controller;
use Bitrix\Main\Text\HtmlFilter;

define('STOP_STATISTICS', true);
define('BX_SECURITY_SHOW_MESSAGE', true);

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

if (!Loader::IncludeModule('lists') || !\Bitrix\Main\Application::getInstance()->getContext()->getRequest()->getQuery('action'))
{
	return;
}

Loc::loadMessages(__FILE__);

class LiveFeedAjaxController extends Controller
{
	/** @var  array */
	protected $lists = array();
	protected $formOprions = array();
	/** @var  string */
	protected $iblockTypeId = 'bitrix_processes';
	protected $listPerm;
	protected $formId;
	protected $randomString;
	protected $iblockDescription;
	protected $iblockCode;
	/** @var  int */
	protected $socnetGroupId = 0;
	protected $iblockId;

	protected function listOfActions()
	{
		return array(
			'getList' => array(
				'method' => array('POST'),
			),
			'setDelegateResponsible' => array(
				'method' => array('POST'),
			),
			'setResponsible' => array(
				'method' => array('POST'),
			),
			'getBizprocTemplateId' => array(
				'method' => array('POST'),
			),
			'createSettingsDropdown' => array(
				'method' => array('POST'),
			),
			'checkPermissions' => array(
				'method' => array('POST'),
			),
			'isConstantsTuned' => array(
				'method' => array('POST'),
			),
			'checkDelegateResponsible' => array(
				'method' => array('POST'),
			),
			'checkDataElementCreation' => array(
				'method' => array('POST'),
			),
			'getListAdmin' => array(
				'method' => array('POST'),
			),
			'notifyAdmin' => array(
				'method' => array('POST'),
			),
		);
	}

	protected function processActionGetList()
	{
		if(!CLists::isFeatureEnabled())
		{
			ShowError(Loc::getMessage('LISTS_SEAC_ACCESS_DENIED'));
			return;
		}

		$this->checkRequiredPostParams(array('iblockId', 'randomString'));

		if($this->errorCollection->hasErrors())
		{
			$errorObject = array_shift($this->errorCollection->toArray());
			ShowError($errorObject->getMessage());
			return;
		}

		$this->iblockId = intval($this->request->getPost('iblockId'));
		$this->iblockDescription = $this->request->getPost('iblockDescription');
		$this->iblockCode = $this->request->getPost('iblockCode');
		$this->socnetGroupId = intval($this->request->getPost('socnetGroupId'));

		$this->iblockTypeId = COption::GetOptionString("lists", "livefeed_iblock_type_id");
		$this->checkPermissionElement();
		if($this->errorCollection->hasErrors())
		{
			$errorObject = array_shift($this->errorCollection->toArray());
			ShowError($errorObject->getMessage());
			return;
		}

		$this->formId = 'lists_element_add_'.$this->iblockId;
		$this->randomString = htmlspecialcharsbx($this->request->getPost('randomString'));

		$this->getListData();
		$this->createPreparedFields();
		if(Loader::includeModule('bizproc') && CBPRuntime::isFeatureEnabled())
			$this->getBizprocData();

		$this->createHtml();
	}

	protected function processActionSetDelegateResponsible()
	{
		$this->checkRequiredPostParams(array('iblockId'));
		if(!Loader::includeModule('iblock'))
		{
			$this->errorCollection->add(array(new Error(Loc::getMessage('LISTS_SEAC_CONNECTION_MODULE_IBLOCK'))));
		}
		$this->iblockId = intval($this->request->getPost('iblockId'));
		$this->iblockTypeId = COption::GetOptionString("lists", "livefeed_iblock_type_id");
		$this->checkPermission();
		if($this->errorCollection->hasErrors())
		{
			$this->sendJsonErrorResponse();
		}

		$selectUsers = $this->request->getPost('selectUsers');

		$rightObject = new CIBlockRights($this->iblockId);
		$rights = $rightObject->getRights();
		$rightsList = $rightObject->getRightsList(false);
		$idRight = array_search('iblock_full', $rightsList);
		foreach($rights as $keyRight => $right)
		{
			$res = mb_strpos($right['GROUP_CODE'], 'U');
			if($res === 0)
			{
				$arraySearch = array_search($right['GROUP_CODE'], $selectUsers);
				if($right['TASK_ID'] == $idRight)
				{
					if(!empty($selectUsers))
					{
						if($arraySearch || $arraySearch == 0)
							unset($rights[$keyRight]);
					}
					else
						unset($rights[$keyRight]);
				}
				else
				{
					if(!empty($selectUsers))
					{
						if($arraySearch || $arraySearch == 0)
							unset($rights[$keyRight]);
					}
				}
			}
		}
		if(!empty($selectUsers))
		{
			foreach($selectUsers as $keySelect => $idUser)
			{
				$rights['n'.$keySelect] = array('GROUP_CODE' => $idUser, 'TASK_ID' => $idRight);
			}
		}
		$rightObject->setRights($rights);

		$this->sendJsonSuccessResponse(array(
			'message' => Loc::getMessage('LISTS_SEAC_MESSAGE_DELEGATE_RESPONSIBLE')
		));
	}

	/**
	 * Displays a form to fill constants
	 * return html
	 */
	protected function processActionSetResponsible()
	{
		$this->checkRequiredPostParams(array('iblockId', 'randomString'));
		if(!Loader::includeModule('bizproc') || !CBPRuntime::isFeatureEnabled())
		{
			$this->errorCollection->add(array(new Error(Loc::getMessage('LISTS_SEAC_CONNECTION_MODULE_BIZPROC'))));
		}
		if($this->errorCollection->hasErrors())
		{
			$errorObject = array_shift($this->errorCollection->toArray());
			ShowError($errorObject->getMessage());
			return;
		}
		$this->iblockId = intval($this->request->getPost('iblockId'));
		if(!CIBlockRights::UserHasRightTo($this->iblockId, $this->iblockId, 'iblock_edit'))
		{
			ShowError(Loc::getMessage('LISTS_SEAC_ACCESS_DENIED'));
			return;
		}

		$html = '';
		$templateId = intval($this->request->getPost('templateId'));
		if(!empty($templateId))
		{
			$documentType = BizprocDocument::generateDocumentComplexType(
				COption::GetOptionString("lists", "livefeed_iblock_type_id"),
				$this->iblockId
			);
			$templateLoader = CBPWorkflowTemplateLoader::GetLoader();
			$templateQuery = $templateLoader->getTemplatesList(
				array('ID' => 'DESC'),
				array('DOCUMENT_TYPE' => $documentType, 'ID' => $templateId),
				false,
				false,
				array('ID', 'NAME')
			);
			if($template = $templateQuery->fetch())
			{
				$html .= $this->createHtmlSetConstants($template['ID'], $template['NAME']);
			}
		}
		else
		{
			$this->randomString = htmlspecialcharsbx($this->request->getPost('randomString'));
			$templateData = $this->getTemplatesIdList($this->iblockId);
			if(empty($templateData))
			{
				$html = '';
			}
			elseif(count($templateData) > 1)
			{
				$html .= '<p>'.Loc::getMessage("LISTS_SET_RESPONSIBLE_POPUP_DESCRIPTION").'</p>';
				foreach($templateData as $templateId => $templateName)
				{
					$url = 'javascript:BX.Lists[\'LiveFeedClass_'.$this->randomString.'\'].setResponsible(\''.$templateId.'\');';
					$html .= '<a href="'.$url.'"><div class="bx-lists-designer-item">'.htmlspecialcharsbx($templateName).'</div></a>';
				}
			}
			else
			{
				foreach($templateData as $templateId => $templateName)
				{
					$html .= $this->createHtmlSetConstants($templateId, $templateName);
				}
			}
		}

		if(empty($html))
		{
			$this->errorCollection->add(array(new Error(Loc::getMessage('LISTS_NOT_BIZPROC_TEMPLATE_NEW'))));
		}
		if($this->errorCollection->hasErrors())
		{
			$errorObject = array_shift($this->errorCollection->toArray());
			ShowError($errorObject->getMessage());
			return;
		}
		echo $html;

		$this->end();
	}

	protected function createHtmlSetConstants($templateId, $templateName)
	{
		$html = '';

		$html .= '<span class="bx-lists-template-name">'.htmlspecialcharsbx($templateName).'</span>';
		ob_start();
		$this->getApplication()->includeComponent(
			'bitrix:bizproc.workflow.setconstants',
			'',
			Array('ID' => $templateId, 'POPUP' => 'Y')
		);
		$html .= ob_get_contents();
		ob_end_clean();
		$html .= '<hr class="bx-lists-constants-form-hr">';

		return $html;
	}

	protected function processActionIsConstantsTuned()
	{
		$this->checkRequiredPostParams(array('iblockId'));
		if(!Loader::includeModule('bizproc') || !CBPRuntime::isFeatureEnabled())
		{
			$this->errorCollection->add(array(new Error(Loc::getMessage('LISTS_SEAC_CONNECTION_MODULE_BIZPROC'))));
		}
		if($this->errorCollection->hasErrors())
		{
			$this->sendJsonErrorResponse();
		}

		$this->iblockId = intval($this->request->getPost('iblockId'));
		$this->checkPermissionElement();
		if($this->errorCollection->hasErrors())
		{
			$this->sendJsonErrorResponse();
		}

		$templateData = $this->getTemplatesIdList($this->iblockId);

		if(empty($templateData))
		{
			$this->errorCollection->add(array(new Error(Loc::getMessage('LISTS_NOT_BIZPROC_TEMPLATE_NEW'))));
		}
		if($this->errorCollection->hasErrors())
		{
			$this->sendJsonErrorResponse();
		}

		$admin = true;
		if($this->listPerm < CListPermissions::IS_ADMIN && !CIBlockRights::UserHasRightTo($this->iblockId, $this->iblockId, 'iblock_edit'))
			$admin = false;

		$isConstantsTuned = true;
		foreach($templateData as $templateId => $templateName)
		{
			if(!CBPWorkflowTemplateLoader::isConstantsTuned($templateId))
				$isConstantsTuned = false;
		}
		if($isConstantsTuned)
		{
			$this->sendJsonSuccessResponse(array(
				'templateData' => $templateData,
			));
		}
		else
		{
			$this->sendJsonSuccessResponse(array(
				'admin' => $admin,
				'templateData' => $templateData,
			));
		}
	}

	/**
	 * @param $iblockId
	 * @return array
	 */
	protected function getTemplatesIdList($iblockId)
	{
		if(!Loader::includeModule('bizproc') || !CBPRuntime::isFeatureEnabled())
		{
			return array();
		}

		$documentType = BizprocDocument::generateDocumentComplexType(
			COption::GetOptionString("lists", "livefeed_iblock_type_id"),
			$iblockId
		);
		$templateLoader = CBPWorkflowTemplateLoader::GetLoader();
		$templateQuery = $templateLoader->getTemplatesList(
			array('ID' => 'DESC'),
			array('DOCUMENT_TYPE' => $documentType, 'AUTO_EXECUTE' => CBPDocumentEventType::Create),
			false,
			false,
			array('ID', 'NAME')
		);
		$templateData = array();
		while($template = $templateQuery->fetch())
		{
			$templateData[$template['ID']] = $template['NAME'];
		}
		return $templateData;
	}

	protected function processActionGetListAdmin()
	{
		$this->checkRequiredPostParams(array('iblockId'));
		if($this->errorCollection->hasErrors())
		{
			$this->sendJsonErrorResponse();
		}

		$this->iblockId = intval($this->request->getPost('iblockId'));
		$this->iblockTypeId = COption::GetOptionString("lists", "livefeed_iblock_type_id");

		$this->checkPermissionElement();
		if($this->errorCollection->hasErrors())
		{
			$this->sendJsonErrorResponse();
		}

		$rightObject = new CIBlockRights($this->iblockId);
		$rights = $rightObject->getRights();
		$rightsList = $rightObject->getRightsList(false);
		$idRight = array_search('iblock_full', $rightsList);
		$listUser = array();
		$nameTemplate = CSite::GetNameFormat(false);
		foreach($rights as $right)
		{
			$res = mb_strpos($right['GROUP_CODE'], 'U');
			if($right['TASK_ID'] == $idRight && $res === 0)
			{
				$userId = mb_substr($right['GROUP_CODE'], 1);
				$users = CUser::GetList($by="id", $order="asc",
					array('ID' => $userId),
					array('FIELDS' => array('ID', 'PERSONAL_PHOTO', 'NAME', 'LAST_NAME'))
				);
				$user = $users->fetch();
				$file['src'] = '';
				if ($user)
				{
					$file = \CFile::ResizeImageGet(
						$user['PERSONAL_PHOTO'],
						array('width' => 58, 'height' => 58),
						\BX_RESIZE_IMAGE_EXACT,
						false
					);
				}
				$listUser[$userId]['id'] = $userId;
				$listUser[$userId]['img'] = $file['src'];
				$listUser[$userId]['name'] = CUser::FormatName($nameTemplate, $user, false);
			}
		}
		$users = CUser::getList(($b = 'ID'), ($o = 'ASC'),
			array('GROUPS_ID' => 1, 'ACTIVE' => 'Y'),
			array('FIELDS' => array('ID', 'PERSONAL_PHOTO', 'NAME', 'LAST_NAME'))
		);
		while ($user = $users->fetch())
		{
			$file = \CFile::ResizeImageGet(
				$user['PERSONAL_PHOTO'],
				array('width' => 58, 'height' => 58),
				\BX_RESIZE_IMAGE_EXACT,
				false
			);
			$listUser[$user['ID']]['id'] = $user['ID'];
			$listUser[$user['ID']]['img'] = $file['src'];
			$listUser[$user['ID']]['name'] = CUser::FormatName($nameTemplate, $user, false);
		}

		$listUser= array_values($listUser);
		$this->sendJsonSuccessResponse(array(
			'listAdmin' => $listUser
		));
	}

	protected function processActionNotifyAdmin()
	{
		$this->checkRequiredPostParams(array('userId'));
		if(!Loader::includeModule('im'))
		{
			$this->errorCollection->add(array(new Error(Loc::getMessage('LISTS_SEAC_CONNECTION_MODULE_IM'))));
		}
		if($this->errorCollection->hasErrors())
		{
			$this->sendJsonErrorResponse();
		}

		$this->iblockId = intval($this->request->getPost('iblockId'));
		$this->iblockTypeId = COption::GetOptionString("lists", "livefeed_iblock_type_id");
		$siteId = SITE_ID;
		if($this->request->getPost('siteId'))
			$siteId = $this->request->getPost('siteId');
		$siteDir = SITE_DIR;
		if($this->request->getPost('siteId'))
			$siteDir = $this->request->getPost('siteDir');

		$this->checkPermissionElement();
		if($this->errorCollection->hasErrors())
		{
			$this->sendJsonErrorResponse();
		}

		$userIdFrom = intval($this->getUser()->getID());
		$userIdTo = intval($this->request->getPost('userId'));
		$iblockName = $this->request->getPost('iblockName');

		$urlForAdmin = COption::GetOptionString('socialnetwork', 'user_page', '/company/personal/', $siteId);
		$urlForAdmin = $urlForAdmin.'log/?bp_setting='.$this->iblockId;

		$messageFields = array(
			'TO_USER_ID' => $userIdTo,
			'FROM_USER_ID' => $userIdFrom,
			'NOTIFY_TYPE' => IM_NOTIFY_FROM,
			'NOTIFY_MODULE' => 'lists',
			'NOTIFY_TAG' => 'LISTS|NOTIFY_ADMIN|'.$userIdTo.'|'.$userIdFrom,
			'NOTIFY_MESSAGE' => Loc::getMessage('LISTS_SEAC_NOTIFY_MESSAGE', array('#NAME_PROCESSES#' => $iblockName, '#URL#' => $urlForAdmin))
		);
		$messageId = CIMNotify::Add($messageFields);

		if($messageId)
		{
			$this->sendJsonSuccessResponse(
				array('message' => Loc::getMessage('LISTS_SEAC_NOTIFY_SUCCESS'))
			);
		}
		else
		{
			$this->errorCollection->add(array(new Error(Loc::getMessage('LISTS_SEAC_NOTIFY_ERROR'))));
			$this->sendJsonErrorResponse();
		}
	}

	protected function processActionGetBizprocTemplateId()
	{
		$this->checkRequiredPostParams(array('iblockId'));
		if(!Loader::includeModule('bizproc') || !CBPRuntime::isFeatureEnabled())
		{
			$this->errorCollection->add(array(new Error(Loc::getMessage('LISTS_SEAC_CONNECTION_MODULE_BIZPROC'))));
		}
		if($this->errorCollection->hasErrors())
		{
			$this->sendJsonErrorResponse();
		}

		$this->iblockId = intval($this->request->getPost('iblockId'));
		$this->checkPermission();
		if($this->errorCollection->hasErrors())
		{
			$this->sendJsonErrorResponse();
		}
		$documentType = BizprocDocument::generateDocumentComplexType(COption::GetOptionString("lists", "livefeed_iblock_type_id"), $this->iblockId);
		$templateLoader = CBPWorkflowTemplateLoader::GetLoader();
		$templateQuery = $templateLoader->getTemplatesList(
			array('ID' => 'DESC'),
			array('DOCUMENT_TYPE' => $documentType, 'AUTO_EXECUTE' => CBPDocumentEventType::Create),
			false,
			false,
			array('ID', 'NAME')
		);
		$isAvailable = false;
		$templateData = array();
		while($template = $templateQuery->fetch())
		{
			$isAvailable = true;
			$templateData[$template['ID']]['ID'] = $template['ID'];
			$templateData[$template['ID']]['NAME'] = $template['NAME'];
		}
		if(!$isAvailable)
		{
			$this->errorCollection->add(array(new Error(Loc::getMessage('LISTS_NOT_BIZPROC_TEMPLATE_NEW'))));
		}
		if($this->errorCollection->hasErrors())
		{
			$this->sendJsonErrorResponse();
		}
		$manyTemplate = false;
		if(count($templateData) > 1)
		{
			$manyTemplate = true;
		}

		$this->sendJsonSuccessResponse(array(
			'templateData' => $templateData,
			'manyTemplate' => $manyTemplate
		));
	}

	protected function processActionCheckPermissions()
	{
		$this->checkRequiredPostParams(array('iblockId'));
		if(!Loader::includeModule('bizproc') || !CBPRuntime::isFeatureEnabled())
		{
			$this->errorCollection->add(array(new Error(Loc::getMessage('LISTS_SEAC_CONNECTION_MODULE_BIZPROC'))));
		}
		if($this->errorCollection->hasErrors())
		{
			$this->sendJsonErrorResponse();
		}

		$this->iblockId = intval($this->request->getPost('iblockId'));
		$this->checkPermission();
		if($this->errorCollection->hasErrors())
		{
			$this->sendJsonErrorResponse();
		}

		$this->sendJsonSuccessResponse(array());
	}

	protected function processActionCreateSettingsDropdown()
	{
		$this->checkRequiredPostParams(array('iblockId', 'randomString'));
		if(!Loader::includeModule('bizproc') || !CBPRuntime::isFeatureEnabled())
		{
			$this->errorCollection->add(array(new Error(Loc::getMessage('LISTS_SEAC_CONNECTION_MODULE_BIZPROC'))));
		}
		if($this->errorCollection->hasErrors())
		{
			$this->sendJsonErrorResponse();
		}
		$this->iblockId = intval($this->request->getPost('iblockId'));
		$this->randomString = htmlspecialcharsbx($this->request->getPost('randomString'));
		$this->iblockTypeId = COption::GetOptionString("lists", "livefeed_iblock_type_id");
		$this->checkPermissionElement();
		if($this->errorCollection->hasErrors())
		{
			$this->sendJsonErrorResponse();
		}

		$settingsDropdown = array();
		$settingsDropdown[] = array(
			'text' => Loc::getMessage('LISTS_SEAC_SELECT_RESPONSIBILITY_NEW'),
			'title' => Loc::getMessage('LISTS_SEAC_SELECT_RESPONSIBILITY_NEW'),
			'href' => "javascript:BX.Lists['LiveFeedClass_{$this->randomString}'].setResponsible();",
		);
		$settingsDropdown[] = array(
			'text' => Loc::getMessage('LISTS_SEAC_DELEGATE_RESPONSIBLE_NEW'),
			'title' => Loc::getMessage('LISTS_SEAC_DELEGATE_RESPONSIBLE_NEW'),
			'href' => "javascript:BX.Lists['LiveFeedClass_{$this->randomString}'].setDelegateResponsible();",
		);
		$settingsDropdown[] = array(
			'text' => Loc::getMessage('LISTS_SEAC_DESIGNER_BP_NEW'),
			'title' => Loc::getMessage('LISTS_SEAC_DESIGNER_BP_NEW'),
			'href' => "javascript:BX.Lists['LiveFeedClass_{$this->randomString}'].jumpProcessDesigner();",
		);
		$settingsDropdown[] = array(
			'text' => Loc::getMessage('LISTS_SEAC_SETTING_LIST_NEW'),
			'title' => Loc::getMessage('LISTS_SEAC_SETTING_LIST_NEW'),
			'href' => "javascript:BX.Lists['LiveFeedClass_{$this->randomString}'].jumpSettingProcess();",
		);

		$this->sendJsonSuccessResponse(array(
			'settingsDropdown' => $settingsDropdown,
		));
	}

	protected function processActionCheckDelegateResponsible()
	{
		$this->checkRequiredPostParams(array('iblockId'));
		if(!Loader::includeModule('iblock'))
		{
			$this->errorCollection->add(array(new Error(Loc::getMessage('LISTS_SEAC_CONNECTION_MODULE_IBLOCK'))));
		}
		$this->iblockId = intval($this->request->getPost('iblockId'));
		$this->iblockTypeId = COption::GetOptionString('lists', 'livefeed_iblock_type_id');
		$this->checkPermission();
		if($this->errorCollection->hasErrors())
		{
			$this->sendJsonErrorResponse();
		}

		$rightObject = new CIBlockRights($this->iblockId);
		$rights = $rightObject->getRights();
		$rightsList = $rightObject->getRightsList(false);
		$idRight = array_search('iblock_full', $rightsList);
		$listUser = array();
		$nameTemplate = CSite::GetNameFormat(false);
		$count = 0;
		foreach($rights as $right)
		{
			$res = mb_strpos($right['GROUP_CODE'], 'U');
			if($right['TASK_ID'] == $idRight && $res === 0)
			{
				$userId = mb_substr($right['GROUP_CODE'], 1);
				$userGroups = CUser::getUserGroup($userId);
				if(!in_array(1, $userGroups))
				{
					$userQuery = CUser::getList(
						$by = 'ID', $order = 'ASC',
						array('ID' => $userId),
						array('FIELDS' => array('ID' ,'LOGIN', 'NAME', 'LAST_NAME', 'SECOND_NAME', 'TITLE', 'EMAIL')
						)
					);
					if ($user = $userQuery->fetch())
					{
						$listUser[$count]['id'] = $right['GROUP_CODE'];
						$listUser[$count]['name'] = CUser::formatName($nameTemplate, $user, false);
					}
				}
			}
			$count++;
		}

		$this->sendJsonSuccessResponse(array(
			'listUser' => $listUser
		));
	}

	protected function unEscape($data)
	{
		global $APPLICATION;

		if(is_array($data))
		{
			$res = array();
			foreach($data as $k => $v)
			{
				$k = $APPLICATION->ConvertCharset(\CHTTP::urnDecode($k), "UTF-8", LANG_CHARSET);
				$res[$k] = $this->unEscape($v);
			}
		}
		else
		{
			$res = $APPLICATION->ConvertCharset(\CHTTP::urnDecode($data), "UTF-8", LANG_CHARSET);
		}

		return $res;
	}

	protected function processActionCheckDataElementCreation()
	{
		if($_POST["save"] != "Y" && $_POST["changePostFormTab"] != "lists" && !check_bitrix_sessid())
			$this->errorCollection->add(array(new Error(Loc::getMessage('LISTS_SEAC_CONNECTION_MODULE_IBLOCK'))));

		if(!Loader::IncludeModule('bizproc') || !CBPRuntime::isFeatureEnabled())
			$this->errorCollection->add(array(new Error(Loc::getMessage('LISTS_SEAC_CONNECTION_MODULE_BIZPROC'))));

		if(!Loader::includeModule('iblock'))
			$this->errorCollection->add(array(new Error(Loc::getMessage('LISTS_SEAC_CONNECTION_MODULE_IBLOCK'))));

		$this->iblockId = intval($this->request->getPost('IBLOCK_ID'));
		$this->iblockTypeId = COption::GetOptionString("lists", "livefeed_iblock_type_id");
		$this->checkPermissionElement();
		if($this->errorCollection->hasErrors())
		{
			$this->sendJsonErrorResponse();
		}

		$documentType = BizprocDocument::generateDocumentComplexType(COption::GetOptionString("lists", "livefeed_iblock_type_id"), $this->iblockId);

		$templateIdString = $_POST['TEMPLATE_ID'];
		$templateData = explode(',', $templateIdString);

		if(!empty($templateData))
		{
			if(CModule::IncludeModule('bizproc') && CBPRuntime::isFeatureEnabled())
			{
				$isConstantsTuned = true;
				foreach($templateData as $templateId)
				{
					if(!empty($templateId))
					{
						if(!CBPWorkflowTemplateLoader::isConstantsTuned($templateId))
							$isConstantsTuned = false;
					}
				}

				if(!$isConstantsTuned)
				{
					$this->errorCollection->add(array(new Error(Loc::getMessage('LISTS_IS_CONSTANTS_TUNED_NEW'))));
					$this->sendJsonErrorResponse();
				}
			}
		}
		else
		{
			if(CModule::IncludeModule("bizproc") && CBPRuntime::isFeatureEnabled())
			{
				$templateData = $this->getTemplatesIdList($this->iblockId);

				if(!empty($templateData))
				{
					$isConstantsTuned = true;
					foreach($templateData as $templateId => $templateName)
					{
						if(!CBPWorkflowTemplateLoader::isConstantsTuned($templateId))
							$isConstantsTuned = false;
					}
					if(!$isConstantsTuned)
					{
						$this->errorCollection->add(array(new Error(Loc::getMessage('LISTS_IS_CONSTANTS_TUNED_NEW'))));
						$this->sendJsonErrorResponse();
					}
				}
				else
				{
					$this->errorCollection->add(array(new Error(Loc::getMessage('LISTS_NOT_BIZPROC_TEMPLATE_NEW'))));
					$this->sendJsonErrorResponse();
				}
			}
		}

		$list = new CList($this->iblockId);
		$fields = $list->getFields();
		$elementData = array(
			"IBLOCK_ID" => $this->iblockId,
			"NAME" => $_POST["NAME"],
		);
		$props = array();
		foreach($fields as $fieldId => $field)
		{
			if($fieldId == "PREVIEW_PICTURE" || $fieldId == "DETAIL_PICTURE")
			{
				$elementData[$fieldId] = $_FILES[$fieldId];
				if(isset($_POST[$fieldId."_del"]) && $_POST[$fieldId."_del"]=="Y")
					$elementData[$fieldId]["del"] = "Y";
			}
			elseif($fieldId == "PREVIEW_TEXT" || $fieldId == "DETAIL_TEXT")
			{
				if(
					isset($field["SETTINGS"])
					&& is_array($field["SETTINGS"])
					&& $field["SETTINGS"]["USE_EDITOR"] == "Y"
				)
					$elementData[$fieldId."_TYPE"] = "html";
				else
					$elementData[$fieldId."_TYPE"] = "text";

				$elementData[$fieldId] = $_POST[$fieldId];
			}
			elseif($fieldId == 'ACTIVE_FROM' || $fieldId == 'ACTIVE_TO')
			{
				$elementData[$fieldId] = array_shift($_POST[$fieldId]);
			}
			elseif($list->is_field($fieldId))
			{
				$elementData[$fieldId] = $_POST[$fieldId];
			}
			elseif($field["PROPERTY_TYPE"] == "F")
			{
				if(isset($_POST[$fieldId."_del"]))
					$deleteArray = $_POST[$fieldId."_del"];
				else
					$deleteArray = array();
				$props[$field["ID"]] = array();
				$files = $this->unEscape($_FILES);
				if(isset($files[$fieldId]) && is_array($files[$fieldId]))
				{
					CFile::ConvertFilesToPost($files[$fieldId], $props[$field["ID"]]);
					foreach($props[$field["ID"]] as $fileId => $file)
					{
						if(
							isset($deleteArray[$fileId])
							&& (
								(!is_array($deleteArray[$fileId]) && $deleteArray[$fileId]=="Y")
								|| (is_array($deleteArray[$fileId]) && $deleteArray[$fileId]["VALUE"]=="Y")
							)
						)
						{
							if(isset($props[$field["ID"]][$fileId]["VALUE"]))
								$props[$field["ID"]][$fileId]["VALUE"]["del"] = "Y";
							else
								$props[$field["ID"]][$fileId]["del"] = "Y";
						}
					}
				}
			}
			elseif($field["PROPERTY_TYPE"] == "N")
			{
				if(is_array($_POST[$fieldId]) && !array_key_exists("VALUE", $_POST[$fieldId]))
				{
					$props[$field["ID"]] = array();
					foreach($_POST[$fieldId] as $key=>$value)
					{
						if(is_array($value))
						{
							if($value["VALUE"] <> '')
							{
								$value = str_replace(" ", "", str_replace(",", ".", $value["VALUE"]));
								if(!is_numeric($value))
								{
									$this->errorCollection->add(array(new Error(Loc::getMessage('LISTS_IS_VALIDATE_FIELD_ERROR', array('#NAME#' => $field['NAME'])))));
									$this->sendJsonErrorResponse();
								}
								$props[$field["ID"]][$key] = doubleval($value);
							}

						}
						else
						{
							if($value <> '')
							{
								$value = str_replace(" ", "", str_replace(",", ".", $value));
								if(!is_numeric($value))
								{
									$this->errorCollection->add(array(new Error(Loc::getMessage('LISTS_IS_VALIDATE_FIELD_ERROR', array('#NAME#' => $field['NAME'])))));
									$this->sendJsonErrorResponse();
								}
								$props[$field["ID"]][$key] = doubleval($value);
							}
						}
					}
				}
				else
				{
					if(is_array($_POST[$fieldId]))
					{
						if($_POST[$fieldId]["VALUE"] <> '')
						{
							$value = str_replace(" ", "", str_replace(",", ".", $_POST[$fieldId]["VALUE"]));
							if(!is_numeric($value))
							{
								$this->errorCollection->add(array(new Error(Loc::getMessage('LISTS_IS_VALIDATE_FIELD_ERROR', array('#NAME#' => $field['NAME'])))));
								$this->sendJsonErrorResponse();
							}
							$props[$field["ID"]] = doubleval($value);
						}
					}
					else
					{
						if($_POST[$fieldId] <> '')
						{
							$value = str_replace(" ", "", str_replace(",", ".", $_POST[$fieldId]));
							if(!is_numeric($value))
							{
								$this->errorCollection->add(array(new Error(Loc::getMessage('LISTS_IS_VALIDATE_FIELD_ERROR', array('#NAME#' => $field['NAME'])))));
								$this->sendJsonErrorResponse();
							}
							$props[$field["ID"]] = doubleval($value);
						}
					}
				}
			}
			else
			{
				$props[$field["ID"]] = $_POST[$fieldId];
			}
		}
		$elementData["MODIFIED_BY"] = $this->getUser()->getID();
		unset($elementData["TIMESTAMP_X"]);
		if(!empty($props))
		{
			$elementData["PROPERTY_VALUES"] = $props;
		}

		$documentStates = CBPDocument::GetDocumentStates($documentType, null);
		$userId = $this->getUser()->getId();
		$write = CBPDocument::CanUserOperateDocumentType(
			CBPCanUserOperateOperation::WriteDocument,
			$userId,
			$documentType,
			array('AllUserGroups' => array(), 'DocumentStates' => $documentStates)
		);

		if(!$write)
		{
			$this->errorCollection->add(array(new Error(Loc::getMessage('LISTS_IS_ACCESS_DENIED_STATUS'))));
			$this->sendJsonErrorResponse();
		}

		$bizprocParametersValues = array();
		$stringError = '';
		foreach ($documentStates as $documentState)
		{
			if($documentState["ID"] == '')
			{
				$errors = array();
				$bizprocParametersValues[$documentState['TEMPLATE_ID']] = CBPDocument::StartWorkflowParametersValidate(
					$documentState['TEMPLATE_ID'],
					$documentState['TEMPLATE_PARAMETERS'],
					$documentType,
					$errors
				);
				foreach($errors as $e)
					$stringError .= $e['message'].'<br />';
			}
		}
		if(!empty($stringError))
		{
			$this->errorCollection->add(array(new Error($stringError)));
			$this->sendJsonErrorResponse();
		}

		$objectElement = new CIBlockElement;
		$idElement = $objectElement->Add($elementData, false, true, true);

		if($idElement)
		{
			$bizProcWorkflowId = array();
			foreach($documentStates as $documentState)
			{
				if($documentState["ID"] == '')
				{
					$errorsTmp = array();

					$bizProcWorkflowId[$documentState['TEMPLATE_ID']] = CBPDocument::StartWorkflow(
						$documentState['TEMPLATE_ID'],
						array('lists', 'BizprocDocument', $idElement),
						array_merge($bizprocParametersValues[$documentState['TEMPLATE_ID']], array('TargetUser' => 'user_'.intval($this->getUser()->getID()))),
						$errorsTmp
					);
				}
			}

			/*if(!empty($errorsTmp))
			{
				$documentStates = null;
				CBPDocument::AddDocumentToHistory(
					array('lists','BizprocDocument',$idElement),
					$elementData['NAME'],
					$this->getUser()->getID()
				);
			}*/
		}
		else
		{
			$this->errorCollection->add(array(new Error($objectElement->LAST_ERROR)));
			$this->sendJsonErrorResponse();
		}

		$this->sendJsonSuccessResponse(array());
	}

	protected function checkPermission()
	{
		$this->listPerm = CListPermissions::checkAccess(
			$this->getUser(),
			$this->iblockTypeId,
			$this->iblockId,
			$this->socnetGroupId
		);
		if($this->listPerm < 0)
		{
			switch($this->listPerm)
			{
				case CListPermissions::WRONG_IBLOCK_TYPE:
					$this->errorCollection->add(array(new Error(Loc::getMessage('LISTS_SEAC_WRONG_IBLOCK_TYPE'))));
					break;
				case CListPermissions::WRONG_IBLOCK:
					$this->errorCollection->add(array(new Error(Loc::getMessage('LISTS_SEAC_WRONG_IBLOCK'))));
					break;
				case CListPermissions::LISTS_FOR_SONET_GROUP_DISABLED:
					$this->errorCollection->add(array(new Error(Loc::getMessage('LISTS_SEAC_LISTS_FOR_SONET_GROUP_DISABLED'))));
					break;
				default:
					$this->errorCollection->add(array(new Error(Loc::getMessage('LISTS_SEAC_UNKNOWN_ERROR'))));
					break;
			}
		}
		elseif($this->listPerm < CListPermissions::IS_ADMIN && !CIBlockRights::UserHasRightTo($this->iblockId, $this->iblockId, 'iblock_edit'))
		{
			$this->errorCollection->add(array(new Error(Loc::getMessage('LISTS_SEAC_ACCESS_DENIED'))));
		}
	}

	protected function checkPermissionElement()
	{
		$this->listPerm = CListPermissions::checkAccess(
			$this->getUser(),
			$this->iblockTypeId,
			$this->iblockId,
			$this->socnetGroupId
		);
		if($this->listPerm < 0)
		{
			switch($this->listPerm)
			{
				case CListPermissions::WRONG_IBLOCK_TYPE:
					$this->errorCollection->add(array(new Error(Loc::getMessage('LISTS_SEAC_WRONG_IBLOCK_TYPE'))));
					break;
				case CListPermissions::WRONG_IBLOCK:
					$this->errorCollection->add(array(new Error(Loc::getMessage('LISTS_SEAC_WRONG_IBLOCK'))));
					break;
				case CListPermissions::LISTS_FOR_SONET_GROUP_DISABLED:
					$this->errorCollection->add(array(new Error(Loc::getMessage('LISTS_SEAC_LISTS_FOR_SONET_GROUP_DISABLED'))));
					break;
				default:
					$this->errorCollection->add(array(new Error(Loc::getMessage('LISTS_SEAC_UNKNOWN_ERROR'))));
					break;
			}
		}
		elseif(($this->listPerm < CListPermissions::CAN_READ &&
			!CIBlockSectionRights::UserHasRightTo($this->iblockId, 0, 'section_element_bind')))
		{
			$this->errorCollection->add(array(new Error(Loc::getMessage('LISTS_SEAC_ACCESS_DENIED'))));
		}
	}

	protected function getListData()
	{
		$list = new CList($this->iblockId);
		$this->lists['FIELDS'] = $list->getFields();

		$this->lists['SELECT'] = array('ID', 'IBLOCK_ID', 'NAME', 'IBLOCK_SECTION_ID', 'CREATED_BY', 'BP_PUBLISHED');
		$this->lists['DATA'] = array();
		$this->lists['DATA']['NAME'] = Loc::getMessage('LISTS_SEAC_FIELD_NAME_DEFAULT');
		$this->lists['DATA']['IBLOCK_SECTION_ID'] =  '';

		foreach($this->lists['FIELDS'] as $fieldId => $field)
		{
			$this->lists['FIELDS'][$fieldId]['NAME'] = $this->lists['FIELDS'][$fieldId]['NAME'];

			if($list->is_field($fieldId))
			{
				if($fieldId == 'ACTIVE_FROM' || $fieldId == 'PREVIEW_PICTURE' || $fieldId == 'DETAIL_PICTURE')
				{
					if($field['DEFAULT_VALUE'] === '=now')
						$this->lists['DATA'][$fieldId] = ConvertTimeStamp(time()+CTimeZone::GetOffset(), 'FULL');
					elseif($field['DEFAULT_VALUE'] === '=today')
						$this->lists['DATA'][$fieldId] = ConvertTimeStamp(time()+CTimeZone::GetOffset(), 'SHORT');
					else
						$this->lists['DATA'][$fieldId] = '';
				}
				else
				{
					$this->lists['DATA'][$fieldId] = $field['DEFAULT_VALUE'];
				}
				$this->lists['SELECT'][] = $fieldId;
			}
			elseif(is_array($field['PROPERTY_USER_TYPE']) && array_key_exists('GetPublicEditHTML', $field['PROPERTY_USER_TYPE']))
			{
				$this->lists['DATA'][$fieldId] = array(
					'n0' => array(
						'VALUE' => $field['DEFAULT_VALUE'],
						'DESCRIPTION' => '',
					)
				);
			}
			elseif($field['PROPERTY_TYPE'] == 'L')
			{
				$this->lists['DATA'][$fieldId] = array();
				$propEnums = CIBlockProperty::getPropertyEnum($field['ID']);
				while($enum = $propEnums->fetch())
					if($enum['DEF'] == 'Y')
						$this->lists['DATA'][$fieldId][] =$enum['ID'];
			}
			elseif($field['PROPERTY_TYPE'] == 'F')
			{
				$this->lists['DATA'][$fieldId] = array(
					'n0' => array('VALUE' => $field['DEFAULT_VALUE'], 'DESCRIPTION' => ''),
				);
			}
			elseif($field['PROPERTY_TYPE'] == 'G' || $field['PROPERTY_TYPE'] == 'E')
			{
				$this->lists['DATA'][$fieldId] = array($field['DEFAULT_VALUE']);
			}
			else
			{
				$this->lists['DATA'][$fieldId] = array(
					'n0' => array('VALUE' => $field['DEFAULT_VALUE'], 'DESCRIPTION' => ''),
				);
				if($field['MULTIPLE'] == 'Y')
				{
					if(is_array($field['DEFAULT_VALUE']) || mb_strlen($field['DEFAULT_VALUE']))
						$this->lists['DATA'][$fieldId]['n1'] = array('VALUE' => '', 'DESCRIPTION' => '');
				}
			}

			if($fieldId == 'CREATED_BY')
				$this->lists['SELECT'][] = 'CREATED_USER_NAME';

			if($fieldId == 'MODIFIED_BY')
				$this->lists['SELECT'][] = 'USER_NAME';
		}
	}

	/**
	 * @return array
	 */
	protected function createFormData()
	{
		foreach($this->lists['DATA'] as $key => $value)
		{
			$this->lists['FORM_DATA'][$key] = $value;
			if(is_array($value))
			{
				foreach($value as $key1 => $value1)
				{
					if(is_array($value1))
					{
						foreach($value1 as $key2 => $value2)
							if(!is_array($value2))
								$value[$key1][$key2] = htmlspecialcharsbx($value2);
					}
					else
					{
						$value[$key1] = htmlspecialcharsbx($value1);
					}
				}
				$this->lists['FORM_DATA'][$key] = $value;
			}
			else
			{
				$this->lists['FORM_DATA'][$key] = htmlspecialcharsbx($value);
			}
		}
	}

	protected function getElementFields()
	{
		$elements = CIBlockElement::getList(
			array(),
			array(
				'IBLOCK_ID' => $this->iblockId,
				"=ID" => $this->lists['ELEMENT_ID'],
			),
			false,
			false,
			$this->lists['SELECT']
		);
		$element = $elements->getNextElement();
		if(is_object($element))
			$this->lists['ELEMENT_FIELDS'] = $element->getFields();
		else
			$this->lists['ELEMENT_FIELDS'] = array();
	}

	protected function createPreparedFields()
	{
		$this->lists['PREPARED_FIELDS'] = array();
		$this->lists['ELEMENT_ID'] = 0;
		$this->createFormData();
		$this->getElementFields();

		$this->getApplication()->showAjaxHead();

		foreach($this->lists['FIELDS'] as $fieldId => $field)
		{
			if($fieldId == 'ACTIVE_FROM' || $fieldId == 'ACTIVE_TO')
			{
				$this->lists['PREPARED_FIELDS'][$fieldId] = array(
					'id' => $fieldId.'['.$this->iblockId.']',
					'name' => $field['NAME'],
					'required' => $field['IS_REQUIRED']=='Y'? true: false,
					'type' => 'date',
					'value' => $this->lists['FORM_DATA'][$fieldId]
				);
			}
			elseif($fieldId == 'PREVIEW_PICTURE' || $fieldId == 'DETAIL_PICTURE')
			{
				$this->lists['PREPARED_FIELDS'][$fieldId] = array(
					'id' => $fieldId,
					'name' => $field['NAME'],
					'required' => $field['IS_REQUIRED']=='Y'? true: false,
					'type' => 'file'
				);
			}
			elseif($fieldId == 'PREVIEW_TEXT' || $fieldId == 'DETAIL_TEXT')
			{
				if($field['SETTINGS']['USE_EDITOR'] == 'Y')
				{
					$params = array(
						'width' => '100%',
						'height' => '200px',
						'iblockId' => $this->iblockId
					);
					$match = array();
					if(preg_match('/\s*(\d+)\s*(px|%|)/', $field['SETTINGS']['WIDTH'], $match) && ($match[1] > 0))
					{
						$params['width'] = $match[1].$match[2];
					}
					if(preg_match('/\s*(\d+)\s*(px|%|)/', $field['SETTINGS']['HEIGHT'], $match) && ($match[1] > 0))
					{
						$params['height'] = $match[1].$match[2];
					}

					$html = $this->connectionHtmlEditor($fieldId, $fieldId, $params, $this->lists['FORM_DATA'][$fieldId]);

					$this->lists['PREPARED_FIELDS'][$fieldId] = array(
						'id'=>$fieldId,
						'name'=>$field['NAME'],
						'required'=>$field['IS_REQUIRED']=='Y'? true: false,
						'type' => 'custom',
						'value' => $html,
					);
				}
				else
				{
					$params = array(
						'style' => '',
					);
					if(preg_match('/\s*(\d+)\s*(px|%|)/', $field['SETTINGS']['WIDTH'], $match) && ($match[1] > 0))
					{
						if($match[2] == '')
							$params['cols'] = $match[1];
						else
							$params['style'] .= 'width:'.$match[1].$match[2].';';
					}
					if(preg_match('/\s*(\d+)\s*(px|%|)/', $field['SETTINGS']['HEIGHT'], $match) && ($match[1] > 0))
					{
						if($match[2] == "")
							$params['rows'] = $match[1];
						else
							$params['style'] .= 'height:'.$match[1].$match[2].';';
					}

					$this->lists['PREPARED_FIELDS'][$fieldId] = array(
						'id'=>$fieldId,
						'name'=>$field['NAME'],
						'required'=>$field['IS_REQUIRED']=='Y'? true: false,
						'type' => 'textarea',
						'params' => $params,
					);
				}
			}
			elseif($fieldId == "DATE_CREATE" || $fieldId == "TIMESTAMP_X")
			{
				if($this->lists['ELEMENT_FIELDS'][$fieldId])
					$this->lists['PREPARED_FIELDS'][$fieldId] = array(
						"id"=>$fieldId,
						"name"=>$field["NAME"],
						"required"=>$field["IS_REQUIRED"]=="Y"? true: false,
						"type" => "custom",
						"value" => $this->lists['ELEMENT_FIELDS'][$fieldId],
					);
			}
			elseif($fieldId == "CREATED_BY")
			{
				if($this->lists['ELEMENT_FIELDS']["CREATED_BY"])
					$this->lists['PREPARED_FIELDS'][$fieldId] = array(
						"id"=>$fieldId,
						"name"=>$field["NAME"],
						"required"=>$field["IS_REQUIRED"]=="Y"? true: false,
						"type" => "custom",
						"value" => "[".$this->lists['ELEMENT_FIELDS']["CREATED_BY"]."] ".$this->lists['ELEMENT_FIELDS']["CREATED_USER_NAME"],
					);
			}
			elseif($fieldId == "MODIFIED_BY")
			{
				if($this->lists['ELEMENT_FIELDS']["MODIFIED_BY"])
					$this->lists['PREPARED_FIELDS'][$fieldId] = array(
						"id"=>$fieldId,
						"name"=>$field["NAME"],
						"required"=>$field["IS_REQUIRED"]=="Y"? true: false,
						"type" => "custom",
						"value" => "[".$this->lists['ELEMENT_FIELDS']["MODIFIED_BY"]."] ".$this->lists['ELEMENT_FIELDS']["USER_NAME"],
					);
			}
			elseif(
				is_array($field["PROPERTY_USER_TYPE"]) && array_key_exists("GetPublicEditHTMLMulty", $field["PROPERTY_USER_TYPE"])
				&& $field["MULTIPLE"] == "Y" && $field["PROPERTY_TYPE"] != "E"
			)
			{
				$html = call_user_func_array($field["PROPERTY_USER_TYPE"]["GetPublicEditHTMLMulty"],
					array(
						$field,
						$this->lists['FORM_DATA'][$fieldId],
						array(
							"VALUE"=>$fieldId,
							"DESCRIPTION"=>'',
							"FORM_NAME"=>$this->formId,
							"MODE"=>"FORM_FILL",
						),
					));

				$this->lists['PREPARED_FIELDS'][$fieldId] = array(
					"id"=>$fieldId,
					"name"=>$field["NAME"],
					"required"=>$field["IS_REQUIRED"]=="Y"? true: false,
					"type"=>"custom",
					"value"=>$html,
				);
			}
			elseif(is_array($field["PROPERTY_USER_TYPE"]) && array_key_exists("GetPublicEditHTML", $field["PROPERTY_USER_TYPE"]))
			{
				$params = array(
					'width' => '100%',
					'height' => '200px',
					'iblockId' => ''
				);
				$listTypeNotMultiple = array('S:DiskFile', 'S:ECrm');
				if($field["MULTIPLE"] == "Y" && !in_array($field["TYPE"], $listTypeNotMultiple))
				{
					$checkHtml = false;
					$html = '<table id="tbl'.$fieldId.'">';
					foreach($this->lists['FORM_DATA'][$fieldId] as $key => $value)
					{
						if($field["TYPE"] == "S:HTML")
						{
							$checkHtml = true;
							$fieldIdForHtml = 'id_'.$fieldId.'__'.$key.'_';
							$fieldNameForHtml = $fieldId."[".$key."][VALUE][TEXT]";
							$html .= '<tr><td><input type="hidden" name="'.$fieldId.'['.HtmlFilter::encode($key).
								'][VALUE][TYPE]" value="html">'
								.$this->connectionHtmlEditor($fieldIdForHtml, $fieldNameForHtml, $params,
									is_array($value['VALUE']) ? $value['VALUE']['TEXT']: '').'</td></tr>';
						}
						elseif($field['TYPE'] == 'S:DateTime')
						{
							$html .= '<tr><td>
								<input class="bx-lists-input-calendar" type="text" name="'.$fieldId.'['.
								HtmlFilter::encode($key).'][VALUE]" onclick="BX.calendar({node: this.parentNode, field: this, bTime: true, bHideTime: false});" value="'.$value['VALUE'].'">
								<span class="bx-lists-calendar-icon" onclick="BX.calendar({node:this, field:\''.$fieldId.'['.HtmlFilter::encode($key).'][VALUE]\', form: \'\', bTime: true, bHideTime: false});"
									  onmouseover="BX.addClass(this, \'calendar-icon-hover\');" onmouseout="BX.removeClass(this, \'calendar-icon-hover\');" border="0"></span>
							</td></tr>';
						}
						elseif($field['TYPE'] == 'S:Date')
						{
							$html .= '<tr><td>
								<input class="bx-lists-input-calendar" type="text" name="'.$fieldId.'['.HtmlFilter::encode($key).'][VALUE]" onclick="BX.calendar({node: this.parentNode, field: this, bTime: false, bHideTime: false});" value="'.$value['VALUE'].'">
								<span class="bx-lists-calendar-icon" onclick="BX.calendar({node:this, field:\''.$fieldId.'['.HtmlFilter::encode($key).'][VALUE]\', form: \'\', bTime: false, bHideTime: false});"
									  onmouseover="BX.addClass(this, \'calendar-icon-hover\');" onmouseout="BX.removeClass(this, \'calendar-icon-hover\');" border="0"></span>
							</td></tr>';
						}
						elseif($field['TYPE'] == 'E:EList')
						{
							$html .= '<tr><td><span class="bx-bp-select">'.call_user_func_array($field["PROPERTY_USER_TYPE"]["GetPublicEditHTML"],
								array(
									$field,
									$value,
									array(
										"VALUE"=>$fieldId."[".$key."][VALUE]",
										"DESCRIPTION"=>'',
										"FORM_NAME"=>$this->formId,
										"MODE"=>"FORM_FILL",
										"COPY"=>false,
									),
								)).'</span></td></tr>';
						}
						else
						{
							$html .= '<tr><td>'.call_user_func_array($field["PROPERTY_USER_TYPE"]["GetPublicEditHTML"],
									array(
										$field,
										$value,
										array(
											"VALUE"=>$fieldId."[".$key."][VALUE]",
											"DESCRIPTION"=>'',
											"FORM_NAME"=>$this->formId,
											"MODE"=>"FORM_FILL",
											"COPY"=>false,
										),
									)).'</td></tr>';
						}
					}
					$html .= '</table>';
					if($checkHtml)
						$html .= '<span class="bx-lists-input-add-button"><input type="button" onclick="BX.Lists[\'LiveFeedClass_'.$this->randomString.'\'].createAdditionalHtmlEditor(\'tbl'.$fieldId.'\', \''.$fieldId.'\', \''.$this->formId.'\');" value="'.Loc::getMessage("LISTS_SEAC_ADD_BUTTON").'"></span>';
					else
					{
						$regExp = '/'.$fieldId.'\[(n)([0-9]*)\]|data-id=".+?"/g';
						$html .= '<span class="bx-lists-input-add-button"><input type="button" onclick="BX.Lists.addNewTableRow(\'tbl'.$fieldId.'\', 1, '.htmlspecialcharsbx($regExp).', 2)" value="'.Loc::getMessage("LISTS_SEAC_ADD_BUTTON").'"></span>';
					}

					$this->lists['PREPARED_FIELDS'][$fieldId] = array(
						"id"=>$fieldId,
						"name"=>$field["NAME"],
						"required"=>$field["IS_REQUIRED"]=="Y"? true: false,
						"type"=>"custom",
						"value"=>$html,
					);
				}
				else
				{
					$html = '';
					foreach($this->lists['FORM_DATA'][$fieldId] as $key => $value)
					{
						if($field["TYPE"] == "S:HTML")
						{
							$fieldNameForHtml = $fieldId."[".$key."][VALUE][TEXT]";
							$html = $this->connectionHtmlEditor($fieldId, $fieldNameForHtml, $params, is_array($value['VALUE']) ? $value['VALUE']['TEXT']: '');
							$html .= '<input type="hidden" name="'.$fieldId.'['.$key.'][VALUE][TYPE]" value="html">';
						}
						elseif($field['TYPE'] == 'S:DateTime')
						{
							$html = '
								<input class="bx-lists-input-calendar" type="text" name="'.$fieldId.'[n0][VALUE]" onclick="BX.calendar({node: this.parentNode, field: this, bTime: true, bHideTime: false});" value="'.$value['VALUE'].'">
								<span class="bx-lists-calendar-icon" onclick="BX.calendar({node:this, field:\''.$fieldId.'[n0][VALUE]\', form: \'\', bTime: true, bHideTime: false});"
									  onmouseover="BX.addClass(this, \'calendar-icon-hover\');" onmouseout="BX.removeClass(this, \'calendar-icon-hover\');" border="0"></span>
							';
						}
						elseif($field['TYPE'] == 'S:Date')
						{
							$html = '
								<input class="bx-lists-input-calendar" type="text" name="'.$fieldId.'[n0][VALUE]" onclick="BX.calendar({node: this.parentNode, field: this, bTime: false, bHideTime: false});" value="'.$value['VALUE'].'">
								<span class="bx-lists-calendar-icon" onclick="BX.calendar({node:this, field:\''.$fieldId.'[n0][VALUE]\', form: \'\', bTime: false, bHideTime: false});"
									  onmouseover="BX.addClass(this, \'calendar-icon-hover\');" onmouseout="BX.removeClass(this, \'calendar-icon-hover\');" border="0"></span>
							';
						}
						elseif($field['TYPE'] == 'E:EList')
						{
							$html = '<span class="bx-bp-select">'.call_user_func_array($field['PROPERTY_USER_TYPE']['GetPublicEditHTML'],
								array(
									$field,
									$value,
									array(
										'VALUE' => $fieldId.'['.$key.'][VALUE]',
										'DESCRIPTION' => '',
										'FORM_NAME' => $this->formId,
										'MODE' => 'FORM_FILL',
										'COPY' => false,
									),
								)).'</span>';
						}
						else
						{
							if($field['TYPE'] == 'S:ECrm')
							{
								Bitrix\Main\Page\Asset::getInstance()->addCss('/bitrix/js/crm/css/crm.css');
								Bitrix\Main\Page\Asset::getInstance()->addJs('/bitrix/js/crm/crm.js');
							}
							$html = call_user_func_array($field['PROPERTY_USER_TYPE']['GetPublicEditHTML'],
								array(
									$field,
									$value,
									array(
										'VALUE' => $fieldId.'['.$key.'][VALUE]',
										'DESCRIPTION' => '',
										'FORM_NAME' => $this->formId,
										'MODE' => 'FORM_FILL',
										'COPY' => false,
									),
								));

						}
						break;
					}

					$this->lists['PREPARED_FIELDS'][$fieldId] = array(
						'id' => $fieldId,
						'name' => $field['NAME'],
						'required' => $field['IS_REQUIRED']=='Y'? true: false,
						'type' => 'custom',
						'value' => $html,
					);
				}
			}
			elseif($field["PROPERTY_TYPE"] == "N")
			{
				$html = '';
				if($field["MULTIPLE"] == "Y")
				{
					$html = '<table id="tbl'.$fieldId.'">';
					foreach($this->lists['FORM_DATA'][$fieldId] as $key => $value)
						$html .= '<tr><td><input type="text" name="'.$fieldId.'['.HtmlFilter::encode($key).'][VALUE]" value="'.$value["VALUE"].'"></td></tr>';
					$html .= '</table>';
					$html .= '<span class="bx-lists-input-add-button"><input type="button" onclick="javascript:BX.Lists.addNewTableRow(\'tbl'.$fieldId.'\', 1, /'.$fieldId.'\[(n)([0-9]*)\]/g, 2)" value="'.Loc::getMessage("LISTS_SEAC_ADD_BUTTON").'"></span>';
				}
				else
				{
					foreach($this->lists['FORM_DATA'][$fieldId] as $key => $value)
						$html = '<input type="text" name="'.$fieldId.'['.HtmlFilter::encode($key).'][VALUE]" value="'.$value["VALUE"].'">';
				}

				$this->lists['PREPARED_FIELDS'][$fieldId] = array(
					"id"=>$fieldId,
					"name"=>$field["NAME"],
					"required"=>$field["IS_REQUIRED"]=="Y"? true: false,
					"type"=>"custom",
					"value"=>$html,
				);
			}
			elseif($field["PROPERTY_TYPE"] == "S")
			{
				$html = '';
				if($field["MULTIPLE"] == "Y")
				{
					$html = '<table id="tbl'.$fieldId.'">';
					if ($field["ROW_COUNT"] > 1)
					{
						foreach($this->lists['FORM_DATA'][$fieldId] as $key => $value)
						{
							$html .= '<tr><td><textarea name="'.$fieldId.'['.HtmlFilter::encode($key).'][VALUE]" rows="'.intval($field["ROW_COUNT"]).'" cols="'.intval($field["COL_COUNT"]).'">'.$value["VALUE"].'</textarea></td></tr>';
						}
					}
					else
					{
						foreach($this->lists['FORM_DATA'][$fieldId] as $key => $value)
						{
							$html .= '<tr><td><input type="text" name="'.$fieldId.'['.HtmlFilter::encode($key).'][VALUE]" value="'.$value["VALUE"].'"></td></tr>';
						}
					}
					$html .= '</table>';
					$html .= '<span class="bx-lists-input-add-button"><input type="button" onclick="javascript:BX.Lists.addNewTableRow(\'tbl'.$fieldId.'\', 1, /'.$fieldId.'\[(n)([0-9]*)\]/g, 2)" value="'.Loc::getMessage("LISTS_SEAC_ADD_BUTTON").'"></span>';
				}
				else
				{
					if ($field["ROW_COUNT"] > 1)
					{
						foreach($this->lists['FORM_DATA'][$fieldId] as $key => $value)
						{
							$html = '<textarea name="'.$fieldId.'['.HtmlFilter::encode($key).'][VALUE]" rows="'.intval($field["ROW_COUNT"]).'" cols="'.intval($field["COL_COUNT"]).'">'.$value["VALUE"].'</textarea>';
						}
					}
					else
					{
						foreach($this->lists['FORM_DATA'][$fieldId] as $key => $value)
						{
							$html = '<input type="text" name="'.$fieldId.'['.HtmlFilter::encode($key).'][VALUE]" value="'.$value["VALUE"].'" size="'.intval($field["COL_COUNT"]).'">';
						}
					}
				}

				$this->lists['PREPARED_FIELDS'][$fieldId] = array(
					"id"=>$fieldId,
					"name"=>$field["NAME"],
					"required"=>$field["IS_REQUIRED"]=="Y"? true: false,
					"type"=>"custom",
					"value"=>$html,
				);
			}
			elseif($field["PROPERTY_TYPE"] == "L")
			{
				$items = array("" => Loc::getMessage("LISTS_SEAC_NO_VALUE"));
				$propEnums = CIBlockProperty::getPropertyEnum($field["ID"]);
				while($enum = $propEnums->fetch())
					$items[$enum["ID"]] = $enum["VALUE"];

				if($field["MULTIPLE"] == "Y")
				{
					$this->lists['PREPARED_FIELDS'][$fieldId] = array(
						"id"=>$fieldId.'[]',
						"name"=>$field["NAME"],
						"required"=>$field["IS_REQUIRED"]=="Y"? true: false,
						"type"=>'list',
						"items"=>$items,
						"value"=>$this->lists['FORM_DATA'][$fieldId],
						"params" => array("size"=>5, "multiple"=>"multiple"),
					);
				}
				else
				{
					$this->lists['PREPARED_FIELDS'][$fieldId] = array(
						"id"=>$fieldId,
						"name"=>$field["NAME"],
						"required"=>$field["IS_REQUIRED"]=="Y"? true: false,
						"type"=>'list',
						"items"=>$items,
						"value"=>$this->lists['FORM_DATA'][$fieldId],
					);
				}
			}
			elseif($field['PROPERTY_TYPE'] == 'F')
			{
				$html = '
					<script>
						var wrappers = document.getElementsByClassName("bx-lists-input-file");
						for (var i = 0; i < wrappers.length; i++)
						{
							var inputs = wrappers[i].getElementsByTagName("input");
							for (var j = 0; j < inputs.length; j++)
							{
								inputs[j].onchange = getName;
							}
						}
						function getName ()
						{
							var str = this.value, i;
							if (str.lastIndexOf("\\\"))
							{
								i = str.lastIndexOf("\\\")+1;
							}
							else
							{
								i = str.lastIndexOf("\\\")+1;
							}
							str = str.slice(i);
							var uploaded = this.parentNode.parentNode.getElementsByClassName("fileformlabel")[0];
							uploaded.innerHTML = str;
						}
					</script>
				';
				if($field['MULTIPLE'] == 'Y')
				{
					$html .= '<table id="tbl'.$fieldId.'">';
					foreach($this->lists['FORM_DATA'][$fieldId] as $key => $value)
					{
						$html .= '<tr><td><span class="file-wrapper"><span class="bx-lists-input-file">
								<span class="webform-small-button bx-lists-small-button">'.Loc::getMessage('LISTS_SEAC_FILE_ADD') .'</span>';

						$html .= $this->connectionFile($fieldId, $key, $value, $field['PROPERTY_TYPE']);

						$html .= '</span><span class="fileformlabel bx-lists-input-file-name"></span></span></td></tr>';
					}
					$html .= '</table>';
					$html .= '
						<span class="bx-lists-input-add-button">
							<input type="button" onclick="javascript:BX.Lists[\'LiveFeedClass_'.$this->randomString.'\'].addNewFileTableRow(\'tbl'.$fieldId.'\', 1, /'.$fieldId.'\[(n)([0-9]*)\]/g, 2);
							BX.Lists[\'LiveFeedClass_'.$this->randomString.'\'].getNameInputFile();" value="'.Loc::getMessage("LISTS_SEAC_ADD_BUTTON").'">
						</span>';

					$this->lists['PREPARED_FIELDS'][$fieldId] = array(
						"id"=>$fieldId,
						"name"=>$field["NAME"],
						"required"=>$field["IS_REQUIRED"]=="Y"? true: false,
						"type"=>"custom",
						"value"=>$html,
					);
				}
				else
				{
					foreach($this->lists['FORM_DATA'][$fieldId] as $key => $value)
					{
						$html .= '<span class="file-wrapper"><span class="bx-lists-input-file">
								<span class="webform-small-button bx-lists-small-button">'.Loc::getMessage('LISTS_SEAC_FILE_ADD') .'</span>';
						$html .= $this->connectionFile($fieldId, $key, $value, $field['PROPERTY_TYPE']);
						$html .= '</span><span class="fileformlabel bx-lists-input-file-name"></span></span>';
						$this->lists['PREPARED_FIELDS'][$fieldId] = array(
							"id" => $fieldId.'['.$key.'][VALUE]',
							"name" => $field["NAME"],
							"required" => $field["IS_REQUIRED"]=="Y"? true: false,
							"type" => "file",
							"value" => $html,
						);
					}
				}
			}
			elseif($field["PROPERTY_TYPE"] == "G")
			{
				if($field["IS_REQUIRED"]=="Y")
					$items = array();
				else
					$items = array("" => Loc::getMessage("LISTS_SEAC_NO_VALUE"));

				$rsSections = CIBlockSection::GetTreeList(Array("IBLOCK_ID" => $field["LINK_IBLOCK_ID"]));
				while($res = $rsSections->GetNext())
					$items[$res["ID"]] = str_repeat(" . ", $res["DEPTH_LEVEL"]).$res["NAME"];

				if($field["MULTIPLE"] == "Y")
					$params = array("size"=>4, "multiple"=>"multiple");
				else
					$params = array();

				$this->lists['PREPARED_FIELDS'][$fieldId] = array(
					"id"=>$fieldId.'[]',
					"name"=>$field["NAME"],
					"required"=>$field["IS_REQUIRED"]=="Y"? true: false,
					"type"=>'list',
					"items"=>$items,
					"value"=>$this->lists['FORM_DATA'][$fieldId],
					"params" => $params,
				);
			}
			elseif($field["PROPERTY_TYPE"] == "E")
			{
				if(!is_array($this->lists['FORM_DATA'][$fieldId]))
					$this->lists['FORM_DATA'][$fieldId] = array($this->lists['FORM_DATA'][$fieldId]);

				$currentElements = array();
				foreach($this->lists['FORM_DATA'][$fieldId] as $listElementId)
				{
					if($listElementId)
					{
						$currentElements[] = $listElementId;
					}
				}
				$randomGenerator = new Bitrix\Main\Type\RandomSequence($fieldId);
				$randString = mb_strtolower($randomGenerator->randString(6));
				$html = '';
				global $APPLICATION;
				ob_start();
				$APPLICATION->includeComponent('bitrix:iblock.element.selector', '',
					array(
						'SELECTOR_ID' => $randString,
						'INPUT_NAME' => $fieldId,
						'IBLOCK_ID' => $field["LINK_IBLOCK_ID"],
						'MULTIPLE' => $field["MULTIPLE"],
						'CURRENT_ELEMENTS_ID' => $currentElements,
						'POPUP' => 'Y',
						'PANEL_SELECTED_VALUES' => 'Y'
					),
					null, array('HIDE_ICONS' => 'Y')
				);
				$html .= ob_get_contents();
				ob_end_clean();

				$this->lists['PREPARED_FIELDS'][$fieldId] = array(
					"id"=>$fieldId,
					"name"=>$field["NAME"],
					"required"=>$field["IS_REQUIRED"]=="Y"? true: false,
					"type"=>'custom',
					"value"=>$html,
				);
			}
			elseif($field["MULTIPLE"] == "Y")
			{
				$html = '<table id="tbl'.$fieldId.'"><tr><td>';
				foreach($this->lists['FORM_DATA'][$fieldId] as $key => $value)
					$html .= '<tr><td><input type="text" name="'.$fieldId.'['.HtmlFilter::encode($key).'][VALUE]" value="'.$value["VALUE"].'"></td></tr>';
				$html .= '</td></tr></table>';
				$html .= '
				<span class="bx-lists-input-add-button">
					<input type="button" onclick="javascript:BX.Lists.addNewTableRow(\'tbl'.$fieldId.'\', 1, /'.$fieldId.'\[(n)([0-9]*)\]/g, 2)" value="'.Loc::getMessage("LISTS_SEAC_ADD_BUTTON").'">
				</span>';

				$this->lists['PREPARED_FIELDS'][$fieldId] = array(
					"id"=>$fieldId,
					"name"=>$field["NAME"],
					"required"=>$field["IS_REQUIRED"]=="Y"? true: false,
					"type"=>"custom",
					"value"=>$html,
				);
			}
			elseif(is_array($this->lists['FORM_DATA'][$fieldId]) && array_key_exists("VALUE", $this->lists['FORM_DATA'][$fieldId]))
			{
				$this->lists['PREPARED_FIELDS'][$fieldId] = array(
					"id"=>$fieldId.'[VALUE]',
					"name"=>$field["NAME"],
					"required"=>$field["IS_REQUIRED"]=="Y"? true: false,
					"type" => "text",
					"value" => $this->lists['FORM_DATA'][$fieldId]["VALUE"],
				);
			}
			else
			{
				$this->lists['PREPARED_FIELDS'][$fieldId] = array(
					"id"=>$fieldId,
					"name"=>$field["NAME"],
					"required"=>$field["IS_REQUIRED"]=="Y"? true: false,
					"type" => "text",
				);
			}

			if(!($fieldId == 'DATE_CREATE' || $fieldId == 'TIMESTAMP_X' || $fieldId == 'CREATED_BY' || $fieldId == 'MODIFIED_BY'))
			{
				if(isset($field['SETTINGS']['SHOW_ADD_FORM']))
				{
					$this->lists['PREPARED_FIELDS'][$fieldId]['show'] = $field['SETTINGS']['SHOW_ADD_FORM'] == 'Y' ? 'Y' : 'N';
				}
				else
				{
					$this->lists['PREPARED_FIELDS'][$fieldId]['show'] = 'Y';
				}
			}

		}
	}

	protected function getBizprocData()
	{
		$userId = $this->getUser()->getID();
		$currentUserGroups = $this->getUser()->getUserGroupArray();
		if(!$this->lists['ELEMENT_FIELDS'] || $this->lists['ELEMENT_FIELDS']['CREATED_BY'] == $userId)
			$currentUserGroups[] = 'Author';

		$documentType = 'iblock_'.$this->iblockId;
		CBPDocument::addShowParameterInit('lists', 'only_users', $documentType);

		$this->lists['BIZPROC_FIELDS'] = array();
		$bizprocIndex = 0;
		$documentStates = CBPDocument::getDocumentStates(array('lists', 'BizprocDocument', $documentType), null);
		$runtime = CBPRuntime::getRuntime();
		$runtime->startRuntime();
		$documentService = $runtime->getService('DocumentService');

		foreach ($documentStates as $documentState)
		{
			$bizprocIndex++;
			$viewWorkflow = CBPDocument::CanUserOperateDocumentType(
				CBPCanUserOperateOperation::StartWorkflow,
				$userId,
				array('lists', 'BizprocDocument', $documentType),
				array('sectionId'=> 0, 'AllUserGroups' => $currentUserGroups, 'DocumentStates' => $documentStates, 'WorkflowId' => $documentState['ID'] > 0 ? $documentState['ID'] : $documentState['TEMPLATE_ID'])
			);

			if($viewWorkflow)
			{
				$templateId = intval($documentState['TEMPLATE_ID']);
				$templateName = $documentState['TEMPLATE_NAME'];
				$workflowParameters = $documentState['TEMPLATE_PARAMETERS'];
				if(!is_array($workflowParameters))
					$workflowParameters = array();
				if($documentState["ID"] == '' && $templateId > 0)
				{
					$parametersValues = array();
					$keys = array_keys($workflowParameters);
					foreach ($keys as $key)
					{
						$value = $workflowParameters[$key]["Default"];
						if (!is_array($value))
						{
							$parametersValues[$key] = $value;
						}
						else
						{
							$keys1 = array_keys($value);
							foreach ($keys1 as $key1)
							{
								$parametersValues[$key][$key1] = $value[$key1];
							}
						}
					}
					foreach ($workflowParameters as $parameterKey => $arParameter)
					{
						$parameterKeyExt = "bizproc".$templateId."_".$parameterKey;

						$html = $documentService->GetFieldInputControl(
							array('lists', 'BizprocDocument', $documentType),
							$arParameter,
							array("Form" => "start_workflow_form1", "Field" => $parameterKeyExt),
							$parametersValues[$parameterKey],
							false,
							true
						);

						$this->lists['BIZPROC_FIELDS'][$parameterKeyExt.$bizprocIndex] = array(
							"id" => $parameterKeyExt.$bizprocIndex,
							"required" => $arParameter["Required"],
							"name" => $arParameter["Name"],
							"title" => $arParameter["Description"],
							"type" => "custom",
							"realType" => $arParameter["Type"],
							"value" => $html,
							'show' => 'Y',
							'templateName' => $templateName,
							'templateId' => $templateId
						);
					}
				}
			}
		}
	}

	protected function connectionFile($fieldId, $key, $value, $type)
	{
		if($type == 'F')
			$fieldId = $fieldId.'['.$key.'][VALUE]';

		$obFile = new CListFile(
			$this->iblockId,
			$this->lists['ELEMENT_FIELDS']["IBLOCK_SECTION_ID"],
			$this->lists['ELEMENT_ID'],
			$fieldId,
			$value["VALUE"]
		);
		$obFile->SetSocnetGroup($this->socnetGroupId);
		$obFileControl = new CListFileControl($obFile, $fieldId);

		return $obFileControl->getHTML(array(
			'max_size' => 102400,
			'max_width' => 150,
			'max_height' => 150,
			'url_template' => '',
			'a_title' => Loc::getMessage("LISTS_SEAC_ENLARGE"),
			'download_text' => Loc::getMessage("LISTS_SEAC_DOWNLOAD"),
		));
	}

	protected function connectionHtmlEditor($fieldId, $fieldNameForHtml, $params, $content)
	{
		$html = '';
		if (Loader::includeModule('fileman'))
		{
			ob_start();
			$editor = new CHTMLEditor;
			$res = array(
				'name' => $fieldNameForHtml,
				'inputName' => $fieldNameForHtml,
				'id' => $fieldId.$params['iblockId'],
				'width' => $params['width'],
				'height' => $params['height'],
				'content' => $content,
				'useFileDialogs' => false,
				'minBodyWidth' => 350,
				'normalBodyWidth' => 555,
				'bAllowPhp' => false,
				'limitPhpAccess' => false,
				'showTaskbars' => false,
				'showNodeNavi' => false,
				'beforeUnloadHandlerAllowed' => true,
				'askBeforeUnloadPage' => false,
				'bbCode' => false,
				'siteId' => SITE_ID,
				'autoResize' => true,
				'autoResizeOffset' => 40,
				'saveOnBlur' => true,
				'actionUrl' => '/bitrix/tools/html_editor_action.php',
				'setFocusAfterShow' => false,
				'controlsMap' => array(
					array('id' => 'Bold', 'compact' => true, 'sort' => 80),
					array('id' => 'Italic', 'compact' => true, 'sort' => 90),
					array('id' => 'Underline', 'compact' => true, 'sort' => 100),
					array('id' => 'Strikeout', 'compact' => true, 'sort' => 110),
					array('id' => 'RemoveFormat', 'compact' => true, 'sort' => 120),
					array('id' => 'Color', 'compact' => true, 'sort' => 130),
					array('id' => 'FontSelector', 'compact' => false, 'sort' => 135),
					array('id' => 'FontSize', 'compact' => false, 'sort' => 140),
					array('separator' => true, 'compact' => false, 'sort' => 145),
					array('id' => 'OrderedList', 'compact' => true, 'sort' => 150),
					array('id' => 'UnorderedList', 'compact' => true, 'sort' => 160),
					array('id' => 'AlignList', 'compact' => false, 'sort' => 190),
					array('separator' => true, 'compact' => false, 'sort' => 200),
					array('id' => 'InsertLink', 'compact' => true, 'sort' => 210),
					array('id' => 'InsertImage', 'compact' => false, 'sort' => 220),
					array('id' => 'InsertVideo', 'compact' => true, 'sort' => 230),
					array('id' => 'InsertTable', 'compact' => false, 'sort' => 250),
					array('separator' => true, 'compact' => false, 'sort' => 290),
					array('id' => 'Fullscreen', 'compact' => false, 'sort' => 310),
					array('id' => 'More', 'compact' => true, 'sort' => 400)
				),
			);
			$editor->show($res);
			$html = ob_get_contents();
			ob_end_clean();
		}
		return $html;
	}

	protected function createHtml()
	{
		if(empty($this->lists['PREPARED_FIELDS']))
			return;

		switch ($this->iblockCode)
		{
			case 'bitrix_outgoing_doc':
				$blueDudeCode = 2216841;
				break;
			case 'bitrix_cash':
				$blueDudeCode = 2216531;
				break;
			case 'bitrix_trip':
				$blueDudeCode = 2216791;
				break;
			case 'bitrix_invoice':
				$blueDudeCode = 2215233;
				break;
			case 'bitrix_holiday':
				$blueDudeCode = 2216341;
				break;
			default:
				$blueDudeCode = 0;
				break;
		}

		$manyParameters = false;
		if(!empty($this->lists['BIZPROC_FIELDS']))
		{
			$title = Loc::getMessage('LISTS_IS_BIZPROC_PARAMETERS');
			if(count($this->lists['BIZPROC_FIELDS']) > 1)
			{
				$title = Loc::getMessage('LISTS_BIZPROC_PARAMETERS');
				$manyParameters = true;
			}
		}

		$data = array_merge($this->lists['PREPARED_FIELDS'], $this->lists['BIZPROC_FIELDS']);
		$listTemplateId = array();
		$bizprocTitle = true;

		?>

		<div class="bx-lists-iblock-description">
			<?= nl2br(htmlspecialcharsbx($this->iblockDescription)) ?>
			<? if(!empty($blueDudeCode)): ?>
				<br><br>
				<a style="cursor:pointer;"
				   onclick='BX.Helper.show("redirect=detail&code=<?=$blueDudeCode ?>");'>
					<?= Loc::getMessage('LISTS_IS_DESRIPTION_DETAIL') ?>
				</a>
			<? endif ?>
		</div>
		<div class="bx-lists-block-errors" id="bx-lists-block-errors" style="display:none;"></div>

		<table class="bx-lists-table-content">
			<? foreach($data as $fieldId => $field): ?>

				<? if(preg_match('/^bizproc/', $fieldId)): ?>

					<? if($bizprocTitle): ?>
						<? $bizprocTitle = false ?>
						<tr><td colspan="2" style="visibility: hidden"></td></tr>
						<tr>
							<td colspan="2" class="bx-lists-bizproc-parameters-title"><?= $title ?></td>
						</tr>
					<? endif ?>

					<? if($manyParameters && empty($listTemplateId[$field['templateId']])): ?>
						<tr><td colspan="2" style="visibility: hidden"></td></tr>
						<tr class="bx-lists-bp-parameters-template">
							<td colspan="2"><?= $field["templateName"] ?></td>
						</tr>
						<? $listTemplateId[$field['templateId']] = true; ?>
					<? endif ?>
				<? endif ?>

				<?
					$customHtml = (isset($field['value'])? $field['value'] : $this->lists['FORM_DATA'][$field['id']]);
					$params = '';
					if(is_array($field['params']) && $field['type'] <> 'file')
					{
						foreach($field['params'] as $p => $v)
							$params .= ' '.$p.'="'.$v.'"';
					}
					$required = $field['required'] ? '<span class="bx-lists-required">*</span>' : '';
					$style = $field['show'] == 'Y' ? '' : 'style="display:none;"';
					if($field['type'] == 'file'): ?>
						<script>
							var wrappers = document.getElementsByClassName('bx-lists-input-file');
							for (var i = 0; i < wrappers.length; i++)
							{
								var inputs = wrappers[i].getElementsByTagName('input');
								for (var j = 0; j < inputs.length; j++)
								{
									inputs[j].onchange = getName;
								}
							}
							function getName ()
							{
								var str = this.value, i;
								if (str.lastIndexOf('\\'))
								{
									i = str.lastIndexOf('\\')+1;
								}
								else
								{
									i = str.lastIndexOf('/')+1;
								}
								str = str.slice(i);
								var uploaded = this.parentNode.parentNode.getElementsByClassName('fileformlabel')[0];
								uploaded.innerHTML = str;
							}
						</script>
					<? endif;
				?>

				<tr <?= $style ?>>
					<td class="bx-lists-table-first-td">
						<?=htmlspecialcharsbx($field['name'])?>: <?= $required ?>
					</td>
					<?
					switch($field['type']):
						case 'label':
						case 'custom':
							?><td><?
							$spanOne = '';
							$spanTwo = '';
							if (!empty($field["realType"]))
							{
								switch ($field["realType"])
								{
									case "select":
									case "internalselect":
									case "E:EList":
									case "bool":
										$spanOne = '<span class="bx-bp-select">';
										$spanTwo = '</span>';
										break;
								}
							}
							echo $spanOne.$customHtml.$spanTwo;
							?></td><?
							break;
						case 'checkbox':
							?>
							<td>
								<input type="hidden" name="<?=$field['id']?>" value="N">
								<input type="checkbox" name="<?=$field['id']?>" value="Y"
									<?=($customHtml == "Y"? ' checked':'')?><?=HtmlFilter::encode($params)?>>
							</td>
							<?
							break;
						case 'textarea':
							?>
							<td>
								<textarea name="<?=$field['id']?>"<?=HtmlFilter::encode($params)?>><?=$customHtml?></textarea>
							</td>
							<?
							break;
						case 'list':
							$class = '';
							if(!empty($params))
							{
								$class = 'bx-bp-select-linking';
								$spanOne = '';
								$spanTwo = '';
							}
							else
							{
								$spanOne = '<span class="bx-bp-select">';
								$spanTwo = '</span>';
							}

							?><td>
							<?= $spanOne ?>
						<select name="<?=$field['id']?>"<?=HtmlFilter::encode($params)?> class="<?= $class ?>">
							<?
							if(is_array($field['items'])):
								if(!is_array($customHtml))
									$customHtml = array($customHtml);
								foreach($field['items'] as $k=>$v):?>
									<option value="<?=htmlspecialcharsbx($k)?>"
										<?=(in_array($k, $customHtml)? ' selected':'')?>>
										<?=htmlspecialcharsbx($v)?></option>
								<? endforeach; ?>
								</select>
								<?= $spanTwo ?>
								</td>
								<?
							endif;
							break;
						case 'file':
							?>
							<td>
								<span class="file-wrapper">
									<span class="bx-lists-input-file">
										<span class="webform-small-button bx-lists-small-button">
											<?= Loc::getMessage('LISTS_SEAC_FILE_ADD') ?></span>
										<input name="<?= $field['id'] ?>"
										       size="<?= HtmlFilter::encode($field['params']['size']) ?>" type="file">
									</span>
									<span class="fileformlabel bx-lists-input-file-name"></span>
								</span>
							</td>
							<?
							break;
						case 'date':
							?>
							<td>
								<input class="bx-lists-input-calendar" value="<?=$customHtml?>" type="text"
								       name="<?= $field['id'] ?>" onclick="BX.calendar({node: this.parentNode,
								       field: this, bTime: true, bHideTime: false});">
								<span class="bx-lists-calendar-icon" onclick="BX.calendar({node:this,
									field:'<?= $field['id'] ?>', form: '', bTime: true, bHideTime: false});"
								      onmouseover="BX.addClass(this, 'calendar-icon-hover');"
								      onmouseout="BX.removeClass(this, 'calendar-icon-hover');" border="0"></span>
							</td>
							<?
							break;
						default:
							?>
							<td>
								<input type="text" name="<?=$field['id']?>" value="<?=$customHtml?>"<?=HtmlFilter::encode($params)?>>
							</td>
							<?
							break;
					endswitch;
					?>
				</tr>

			<? endforeach ?>
		</table>

		<?
	}
}
$controller = new LiveFeedAjaxController();
$controller
	->setActionName(\Bitrix\Main\Application::getInstance()->getContext()->getRequest()->getQuery('action'))
	->exec();