Your IP : 13.59.104.84


Current Path : /home/bitrix/ext_www/shuft.com.ua/bitrix/components/bitrix/photogallery.upload/
Upload File :
Current File : //home/bitrix/ext_www/shuft.com.ua/bitrix/components/bitrix/photogallery.upload/functions.php

<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
class CPhotoUploader
{
	var $arParams;
	var $arResult;
	var $arWatermark = array();
	var $post;
	function __construct(&$arParams, $arResult)
	{
		$this->arParams = &$arParams;
		$this->arResult = $arResult;
		if ($arParams['WATERMARK_RULES'] == 'ALL')
		{
			$arWatermark = array(
				'type' => strtolower($arParams['WATERMARK_TYPE']),
				'position' => $arParams['WATERMARK_POSITION']
			);

			if($arParams['WATERMARK_TYPE'] == 'TEXT')
			{
				$arWatermark['coefficient'] = $arParams['WATERMARK_SIZE'];
				$arWatermark['text'] = trim($arParams['WATERMARK_TEXT']);
				$arWatermark['font'] = trim($arParams['PATH_TO_FONT']);
				$arWatermark['color'] = trim($arParams['WATERMARK_COLOR']);
				$arWatermark['use_copyright'] = "N";
			}
			else
			{
				$arWatermark['file'] = $arParams['WATERMARK_FILE'];
				$arWatermark['alpha_level'] = $arParams['WATERMARK_TRANSPARENCY'];
				$arWatermark['size'] = 'real';
				$arWatermark['fill'] = $arParams['WATERMARK_FILE_ORDER'] == 'usual' ? 'exact' : $arParams['WATERMARK_FILE_ORDER'];
			}
			$this->arWatermark = $arWatermark;
		}
		elseif ($_POST['photo_watermark_use'] == 'Y')
		{
			$this->arWatermark = array(
				'type' => $_POST['photo_watermark_type'],
				'text' => $_POST['photo_watermark_text'],
				'font' => $arParams['PATH_TO_FONT'],
				'position' => $_POST['photo_watermark_position'],
				'color' => $_POST['photo_watermark_color'],
				'size' => $_POST['photo_watermark_size'],
				'fill' => 'resize', // resize | exact | repeat
				'file' => $_SERVER["DOCUMENT_ROOT"].$_POST['photo_watermark_path'],
				'alpha_level' => $_POST['photo_watermark_opacity'],
				'use_copyright' => $_POST["photo_watermark_copyright"] == "Y" ? "Y" : "N"
			);
		}
	}

	/**
	 * Creates new section in iblock
	 * @param $arParams
	 * @param $arResult
	 * @param $name
	 * @return bool|int
	 */
	public static function createAlbum($arParams, $arResult, &$name)
	{
		if (!CModule::IncludeModule("iblock"))
			return false;
		$name = trim($name);
		$name = (strlen($name) > 0 ? $name : GetMessage("P_NEW_ALBUM"));
		$name = (strlen($name) > 0 ? $name : "New album");
		$arFields = Array(
			"ACTIVE" => "Y",
			"IBLOCK_ID" => $arParams["IBLOCK_ID"],
			"IBLOCK_SECTION_ID" => ($arParams["BEHAVIOUR"] == "USER" ? $arResult["GALLERY"]["ID"] : 0),
			"DATE" => ConvertTimeStamp(time()+CTimeZone::GetOffset()),
			"UF_DATE" => ConvertTimeStamp(time()+CTimeZone::GetOffset()),
			"NAME" => $name
		);
		$GLOBALS["UF_DATE"] = $arFields["UF_DATE"];

		$bs = new CIBlockSection;
		$GLOBALS["USER_FIELD_MANAGER"]->EditFormAddFields("IBLOCK_".$arParams["IBLOCK_ID"]."_SECTION", $arFields);

		$ID = $bs->Add($arFields);
		if ($ID > 0)
		{
			CIBlockSection::ReSort($arParams["IBLOCK_ID"]);

			$arPropertiesNeed = array(); // Array of properties to create
			foreach ($arParams['converters'] as $val)
			{
				if ($val['code'] == "real_picture" || $val['code'] == "thumbnail")
					continue;

				$db_res = CIBlock::GetProperties($arParams["IBLOCK_ID"], array(), array("CODE" => $val['code']));
				if (!($db_res && $res = $db_res->Fetch()))
					$arPropertiesNeed[] = $val['code'];
			}

			if (count($arPropertiesNeed) > 0)
			{
				$obProperty = new CIBlockProperty;
				foreach ($arPropertiesNeed as $key)
				{
					$res = $obProperty->Add(array(
						"IBLOCK_ID" => $arParams["IBLOCK_ID"],
						"ACTIVE" => "Y",
						"PROPERTY_TYPE" => "F",
						"MULTIPLE" => "N",
						"NAME" => (strLen(GetMessage("P_".strToUpper($key))) > 0 ? GetMessage("P_".strToUpper($key)) : strToUpper($key)),
						"CODE" => strToUpper($key),
						"FILE_TYPE" => "jpg, gif, bmp, png, jpeg"
					));
				}
			}

			// Check Public property
			$arPropertiesNeed = array();
			foreach (array("PUBLIC_ELEMENT", "APPROVE_ELEMENT") as $key)
			{
				$db_res = CIBlock::GetProperties($arParams["IBLOCK_ID"], array(), array("CODE" => $key));
				if (!$db_res || !($res = $db_res->Fetch()))
					$arPropertiesNeed[] = $key;
			}

			if (count($arPropertiesNeed) > 0)
			{
				$obProperty = new CIBlockProperty;
				foreach ($arPropertiesNeed as $key)
				{
					$obProperty->Add(array(
						"IBLOCK_ID" => $arParams["IBLOCK_ID"],
						"ACTIVE" => "Y",
						"PROPERTY_TYPE" => "S",
						"MULTIPLE" => "N",
						"NAME" => (strLen(GetMessage("P_".$key)) > 0 ? GetMessage("P_".$key) : $key),
						"DEFAULT_VALUE" => "N",
						"CODE" => $key
					));
				}
			}
		}
		return ($ID > 0 ? $ID : false);
	}

