// Проверка доступности хоста

var pending = 0; // счетчик еще не выполненных запросов

// Посылка ping-запроса на хост номер i
function Ping(i) {
	var objWMIService = GetObject("winmgmts:\\\\.\\Root\\CIMV2");
	var objContext = new ActiveXObject("WbemScripting.SWbemNamedValueSet");
	objContext.Add ("index", i);
	var id = INI['host'+i].name || INI['host'+i].ip;
	objWMIService.ExecQueryAsync(idPing, "select * from Win32_PingStatus where address ='" + id + "'", null, null, null, objContext);
}

// Обработка ответа на ping
function fOnObjectReady(objWbemObject, objWbemAsyncContext){
	var i = objWbemAsyncContext("index");
	INI['host'+i].online = (objWbemObject.StatusCode == 0) ? objWbemObject.ResponseTime : -1;
	RowEnabled(i);
	pending--;
	if (pending==0) StartTimer();
}

// "Ping" на определенный порт хоста
// Используется утилита tcping.exe <http://www.elifulkerson.com/projects/tcping.php>)
function PingPort(i) {
	var id = INI['host'+i].name || INI['host'+i].ip;
	var out_file = FSO.BuildPath(FSO.GetSpecialFolder(2), FSO.GetTempName());
	var cmd = 'cmd /c "' + util_dir + '\\tcping.exe" -n 1 ' + id + ' ' + INI['host'+i].port_check + ' >' + out_file;
	WshShell.Run(cmd, 0, true);
	var out = ReadTextFile(out_file);
	if (FSO.FileExists(out_file)) FSO.DeleteFile(out_file, true);
	INI['host'+i].online = (/Average = (\d+)\.*\d*ms[\s]*$/g.test(out)) ? RegExp.lastParen : -1;
	RowEnabled(i);
	pending--;
	if (pending==0) StartTimer();
}

// Пинг на очередной хост из arrPingHosts
function PingNextHost(){
	if (arrPingHosts.length > 0) {
		var i = arrPingHosts.shift();
		pending++;
		if (INI['host'+i].port_check) {
			PingPort(i);
		} else {
			Ping(i);
		}
		setTimeout('PingNextHost()', 0);
	}
}

var arrPingHosts = []; // содержит номера пингуемых хостов

// Создает массив пингуемых хостов
function CreatePingArr() {
	if (hosts_count < 1) return;
	StopTimer();
	idStatus.innerText = "Ping all hosts...";
	arrPingHosts = [];
	for (var i=0; i<hosts_count; i++) {
		arrPingHosts.push(i);
	}
	setTimeout('PingNextHost()', 0);
}

var timerID = null; // Идентификатор таймера
var ping_enable = true; // Признак того, что пинги разрешены

function StopTimer() {
	ping_enable = false;
	if (timerID) {
		clearInterval(timerID);
		idTimer.value = 0;
		timerID = null;
	}
}

function StartTimer() {
	StopTimer();
	idTimer.value = INI.main.ping_interval;
	idStatus.innerText = "Ready";
	timerID = setInterval(Timer, 1000);
	ping_enable = true;
}

function Timer() {
	if (idTimer.value==0) {
		if (ping_enable) CreatePingArr();
	} else {
		idTimer.value--;
	}
}
