Your IP : 3.148.210.23


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

<?
/*
$e = new CDavExchangeTasks("http", "test-exch2007", 80, 'alex', 'P@$$w0rd');
//$e->Debug();
$r = $e->GetFoldersList(array("mailbox" => "anti_bug@test.local"));
$r = $e->GetFolderById("AQATAGFud...");
$r = $e->AddFolder(array("NAME" => "AbFolder", "mailbox" => "anti_bug@test.local"));
$r = $e->UpdateFolder(array("XML_ID" => "AQATAGFud...", "MODIFICATION_LABEL" => "AwAAA..."), array("NAME" => "AbFolder1"));
$r = $e->DeleteFolder("AQATAGFud...");

$r = $e->GetList(array("mailbox" => "anti_bug@test.local"));
$r = $e->GetList(
	array("Mailbox" => "anti_bug@test.local", "FolderId" => "JTJFHDTrs..."),
	array("ItemShape" => "IdOnly")
);
$r = $e->GetById("AAATAGFud...");

$arFields = array(
	"MAILBOX" => "anti_bug@test.local",
	"FOLDER_ID" => "JTJFHDTrs...",
	"SUBJECT" => "New task",
	"BODY" => "ToDo!",
	"BODY_TYPE" => "text",		// text, html
	"IMPORTANCE" => "High",		// High, Normal, Low
	"START_DATE" => "20.03.2011",
	"DUE_DATE" => "25.03.2011",
	"PERCENT_COMPLETE" => "0",
	"STATUS" => "NotStarted",		//  NotStarted, InProgress, Completed, WaitingOnOthers, Deferred
	"TOTAL_WORK" => "123",
	"REMINDER_MINUTES_BEFORE_START" => 365,
	"RECURRING_TYPE" => "MONTHLY_RELATIVE",	// MONTHLY_ABSOLUTE, MONTHLY_RELATIVE, YEARLY_ABSOLUTE, YEARLY_RELATIVE, WEEKLY, DAILY
	"RECURRING_INTERVAL" => 3,
	"RECURRING_DAYOFMONTH" => 5,
	"RECURRING_DAYSOFWEEK" => "Monday",		// Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Day, Weekday, WeekendDay
	"RECURRING_DAYOFWEEKINDEX" => "Third",	// First, Second, Third, Fourth, Last
	"RECURRING_MONTH" => "November",		// January, February, March, April, May, June, July, August, September, October, November, December
	"RECURRING_STARTDATE" => "20.03.2011",
	"RECURRING_NUMBEROFOCCURRENCES" => 5,
);
$r = $e->Add($arFields);

$arFields = array(
	"mailbox" => "anti_bug@test.local",
	"SUBJECT" => "New task 111",
	"BODY" => "ToDo!",
	"BODY_TYPE" => "text",
	"IMPORTANCE" => "High",
	"START_DATE" => "20.03.2011",
	"DUE_DATE" => "25.03.2011",
	"PERCENT_COMPLETE" => "20",
	"STATUS" => "WaitingOnOthers",
	"TOTAL_WORK" => "123",
	"REMINDER_MINUTES_BEFORE_START" => 365,
	"RECURRING_TYPE" => "MONTHLY_RELATIVE",
	"RECURRING_INTERVAL" => 1,
	"RECURRING_DAYSOFWEEK" => "Thursday",
	"RECURRING_DAYOFWEEKINDEX" => "Last",
	"RECURRING_STARTDATE" => "20.03.2011",
	"RECURRING_ENDDATE" => "20.10.2011",
);
$r = $e->Update(
	array(
		"XML_ID" => "AAATAGFud...",
		"MODIFICATION_LABEL" => "EQAAAB...",
	),
	$arFields
);

$r = $e->Delete("AAATAGFud...");

print_r($e->GetErrors());
*/

IncludeModuleLangFile(__FILE__);