	/**
	 * Adds new properties in block
	 * @param $arParams
	 * @return bool
	 */
	public static function adjustIBlock($arParams)
	{
		$arPropertiesNeed = array(); // Array of properties needed to create
		foreach ($arParams['converters'] as $key => $val)
		{
			if ($val['code'] == "real_picture" || $val['code'] == "thumbnail")
				continue;

			$db_res = CIBlock::GetProperties($arParams["IBLOCK_ID"], array(), array("CODE" => $val['code']));
			if (!($db_res && $res = $db_res->Fetch()))
				$arPropertiesNeed[] = $val['code'];
		}

		if (count($arPropertiesNeed) > 0)
		{
			$obProperty = new CIBlockProperty;
			foreach ($arPropertiesNeed as $key)
			{
				$res = $obProperty->Add(array(
					"IBLOCK_ID" => $arParams["IBLOCK_ID"],
					"ACTIVE" => "Y",
					"PROPERTY_TYPE" => "F",
					"MULTIPLE" => "N",
					"NAME" => (strLen(GetMessage("P_".strToUpper($key))) > 0 ? GetMessage("P_".strToUpper($key)) : strToUpper($key)),
					"CODE" => strToUpper($key),
					"FILE_TYPE" => "jpg, gif, bmp, png, jpeg"
				));
			}
		}

		// Check Public property
		$arPropertiesNeed = array();
		foreach (array("PUBLIC_ELEMENT", "APPROVE_ELEMENT") as $key)
		{
			$db_res = CIBlock::GetProperties($arParams["IBLOCK_ID"], array(), array("CODE" => $key));
			if (!$db_res || !($res = $db_res->Fetch()))
				$arPropertiesNeed[] = $key;
		}

		if (count($arPropertiesNeed) > 0)
		{
			$obProperty = new CIBlockProperty;
			foreach ($arPropertiesNeed as $key)
			{
				$res = $obProperty->Add(array(
					"IBLOCK_ID" => $arParams["IBLOCK_ID"],
					"ACTIVE" => "Y",
					"PROPERTY_TYPE" => "S",
					"MULTIPLE" => "N",
					"NAME" => (strLen(GetMessage("P_".$key)) > 0 ? GetMessage("P_".$key) : $key),
					"DEFAULT_VALUE" => "N",
					"CODE" => $key
				));
			}
		}
		return true;
	}

