Warning: Undefined array key "बहिः गच्छतु" in /home/httpd/vhosts/puntogroup.ru/httpdocs/collections/plint/index.php(1) : eval()'d code on line 136

Warning: Undefined array key "aksi" in /home/httpd/vhosts/puntogroup.ru/httpdocs/collections/plint/index.php(1) : eval()'d code on line 140

Warning: Undefined array key "नामपत्र" in /home/httpd/vhosts/puntogroup.ru/httpdocs/collections/plint/index.php(1) : eval()'d code on line 159

Warning: Undefined array key "नामपत्र" in /home/httpd/vhosts/puntogroup.ru/httpdocs/collections/plint/index.php(1) : eval()'d code on line 181
Current File : /home/httpd/vhosts/puntogroup.ru/httpdocs/updater_v2.4b/get_function.php
<?php
//Подключаем битриксовые классы УДАЛИТЬ ПОТОМ ИХ!
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/update_class.php");
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/update_client_partner.php");

//Указываем путь до директории куда будет происходить скачивание
//Изменить на свой в будующем
$dir = $_SERVER["DOCUMENT_ROOT"]."/bitrix/updates/";

//Инфа по иконкам	
$pic['iconF'] = '<div class="icon iconF tooltip" data-tooltip="Присутствует файл в папке обновлений!"></div>';
$pic['keyF'] = '<div class="icon keyF tooltip" data-tooltip="Модуль достуен на ключе!"></div>';
$pic['keyA'] = '<div class="icon keyA tooltip" data-tooltip="Модуль доступен на ключе, но закончился срок получения обновлений!"></div>';
$pic['checkF'] = '<div class="icon checkF tooltip" data-tooltip="Модуль установлен!"></div>';
$pic['empty'] = '<div class="icon"></div>';
$ajaxloading = "<div class='cssload-container'><div class='cssload-shaft1'></div><div class='cssload-shaft2'></div><div class='cssload-shaft3'></div><div class='cssload-shaft4'></div><div class='cssload-shaft5'></div><div class='cssload-shaft6'></div><div class='cssload-shaft7'></div><div class='cssload-shaft8'></div><div class='cssload-shaft9'></div><div class='cssload-shaft10'></div></div>";



//Все функции
function clear(){unset($_SESSION['KeyInfo']);unset($_SESSION['k']);unset($_SESSION['Key']);}


//Формирует запрос на сервера битрикса $gzip, $step, $type, $module=NULL, $data=NULL, $ver=NUL
	/*
		array(
			0 utf - поддержка utf
			1 gzip - поддержка сжатия
			2 step - вид запроса
			3 type - тип страницы запроса STEPM|LIST
			4 idmodule - идентификатор модуля
			5 ver - текущая  установленная версия модуля
			6 data - остальные данные
			7 fname - имя файла
		);
		
	*/
function response($p) {
	
	$key = $_SESSION['k'];

	$str =   "utf=".$p['utf'].
           		"&lang=ru".
		   		"&stable=Y".
		   		"&CANGZIP=".$p['gzip'].
		   		"&SUPD_DBS=MYSQL".
		   		"&XE=N".
		   		"&LICENSE_KEY=".md5($key).
		   		"&SUPD_STS=1".
		   		"&SUPD_URS=0".
		   		"&SUPD_URSA=1".
		   		"&TYPENC=E".
		   		"&CLIENT_PHPVER=5.5.14".
		   		"&dbv=5.5.41";
		   		
	switch ($p['step']) {
    	case "info_key":
        	$str .= "&fullmoduleinfo=Y&SUPD_SRS=RU&SUPD_CMP=N&product=BSM&verfix=2";
			break;
		case "module_info":
			$str .= "&reqm=".$p['idmodule']."&lim=Y&SUPD_SRS=RU&SUPD_CMP=N&product=BSM&verfix=2";
			break;
		case "download":
			$str .= "&reqm=".$p['idmodule']."&lim=Y&SUPD_SRS=RU&SUPD_CMP=N&UFILE=".$p['data']."&USTART=0&product=BSM&verfix=2";
			break;
		case "updates":
			$str .= "&instm=".$p['data']."&reqm=".$p['idmodule']."&lim=Y&SUPD_SRS=RU&SUPD_CMP=N&product=BSM&verfix=2";
			break;
	}

	if(GetHTTPBitrix($p['fname'], $p['type'], $str)) return TRUE;
	else return FALSE;
}




