<html>

<head>
<meta http-equiv="Content-Language" content="ru-ru">
<meta http-equiv="Content-Type" content="text/html; charset=unicode">
<title>Обновление конфигурации "1C:Предприятие"...</title>

<HTA:APPLICATION ID="oHTA"
     BORDER="none"
     CAPTION="no"
     CONTEXTMENU="no"
     Icon="splash.ico"
     INNERBORDER="no"
     NAVIGABLE="yes"
     SHOWINTASKBAR="yes"
     SCROLL="no"
     VERSION="1.0.0.0"/>

<script language="javascript" src="helpers.js"></script>
<script language="javascript" src="main.js"></script>
<script language="javascript">

	// Размер и положение окна по умолчанию.
	var splashWindowWidth  = 490;
	var splashWindowHeight = 350;
	var splashWindowLeft   = 200;
	var splashWindowTop    = 100;
	
	// Инициализация окна
	if (window.screen)
	{
		splashWindowLeft = (window.screen.availWidth - splashWindowWidth) / 2;
		splashWindowTop  = (window.screen.availHeight - splashWindowHeight) / 2;
	}
	window.moveTo(splashWindowLeft, splashWindowTop);
	window.resizeTo(splashWindowWidth, splashWindowHeight);

	// Переменные состояния
    var step = 0;   // Текущий шаг процедуры обновления.
	var ret = 0;    // Код возврата предыдущего шага.
    var finish = false;
    var errStep = 0;
    var loadStep = 6;   // шаг начала загрузк первого файла обновления
    var endLoadStep = loadStep + cfgFileNames.length * 4;    // следующий шаг после завершения загрузки файлов обновления
	if (cfgFileNames.length == 0)
		endLoadStep = loadStep + 2;

	// Вывести сообщение о ходе обновления
	function setProgress(statusText)
	{
	    statusText += "...";
        progressText.innerHTML = statusText;
	    log(statusText);
	}

	// Конечный автомат для выполнения шагов процедуры обновления конфигурации.
	function doStep(step)
	{
	    switch(step)
	    {
	        case 0:
    	        setProgress("Инициализация");
	            break;
	        case 1:
                ret = initialize();
	            break;
	        case 2:
        	    setProgress("Завершение работы пользователей");
	            break;
	        case 3:
	            ret = disconnectAndBlockUsersHTA(); 
	            CollectGarbage();
	            break;
	        case 4:
                setProgress("Cоздание резервной копии информационной базы");
	            break;
	        case 5:
	            ret = backupDB(); 
	            break;
	        case endLoadStep:
	            setProgress("Разрешение подключений новых соединений");
	            break;
	        case endLoadStep + 1:
	            ret = allowConnections(); 
	            break;
	        case endLoadStep + 2:
        	    setProgress("Завершение");
	            break;
	        case endLoadStep + 3: 
                // Все готово.
                finalize(true);
                runEnterprise();
                self.close();
                ClearTempFiles();
                finish = true;
	            break;
	        default: 
	        {
	            if ((step < loadStep) || (step >= endLoadStep))
	                break;
				if (cfgFileNames.length == 0)
				{
		            var internalStep = step - loadStep; 
		            switch (internalStep)
		            {
		                case 0:
	                	    setProgress("Обновление конфигурации информационной базы");
		                    break;
		                case 1:
	        	            ret = updateDbCfg(); 
		                    break;
	                }
					break;
				}
				
	            var cfgFileIndex = Math.floor((step - loadStep) / 4); // 0, 1, 2, 3, ...
	            var internalStep = (step - loadStep) % 4; 
	            switch (internalStep)
	            {
	                case 0:
                        setProgress(format("Загрузка файла обновления в основную базу ({0}/{1})", cfgFileIndex + 1, cfgFileNames.length));
	                    break;
	                case 1:
        	            ret = updateCfg(cfgFileNames[cfgFileIndex]);
        	            if (ret != 0)   // Если не удалось загрузить файл, возможно конфигурация не находится на поддержке.
        	                ret = loadCfg(cfgFileNames[cfgFileIndex]);
	                    break;
	                case 2:
                	    setProgress(format("Обновление конфигурации информационной базы ({0}/{1})", cfgFileIndex + 1, cfgFileNames.length));
	                    break;
	                case 3:
        	            ret = updateDbCfg(); 
	                    break;
                }
                    
	            break;
	        }
	    }
	    return ret;
	}
	
	// Выпонить процедуру обновления конфигурации
	function main()
	{
        if (finish) 
            return;

        if (ret > 0)   // Если предыдущий шаг завершился неудачно...
        { 
            if (errStep == 0)
            {
    	        log(format("Завершение с ошибкой. Код ошибки: {0}. Подробности см. в предыдущей записи.", ret), true);
    	        setProgress("Восстановление информационной базы");
                errStep++;
                setTimeout("main()", 5);   // Передача управления IE и повторный вызов main.
                return;
            }
            finalize(); 
            runEnterprise(false);
            self.close();
            ClearTempFiles();
            finish = true;
            return; 
        }
        
	    // Последовательное выполнение шагов процедуры обновления.
	    
	    // При отключении пользователей необходимо возвращаться на тот же шаг
	    if (ret != -1) 
        	step++;
        doStep(step);
        if (!finish)
            setTimeout("main()", ret != -1 ? 5 : 18*1000);   // Передача управления IE и повторный вызов main.
	}

function checkClose()
{
    if (!finish)
        event.returnValue = format('Внимание: процесс обновления был прерван, и информационная база осталась заблокированной!\n'+
            'Для разблокирования информационной базы воспользуйтесь консолью кластера серверов или запустите "1С:Предприятие".');
}

function ClearTempFiles()
{
    // Удаляем временные файлы
	try
	{
		oFileSystemObject.DeleteFile(thisFileDir + '\\main.js');
		oFileSystemObject.DeleteFile(thisFileDir + '\\helpers.js');
		oFileSystemObject.DeleteFile(thisFileDir + '\\splash.bmp');
		oFileSystemObject.DeleteFile(thisFileDir + '\\splash.ico');
		oFileSystemObject.DeleteFile(thisFileDir + '\\progress.gif');
	}
	catch(e) {}
}

</script>
</head>

<body  onLoad="window.setTimeout('main()',10);"  background="splash.bmp" style="border: 0px;">

<div id="progressIcon" style="position: absolute; left: 150px; top: 90px;">
  <img src="progress.gif" border=0/>
</div>

<div id="captionText" style="font-size: 10pt; font-family: verdana,arial; font-weight: bold; color: #606060; position: absolute; left: 220px; top: 90px;">
  Пожалуйста, подождите. Выполняется обновление конфигурации.
</div>

<div id="progressText" style="font-size: 8pt; font-family: verdana,arial; color: #000000; position: absolute; left: 180px; top: 270px;">
  &nbsp;
</div>

</body>

</html>