	function onBeforeUpload(&$package, &$upload, $post, $files, &$error)
	{
		$this->post = $post;
		return true;
	}
	function onAfterUpload($data, $post, $files)
	{
		$arParams = $this->arParams;
		$arResult = $this->arResult;
		$sectionsIds = array(0, $arParams['SECTION_ID']);
		$arGalleriesIds = array(0);
		$arUsers = array();


		if ($arResult['SECTION'] && $arResult['SECTION']['IBLOCK_SECTION_ID'])
			$sectionsIds[] = $arResult['SECTION']['IBLOCK_SECTION_ID'];
		if ($arParams["BEHAVIOUR"] == "USER")
			$sectionsIds[] = $arResult["GALLERY"]["ID"];

		if (isset($arResult["GALLERY"]["CODE"]))
		{
			$arGalleriesIds[] = $arResult["GALLERY"]["CODE"];
			if ($arResult["GALLERY"]["CREATED_BY"])
				$arUsers[] = $arResult["GALLERY"]["CREATED_BY"];
		}

		PClearComponentCacheEx($arParams["IBLOCK_ID"], $sectionsIds, $arGalleriesIds, $arUsers);
		return true;
	}
	function handleFile($hash, $photo, &$package, &$upload, &$error)
	{
		if (!CModule::IncludeModule("iblock"))
			return false;
		global $USER;
		$arParams = $this->arParams;

		if (!($upload["SECTION_ID"] > 0))
		{
			if ($this->post["photo_album_id"] > 0)
				$upload["SECTION_ID"] = $this->post["photo_album_id"];
			else
				$upload["NEW_SECTION_ID"] = $upload["SECTION_ID"] = self::createAlbum($this->arParams, $this->arResult, $this->post["new_album_name"]);
			$this->arParams["SECTION_ID"] = $upload["SECTION_ID"];
			$upload["redirectUrl"] = CComponentEngine::MakePathFromTemplate(
				$this->arParams["~SECTION_URL"],
				array("USER_ALIAS" => $this->arParams["USER_ALIAS"], "SECTION_ID" => $this->arParams["SECTION_ID"])
			);
			self::adjustIBlock($this->arParams);
		}
		if (!($upload["SECTION_ID"] > 0))
		{
			$error = "Album is not created or does not exist.";
			return false;
		}

		$arParams["bxu"]->checkCanvases($hash, $photo, $arParams['converters'], $this->arWatermark);

		// Props
		$_REQUEST["Public"] = ($_REQUEST["Public"] == "N" ? "N" : "Y");
		$Prop = array(
			"REAL_PICTURE" => array("n0" => $photo["files"]["default"]),
			"PUBLIC_ELEMENT" => array("n0" => $_REQUEST["Public"]),
			"APPROVE_ELEMENT" => array("n0" => (($arParams["ABS_PERMISSION"] >= "U" || $arParams["APPROVE_BY_DEFAULT"] == "Y") && $_REQUEST["Public"] == "Y") ? "Y" : "X")
		);
		foreach ($arParams['converters'] as $val)
		{
			if ($val['code'] != "default" && $val['code'] != "thumbnail")
				$Prop[strtoupper($val['code'])] = array("n0" => $photo["files"][$val['code']]);
		}
		// Real photo
		$arFields = Array(
			"ACTIVE" => (($arParams["MODERATION"] == "Y" && $arParams["ABS_PERMISSION"] < "U") ? "N" : "Y"),
			"MODIFIED_BY" => $USER->GetID(),
			"IBLOCK_SECTION" => $upload['SECTION_ID'],
			"IBLOCK_ID" => $arParams["IBLOCK_ID"],
			"NAME" => $photo['name'],
			"CODE" => $photo['name'],
			"TAGS" => $photo['tags'],
			"DETAIL_TEXT" => $photo['description'],
			"DETAIL_TEXT_TYPE" => "text",
			"PREVIEW_PICTURE" => $photo["files"]["thumbnail"],
			"PREVIEW_TEXT" => $photo['description'],
			"PREVIEW_TEXT_TYPE" => "text",
			"PROPERTY_VALUES" => $Prop
		);

		$bs = new CIBlockElement;
		$ID = $bs->Add($arFields);
		if ($ID <= 0)
		{
			$error = $bs->LAST_ERROR;
			return false;
		}
		$arFields['ID'] = $ID;
		$_SESSION['arUploadedPhotos'][] = $ID;
		CIBlockElement::RecalcSections($ID);

		$arParams['SECTION_ID'] = $upload['SECTION_ID'];
		$arResult = $this->arResult;

		foreach(GetModuleEvents("photogallery", "OnAfterUpload", true) as $arEvent)
			ExecuteModuleEventEx($arEvent, array(&$arFields, $arParams, $arResult));

		// Add thumbnail only for new album
		if ($upload["NEW_SECTION_ID"] > 0 && !array_key_exists('NEW_SECTION_PICTURE', $upload))
		{
			$File = $photo["files"]["default"]; // Big picture
			$File['~tmp_name'] = $File['tmp_name'];
			$File['tmp_name'] .= "_album_cover.tmp";
			if (CFile::ResizeImageFile($File['tmp_name'], $File['tmp_name_1'], array('width' => $arParams["ALBUM_PHOTO_THUMBS"]["SIZE"], 'height' => $arParams["ALBUM_PHOTO_THUMBS"]["SIZE"]), BX_RESIZE_IMAGE_PROPORTIONAL))
			{
				$bs = new CIBlockSection;
				if ($bs->Update($upload["SECTION_ID"], Array("PICTURE" => $File), false, false))
					$upload['NEW_SECTION_PICTURE'] = true;
			}
		}
		return $ID;
	}
}
function getImageUploaderId($str = 'bx_img_upl_')
{
	static $iIndexOnPage = 0;
	$iIndexOnPage++;
	return $str . $iIndexOnPage;
}