////////////////////////////////////////////////
// РАБОТАЕМ ИСКЛЮЧИТЕЛЬНО С ИНФОРМАЦИЕЙ О КЛЮЧЕ
//Получает информацию о ключе	
function getKeyInfo($q=FALSE){
	if($q) {$result = &$_SESSION['Key']; $key = $_SESSION['k']; $_SESSION['k'] = $_POST["k"];}
	else $result = &$_SESSION['KeyInfo'];
	
	//формируем массив запроса
	$query = array(
		'utf' => 'Y',
		'gzip' => 'N',
		'step' => 'info_key',
		'type' => 'LIST',
		'fname' => 'keyinfo');
	//Если запрос к серверу вернул ИСТИНУ
	if(response($query)){
			$file = get_tmp_file($query['fname']);
			$infoKey = file_get_contents($file);
			unlink($file);
			$arrInfoKey = Array(); 
			CUpdateClientPartner::__ParseServerData($infoKey, $arrInfoKey, $strError_tmp);
			//Проверяем на наличие ошибок
			if(isset($arrInfoKey['DATA']['#']['ERROR'])) $result['ERROR'] = $arrInfoKey['DATA']['#']['ERROR']['0']['#'];
			else{
				//Формируем массив с ответом 
				$result['CLIENT']['NAME'] = $arrInfoKey['DATA']['#']['CLIENT']['0']['@']['NAME'];
				$result['CLIENT']['DATE_FROM'] = $arrInfoKey['DATA']['#']['CLIENT']['0']['@']['DATE_FROM'];
				$result['CLIENT']['DATE_TO'] = $arrInfoKey['DATA']['#']['CLIENT']['0']['@']['DATE_TO'];
				//пробегаемся по модулям если они есть и дергаем информацию
				foreach($arrInfoKey['DATA']['#']['MODULE'] as $value){
					$moduleId = $value['@']['ID'];
					$result['MODULES'][$moduleId]['ID'] = $moduleId;
					$result['MODULES'][$moduleId]['NAME'] = $value['@']['NAME'];
					$result['MODULES'][$moduleId]['DATE_FROM'] = $value['@']['DATE_FROM'];
					$result['MODULES'][$moduleId]['DATE_TO'] = $value['@']['DATE_TO'];
					$result['MODULES'][$moduleId]['UPDATE_END'] = $value['@']['UPDATE_END'];
					$result['MODULES'][$moduleId]['KEY'] = 'Y';
					foreach($value['#']['VERSION'] as $val){
						$ver = $val['@']['ID'];
						$result['MODULES'][$moduleId]['VERSIONS'][$ver]['ID'] = $moduleId;
						$result['MODULES'][$moduleId]['VERSIONS'][$ver]['UPDATE_VERSION'] = $ver;
						$result['MODULES'][$moduleId]['VERSIONS'][$ver]['DESC'] = $val['#']['DESCRIPTION']['0']['#'];
					}
					
				}
			}
			if($q) {unset($_SESSION['k']); $_SESSION['k'] = $key;}
			return $result;
	}
	//Иначе ошибка
	else return $result['ERROR'] = UNKNOWNERROR;

}

//Добавляет информацию о файлах модуля в сессию	
function getModuleInfo($moduleId){
	//Проверяем на доступность обновлений и информацию хранящююся в сессии
	$module = &$_SESSION['KeyInfo']['MODULES'][$moduleId];
	
	if(	(!$module['UFILE'] || !$module['FSIZE']) && $module['UPDATE_END'] != 'Y'){
		$query = array(
			'utf' => 'Y',
			'gzip' => 'N',
			'step' => 'module_info',
			'type' => 'STEPM',
			'idmodule' => $moduleId,
			'fname' => 'info.'.$moduleId);
		
	
		if(response($query)){
			$file = get_tmp_file($query['fname']);
			$infoModule = file_get_contents($file);
			unlink($file);
			$arrInfoModule = Array(); 
			CUpdateClientPartner::__ParseServerData($infoModule, $arrInfoModule, $strError_tmp);
			$module['UFILE'] = $arrInfoModule['DATA']['#']['FILE']['0']['@']['NAME'];
			$module['FSIZE'] = $arrInfoModule['DATA']['#']['FILE']['0']['@']['SIZE'];
		}else return $_SESSION['KeyInfo']['ERROR'] = UNKNOWNERROR;
	}
	
}
////////////////////////////////////////////////