class CDavExchangeTasks
	extends CDavExchangeClient
{
	static $arMapItem = array("MimeContent", "ItemId", "ParentFolderId", "ItemClass", "Subject", "Sensitivity", "Body", "Attachments", "DateTimeReceived", "Size", "Categories", "Importance", "InReplyTo", "IsSubmitted", "IsDraft", "IsFromMe", "IsResend", "IsUnmodified", "InternetMessageHeaders", "DateTimeSent", "DateTimeCreated", "ResponseObjects", "ReminderDueBy", "ReminderIsSet", "ReminderMinutesBeforeStart", "DisplayCc", "DisplayTo", "HasAttachments", "ExtendedProperty", "Culture", "EffectiveRights", "LastModifiedName", "LastModifiedTime");
	static $arMapTask = array("ActualWork", "AssignedTime", "BillingInformation", "ChangeCount", "Companies", "CompleteDate", "Contacts", "DelegationState", "Delegator", "DueDate", "IsAssignmentEditable", "IsComplete", "IsRecurring", "IsTeamTask", "Mileage", "Owner", "PercentComplete", "Recurrence", "StartDate", "Status", "StatusDescription", "TotalWork");
	static $arMapExtendedFields = array('GUID', 'SERIALIZED_DATA');

	public function __construct($scheme, $server, $port, $userName, $userPassword, $siteId = null)
	{
		parent::__construct($scheme, $server, $port, $userName, $userPassword);
		$this->SetCurrentEncoding($siteId);
	}

	public function GetList($arFilter = array(), $arMode = array(), $arAdditionalExtendedProperties = array())
	{
		$this->ClearErrors();

		$request = $this->CreateSOAPRequest("POST", $this->GetPath());
		$request->AddHeader("Content-Type", "text/xml; charset=utf-8");
		$request->AddHeader("SOAPAction", "http://schemas.microsoft.com/exchange/services/2006/messages/FindItem");
		$request->AddHeader("Connection", "Keep-Alive");

		$arMapTmp = array("folder_id" => "FolderId", "folderid" => "FolderId", "mailbox" => "Mailbox");
		CDavExchangeClient::NormalizeArray($arFilter, $arMapTmp);
		if (!array_key_exists("FolderId", $arFilter))
			$arFilter["FolderId"] = "tasks";

		$arMapTmp = array("itemshape" => "ItemShape", "item_shape" => "ItemShape");
		CDavExchangeClient::NormalizeArray($arMode, $arMapTmp);
		if (!array_key_exists("ItemShape", $arMode))
			$arMode["ItemShape"] = "AllProperties";

		$arParentFolderId = array("id" => $arFilter["FolderId"]);
		if (array_key_exists("Mailbox", $arFilter))
			$arParentFolderId["mailbox"] = $arFilter["Mailbox"];

		$arAdditionalProperties = array();

		$request->CreateFindItemBody($arParentFolderId, null,
			$arMode["ItemShape"], $arAdditionalProperties,
			$arAdditionalExtendedProperties
		);

		$this->Connect();
		$response = $this->Send($request);
		$this->Disconnect();

		if (is_null($response))
			return null;

		if ($this->ParseError($response))
			return null;

		$arResultItemsList = array();
		$xmlDoc = $response->GetBodyXml();

		$arResponseMessage = $xmlDoc->GetPath("/Envelope/Body/FindItemResponse/ResponseMessages/FindItemResponseMessage");
		foreach ($arResponseMessage as $responseMessage)
		{
			$arResponseCode = $responseMessage->GetPath("/FindItemResponseMessage/ResponseCode");
			$responseCode = null;
			if (count($arResponseCode) > 0)
				$responseCode = $arResponseCode[0]->GetContent();

			$responseClass = $responseMessage->GetAttribute("ResponseClass");

			if ((!is_null($responseClass) && ($responseClass != "Success")) || (!is_null($responseCode) && ($responseCode != "NoError")))
			{
				$arMessageText = $responseMessage->GetPath("/FindItemResponseMessage/MessageText");
				$messageText = "Error";
				if (count($arMessageText) > 0)
					$messageText = $arMessageText[0]->GetContent();

				$this->AddError(!is_null($responseCode) ? $this->Encode($responseCode) : $this->Encode($responseClass), $this->Encode($messageText));
				continue;
			}

			$arTaskItem = $responseMessage->GetPath("/FindItemResponseMessage/RootFolder/Items/Task");
			foreach ($arTaskItem as $taskItem)
				$arResultItemsList[] = $this->ConvertTaskToArray($taskItem);
		}

		return $arResultItemsList;
	}

	public function GetById($id, $arAdditionalExtendedProperties = array())
	{
		$this->ClearErrors();

		$request = $this->CreateSOAPRequest("POST", $this->GetPath());
		$request->AddHeader("Content-Type", "text/xml; charset=utf-8");
		$request->AddHeader("SOAPAction", "http://schemas.microsoft.com/exchange/services/2006/messages/GetItem");
		$request->AddHeader("Connection", "Keep-Alive");

		$request->CreateGetItemBody($id, "AllProperties", $arAdditionalExtendedProperties);

		$this->Connect();
		$response = $this->Send($request);
		$this->Disconnect();

		if (is_null($response))
			return null;

		if ($this->ParseError($response))
			return null;

		$arResultItemsList = array();
		$xmlDoc = $response->GetBodyXml();

		$arResponseMessage = $xmlDoc->GetPath("/Envelope/Body/GetItemResponse/ResponseMessages/GetItemResponseMessage");
		foreach ($arResponseMessage as $responseMessage)
		{
			$arResponseCode = $responseMessage->GetPath("/GetItemResponseMessage/ResponseCode");
			$responseCode = null;
			if (count($arResponseCode) > 0)
				$responseCode = $arResponseCode[0]->GetContent();

			$responseClass = $responseMessage->GetAttribute("ResponseClass");

			if ((!is_null($responseClass) && ($responseClass != "Success")) || (!is_null($responseCode) && ($responseCode != "NoError")))
			{
				$arMessageText = $responseMessage->GetPath("/GetItemResponseMessage/MessageText");
				$messageText = "Error";
				if (count($arMessageText) > 0)
					$messageText = $arMessageText[0]->GetContent();

				$this->AddError(!is_null($responseCode) ? $this->Encode($responseCode) : $this->Encode($responseClass), $this->Encode($messageText));
				continue;
			}

			$arTaskItem = $responseMessage->GetPath("/GetItemResponseMessage/Items/Task");
			foreach ($arTaskItem as $taskItem)
				$arResultItemsList[] = $this->ConvertTaskToArray($taskItem);
		}

		return $arResultItemsList;
	}

	public function Add($arFields)
	{
		$this->ClearErrors();

		$request = $this->CreateSOAPRequest("POST", $this->GetPath());
		$request->AddHeader("Content-Type", "text/xml; charset=utf-8");
		$request->AddHeader("SOAPAction", "http://schemas.microsoft.com/exchange/services/2006/messages/CreateItem");
		$request->AddHeader("Connection", "Keep-Alive");

		$arMapTmp = array("folder_id" => "FolderId", "folderid" => "FolderId", "mailbox" => "Mailbox");
		CDavExchangeClient::NormalizeArray($arFields, $arMapTmp);
		if (!array_key_exists("FolderId", $arFields))
			$arFields["FolderId"] = "tasks";

		$arFieldsNew = $this->FormatFieldsArray($arFields);

		$arParentFolderId = array("id" => $arFields["FolderId"]);
		if (array_key_exists("Mailbox", $arFields))
			$arParentFolderId["mailbox"] = $arFields["Mailbox"];

		$request->CreateCreateItemBody($arParentFolderId, $arFieldsNew);

		$this->Connect();
		$response = $this->Send($request);
		$this->Disconnect();

		if (is_null($response))
			return null;

		if ($this->ParseError($response))
			return null;

		$arResultItemsList = array();
		$xmlDoc = $response->GetBodyXml();

		$arResponseMessage = $xmlDoc->GetPath("/Envelope/Body/CreateItemResponse/ResponseMessages/CreateItemResponseMessage");
		foreach ($arResponseMessage as $responseMessage)
		{
			$arResponseCode = $responseMessage->GetPath("/CreateItemResponseMessage/ResponseCode");
			$responseCode = null;
			if (count($arResponseCode) > 0)
				$responseCode = $arResponseCode[0]->GetContent();

			$responseClass = $responseMessage->GetAttribute("ResponseClass");

			if ((!is_null($responseClass) && ($responseClass != "Success")) || (!is_null($responseCode) && ($responseCode != "NoError")))
			{
				$arMessageText = $responseMessage->GetPath("/CreateItemResponseMessage/MessageText");
				$messageText = "Error";
				if (count($arMessageText) > 0)
					$messageText = $arMessageText[0]->GetContent();

				$this->AddError(!is_null($responseCode) ? $this->Encode($responseCode) : $this->Encode($responseClass), $this->Encode($messageText));
				continue;
			}

			$arTaskItem = $responseMessage->GetPath("/CreateItemResponseMessage/Items/Task");
			foreach ($arTaskItem as $taskItem)
				$arResultItemsList[] = $this->ConvertTaskToArray($taskItem);
		}

		return $arResultItemsList;
	}

	public function Update($id, $arFields)
	{
		$this->ClearErrors();

		$request = $this->CreateSOAPRequest("POST", $this->GetPath());
		$request->AddHeader("Content-Type", "text/xml; charset=utf-8");
		$request->AddHeader("SOAPAction", "http://schemas.microsoft.com/exchange/services/2006/messages/UpdateItem");
		$request->AddHeader("Connection", "Keep-Alive");

		$arFieldsNew = $this->FormatFieldsArray($arFields);

		$request->CreateUpdateItemBody($id, $arFieldsNew);

		$this->Connect();
		$response = $this->Send($request);
		$this->Disconnect();

		if (is_null($response))
			return null;

		if ($this->ParseError($response))
			return null;

		$arResultItemsList = array();
		$xmlDoc = $response->GetBodyXml();

		$arResponseMessage = $xmlDoc->GetPath("/Envelope/Body/UpdateItemResponse/ResponseMessages/UpdateItemResponseMessage");
		foreach ($arResponseMessage as $responseMessage)
		{
			$arResponseCode = $responseMessage->GetPath("/UpdateItemResponseMessage/ResponseCode");
			$responseCode = null;
			if (count($arResponseCode) > 0)
				$responseCode = $arResponseCode[0]->GetContent();

			$responseClass = $responseMessage->GetAttribute("ResponseClass");

			if ((!is_null($responseClass) && ($responseClass != "Success")) || (!is_null($responseCode) && ($responseCode != "NoError")))
			{
				$arMessageText = $responseMessage->GetPath("/UpdateItemResponseMessage/MessageText");
				$messageText = "Error";
				if (count($arMessageText) > 0)
					$messageText = $arMessageText[0]->GetContent();

				$this->AddError(!is_null($responseCode) ? $this->Encode($responseCode) : $this->Encode($responseClass), $this->Encode($messageText));
				continue;
			}

			$arTaskItem = $responseMessage->GetPath("/UpdateItemResponseMessage/Items/Task");
			foreach ($arTaskItem as $taskItem)
				$arResultItemsList[] = $this->ConvertTaskToArray($taskItem);
		}

		return $arResultItemsList;
	}

	public function Delete($id)
	{
		$this->ClearErrors();

		$request = $this->CreateSOAPRequest("POST", $this->GetPath());
		$request->AddHeader("Content-Type", "text/xml; charset=utf-8");
		$request->AddHeader("SOAPAction", "http://schemas.microsoft.com/exchange/services/2006/messages/DeleteItem");
		$request->AddHeader("Connection", "Keep-Alive");

		$request->CreateDeleteItemBody($id);

		$this->Connect();
		$response = $this->Send($request);
		$this->Disconnect();

		if (is_null($response))
			return null;

		if ($this->ParseError($response))
			return null;

		$xmlDoc = $response->GetBodyXml();

		$arResponseMessage = $xmlDoc->GetPath("/Envelope/Body/DeleteItemResponse/ResponseMessages/DeleteItemResponseMessage");
		foreach ($arResponseMessage as $responseMessage)
		{
			$arResponseCode = $responseMessage->GetPath("/DeleteItemResponseMessage/ResponseCode");
			$responseCode = null;
			if (count($arResponseCode) > 0)
				$responseCode = $arResponseCode[0]->GetContent();

			$responseClass = $responseMessage->GetAttribute("ResponseClass");

			if ((!is_null($responseClass) && ($responseClass != "Success")) || (!is_null($responseCode) && ($responseCode != "NoError")))
			{
				$arMessageText = $responseMessage->GetPath("/DeleteItemResponseMessage/MessageText");
				$messageText = "Error";
				if (count($arMessageText) > 0)
					$messageText = $arMessageText[0]->GetContent();

				$this->AddError(!is_null($responseCode) ? $this->Encode($responseCode) : $this->Encode($responseClass), $this->Encode($messageText));
				return false;
			}
		}

		return true;
	}

	public function GetFoldersList($arFilter)
	{
		$this->ClearErrors();

		$request = $this->CreateSOAPRequest("POST", $this->GetPath());
		$request->AddHeader("Content-Type", "text/xml; charset=utf-8");
		$request->AddHeader("SOAPAction", "http://schemas.microsoft.com/exchange/services/2006/messages/FindFolder");
		$request->AddHeader("Connection", "Keep-Alive");

		$arMapTmp = array("mailbox" => "Mailbox");
		CDavExchangeClient::NormalizeArray($arFilter, $arMapTmp);

		$arParentFolderId = array("id" => "tasks");
		if (array_key_exists("Mailbox", $arFilter))
			$arParentFolderId["mailbox"] = $arFilter["Mailbox"];

		$request->CreateFindFolderBody($arParentFolderId, "AllProperties");

		$this->Connect();
		$response = $this->Send($request);
		$this->Disconnect();

		if (is_null($response))
			return null;

		if ($this->ParseError($response))
			return null;

		$arResultFoldersList = array();
		try
		{
			$xmlDoc = $response->GetBodyXml();
		}
		catch (Exception $e)
		{
			$this->AddError($e->getCode(), $e->getMessage());
			return null;
		}

		$arResponseMessage = $xmlDoc->GetPath("/Envelope/Body/FindFolderResponse/ResponseMessages/FindFolderResponseMessage");
		foreach ($arResponseMessage as $responseMessage)
		{
			$arResponseCode = $responseMessage->GetPath("/FindFolderResponseMessage/ResponseCode");
			$responseCode = null;
			if (count($arResponseCode) > 0)
				$responseCode = $arResponseCode[0]->GetContent();

			$responseClass = $responseMessage->GetAttribute("ResponseClass");

			if ((!is_null($responseClass) && ($responseClass != "Success")) || (!is_null($responseCode) && ($responseCode != "NoError")))
			{
				$arMessageText = $responseMessage->GetPath("/FindFolderResponseMessage/MessageText");
				$messageText = "Error";
				if (count($arMessageText) > 0)
					$messageText = $arMessageText[0]->GetContent();

				$this->AddError(!is_null($responseCode) ? $this->Encode($responseCode) : $this->Encode($responseClass), $this->Encode($messageText));
				continue;
			}

			$arTaskFolder = $responseMessage->GetPath("/FindFolderResponseMessage/RootFolder/Folders/TasksFolder");
			foreach ($arTaskFolder as $taskFolder)
				$arResultFoldersList[] = $this->ConvertTaskFolderToArray($taskFolder);
		}

		return $arResultFoldersList;
	}

	public function GetFolderById($id)
	{
		$this->ClearErrors();

		$request = $this->CreateSOAPRequest("POST", $this->GetPath());
		$request->AddHeader("Content-Type", "text/xml; charset=utf-8");
		$request->AddHeader("SOAPAction", "http://schemas.microsoft.com/exchange/services/2006/messages/GetFolder");
		$request->AddHeader("Connection", "Keep-Alive");

		$request->CreateGetFolderBody($id, "AllProperties");

		$this->Connect();
		$response = $this->Send($request);
		$this->Disconnect();

		if (is_null($response))
			return null;

		if ($this->ParseError($response))
			return null;

		$arResultFoldersList = array();
		$xmlDoc = $response->GetBodyXml();

		$arResponseMessage = $xmlDoc->GetPath("/Envelope/Body/GetFolderResponse/ResponseMessages/GetFolderResponseMessage");
		foreach ($arResponseMessage as $responseMessage)
		{
			$arResponseCode = $responseMessage->GetPath("/GetFolderResponseMessage/ResponseCode");
			$responseCode = null;
			if (count($arResponseCode) > 0)
				$responseCode = $arResponseCode[0]->GetContent();

			$responseClass = $responseMessage->GetAttribute("ResponseClass");

			if ((!is_null($responseClass) && ($responseClass != "Success")) || (!is_null($responseCode) && ($responseCode != "NoError")))
			{
				$arMessageText = $responseMessage->GetPath("/GetFolderResponseMessage/MessageText");
				$messageText = "Error";
				if (count($arMessageText) > 0)
					$messageText = $arMessageText[0]->GetContent();

				$this->AddError(!is_null($responseCode) ? $this->Encode($responseCode) : $this->Encode($responseClass), $this->Encode($messageText));
				continue;
			}

			$arTaskFolder = $responseMessage->GetPath("/GetFolderResponseMessage/Folders/TasksFolder");
			foreach ($arTaskFolder as $taskFolder)
				$arResultFoldersList[] = $this->ConvertTaskFolderToArray($taskFolder);
		}

		return $arResultFoldersList;
	}

	public function AddFolder($arFields)
	{
		$this->ClearErrors();

		$request = $this->CreateSOAPRequest("POST", $this->GetPath());
		$request->AddHeader("Content-Type", "text/xml; charset=utf-8");
		$request->AddHeader("SOAPAction", "http://schemas.microsoft.com/exchange/services/2006/messages/CreateFolder");
		$request->AddHeader("Connection", "Keep-Alive");

		$arMapTmp = array("mailbox" => "Mailbox");
		CDavExchangeClient::NormalizeArray($arFields, $arMapTmp);

		$arFieldsNew = $this->FormatFolderFieldsArray($arFields);

		$arParentFolderId = array("id" => "tasks");
		if (array_key_exists("Mailbox", $arFields))
			$arParentFolderId["mailbox"] = $arFields["Mailbox"];

		$request->CreateCreateFolderBody($arParentFolderId, $arFieldsNew);

		$this->Connect();
		$response = $this->Send($request);
		$this->Disconnect();

		if (is_null($response))
			return null;

		if ($this->ParseError($response))
			return null;

		$arResultFoldersList = array();
		$xmlDoc = $response->GetBodyXml();

		$arResponseMessage = $xmlDoc->GetPath("/Envelope/Body/CreateFolderResponse/ResponseMessages/CreateFolderResponseMessage");
		foreach ($arResponseMessage as $responseMessage)
		{
			$arResponseCode = $responseMessage->GetPath("/CreateFolderResponseMessage/ResponseCode");
			$responseCode = null;
			if (count($arResponseCode) > 0)
				$responseCode = $arResponseCode[0]->GetContent();

			$responseClass = $responseMessage->GetAttribute("ResponseClass");

			if ((!is_null($responseClass) && ($responseClass != "Success")) || (!is_null($responseCode) && ($responseCode != "NoError")))
			{
				$arMessageText = $responseMessage->GetPath("/CreateFolderResponseMessage/MessageText");
				$messageText = "Error";
				if (count($arMessageText) > 0)
					$messageText = $arMessageText[0]->GetContent();

				$this->AddError(!is_null($responseCode) ? $this->Encode($responseCode) : $this->Encode($responseClass), $this->Encode($messageText));
				continue;
			}

			$arTaskFolder = $responseMessage->GetPath("/CreateFolderResponseMessage/Folders/TasksFolder");
			foreach ($arTaskFolder as $taskFolder)
				$arResultFoldersList[] = $this->ConvertTaskFolderToArray($taskFolder);
		}

		return $arResultFoldersList;
	}

	public function UpdateFolder($id, $arFields)
	{
		$this->ClearErrors();

		$request = $this->CreateSOAPRequest("POST", $this->GetPath());
		$request->AddHeader("Content-Type", "text/xml; charset=utf-8");
		$request->AddHeader("SOAPAction", "http://schemas.microsoft.com/exchange/services/2006/messages/UpdateFolder");
		$request->AddHeader("Connection", "Keep-Alive");

		$arFieldsNew = $this->FormatFolderFieldsArray($arFields);

		$request->CreateUpdateFolderBody($id, $arFieldsNew);

		$this->Connect();
		$response = $this->Send($request);
		$this->Disconnect();

		if (is_null($response))
			return null;

		if ($this->ParseError($response))
			return null;

		$arResultFoldersList = array();
		$xmlDoc = $response->GetBodyXml();

		$arResponseMessage = $xmlDoc->GetPath("/Envelope/Body/UpdateFolderResponse/ResponseMessages/UpdateFolderResponseMessage");
		foreach ($arResponseMessage as $responseMessage)
		{
			$arResponseCode = $responseMessage->GetPath("/UpdateFolderResponseMessage/ResponseCode");
			$responseCode = null;
			if (count($arResponseCode) > 0)
				$responseCode = $arResponseCode[0]->GetContent();

			$responseClass = $responseMessage->GetAttribute("ResponseClass");

			if ((!is_null($responseClass) && ($responseClass != "Success")) || (!is_null($responseCode) && ($responseCode != "NoError")))
			{
				$arMessageText = $responseMessage->GetPath("/UpdateFolderResponseMessage/MessageText");
				$messageText = "Error";
				if (count($arMessageText) > 0)
					$messageText = $arMessageText[0]->GetContent();

				$this->AddError(!is_null($responseCode) ? $this->Encode($responseCode) : $this->Encode($responseClass), $this->Encode($messageText));
				continue;
			}

			$arTaskFolder = $responseMessage->GetPath("/UpdateFolderResponseMessage/Folders/TasksFolder");
			foreach ($arTaskFolder as $taskFolder)
				$arResultFoldersList[] = $this->ConvertTaskFolderToArray($taskFolder);
		}

		return $arResultFoldersList;
	}

	public function DeleteFolder($id)
	{
		$this->ClearErrors();

		$request = $this->CreateSOAPRequest("POST", $this->GetPath());
		$request->AddHeader("Content-Type", "text/xml; charset=utf-8");
		$request->AddHeader("SOAPAction", "http://schemas.microsoft.com/exchange/services/2006/messages/DeleteFolder");
		$request->AddHeader("Connection", "Keep-Alive");

		$request->CreateDeleteFolderBody($id);

		$this->Connect();
		$response = $this->Send($request);
		$this->Disconnect();

		if (is_null($response))
			return null;

		if ($this->ParseError($response))
			return null;

		$xmlDoc = $response->GetBodyXml();

		$arResponseMessage = $xmlDoc->GetPath("/Envelope/Body/DeleteFolderResponse/ResponseMessages/DeleteFolderResponseMessage");
		foreach ($arResponseMessage as $responseMessage)
		{
			$arResponseCode = $responseMessage->GetPath("/DeleteFolderResponseMessage/ResponseCode");
			$responseCode = null;
			if (count($arResponseCode) > 0)
				$responseCode = $arResponseCode[0]->GetContent();

			$responseClass = $responseMessage->GetAttribute("ResponseClass");

			if ((!is_null($responseClass) && ($responseClass != "Success")) || (!is_null($responseCode) && ($responseCode != "NoError")))
			{
				$arMessageText = $responseMessage->GetPath("/DeleteFolderResponseMessage/MessageText");
				$messageText = "Error";
				if (count($arMessageText) > 0)
					$messageText = $arMessageText[0]->GetContent();

				$this->AddError(!is_null($responseCode) ? $this->Encode($responseCode) : $this->Encode($responseClass), $this->Encode($messageText));
				return false;
			}
		}

		return true;
	}

	private function FormatFieldsArray($arFields)
	{
		$arFieldsNew = array();

		$arMap = array(
			"XML_ID" => "Id",
			"SUBJECT" => "Subject",
			"BODY" => "Body",
			"BODY_TYPE" => "BodyType",
			"DATE_CREATE" => "DateTimeCreated",
			"IMPORTANCE" => "Importance",
			'GUID' => array(	// Extended field. Must be represented as array
				'PropertyName' => 'BX_TASKS_GUID',
				'PropertyType' => 'String',
				'Value'        => 'not inited yet'	// will be initialized later
			),
			'SERIALIZED_DATA' => array(	// Extended field. Must be represented as array
				'PropertyName' => 'BX_TASKS_SERIALIZED_DATA',
				'PropertyType' => 'String',
				'Value'        => 'not inited yet'	// will be initialized later
			),
			"ACTUAL_WORK" => "ActualWork",
			"BILLING_INFORMATION" => "BillingInformation",
			"MILEAGE" => "Mileage",
			"START_DATE" => "StartDate",
			"DUE_DATE" => "DueDate",
			"IS_COMPLETE" => "IsComplete",
			"PERCENT_COMPLETE" => "PercentComplete",
			"STATUS" => "Status",
			//"STATUS_DESCRIPTION" => "StatusDescription",
			"TOTAL_WORK" => "TotalWork",
			"OWNER" => "Owner",
			"REMINDER_MINUTES_BEFORE_START" => "ReminderMinutesBeforeStart",
			"RECURRING_TYPE" => "RecurringType",
			"RECURRING_INTERVAL" => "RecurringInterval",
			"RECURRING_DAYOFMONTH" => "RecurringDayOfMonth",
			"RECURRING_DAYSOFWEEK" => "RecurringDaysOfWeek",
			"RECURRING_DAYOFWEEKINDEX" => "RecurringDayOfWeekIndex",
			"RECURRING_MONTH" => "RecurringMonth",
			"RECURRING_STARTDATE" => "RecurringStartDate",
			"RECURRING_NUMBEROFOCCURRENCES" => "RecurringNumberOfOccurrences",
			"RECURRING_ENDDATE" => "RecurringEndDate",
		);

		foreach ($arFields as $key => $value)
		{
			if (!array_key_exists($key, $arMap))
				continue;

			$newKey = $arMap[$key];
			if (is_array($newKey))
			{
				$arFieldsNew[$key] = $newKey;
				$arFieldsNew[$key]['Value'] = base64_encode($this->Decode($value));
			}
			elseif (in_array($newKey, array("DateTimeCreated", "StartDate", "DueDate")))
			{
				$arFieldsNew[$newKey] = date("c", MakeTimeStamp($value));
			}
			elseif (in_array($newKey, array("RecurringStartDate", "RecurringEndDate")))
			{
				$arFieldsNew[$newKey] = date("Y-m-d\Z", MakeTimeStamp($value));
			}
			elseif ($this->FormatStandartFieldsArray($newKey, $value, $arFieldsNew)
				|| $this->FormatRecurrenceFieldsArray($newKey, $value, $arFieldsNew))
			{

			}
			else
			{
				$arFieldsNew[$newKey] = $this->Decode($value);
			}
		}

		if (isset($arFieldsNew["ReminderMinutesBeforeStart"]) && intval($arFieldsNew["ReminderMinutesBeforeStart"]) > 0)
		{
			$arFieldsNew["ReminderMinutesBeforeStart"] = intval($arFieldsNew["ReminderMinutesBeforeStart"]);
			$arFieldsNew["ReminderIsSet"] = true;
		}

		return $arFieldsNew;
	}

	private function FormatFolderFieldsArray($arFields)
	{
		$arFieldsNew = array();

		foreach ($arFields as $key => $value)
		{
			switch ($key)
			{
				case "NAME":
					$arFieldsNew["DisplayName"] = $this->Decode($value);
					break;
			}
		}

		return $arFieldsNew;
	}

	private function ConvertTaskToArray($taskItem)
	{
		$arResultItem = array();

		$arItemId = $taskItem->GetPath("/Task/ItemId");
		if (count($arItemId) > 0)
		{
			$arResultItem["XML_ID"] = $arItemId[0]->GetAttribute("Id");
			$arResultItem["MODIFICATION_LABEL"] = $arItemId[0]->GetAttribute("ChangeKey");
		}

		$arSubject = $taskItem->GetPath("/Task/Subject");
		if (count($arSubject) > 0)
			$arResultItem["SUBJECT"] = $this->Encode($arSubject[0]->GetContent());

		$arBody = $taskItem->GetPath("/Task/Body");
		if (count($arBody) > 0)
		{
			$arResultItem["BODY"] = $this->Encode($arBody[0]->GetContent());
			$arResultItem["BODY_TYPE"] = $arBody[0]->GetAttribute("BodyType");
		}

		$arDateTimeCreated = $taskItem->GetPath("/Task/DateTimeCreated");
		if (count($arDateTimeCreated) > 0)
			$arResultItem["DATE_CREATE"] = CDavICalendarTimeZone::GetFormattedServerDateTime($arDateTimeCreated[0]->GetContent());

		$arImportance = $taskItem->GetPath("/Task/Importance");
		if (count($arImportance) > 0)
			$arResultItem["IMPORTANCE"] = $arImportance[0]->GetContent();

		$arReminderIsSet = $taskItem->GetPath("/Task/ReminderIsSet");
		if ((count($arReminderIsSet) > 0) && ($arReminderIsSet[0]->GetContent() == "true"))
		{
			$arReminderMinutesBeforeStart = $taskItem->GetPath("/Task/ReminderMinutesBeforeStart");
			if (count($arReminderMinutesBeforeStart) > 0)
				$arResultItem["REMINDER_MINUTES_BEFORE_START"] = $arReminderMinutesBeforeStart[0]->GetContent();
		}

		$arActualWork = $taskItem->GetPath("/Task/ActualWork");
		if (count($arActualWork) > 0)
			$arResultItem["ACTUAL_WORK"] = $arActualWork[0]->GetContent();

		$arBillingInformation = $taskItem->GetPath("/Task/BillingInformation");
		if (count($arBillingInformation) > 0)
			$arResultItem["BILLING_INFORMATION"] = $arBillingInformation[0]->GetContent();

		$arMileage = $taskItem->GetPath("/Task/Mileage");
		if (count($arMileage) > 0)
			$arResultItem["MILEAGE"] = $arMileage[0]->GetContent();

		$arStartDate = $taskItem->GetPath("/Task/StartDate");
		if (count($arStartDate) > 0)
			$arResultItem["START_DATE"] = CDavICalendarTimeZone::GetFormattedServerDateTime($arStartDate[0]->GetContent());

		$arDueDate = $taskItem->GetPath("/Task/DueDate");
		if (count($arDueDate) > 0)
			$arResultItem["DUE_DATE"] = CDavICalendarTimeZone::GetFormattedServerDateTime($arDueDate[0]->GetContent());

		$arIsComplete = $taskItem->GetPath("/Task/IsComplete");
		if (count($arIsComplete) > 0)
			$arResultItem["IS_COMPLETE"] = (($arIsComplete[0]->GetContent() == "true") ? true : false);

		$arIsRecurring = $taskItem->GetPath("/Task/IsRecurring");
		if (count($arIsRecurring) > 0)
			$arResultItem["IS_RECURRING"] = (($arIsRecurring[0]->GetContent() == "true") ? true : false);

		$arRecurrence = $taskItem->GetPath("/Task/Recurrence");
		if (count($arRecurrence) > 0)
		{
			$ar = $this->ConvertRecurrenceToArray($arRecurrence[0]);
			if (count($ar) > 0)
			{
				$arResultItem = array_merge($arResultItem, $ar);
				$arResultItem["IS_RECURRING"] = true;
			}
		}

		$arPercentComplete = $taskItem->GetPath("/Task/PercentComplete");
		if (count($arPercentComplete) > 0)
			$arResultItem["PERCENT_COMPLETE"] = $arPercentComplete[0]->GetContent();

		$arStatus = $taskItem->GetPath("/Task/Status");
		if (count($arStatus) > 0)
			$arResultItem["STATUS"] = $arStatus[0]->GetContent();

		$arExtendedProperty = $taskItem->GetPath("/Task/ExtendedProperty");
		$extendedPropertiesCount = count($arExtendedProperty);
		for ($i = 0; $i < $extendedPropertiesCount; $i++)
		{
			$arTmp = $arExtendedProperty[$i]->GetContent();

			$propertyName  = $arTmp[0]->GetAttribute('PropertyName');
			$propertyValue = $arTmp[1]->GetContent();

			$arResultItem['ExtendedProperty'][$i] = array(
				'Name'  => $propertyName,
				'Value' => $this->Encode(base64_decode($propertyValue))
			);
		}

		$arStatusDescription = $taskItem->GetPath("/Task/StatusDescription");
		if (count($arStatusDescription) > 0)
			$arResultItem["STATUS_DESCRIPTION"] = $arStatusDescription[0]->GetContent();

		$arTotalWork = $taskItem->GetPath("/Task/TotalWork");
		if (count($arTotalWork) > 0)
			$arResultItem["TOTAL_WORK"] = $arTotalWork[0]->GetContent();

		$arOwner = $taskItem->GetPath("/Task/Owner");
		if (count($arOwner) > 0)
			$arResultItem["OWNER"] = $this->Encode($arOwner[0]->GetContent());

		return $arResultItem;
	}

	private function ConvertTaskFolderToArray($calendarFolder)
	{
		$arResultFolder = array();

		$arFolderId = $calendarFolder->GetPath("/TasksFolder/FolderId");
		if (count($arFolderId) > 0)
		{
			$arResultFolder["XML_ID"] = $arFolderId[0]->GetAttribute("Id");
			$arResultFolder["MODIFICATION_LABEL"] = $arFolderId[0]->GetAttribute("ChangeKey");
		}

		$arDisplayName = $calendarFolder->GetPath("/TasksFolder/DisplayName");
		if (count($arDisplayName) > 0)
			$arResultFolder["NAME"] = $this->Encode($arDisplayName[0]->GetContent());

		$arTotalCount = $calendarFolder->GetPath("/TasksFolder/TotalCount");
		if (count($arTotalCount) > 0)
			$arResultFolder["TOTAL_COUNT"] = $arTotalCount[0]->GetContent();

		$arChildFolderCount = $calendarFolder->GetPath("/TasksFolder/ChildFolderCount");
		if (count($arChildFolderCount) > 0)
			$arResultFolder["CHILD_FOLDER_COUNT"] = $arChildFolderCount[0]->GetContent();

		return $arResultFolder;
	}

	public function CreateItemBody($arFields)
	{
		$itemBody  = "    <Task xmlns=\"http://schemas.microsoft.com/exchange/services/2006/types\">\r\n";
		$itemBody .= "     <ItemClass>IPM.Task</ItemClass>\r\n";

		$arMap = array_merge(self::$arMapItem, self::$arMapExtendedFields, self::$arMapTask);
		foreach ($arMap as $key)
		{
			if (!array_key_exists($key, $arFields))
				continue;

			$value = $arFields[$key];

			$itemBody .= $this->CreateUpdateField($key, $value, $arFields);
		}

		$itemBody .= "    </Task>\r\n";

		return $itemBody;
	}

	public function UpdateItemAttributes()
	{
		return "ConflictResolution=\"AlwaysOverwrite\"";
	}

	public function UpdateItemBody($arFields)
	{
		$itemBody = "";

		$arMap = array_merge(self::$arMapItem, self::$arMapExtendedFields, self::$arMapTask);
		foreach ($arMap as $key)
		{
			if (!array_key_exists($key, $arFields))
				continue;

			$value = $arFields[$key];
			$fieldUri = (in_array($key, self::$arMapTask) ? "task" : "item").":".htmlspecialcharsbx($key);

			if (is_null($value))
			{
				//$itemBody .= "      <DeleteItemField><FieldURI FieldURI=\"".$fieldUri."\"/></DeleteItemField>\r\n";
			}
			else
			{
				$itemBody .= "      <SetItemField>\r\n";

				if (is_array($value))	// Extended fields are represented as arrays
				{
					$itemBody .= '       <ExtendedFieldURI DistinguishedPropertySetId="PublicStrings" '
								. 'PropertyName="' . $value['PropertyName'] . '" '
								. 'PropertyType="' . $value['PropertyType'] . '"/>' . "\r\n";
				}
				else
					$itemBody .= "       <FieldURI FieldURI=\"".$fieldUri."\"/>\r\n";

				$itemBody .= "       <Task>\r\n";
				$itemBody .= $this->CreateUpdateField($key, $value, $arFields);
				$itemBody .= "       </Task>\r\n";
				$itemBody .= "      </SetItemField>\r\n";
			}
		}

		return $itemBody;
	}

	private function CreateUpdateField($key, $value, &$arFields)
	{
		$itemBody = "";

		if ($key == "Body")
		{
			$itemBody .= "     <Body";
			if (array_key_exists("BodyType", $arFields))
				$itemBody .= " BodyType=\"".(strtolower($arFields["BodyType"]) == "html" ? "HTML" : "Text")."\"";
			$itemBody .= ">".htmlspecialcharsbx($value)."</Body>\r\n";
		}
		elseif ($key == "Recurrence")
		{
			$ar = array("MONTHLY_ABSOLUTE" => "AbsoluteMonthlyRecurrence", "MONTHLY_RELATIVE" => "RelativeMonthlyRecurrence", "YEARLY_ABSOLUTE" => "AbsoluteYearlyRecurrence", "YEARLY_RELATIVE" => "RelativeYearlyRecurrence", "WEEKLY" => "WeeklyRecurrence", "DAILY" => "DailyRecurrence");

			if (isset($arFields["RecurringType"]) && array_key_exists($arFields["RecurringType"], $ar))
			{
				$rnode = $ar[$arFields["RecurringType"]];

				$itemBody .= "     <Recurrence>\r\n";
				$itemBody .= "      <".$rnode.">\r\n";

				if ($arFields["RecurringType"] == "MONTHLY_ABSOLUTE")
				{
					if (isset($arFields["RecurringInterval"]))
						$itemBody .= "       <Interval>".htmlspecialcharsbx($arFields["RecurringInterval"])."</Interval>\r\n";
					if (isset($arFields["RecurringDayOfMonth"]))
						$itemBody .= "       <DayOfMonth>".htmlspecialcharsbx($arFields["RecurringDayOfMonth"])."</DayOfMonth>\r\n";
				}
				elseif ($arFields["RecurringType"] == "MONTHLY_RELATIVE")
				{
					if (isset($arFields["RecurringInterval"]))
						$itemBody .= "       <Interval>".htmlspecialcharsbx($arFields["RecurringInterval"])."</Interval>\r\n";
					if (isset($arFields["RecurringDaysOfWeek"]))
						$itemBody .= "       <DaysOfWeek>".htmlspecialcharsbx($arFields["RecurringDaysOfWeek"])."</DaysOfWeek>\r\n";
					if (isset($arFields["RecurringDayOfWeekIndex"]))
						$itemBody .= "       <DayOfWeekIndex>".htmlspecialcharsbx($arFields["RecurringDayOfWeekIndex"])."</DayOfWeekIndex>\r\n";
				}
				elseif ($arFields["RecurringType"] == "YEARLY_ABSOLUTE")
				{
					if (isset($arFields["RecurringDayOfMonth"]))
						$itemBody .= "       <DayOfMonth>".htmlspecialcharsbx($arFields["RecurringDayOfMonth"])."</DayOfMonth>\r\n";
					if (isset($arFields["RecurringMonth"]))
						$itemBody .= "       <Month>".htmlspecialcharsbx($arFields["RecurringMonth"])."</Month>\r\n";
				}
				elseif ($arFields["RecurringType"] == "YEARLY_RELATIVE")
				{
					if (isset($arFields["RecurringDaysOfWeek"]))
						$itemBody .= "       <DaysOfWeek>".htmlspecialcharsbx($arFields["RecurringDaysOfWeek"])."</DaysOfWeek>\r\n";
					if (isset($arFields["RecurringDayOfWeekIndex"]))
						$itemBody .= "       <DayOfWeekIndex>".htmlspecialcharsbx($arFields["RecurringDayOfWeekIndex"])."</DayOfWeekIndex>\r\n";
					if (isset($arFields["RecurringMonth"]))
						$itemBody .= "       <Month>".htmlspecialcharsbx($arFields["RecurringMonth"])."</Month>\r\n";
				}
				elseif ($arFields["RecurringType"] == "WEEKLY")
				{
					if (isset($arFields["RecurringInterval"]))
						$itemBody .= "       <Interval>".htmlspecialcharsbx($arFields["RecurringInterval"])."</Interval>\r\n";
					if (isset($arFields["RecurringDaysOfWeek"]))
						$itemBody .= "       <DaysOfWeek>".htmlspecialcharsbx($arFields["RecurringDaysOfWeek"])."</DaysOfWeek>\r\n";
				}
				elseif ($arFields["RecurringType"] == "DAILY")
				{
					if (isset($arFields["RecurringInterval"]))
						$itemBody .= "       <Interval>".htmlspecialcharsbx($arFields["RecurringInterval"])."</Interval>\r\n";
				}

				$itemBody .= "      </".$rnode.">\r\n";

				if (isset($arFields["RecurringEndDate"]))
				{
					$itemBody .= "      <EndDateRecurrence>\r\n";
					if (isset($arFields["RecurringStartDate"]))
						$itemBody .= "      <StartDate>".htmlspecialcharsbx($arFields["RecurringStartDate"])."</StartDate>\r\n";
					$itemBody .= "      <EndDate>".htmlspecialcharsbx($arFields["RecurringEndDate"])."</EndDate>\r\n";
					$itemBody .= "      </EndDateRecurrence>\r\n";
				}
				elseif (isset($arFields["RecurringNumberOfOccurrences"]))
				{
					$itemBody .= "      <NumberedRecurrence>\r\n";
					if (isset($arFields["RecurringStartDate"]))
						$itemBody .= "      <StartDate>".htmlspecialcharsbx($arFields["RecurringStartDate"])."</StartDate>\r\n";
					$itemBody .= "      <NumberOfOccurrences>".htmlspecialcharsbx($arFields["RecurringNumberOfOccurrences"])."</NumberOfOccurrences>\r\n";
					$itemBody .= "      </NumberedRecurrence>\r\n";
				}
				else
				{
					$itemBody .= "      <NoEndRecurrence>\r\n";
					if (isset($arFields["RecurringStartDate"]))
						$itemBody .= "      <StartDate>".htmlspecialcharsbx($arFields["RecurringStartDate"])."</StartDate>\r\n";
					$itemBody .= "      </NoEndRecurrence>\r\n";
				}

				$itemBody .= "     </Recurrence>\r\n";
			}
		}
		elseif (is_array($value))	// Extended fields represented as arrays
		{
			$propertyName = $value['PropertyName'];
			$propertyType = $value['PropertyType'];
			$propertyValue = $value['Value'];

			$itemBody .= '     <ExtendedProperty>' . "\r\n";
			$itemBody .= '      <ExtendedFieldURI '
				. 'DistinguishedPropertySetId="PublicStrings" '
				. 'PropertyName="' . $propertyName . '" '
				. 'PropertyType="' . $propertyType . '" /> ' . "\r\n"
				. '      <Value>' . htmlspecialcharsbx($propertyValue) . '</Value>' . "\r\n";
			$itemBody .= '     </ExtendedProperty>' . "\r\n";
		}
		else
		{
			$itemBody .= "     <".htmlspecialcharsbx($key).">";
			if (is_bool($value))
				$itemBody .= ($value ? "true" : "false");
			else
				$itemBody .= htmlspecialcharsbx($value);
			$itemBody .= "</".htmlspecialcharsbx($key).">\r\n";
		}

		return $itemBody;
	}

	public function CreateFolderBody($arFields)
	{
		$itemBody  = "    <TasksFolder xmlns=\"http://schemas.microsoft.com/exchange/services/2006/types\">\r\n";
		//$itemBody .= "     <FolderClass>IPF.Task</FolderClass>\r\n";
		$itemBody .= "     <DisplayName>".htmlspecialcharsbx($arFields["DisplayName"])."</DisplayName>\r\n";
		$itemBody .= "    </TasksFolder>\r\n";
		return $itemBody;
	}

	public function UpdateFolderBody($arFields)
	{
		$itemBody = "";

		$itemBody .= "      <SetFolderField>\r\n";
		$itemBody .= "       <FieldURI FieldURI=\"folder:DisplayName\"/>\r\n";
		$itemBody .= "       <TasksFolder>\r\n";
		$itemBody .= "        <DisplayName>".htmlspecialcharsbx($arFields["DisplayName"])."</DisplayName>\r\n";
		$itemBody .= "       </TasksFolder>\r\n";
		$itemBody .= "      </SetFolderField>\r\n";

		return $itemBody;
	}

	private static function InitUserEntity()
	{
		if (!CModule::IncludeModule("tasks"))
			return;

		$arRequiredFields = array(
			"UF_BXDAVEX_TSKSYNC" => array(
				"USER_TYPE_ID" => "datetime",
				"SORT" => 100,
				"EDIT_FORM_LABEL_DEFAULT_MESSAGE" => "Tasks sync date",
			)
		);

		$arUserCustomFields = $GLOBALS["USER_FIELD_MANAGER"]->GetUserFields("USER");
		foreach ($arUserCustomFields as $key => $value)
		{
			if (array_key_exists($key, $arRequiredFields))
				unset($arRequiredFields[$key]);
		}

		foreach ($arRequiredFields as $requiredFieldKey => $requiredFieldValue)
		{
			$arFields = array(
				"ENTITY_ID" => "USER",
				"FIELD_NAME" => $requiredFieldKey,
				"SHOW_IN_LIST" => "N",
				"IS_SEARCHABLE" => "N",
				"SHOW_FILTER" => "N",
				"EDIT_IN_LIST" => "N",
				"EDIT_FORM_LABEL" => CDavExchangeClient::InitUserEntityLoadMessages($requiredFieldKey, $requiredFieldValue["EDIT_FORM_LABEL_DEFAULT_MESSAGE"]),
			);
			$obUserField = new CUserTypeEntity;
			$obUserField->Add(array_merge($arFields, $requiredFieldValue));
		}
	}

	public static function DataSync($paramUserId = 0)
	{
		$exchangeScheme = COption::GetOptionString("dav", "exchange_scheme", "http");
		$exchangeServer = COption::GetOptionString("dav", "exchange_server", "");
		$exchangePort = COption::GetOptionString("dav", "exchange_port", "80");
		$exchangeUsername = COption::GetOptionString("dav", "exchange_username", "");
		$exchangePassword = COption::GetOptionString("dav", "exchange_password", "");

		if (empty($exchangeServer)/* || (COption::GetOptionString("dav", "agent_tasks", "N") != "Y")*/)
		{
			CAgent::RemoveAgent("CDavExchangeTasks::DataSync();", "dav");
			COption::SetOptionString("dav", "agent_tasks", "N");
			return "";
		}

		$exchange = new CDavExchangeTasks($exchangeScheme, $exchangeServer, $exchangePort, $exchangeUsername, $exchangePassword);

		$exchangeMailbox = COption::GetOptionString("dav", "exchange_mailbox", "");
		$exchangeUseLogin = COption::GetOptionString("dav", "exchange_use_login", "Y");

		self::InitUserEntity();

		$maxNumber = COption::GetOptionString("dav", "users_by_step", "5");
		$index = 0;

		$paramUserId = intval($paramUserId);
		$arUserFilter = array("ACTIVE" => "Y", "!UF_DEPARTMENT" => false);
		if ($paramUserId > 0)
			$arUserFilter["ID_EQUAL_EXACT"] = $paramUserId;
		if ($exchangeUseLogin == "N")
			$arUserFilter["!UF_BXDAVEX_MAILBOX"] = false;

		$arAdditionalExtendedProperties = array(
			array(
				'DistinguishedPropertySetId' => 'PublicStrings',
				'PropertyName'               => 'BX_TASKS_GUID',
				'PropertyType'               => 'String'
			),
			array(
				'DistinguishedPropertySetId' => 'PublicStrings',
				'PropertyName'               => 'BX_TASKS_SERIALIZED_DATA',
				'PropertyType'               => 'String'
			),
		);

		$dbUserList = CUser::GetList($by = "UF_BXDAVEX_TSKSYNC", $order = "asc", $arUserFilter, array("SELECT" => array("ID", "LOGIN", "UF_BXDAVEX_MAILBOX", "UF_BXDAVEX_TSKSYNC")));
		while ($arUser = $dbUserList->Fetch())
		{
			$index++;
			if ($index > $maxNumber)
				break;

			$GLOBALS["USER_FIELD_MANAGER"]->Update("USER", $arUser["ID"], array("UF_BXDAVEX_TSKSYNC" => ConvertTimeStamp(time(), FULL)));

			$mailbox = (($exchangeUseLogin == "Y") ? $arUser["LOGIN"].$exchangeMailbox : $arUser["UF_BXDAVEX_MAILBOX"]);
			if (empty($mailbox))
				continue;

			$arFoldersList = $exchange->GetFoldersList(array("mailbox" => $mailbox));
			if ( ! is_array($arFoldersList) )
			{
				if (DAV_CALDAV_DEBUG)
					CDav::WriteToLog('Error during tasks exchange: $exchange->GetFoldersList() returns unexpected result', '');
				continue;
			}

			$arUserFolders = array("tasks" => GetMessage("DAV_EC_TASKS"));
			foreach ($arFoldersList as $value)
				$arUserFolders[$value["XML_ID"]] = $value["NAME"];

			$arUserTaskItems = array();
			$arUserTaskItemsFolder = array();
			foreach ($arUserFolders as $userFolderXmlId => $userFolder)
			{
				$arTaskItemsList = $exchange->GetList(
					array("mailbox" => $mailbox, "FolderId" => $userFolderXmlId),
					array("ItemShape" => "IdOnly"),
					$arAdditionalExtendedProperties
				);
				if ( ! is_array($arTaskItemsList) )
				{
					if (DAV_CALDAV_DEBUG)
						CDav::WriteToLog('Error during tasks exchange: $exchange->GetList() returns unexpected result', '');
					continue;
				}

				foreach ($arTaskItemsList as $value)
				{
					$arUserTaskItems[] = array(
						"XML_ID" => $value["XML_ID"],
						"MODIFICATION_LABEL" => $value["MODIFICATION_LABEL"],
					);
					$arUserTaskItemsFolder[$value["XML_ID"]] = $userFolderXmlId;
				}
			}

			$arModifiedUserTaskItems = CTaskSync::SyncTaskItems("exchange", $arUser["ID"], $arUserTaskItems);

			foreach ($arModifiedUserTaskItems as $value)
			{
				$arModifiedTaskItem = $exchange->GetById($value["XML_ID"], $arAdditionalExtendedProperties);
				if (is_array($arModifiedTaskItem) && count($arModifiedTaskItem) > 0)
				{
					$arModifiedTaskItem = $arModifiedTaskItem[0];

					$arModifyEventArray = array_merge(
						$arModifiedTaskItem,
						array(
							"ID" => $value["ID"],
							"USER_ID" => $arUser["ID"],
							"FOLDER_ID" => $arUserFolders[$arUserTaskItemsFolder[$arModifiedTaskItem["XML_ID"]]]
						)
					);

					//XML_ID, MODIFICATION_LABEL, SUBJECT, BODY, BODY_TYPE, DATE_CREATE, IMPORTANCE, REMINDER_MINUTES_BEFORE_START, ACTUAL_WORK, BILLING_INFORMATION, MILEAGE, START_DATE, DUE_DATE, IS_COMPLETE, IS_RECURRING, PERCENT_COMPLETE, STATUS, STATUS_DESCRIPTION, TOTAL_WORK, OWNER, RECURRING_TYPE, RECURRING_INTERVAL, RECURRING_DAYOFMONTH, RECURRING_DAYSOFWEEK, RECURRING_DAYOFWEEKINDEX, RECURRING_MONTH, RECURRING_STARTDATE, RECURRING_NUMBEROFOCCURRENCES, RECURRING_ENDDATE

					CTaskSync::SyncModifyTaskItem($arModifyEventArray);
				}
			}
		}

		return "CDavExchangeTasks::DataSync();";
	}

	public static function DoAddItem($userId, $arFields)
	{
		$exchangeScheme = COption::GetOptionString("dav", "exchange_scheme", "http");
		$exchangeServer = COption::GetOptionString("dav", "exchange_server", "");
		$exchangePort = COption::GetOptionString("dav", "exchange_port", "80");
		$exchangeUsername = COption::GetOptionString("dav", "exchange_username", "");
		$exchangePassword = COption::GetOptionString("dav", "exchange_password", "");

		if (empty($exchangeServer))
			return "";

		$exchange = new CDavExchangeTasks($exchangeScheme, $exchangeServer, $exchangePort, $exchangeUsername, $exchangePassword);

		$exchangeMailbox = COption::GetOptionString("dav", "exchange_mailbox", "");
		$exchangeUseLogin = COption::GetOptionString("dav", "exchange_use_login", "Y");

		self::InitUserEntity();

		$userId = intval($userId);
		$dbUserList = CUser::GetList(
			$by = "",
			$order = "",
			array("ACTIVE" => "Y", "!UF_DEPARTMENT" => false, "ID_EQUAL_EXACT" => $userId),
			array("SELECT" => array("ID", "LOGIN", "UF_BXDAVEX_MAILBOX"))
		);
		if ($arUser = $dbUserList->Fetch())
		{
			$mailbox = (($exchangeUseLogin == "Y") ? $arUser["LOGIN"].$exchangeMailbox : $arUser["UF_BXDAVEX_MAILBOX"]);
			if (!empty($mailbox))
			{
				$arFields["MAILBOX"] = $mailbox;

				if (isset($arFields["FOLDER_ID"]))
				{
					$arFoldersList = $exchange->GetFoldersList(array("mailbox" => $mailbox));
					$arUserFolders = array(GetMessage("DAV_EC_TASKS") => "tasks");
					foreach ($arFoldersList as $value)
						$arUserFolders[$value["NAME"]] = $value["XML_ID"];

					if (array_key_exists($arFields["FOLDER_ID"], $arUserFolders))
						$arFields["FOLDER_ID"] = $arUserFolders[$arFields["FOLDER_ID"]];
					else
						$arFields["FOLDER_ID"] = "tasks";
				}
				else
				{
					$arFields["FOLDER_ID"] = "tasks";
				}

				$arResult = $exchange->Add($arFields);

				if (is_array($arResult) && (count($arResult) > 0))
					return $arResult[0];
			}
		}

		return $exchange->GetErrors();
	}

	public static function DoUpdateItem($userId, $itemXmlId, $itemModificationLabel, $arFields)
	{
		$exchangeScheme = COption::GetOptionString("dav", "exchange_scheme", "http");
		$exchangeServer = COption::GetOptionString("dav", "exchange_server", "");
		$exchangePort = COption::GetOptionString("dav", "exchange_port", "80");
		$exchangeUsername = COption::GetOptionString("dav", "exchange_username", "");
		$exchangePassword = COption::GetOptionString("dav", "exchange_password", "");

		if (empty($exchangeServer))
			return "";

		$exchange = new CDavExchangeTasks($exchangeScheme, $exchangeServer, $exchangePort, $exchangeUsername, $exchangePassword);

		$exchangeMailbox = COption::GetOptionString("dav", "exchange_mailbox", "");
		$exchangeUseLogin = COption::GetOptionString("dav", "exchange_use_login", "Y");

		self::InitUserEntity();

		$userId = intval($userId);
		$dbUserList = CUser::GetList(
			$by = "",
			$order = "",
			array("ACTIVE" => "Y", "!UF_DEPARTMENT" => false, "ID_EQUAL_EXACT" => $userId),
			array("SELECT" => array("ID", "LOGIN", "UF_BXDAVEX_MAILBOX"))
		);
		if ($arUser = $dbUserList->Fetch())
		{
			$mailbox = (($exchangeUseLogin == "Y") ? $arUser["LOGIN"].$exchangeMailbox : $arUser["UF_BXDAVEX_MAILBOX"]);
			if (!empty($mailbox))
			{
				$arResult = $exchange->Update(
					array("XML_ID" => $itemXmlId, "MODIFICATION_LABEL" => $itemModificationLabel),
					$arFields
				);

				if (is_array($arResult) && (count($arResult) > 0))
					return $arResult[0];
			}
		}

		return $exchange->GetErrors();
	}

	public static function DoDeleteItem($userId, $itemXmlId)
	{
		$exchangeScheme = COption::GetOptionString("dav", "exchange_scheme", "http");
		$exchangeServer = COption::GetOptionString("dav", "exchange_server", "");
		$exchangePort = COption::GetOptionString("dav", "exchange_port", "80");
		$exchangeUsername = COption::GetOptionString("dav", "exchange_username", "");
		$exchangePassword = COption::GetOptionString("dav", "exchange_password", "");

		if (empty($exchangeServer))
			return "";

		$exchange = new CDavExchangeTasks($exchangeScheme, $exchangeServer, $exchangePort, $exchangeUsername, $exchangePassword);

		$exchangeMailbox = COption::GetOptionString("dav", "exchange_mailbox", "");
		$exchangeUseLogin = COption::GetOptionString("dav", "exchange_use_login", "Y");

		self::InitUserEntity();

		$userId = intval($userId);
		$dbUserList = CUser::GetList(
			$by = "",
			$order = "",
			array("ACTIVE" => "Y", "!UF_DEPARTMENT" => false, "ID_EQUAL_EXACT" => $userId),
			array("SELECT" => array("ID", "LOGIN", "UF_BXDAVEX_MAILBOX"))
		);
		if ($arUser = $dbUserList->Fetch())
		{
			$mailbox = (($exchangeUseLogin == "Y") ? $arUser["LOGIN"].$exchangeMailbox : $arUser["UF_BXDAVEX_MAILBOX"]);
			if (!empty($mailbox))
			{
				$arResult = $exchange->Delete($itemXmlId);
				if ($arResult)
					return $arResult;
			}
		}

		return $exchange->GetErrors();
	}

	public static function IsExchangeEnabled()
	{
		$exchangeServer = COption::GetOptionString("dav", "exchange_server", "");
		$agentTasks = COption::GetOptionString("dav", "agent_tasks", "N");
		return (!empty($exchangeServer) && ($agentTasks == "Y"));
	}
}