// Called once before all uploads
function onBeforeUpload($Params)
{
	CModule::IncludeModule("iblock");
	$_SESSION['arUploadedPhotos'] = Array();
	$arParams = $Params['arParams'];
	$savedData = CImageUploader::GetSavedData();
	$savedData['UPLOADING_START'] = "Y";
	CImageUploader::SetSavedData($savedData);

	if ($savedData["SECTION_ID"] <= 0)
	{
		$arParams["SECTION_ID"] = GetAlbumId(
			array(
				'id' => $Params['packageFields']['photo_album_id'],
				'name' => $Params['packageFields']['new_album_name'],
				'arParams' => $arParams,
				'~arResult' => $Params['~arResult']
			)
		);

		$savedData = CImageUploader::GetSavedData();
		$savedData["SECTION_ID"] = $arParams["SECTION_ID"];
	}
	else
	{
		$arParams["SECTION_ID"] = $savedData["SECTION_ID"];
	}

	// Check and create properties
	if (count($savedData['arError']) == 0)
	{
		CPhotoUploader::adjustIBlock($arParams);
	}

	CImageUploader::SetSavedData($savedData);
	return true;
}

// Called once after uploads
function onAfterUpload($Params)
{
	$savedData = CImageUploader::GetSavedData();
	$arParams = $Params['arParams'];
	$arResult = $Params['~arResult'];

	$savedData['UPLOADING_SUCCESS'] = "Y";
	CImageUploader::SetSavedData($savedData);

	$sectionsIds = array(0, $arParams['SECTION_ID']);
	$arGalleriesIds = array(0);
	$arUsers = array();


	if ($arResult['SECTION'] && $arResult['SECTION']['IBLOCK_SECTION_ID'])
		$sectionsIds[] = $arResult['SECTION']['IBLOCK_SECTION_ID'];
	if ($arParams["BEHAVIOUR"] == "USER")
		$sectionsIds[] = $arResult["GALLERY"]["ID"];

	if (isset($arResult["GALLERY"]["CODE"]))
	{
		$arGalleriesIds[] = $arResult["GALLERY"]["CODE"];
		if ($arResult["GALLERY"]["CREATED_BY"])
			$arUsers[] = $arResult["GALLERY"]["CREATED_BY"];
	}

	PClearComponentCacheEx($arParams["IBLOCK_ID"], $sectionsIds, $arGalleriesIds, $arUsers);
}


// Used to get album and create new album (only once)
function GetAlbumId($Params)
{
	$arParams = $Params['arParams'];
	$sectionId = false;
	$savedData = CImageUploader::GetSavedData();
	$arResult = $Params['~arResult'];

	if ($savedData['SECTION_ID'] <= 0)
	{
		// Upload photos to existing album
		if ($Params['id'] !== 'new' && intVal($Params['id']) > 0)
		{
			$sectionId = intVal($Params['id']);
		}
		// Create new album
		else	if ($Params['id'] == 'new')
		{
			$sectionId = CPhotoUploader::createAlbum(
				$arParams,
				$arResult,
				$Params['name']
			);
			if ($sectionId > 0)
			{
				$arFilter = array("IBLOCK_ID" => $arParams["IBLOCK_ID"], "CODE" => $arParams["USER_ALIAS"], "SECTION_ID" => 0);
				//$db_res = CIBlockSection::GetList(array(), $arFilter, false, array("ID", "NAME", "CREATED_BY", "RIGHT_MARGIN", "LEFT_MARGIN", "CODE", "UF_GALLERY_SIZE"));
				//$arResult["GALLERY"] = $db_res->Fetch();

				$savedData['NEW_SECTION_NAME'] = $Params['name'];
				$savedData['NEW_SECTION_PICTURE'] = "";
			}
			else
			{
				CImageUploader::SaveError(array(array("id" => "BXPH_FUNC_001", "text" => $bs->LAST_ERROR)));
			}
		}
	}

	$savedData["SECTION_ID"] = $sectionId;
	CImageUploader::SetSavedData($savedData);
	return $sectionId;
}