////////////////////////////////////////////////
//РАБОТАЕМ ИСКЛЮЧИТЕЛЬНО С ИНФОРМАЦИЕЙ ИЗ ПАПКИ ОБНОВЛЕНИЙ
//Добавляет информацию о файлах обновлений в сессию	
function getMyUpdates(){
	//Разбираем файлы в папке
	global $dir;
	$result = &$_SESSION['KeyInfo']['MODULES'];
 	$arrDir = scandir($dir);
 	foreach($arrDir as $val){
	 	$arr = infUPD($val);

	 	//!!!!!!!!!!!!!!
	 	//Добавить поиск имени модуля в файле обновления
	 	
	 	//////

	 	//Заносим информацию в сессию о доступных обновлениях
	 	if($arr['updtype'] == 'mod'){
		 	$result[$arr['mid']]['UPDATE_VERSION'] = $arr['mver'];
		 	$result[$arr['mid']]['UPDATE_FILE'] = $arr['fname'];
		 	$result[$arr['mid']]['ID'] = $arr['mid'];
	 	}
	 	elseif($arr['updtype'] == 'delta'){	
		 	$result[$arr['mid']]['VERSIONS'][$arr['mver']]['UPDATE_VERSION'] = $arr['mver'];
		 	$result[$arr['mid']]['VERSIONS'][$arr['mver']]['UPDATE_FILE'] = $arr['fname'];
		 	$result[$arr['mid']]['VERSIONS'][$arr['mver']]['ID'] = $arr['mid'];
	 	}
	 	
 	}

}

//разбирает имя файла на массив с данными
function infUPD($fupd){
	preg_match("/(\w+\.\w+)+\.(\d+\.\d+\.\d+)+\.(mod|delta)+.upd+/", $fupd, $arr);
	if(is_array($arr)){
		$result['fname'] = $arr['0'];
		$result['mid'] = $arr['1'];
		$result['mver'] = $arr['2'];
		$result['updtype'] = $arr['3'];
		return $result;
	}else return NULL;
}
////////////////////////////////////////////////



////////////////////////////////////////////////
//РАБОТАЕМ ИСКЛЮЧИТЕЛЬНО С ИНФОРМАЦИЕ О СИСТЕМЕ
//Получает список присутствующих в системе модулей
function myModules(){
	//Получаем список установленных модулей
	// Получаем массив установленных версий модулей с версиями
	$myModules = CUpdateClientPartner::GetCurrentModules($strError_tmp='');
	
	//Убираем пример для скрытия модулей
	unset($myModules['module.name1-not_mine']);
	unset($myModules['module.name2-not_mine']);
	unset($myModules['module.name3-not_mine']);
	
	//убираем пометку "Не мое" скрывавшую модуль от сервера битрикса
	foreach($myModules as $key => $value){
		$myModules[str_replace('-not_mine','',$key)] = $value;
		if (strpos($key,'-not_mine')) unset($myModules[$key]);
	}
	//Убираем все модули ядра
	$bitrixModules = array("abtest", "advertising", "bitrix.eshop", "bitrix.sitecommunity", "bitrix.sitecorporate", "bitrix.siteinfoportal", "bitrix.sitepersonal", "bitrixcloud", "bizproc", "bizprocdesigner", "blog", "calendar", "catalog", "clouds", "cluster", "compression", "conversion", "currency", "eshopapp", "fileman", "form", "forum", "highloadblock", "iblock", "idea", "im", "ldap", "learning", "lists", "mail", "main", "mobileapp", "perfmon", "photogallery", "pull", "report", "sale", "scale", "search", "security", "sender", "seo", "socialnetwork", "socialservices", "statistic", "storeassist", "subscribe", "support", "translate", "vote", "webservice", "wiki", "workflow");
	foreach($bitrixModules as $value){
		if(isset($myModules[$value])) unset($myModules[$value]);
	}
	//Получаем имена модулей
	foreach($myModules as $key => $value){
		if(file_exists($lang=$_SERVER["DOCUMENT_ROOT"].'/bitrix/modules/'.$key.'/lang/ru/install/index.php')) require($lang);
		foreach($MESS as $k => $v){
			if(strpos($k, 'MODULE_NAME') or strpos($k,'INSTALL_NAME') or strpos($k,'MOD_NAME')) {
				$myModules[$key]['NAME'] = $v;
			}
		}
		unset($MESS);
	}

	return $myModules;
}
//Помещает информацию в сессию
function getMyModules(){
	$myModules = myModules();
	foreach($myModules as $moduleId => $value){
		$_SESSION['KeyInfo']['MODULES'][$moduleId]['INST_VERSION'] = $value['VERSION'];
		$_SESSION['KeyInfo']['MODULES'][$moduleId]['IS_DEMO'] = $value['IS_DEMO'];
		$_SESSION['KeyInfo']['MODULES'][$moduleId]['NAME'] = $value['NAME'];
		$_SESSION['KeyInfo']['MODULES'][$moduleId]['ID'] = $moduleId;
	}
}	
////////////////////////////////////////////////

//Перестраивает массив без запроса данных с ключа.
function rebuild(){
	$_SESSION['KeyInfo'] = $_SESSION['Key'];
	getMyModules();
	getMyUpdates();
}