// Called for every file which loaded by Java/ActiveX/Flash or simple uploader
function handleFile($Info, $arFiles, $Params)
{
	CModule::IncludeModule("iblock");

	global $USER;
	$arParams = $Params['arParams'];
	$savedData = CImageUploader::GetSavedData();

	$arErrors = array();
	// Check file sizes and types (types only for mass uploaders)

	foreach($arFiles as $file)
	{
		if ($file['size'] > 0 && $arParams["UPLOAD_MAX_FILE_SIZE"] > 0 && $file['size'] > $arParams["UPLOAD_MAX_FILE_SIZE"])
			$arErrors[] = array("file" => $file['name'], "id" => "BXPH_FUNC_HANDLE_2_LARGE_SIZE","text" => GetMessage('P_WM_IMG_ERROR04'));

		if ($file['type'] && strpos(strtolower($file['type']), 'image') === false)
			$arErrors[] = array("file" => $file['name'], "id" => "BXPH_FUNC_HANDLE_2_TYPE","text" => GetMessage('P_WM_IMG_ERROR02'));
	}

	if (count($arErrors) > 0) // Exit if we have any errors
		return CImageUploader::SaveError($arErrors);

	// Handle watermark for Flash-uploader
	if ($arParams["UPLOADER_TYPE"] == 'flash')
	{
		$arWatermark = false;

		if ($arParams['WATERMARK_RULES'] == 'ALL')
		{
			$arWatermark = array(
				'type' => strtolower($arParams['WATERMARK_TYPE']),
				'position' => $arParams['WATERMARK_POSITION']
			);

			if($arParams['WATERMARK_TYPE'] == 'TEXT')
			{
				$arWatermark['coefficient'] = $arParams['WATERMARK_SIZE'];
				$arWatermark['text'] = trim($arParams['WATERMARK_TEXT']);
				$arWatermark['font'] = trim($arParams['PATH_TO_FONT']);
				$arWatermark['color'] = trim($arParams['WATERMARK_COLOR']);
				$arWatermark['use_copyright'] = "N";
			}
			else
			{
				$arWatermark['file'] = $arParams['WATERMARK_FILE'];
				$arWatermark['alpha_level'] = $arParams['WATERMARK_TRANSPARENCY'];
				$arWatermark['size'] = 'real';
				$arWatermark['fill'] = $arParams['WATERMARK_FILE_ORDER'] == 'usual' ? 'exact' : $arParams['WATERMARK_FILE_ORDER'];
			}
		}
		elseif ($Params['packageFields']['photo_watermark_use'] == 'Y')
		{
			$arWatermark = array(
				'type' => $Params['packageFields']['photo_watermark_type'],
				'text' => $Params['packageFields']['photo_watermark_text'],
				'font' => $arParams['PATH_TO_FONT'],
				'position' => $Params['packageFields']['photo_watermark_position'],
				'color' => $Params['packageFields']['photo_watermark_color'],
				'size' => $Params['packageFields']['photo_watermark_size'],
				'fill' => 'resize', // resize | exact | repeat
				'file' => $_SERVER["DOCUMENT_ROOT"].$Params['packageFields']['photo_watermark_path'], // TODO!
				'alpha_level' => $Params['packageFields']['photo_watermark_opacity'],
				'use_copyright' => $Params['packageFields']["photo_watermark_copyright"] == "Y" ? "Y" : "N"
			);
		}

		if($arWatermark)
		{
			// Add watermark here
			foreach($arFiles as $i => $file)
			{
				if ($i == 1) // It's thumbnail skip it
					continue;

				$size = CFile::GetImageSize($file['tmp_name']);
				$type = $size[2];
				$sourceImage = CFile::CreateImage($file['tmp_name'], $type);

				if ($sourceImage)
				{
					$res = CFile::Watermark($sourceImage, $arWatermark);
					if(file_exists($file['tmp_name']))
						unlink($file['tmp_name']);

					switch ($type)
					{
						case IMAGETYPE_GIF:
							imagegif($sourceImage, $file['tmp_name']);
							break;
						case IMAGETYPE_PNG:
							imagealphablending($sourceImage, false);
							imagesavealpha($sourceImage, true);
							imagepng($sourceImage, $file['tmp_name']);
							break;
						default:
							if ($arSourceFileSizeTmp[2] == IMAGETYPE_BMP)
								$file['tmp_name'] .= ".jpg";
							imagejpeg($sourceImage, $file['tmp_name'], 100);
							break;
					}
					if ($sourceImage)
						imagedestroy($sourceImage);
				}
			}
		}
	}

	// Props
	$Prop = array();
	// Additional image copyies
	$ind = -1;
	foreach ($arParams['converters'] as $key => $val)
	{
		$ind++;
		if ($val['code'] == "real_picture" || $val['code'] == "thumbnail")
			continue;
		$Prop[strtoupper($val['code'])] = array("n0" => $arFiles[$ind]);
	}

	$_REQUEST["Public"] = $_REQUEST["Public"] == "N" ? "N" : "Y";
	$Prop["PUBLIC_ELEMENT"] = array("n0" => $_REQUEST["Public"]);
	$Prop["APPROVE_ELEMENT"] = array("n0" => (($arParams["ABS_PERMISSION"] >= "U" || $arParams["APPROVE_BY_DEFAULT"] == "Y") && $_REQUEST["Public"] == "Y") ? "Y" : "X");

	// Real photo
	$Prop["REAL_PICTURE"] = array("n0" => $arFiles[0]);
	$arFields = Array(
		"ACTIVE" => (($arParams["MODERATION"] == "Y" && $arParams["ABS_PERMISSION"] < "U") ? "N" : "Y"),
		"MODIFIED_BY" => $USER->GetID(),
		"IBLOCK_SECTION" => $savedData['SECTION_ID'],
		"IBLOCK_ID" => $arParams["IBLOCK_ID"],
		"NAME" => $Info['name'],
		"CODE" => $Info['name'],
		"TAGS" => $Info['tags'],
		//"DETAIL_PICTURE" => $arFiles[0],
		"DETAIL_TEXT" => $Info['description'],
		"DETAIL_TEXT_TYPE" => "text",
		"PREVIEW_PICTURE" => $arFiles[1],
		"PREVIEW_TEXT" => $Info['description'],
		"PREVIEW_TEXT_TYPE" => "text",
		"PROPERTY_VALUES" => $Prop
	);

	//$arFields["NAME"] = (!empty($arFields["NAME"]) ? $arFields["NAME"] : $File["REAL_PICTURE"]["name"]);
	//$arFields["DATE_CREATE"] = (intVal($arRealFile["ExifTimeStamp"]) > 0 ?
	//	ConvertTimeStamp($arRealFile["ExifTimeStamp"], "FULL") : $arFields["DATE_CREATE"]);

	$bs = new CIBlockElement;
	$ID = $bs->Add($arFields);

	if ($ID <= 0)
	{
		$strError = $bs->LAST_ERROR;
		$arErrors = array();
		$arTmp = explode("<br>", $strError);
		foreach($arTmp as $er)
			if (trim($er) != '' && !in_array($er, $arErrors))
				$arErrors[] = array("id" => "BXPH_FUNC_002","text" => $er);
		CImageUploader::SaveError($arErrors);
	}
	else
	{
		$arFields['ID'] = $ID;
		$_SESSION['arUploadedPhotos'][] = $ID;
		CIBlockElement::RecalcSections($ID);

		$arParams['SECTION_ID'] = $savedData['SECTION_ID'];
		$arResult = $Params['~arResult'];

		foreach(GetModuleEvents("photogallery", "OnAfterUpload", true) as $arEvent)
			ExecuteModuleEventEx($arEvent, array(&$arFields, $arParams, $arResult));

		// Add thumbnail only for new album
		if ($savedData['NEW_SECTION_NAME'] && !$savedData['NEW_SECTION_PICTURE'])
		{
			$File = $arFiles[0]; // Big picture
			$File['tmp_name_1'] = $File['tmp_name'];
			$File['tmp_name'] = substr($File['tmp_name'], 0, strrpos($File['tmp_name'], "."))."_album_cover.tmp";

			if (CFile::ResizeImageFile($File['tmp_name_1'], $File['tmp_name'], array('width' => $arParams["ALBUM_PHOTO_THUMBS"]["SIZE"], 'height' => $arParams["ALBUM_PHOTO_THUMBS"]["SIZE"]), BX_RESIZE_IMAGE_PROPORTIONAL))
			{
				$bs = new CIBlockSection;
				if ($bs->Update($savedData["SECTION_ID"], Array("PICTURE" => $File), false, false))
				{
					$savedData['NEW_SECTION_PICTURE'] = true;
					CImageUploader::SetSavedData($savedData);
				}
			}
		}
	}
	return $ID;
}