function GetHTTPBitrix($fname, $page, $str, $vfix=FALSE){
	
	$requestIP = COption::GetOptionString("main", "update_site", DEFAULT_UPDATE_SERVER);
	$requestPort = 80;
	
	if($page == "LIST")
		$page = "smp_updater_list.php";
	elseif($page == "STEPM")
		$page = "smp_updater_modules.php";

	$FP = fsockopen($requestIP, $requestPort, $errno, $errstr, 120);

	if ($FP)
	{
		$strRequest = "";
		$strRequest .= "POST /bitrix/updates/".$page." HTTP/1.0\r\n";
		$strRequest .= "User-Agent: BitrixSMUpdater\r\n";
		$strRequest .= "Accept: */*\r\n";
		$strRequest .= "Host: ".$requestIP."\r\n";
		$strRequest .= "Accept-Language: en\r\n";
		$strRequest .= "Content-type: application/x-www-form-urlencoded\r\n";
		$strRequest .= "Content-length: ".strlen($str)."\r\n\r\n";
		$strRequest .= "$str";
		$strRequest .= "\r\n";

		fputs($FP, $strRequest);

		$bChunked = False;
		while (!feof($FP)){
			$line = fgets($FP, 4096);
			if ($line != "\r\n"){
				if (preg_match("/Transfer-Encoding: +chunked/i", $line))
					$bChunked = True;
			}else break;
		}

		$content = "";
		if ($bChunked){
			$maxReadSize = 4096;

			$length = 0;
			$line = FGets($FP, $maxReadSize);
			$line = StrToLower($line);

			$strChunkSize = "";
			$i = 0;
			while ($i < StrLen($line) && in_array($line[$i], array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f")))
			{
				$strChunkSize .= $line[$i];
				$i++;
			}

			$chunkSize = hexdec($strChunkSize);

			while ($chunkSize > 0){
				$processedSize = 0;
				$readSize = (($chunkSize > $maxReadSize) ? $maxReadSize : $chunkSize);

				while ($readSize > 0 && $line = fread($FP, $readSize)){
					$content .= $line;
					$processedSize += StrLen($line);
					$newSize = $chunkSize - $processedSize;
					$readSize = (($newSize > $maxReadSize) ? $maxReadSize : $newSize);
				}
				
				$length += $chunkSize;

				$line = FGets($FP, $maxReadSize);

				$line = FGets($FP, $maxReadSize);
				$line = StrToLower($line);

				$strChunkSize = "";
				$i = 0;
				while ($i < StrLen($line) && in_array($line[$i], array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f")))
				{
					$strChunkSize .= $line[$i];
					$i++;
				}

				$chunkSize = hexdec($strChunkSize);
			}
		}else{
			$file = fopen($_SERVER["DOCUMENT_ROOT"]."/bitrix/updates/".$fname.".upd", "w");
			while ($line = fread($FP, 4096)){
				fwrite($file,$line);
			}
			fclose($file);
		}		
		fclose($FP);
	}else return FALSE;
	return TRUE;
}
	
	
//////////////////////////////////////////////

function get_tmp_file($file,$upd=TRUE){
	$str = $_SERVER["DOCUMENT_ROOT"]."/bitrix/updates/".$file;
	if($upd)$str .= ".upd";
	return $str;
	
}

//Убирает пометку "НЕ МОЕ" с ID модуля
function not_mine(){
    //Смотрим пропатчен ли апдейтер. Если нет — патчим его
    $path2 = $_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/update_client_partner.php";
    $path3 = $_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/update_client.php";
    $newstr = '/*PATCH*/if(file_exists($ff=$_SERVER["DOCUMENT_ROOT"]."/not_mine.php")) require($ff); /*END PATCH*/return $arClientModules;';
	$newstr2 = '/*PATCH*/if(file_exists($ff=$_SERVER["DOCUMENT_ROOT"]."/not_mine.php")) require($ff);';
		
    $oldstr = '/return\s\$arClientModules;/';
    $isPatch = str_search($path2, $newstr);
    $isPatchToo = str_search($path3, $newstr2);
	$itsNumber = '/GetCurrentModules\(\S+\s\S+\s\S+\s\S(\S+)=\sarray/';	//ну, как смог...


    if(!$isPatch){
        $arrfile = file($path2);
        foreach($arrfile as $key => $str){
            $arrfile[$key] = preg_replace($oldstr, $newstr, $str);
        }
        $fp = fopen($path2, "w+"); // перезаписываем независимо от длины новой строки
        fwrite($fp,implode("",$arrfile));
        fclose($fp);
        echo "<span style='color:red; font-size:16px;'>Внимание!!!<br><br>Файл /bitrix/modules/main/classes/general/update_client_partner.php пропатчен (искать по слову PATCH).</span><br><br>";
    }
	//пропатчен ли update_client.php 
   if(!$isPatchToo){
        $arrfile = file($path3);
		foreach($arrfile as $key => $str){
        preg_match($itsNumber, $str, $itsNumber);
		$itsNumber = $itsNumber[1];
		$oldstr = '/return\s\$'.$itsNumber.';/';
		$newstr2 = '/*PATCH*/if(file_exists($ff=$_SERVER["DOCUMENT_ROOT"]."/not_mine.php")) require($ff);foreach($arModules as $val){if(isset($'.$itsNumber.'[$val]))unset($'.$itsNumber.'[$val]);} /*END PATCH*/return $'.$itsNumber.';';
			$arrfile[$key] = preg_replace($oldstr, $newstr2, $str);
        }
        $fp = fopen($path3, "w+"); // перезаписываем независимо от длины новой строки
        fwrite($fp,implode("",$arrfile));
        fclose($fp);
        echo "<span style='color:red; font-size:16px;'>Внимание!!!<br><br>Файл /bitrix/modules/main/classes/general/update_client.php пропатчен (искать по слову PATCH).</span><br><br>";
    }
    // Проверяем есть ли файл, если да, то не меняем его
    if(!file_exists($path=$_SERVER["DOCUMENT_ROOT"]."/not_mine.php")){
        $fp = fopen($path,"w+");
        fwrite ($fp, "<?\r\n//Замените названия module.name1, module.name2, module.name3 и так далее на модули которые хотите скрыть от серверов битрикса\r\n".'$'."arModules = array(\r\n'module.name1',\r\n'module.name2',\r\n'module.name3'\r\n);\r\n\r\nforeach(".'$'."arModules as ".'$'."val){\r\n    if(isset(".'$'."arClientModules[".'$'."val])) unset(".'$'."arClientModules[".'$'."val]);\r\n}\r\n?>");
        fclose($fp);
        echo "<span style='color:red; font-size:16px;'>Внесите свои даные в файл /not_mine.php находящемся в корне вашего сайта</span><br><br>";
    }
}

// Поиск вхождения строки в файле
function str_search($file, $str)
{
    $isPatch = false;
    if(strpos(file_get_contents($file), $str)){
        $isPatch = true;
    }
    return $isPatch;
}

/** Сравнение двух версий в формате XX.XX.XX  **/
/** Возвращает 1, если $v1 > $v2  **/
/** Возвращает -1, если $v1 < $v2 **/
/** Возвращает 0, если $v1 == $v2 **/
function compareVer($v1, $v2)
{
	$v1 = Trim($v1);
	$v2 = Trim($v2);
	if ($v1 == $v2)	return 0;
	$arrV1 = explode(".", $v1);
	$arrV2 = explode(".", $v2);
	if (IntVal($arrV1[0]) > IntVal($arrV2[0])
		|| IntVal($arrV1[0]) == IntVal($arrV2[0]) && IntVal($arrV1[1]) > IntVal($arrV2[1])
		|| IntVal($arrV1[0]) == IntVal($arrV2[0]) && IntVal($arrV1[1]) == IntVal($arrV2[1]) && IntVal($arrV1[2]) > IntVal($arrV2[2]))
	{return 1;}

	if (IntVal($arrV1[0]) == IntVal($arrV2[0]) && IntVal($arrV1[1]) == IntVal($arrV2[1]) && IntVal($arrV1[2]) == IntVal($arrV2[2]))
	{return 0;}

	return -1;
}


//проверяет возможность установки для модуля
function canInstall($moduleId, $verUPD = NULL){
	
	$inf = $_SESSION['KeyInfo']['MODULES'][$moduleId];

	//Есть ли установленная версия в системе
	if(!isset($verUPD)){
		if($inf['UPDATE_FILE']){
			//Проверяем на установку модуля
			if($inf['INST_VERSION']){
				//сравниваем версии
				$v = compareVer($inf['INST_VERSION'],$inf['UPDATE_VERSION']);
				//Если установленная версия больше или равна той что содержится в папке обновлений запрещаем обновления
				if($v == '1' || $v == '0') return FALSE;
				else return TRUE;			
			} else return TRUE;
		} //else return FALSE;
	}else{
		//Проверяем наличие файла обновления
		if($inf['VERSIONS'][$verUPD]['UPDATE_FILE']){
			//Проверяем на установку модуля
			if($inf['INST_VERSION']){
				
				$v = compareVer($inf['INST_VERSION'],$verUPD);//править
				if($v == "-1" && $inf['VERSIONS'][$verUPD]['UPDATE_VERSION']) return TRUE;
				else return FALSE;
			} //else return FALSE;
		}
	}
	return FALSE;
}

//Проверяет возможность скачивания
function canDownload($moduleId){
	$inf = $_SESSION['KeyInfo']['MODULES'][$moduleId];
	
	//Проверям окончилась ли поддержка
	if($inf['UPDATE_END'] != 'Y' && $inf['KEY'] == 'Y'){
		//сравниваем версии
		return TRUE;
	}else return FALSE;
}

////////////////////////////////////
//Отображение информации

function sortArray(&$arr){
	ksort($arr, SORT_NATURAL);
}

//Отдаем строку модуля
function strModule($infMod){
	
	$str  = "<div id=".str_replace('.', '-',$infMod['ID'])." class='module'>";
	$str .= "<div class='nameModule'><a href='http://marketplace.1c-bitrix.ru/solutions/".$infMod['ID']."'>";
	$infMod['NAME'] ? $str .= $infMod['NAME'].' ' : $str .= "(".$infMod['ID'].")";
	//$str .= "(".$infMod['ID'].")";
	$infMod["DATE_TO"] ? $str .= " поддержка до - ".$infMod["DATE_TO"] : "";
	$str .= "</a></div>";
	$str .=  "<div class='strModule'>";
	$str .= "<div class='inf'>";
	$infMod['INST_VERSION'] ? $str .= $infMod['ID']." (".$infMod['INST_VERSION'].")</div>" : $str .= $infMod['ID']."</div>";
	$str .= infForModule($infMod);
	$str .= "</div>";
		//Есть ли версии и установлен ли модуль
		if($infMod['VERSIONS'] && $infMod['INST_VERSION'])
		$prevVer = '0.0.0';
		foreach($infMod['VERSIONS'] as $vModId => $infVer){
			
			if($infMod['UPDATE_END'] != 'Y' || $infVer['UPDATE_FILE']) $str .= strDelta($infMod,$infVer,$prevVer);
			$prevVer = $infVer['UPDATE_VERSION'];
		}

	$str .= "</div>";
	
	return $str;
}

//блок информации и действий для модуля
function infForModule($infMod){
	global $pic;
	
	//Проверяем на возможность скачивания
	if(canDownload($infMod['ID'])) $isDownloadMod = '<div class="download"><a class="isDownload ajax-send-dwl" data-id="'.$infMod['ID'].'" data-type="mod" href="">Скачать</a></div>';
	else $isDownloadMod = '<div class="download no">Скачать</div>';
	
	//Проверяем на возможность установки
	if(canInstall($infMod['ID'])) $isInstallMod = '<div class="install"><a class="isInstall ajax-send-upd"  data-file="'.$infMod['UPDATE_FILE'].'" data-id="'.$infMod['ID'].'" data-type="mod" href="">Установить</a></div>';
	else $isInstallMod = '<div class="install no">Установить</div>';
	
	$str = '<div id="control-'.str_replace('.', '-',$infMod['ID']).'"class="control">';
	//Установлен?
	$infMod["INST_VERSION"] ? $str .= $pic['checkF'] : $str .= $pic['empty'];
	//Есть файл обновления?
	$infMod["UPDATE_FILE"] ? $str .= $pic['iconF'] : $str .= $pic['empty'];
	//Инфа с ключа о поддержке
	if($infMod["KEY"] == 'Y'){
		$infMod["UPDATE_END"] == 'Y' ? $str .= $pic['keyA'] : $str .= $pic['keyF'];
	}else $str .= $pic['empty'];
	
	$str .= $isDownloadMod;
	$str .= $isInstallMod;
	$str .= "</div>";
	$str .= "<div id='".str_replace('.', '-',$infMod['ID'])."-inf' class='infoAJAX'></div>";
	return $str;
}


//Отдаем строку дельта обновления
function strDelta($infMod,$infVer,$prevVer){

	
	$str = "<div class='strUpdate'>";
	$str .= "<div class='inf'>";
	$str .= $infVer['UPDATE_VERSION'];
	$str .= "</div>";
	$str .= infForDelta($infMod,$infVer,$prevVer);
	$str .= "</div>";
	
	return $str;
}

//блок информации и действий для модуля
function infForDelta($infMod,$infVer,$prevVer){
	global $pic;
	
	//Проверяем на возможность скачивания
	//if(canDownload($infMod['ID'])) $isDownloadUpd = '<div class="download"><a class="isDownload ajax-send-dwl" data-id="'.$infVer['ID'].'" data-prevver="'.$prevVer.'" data-ver="'.$infVer['UPDATE_VERSION'].'" data-type="delta" href="">Скачать</a></div>';
	//else $isDownloadUpd = '<div class="download no">Скачать</div>';
	
	if(canDownload($infMod['ID'])) $noDown = NULL; else $noDown ='no';
	$isDownloadUpd = '<div class="download '.$noDown.'"><a class="isDownload ajax-send-dwl" data-id="'.$infVer['ID'].'" data-prevver="'.$prevVer.'" data-ver="'.$infVer['UPDATE_VERSION'].'" data-type="delta" href="">Скачать</a></div>';
	
	//Проверяем на возможность установки
	//if(canInstall($infMod['ID'], $infVer['UPDATE_VERSION'])) $isInstallUpd = '<div class="install"><a class="isInstall ajax-send-upd" data-file="'.$infVer['UPDATE_FILE'].'" data-id="'.$infVer['ID'].'" data-prevver="'.$prevVer.'" data-ver="'.$infVer['UPDATE_VERSION'].'" data-type="delta" href="">Установить</a></div>';
	//else $isInstallUpd = '<div class="install no">Установить</div>';
	
	if(canInstall($infMod['ID'], $infVer['UPDATE_VERSION'])) $noUpd = NULL; else $noUpd ='no';
	$isInstallUpd = '<div class="install '.$noUpd.'"><a class="isInstall ajax-send-upd" data-file="'.$infVer['UPDATE_FILE'].'" data-id="'.$infVer['ID'].'" data-prevver="'.$prevVer.'" data-ver="'.$infVer['UPDATE_VERSION'].'" data-type="delta" href="">Установить</a></div>';
	
	$str = '<div id="control-'.str_replace('.', '-',$infMod['ID'].'-'.$infVer['UPDATE_VERSION']).'"class="control">';
	//Установлено ли обновление?
	compareVer($infMod["INST_VERSION"],$infVer['UPDATE_VERSION']) != '-1' ? $str .= $pic['checkF'] : $str .= $pic['empty'];
	$infVer["UPDATE_FILE"] ? $str .= $pic['iconF'] : $str .= $pic['empty'];
	//Поправка для иконки ключа
	$str .= $pic['empty'];
	$str .= $isDownloadUpd;
	$str .= $isInstallUpd;
	$str .= "</div>";
	$str .= "<div id='".str_replace('.', '-',$infMod['ID'])."-".str_replace('.', '-',$infVer['UPDATE_VERSION'])."-inf' class='infoAJAX'></div>";
	return $str;

}
//////////////////////////////////////////



//////////////////////////////////////////
//Функции для Аякса

//Функция скачивания модулей
// возвращает строку html после скачивания
// возвращает TRUE если файл уже был
// возвращает FALSE в случае ошибки
function downloadModule($request){
	
	//формируем запрос на получение имени файла для скачивания
	if($request['type'] == 'mod'){
		$query = array(
		'utf' => 'Y',
		'gzip' => 'N',
		'step' => 'download',
		'type' => 'STEPM',
		'idmodule' => $request['id'],
		'fname' => 'dwl.'.$request['id']);
	}else{
		$query = array(
		'utf' => 'Y',
		'gzip' => 'N',
		'step' => 'updates',
		'type' => 'STEPM',
		'idmodule' => $request['id'],
		'data' => $request['id']."%2C".$request['prevver']."%2CN",
		'fname' => 'dwl.'.$request['id']);
	}

		
	//отправляем запрос
	response($query);
	$file = get_tmp_file($query['fname']);
	//считываем файл
	$infFile = file_get_contents($file);

	unlink($file);
	$arrInf = Array();
	//разбираем в массив
	CUpdateClientPartner::__ParseServerData($infFile, $arrInf, $strError_tmp);
	$ufile = $arrInf['DATA']['#']['FILE']['0']['@']['NAME'];
	$ufile_size = $arrInf['DATA']['#']['FILE']['0']['@']['SIZE'];	
	//ищем уже скаченный файл в папке с таким же размером
	$nofile = TRUE;


	global $dir;
	$arrDir = scandir($dir);

 	foreach($arrDir as $val){
	 	$arr = infUPD($val);
	 	$file = str_replace('.upd.upd', '.upd',get_tmp_file($arr['fname']));
	 	//Отладка
	 	//echo $arr['mid']." == ".$request['id']." && ".$arr['updtype']." == ".$request['type']." && ".$arr['mver']." == ".$request['ver']." -- ".$ufile_size." == ".filesize($file)."<br>";
	 	if($request['type'] == 'mod'){
		 	if($arr['mid'] == $request['id'] && $arr['updtype'] == $request['type'])
	 		if($ufile_size==filesize($file)) $nofile =FALSE;
	 	}else{
		 	if($arr['mid'] == $request['id'] && $arr['updtype'] == $request['type'] && $arr['mver'] == $request['ver'])
	 		if($ufile_size==filesize($file)) $nofile =FALSE;
	 	}
	 }
 
	if($nofile){
		//Если получено имя файла
		if($ufile){
			//Получаем файл модуля
			if($request['type'] == 'mod') {
				$query['data'] = $ufile;
				$query['fname'] = $request['id'].'.0.0.0.mod';
			}else{
				$query['data'] .= "&UFILE=".$ufile;
				$query['fname'] = $request['id'].'.'.$request['ver'].'.'.$request['type'];
			}	

			response($query);
			$file = get_tmp_file($query['fname']);
	
			//Если размер не совпадает то удаляем
			if($ufile_size!=filesize($file)){
				unlink($file);
				return FALSE;
			}
			//иначе ищим строку с указанием версии модуля
			elseif($request['type'] == 'mod'){
				$handle = fopen($file, "r");
				$versionMod = FALSE;
				while(!$versionMod  && ($line = fgets($handle, 4096)) !== FALSE ){
					preg_match("/VERSION.[^0-9]*=+>+.[^0-9]*(\d+\.\d+\.\d+)/", $line, $arr);
					//Если найдена то переименовываем файл и останавливаем цикл
					if($arr['1']) {
						rename($file,get_tmp_file($request['id'].'.'.$arr['1'].'.mod'));
						$versionMod = TRUE;}
					
				}
				
				//Изменяем данные в сессии в соответствии с полученными данными
				rebuild();
				return infForModule($_SESSION['KeyInfo']['MODULES'][$request['id']]);
			}elseif($request['type'] == 'delta'){
				//Изменяем данные в сессии в соответствии с полученными данными
				rebuild();
				return infForDelta($_SESSION['KeyInfo']['MODULES'][$request['id']],$_SESSION['KeyInfo']['MODULES'][$request['id']]['VERSIONS'][$request['ver']],$request['prevver']);
			}
		}else return FALSE;
	}else	return TRUE;
}


//Функция расспаковки архива обновлений
function unarch($file, $isDel=FALSE){
	
	$pathFile = get_tmp_file($file,FALSE);
	$updatesDir = "update_".$file;
	$updatesDirFull = $_SERVER["DOCUMENT_ROOT"]."/bitrix/updates/".$updatesDir;

	$f = fopen($pathFile, "r");
	$flabel = fread($f, strlen("BITRIX"));
	if($flabel != 'BITRIX') return FALSE;

	while (TRUE){

		$add_info_size = fread($f, 5);
		$add_info_size = Trim($add_info_size);

		if (IntVal($add_info_size) > 0 && IntVal($add_info_size)."!"==$add_info_size."!"){
			$add_info_size = IntVal($add_info_size);
		}else break;
		
		$add_info = fread($f, $add_info_size);
		$add_info_arr = explode("|", $add_info);

		//Проверяем полученный массив на кол-во элементов
		if (count($add_info_arr) != 3) break;

		$size = $add_info_arr[0];
		$curpath = $add_info_arr[1];
		$crc32 = $add_info_arr[2];

		$contents = "";

		if (IntVal($size) > 0) $contents = fread($f, $size);
		
		//Проверяем контент, контрольная сумма
		$crc32_new = dechex(crc32($contents));
		if ($crc32_new != $crc32) break;
						
		else
		{
			checkDir($updatesDirFull.$curpath, true);

			if (!($fp1 = fopen($updatesDirFull.$curpath, "wb")))break;

			if (strlen($contents) > 0 && !fwrite($fp1, $contents))
			{
				@fclose($fp1);
				break;
			}
			fclose($fp1);

			//Проверка записанного файла
			$crc32_new = dechex(crc32(file_get_contents($updatesDirFull.$curpath)));
			if ($crc32_new != $crc32) break;
		}
				
		fclose($zp);
		
		
		
	}
	if ($isDel)	@unlink($pathFile);
	return TRUE;
	
}


///////////////////ВЯЗТО ТУПО У БИТРИКСА//////////////////////////
/** Создание пути, если его нет, и установка прав писать **/
function checkDir($path, $bPermission = true)
{
	$badDirs = Array();
	$path = str_replace("\\", "/", $path);
	$path = str_replace("//", "/", $path);

	if ($path[strlen($path)-1] != "/") //отрежем имя файла
	{
		$p = strrposbx($path, "/");
		$path = substr($path, 0, $p);
	}

	while (strlen($path)>1 && $path[strlen($path)-1]=="/") //отрежем / в конце, если есть
		$path = substr($path, 0, strlen($path)-1);

	$p = strrposbx($path, "/");
	while ($p > 0)
	{
		if (file_exists($path) && is_dir($path))
		{
			if ($bPermission)
			{
				if (!is_writable($path))
					@chmod($path, BX_DIR_PERMISSIONS);
			}
			break;
		}
		$badDirs[] = substr($path, $p+1);
		$path = substr($path, 0, $p);
		$p = strrposbx($path, "/");
	}

	for ($i = count($badDirs)-1; $i>=0; $i--)
	{
		$path = $path."/".$badDirs[$i];
		@mkdir($path, BX_DIR_PERMISSIONS);
	}
}

function strrposbx($haystack, $needle)
{
	$index = strpos(strrev($haystack), strrev($needle));
	if($index === false)
		return false;
	$index = strlen($haystack) - strlen($needle) - $index;
	return $index;
}
////////////////////////////////////////////////////////////////
?>