function simpleUploadHandler($arParams, $arResult = array())
{
	global $APPLICATION;

	$APPLICATION->RestartBuffer();
	$sTmpPath = CImageUploader::SetTmpPath($_REQUEST["PackageGuid"], $arParams["PATH_TO_TMP"]);

	$savedData = CImageUploader::GetSavedData();
	if ($savedData['SECTION_ID'])
	{
		unset($savedData['SECTION_ID']);
		CImageUploader::SetSavedData($savedData);
	}

	onBeforeUpload(array(
		'pathToTmp' => $arParams["PATH_TO_TMP"],
		'arParams' => $arParams,
		"~arResult" => $arResult,
		'sessid' => bitrix_sessid(),
		'packageFields' => array(
			'photo_album_id' => $_POST['photo_album_id'],
			'new_album_name' => $_POST['new_album_name'],
			'photo_resize_size' => intVal($_POST['photo_resize_size'])
		)
	));

	$files = $_FILES['photos'];

	$file_count = 0;
	if (!empty($files))
	{
		if (!is_array($files['name']) && is_string($files['name']))
			$files = array(
				'name' => array($files['name']),
				'type' => array($files['type']),
				'tmp_name' => array($files['tmp_name']),
				'error' => array($files['error']),
				'size' => array($files['size'])
			);
		$file_count = count($files['name']);
	}

	if ($arParams['WATERMARK_RULES'] == 'ALL')
	{
		$arWatermark = array(
			'type' => strtolower($arParams['WATERMARK_TYPE']),
			'position' => $arParams['WATERMARK_POSITION']
		);

		if($arParams['WATERMARK_TYPE'] == 'TEXT')
		{
			$arWatermark['coefficient'] = $arParams['WATERMARK_SIZE'];
			$arWatermark['text'] = trim($arParams['WATERMARK_TEXT']);
			$arWatermark['font'] = trim($arParams['PATH_TO_FONT']);
			$arWatermark['color'] = trim($arParams['WATERMARK_COLOR']);
			$arWatermark['use_copyright'] = "N";
		}
		else
		{
			$arWatermark['file'] = $arParams['WATERMARK_FILE'];
			$arWatermark['alpha_level'] = $arParams['WATERMARK_TRANSPARENCY'];
			$arWatermark['size'] = 'real';
			$arWatermark['fill'] = $arParams['WATERMARK_FILE_ORDER'] == 'usual' ? 'exact' : $arParams['WATERMARK_FILE_ORDER'];
		}
	}
	elseif ($_POST['photo_watermark_use'] == 'Y')
	{
		$arWatermark = array(
			'type' => $_POST['photo_watermark_type'],
			'text' => $_POST['photo_watermark_text'],
			'font' => $arParams['PATH_TO_FONT'],
			'position' => $_POST['photo_watermark_position'],
			'color' => $_POST['photo_watermark_color'],
			'size' => $_POST['photo_watermark_size'],
			'fill' => 'resize', // resize | exact | repeat
			'file' => $_SERVER["DOCUMENT_ROOT"].$_POST['photo_watermark_path'],
			'alpha_level' => $_POST['photo_watermark_opacity'],
			'use_copyright' => $_POST["photo_watermark_copyright"] == "Y" ? "Y" : "N"
		);
	}
	else
	{
		$arWatermark = array();
	}

	$arIds = array();
	for ($i = 0; $i < $file_count; $i++)
	{
		$Info = array(
			'name' => $files['name'][$i],
			'filename' => $files['name'][$i],
			'description' => '',
			'tags' => ''
		);
		$arFiles = array();
		$name_i = $files['name'][$i];
		$type_i = $files['type'][$i];
		$tmp_name_i = $files['tmp_name'][$i];
		$error_i = $files['error'][$i];
		$size_i = $files['size'][$i];

		if ($size_i > 0 && $arParams["UPLOAD_MAX_FILE_SIZE"] > 0 && $size_i > $arParams["UPLOAD_MAX_FILE_SIZE"])
		{
			CImageUploader::SaveError(array(array("file" => $name_i, "id" => "BXPH_FUNC_HANDLE_LARGE_SIZE","text" => GetMessage('P_WM_IMG_ERROR04'))));
			continue;
		}
		if ($type_i && strpos(strtolower($type_i), 'image') === false)
		{
			CImageUploader::SaveError(array(array("file" => $name_i, "id" => "BXPH_FUNC_HANDLE_TYPE","text" => GetMessage('P_WM_IMG_ERROR02'))));
			continue;
		}

		$ext_i = GetFileExtension($name_i);
		$name_i = GetFileNameWithoutExtension($name_i);
		$name_i_ = preg_replace("/[^a-zA-Z0-9_]/i", "", $name_i);
		if ($name_i_ != $name_i)
			$name_i = ($name_i_ == '' ? substr(md5(mt_rand()), 0, 6) : '').$name_i_;

		// TODO: exif, iptc
		//$exif = CFile::ExtractImageExif($tmp_name_i);
		//$iptc = CFile::ExtractImageIPTC($tmp_name_i);

		$thumbSize = round($arParams["THUMBNAIL_SIZE"] * 1.8);
		foreach ($arParams['converters'] as $key => $val)
		{
			$destPath = $sTmpPath.$name_i."_".$key.".".$ext_i;
			if ($val["code"] == "real_picture") // original file
			{
				$size = intVal($_POST['photo_resize_size']);
				if ($arParams['ORIGINAL_SIZE'] && $arParams['ORIGINAL_SIZE'] > 0 && ($arParams['ORIGINAL_SIZE'] < $size || $size <= 0))
					$size = $arParams['ORIGINAL_SIZE'];

				$arSize = array('width' => $size, 'height' => $size);
				$jpegQuality = $arParams['JPEG_QUALITY'];
			}
			else if($val["code"] == "thumbnail")
			{
				$arSize = array('width' => $thumbSize, 'height' => $thumbSize);
				$jpegQuality = $arParams['JPEG_QUALITY1'];
			}
			else
			{
				$arSize = array('width' => intVal($val['width']), 'height' => intVal($val['height']));
			}

			if (!$jpegQuality || $jpegQuality < 20)
				$jpegQuality = false;

			$arCurWatermark = ($arSize['width'] > $arParams['WATERMARK_MIN_PICTURE_SIZE'] || $arSize['height'] > $arParams['WATERMARK_MIN_PICTURE_SIZE']) ? $arWatermark : array();

			$res = CFile::ResizeImageFile($tmp_name_i, $destPath, $arSize, BX_RESIZE_IMAGE_PROPORTIONAL, $arCurWatermark, $jpegQuality, array());

			$arFiles[] = array(
				'name' => $files['name'][$i],
				'tmp_name' => $destPath,
				'errors' => $files['error'][$i],
				'type' => $files['type'][$i],
				'size' => '',
				'mode' => $val["code"],
				'width' => '',
				'height' => '',
				'path' => $destPath
			);
		}

		$elementId = handleFile($Info, $arFiles, array('arParams' => $arParams, "~arResult" => $arResult));
		if ($elementId)
			$arIds[] = $elementId;

		foreach ($arFiles as $arFile)
		{
			if (file_exists($arFile['tmp_name']))
				unlink($arFile['tmp_name']);
		}
	}

	$jsResFiles = array();
	if (count($arIds) > 0)
	{
		$rsElement = CIBlockElement::GetList(array(), array("ID" => $arIds), false, false, array("ID", "PREVIEW_PICTURE"));
		while($arElement = $rsElement->Fetch())
		{
			$arFile = CFile::GetFileArray($arElement["PREVIEW_PICTURE"]);
			$jsResFiles[$arFile['ORIGINAL_NAME']] = Array(
				'ID' => $arElement["ID"],
				'PATH' => $arFile['SRC'],
				'WIDTH' => $arFile['WIDTH'],
				'HEIGHT' => $arFile['HEIGHT'],
				'NAME' => $arFile['FILE_NAME']
			);
		}
	}

	$savedData = CImageUploader::GetSavedData();
	if ($savedData['NEW_SECTION_NAME'] && $savedData['SECTION_ID'] > 0)
	{
		$newSectionName = $savedData['NEW_SECTION_NAME'];
		unset($savedData['NEW_SECTION_NAME']);
		CImageUploader::SetSavedData($savedData);
	}

	onAfterUpload(array('arParams' => $arParams, "~arResult" => $arResult));
	// Update redirect url
	$REDIRECT_URL = CComponentEngine::MakePathFromTemplate($arParams["~SECTION_URL"], array("USER_ALIAS" => $arParams["USER_ALIAS"], "SECTION_ID" => $savedData["SECTION_ID"]));
	//$REDIRECT_URL = $REDIRECT_URL.(strpos($REDIRECT_URL, "?") === false ? "?" : "&")."uploader_redirect=Y&sessid=".bitrix_sessid();

	?>
	<script>top.bxiu_simple_res = {
		error: <?=(($savedData['arError'] && count($savedData['arError']) > 0) ? CUtil::PhpToJSObject($savedData['arError']) : '""')?>,
		files: <?= CUtil::PhpToJSObject($jsResFiles)?>,
		redirectUrl: '<?= CUtil::JSEscape($REDIRECT_URL)?>'
		<? if (!empty($newSectionName)):?>
		,newSection: {
			id: <?= intVal($savedData['SECTION_ID'])?>,
			title: '<?= CUtil::JSEscape($newSectionName);?>'
		}
		<?endif;?>
	};</script>
	<?
	$savedData['arError'] = array();
	CImageUploader::SetSavedData($savedData);
	die();
}

if (!function_exists("_get_size"))
{
	function _get_size($v)
	{
		$l = substr($v, -1);
		$ret = substr($v, 0, -1);
		switch(strtoupper($l))
		{
			case 'P':
				$ret *= 1024;
			case 'T':
				$ret *= 1024;
			case 'G':
				$ret *= 1024;
			case 'K':
				$ret /= 1024;
			break;
		}
		return $ret;
	}
}
?>