// Выделяет и снимает выделение с группы чекбоксов (с зажатым Shift)
function CheckHosts() {
	if (event.shiftKey) {
		var _check = false;
		var ChkBox = event.srcElement;
		var idxChkBox = GetElementIndex(idMarkHost, ChkBox);
		for (var i=0; i<idMarkHost.length; i++) {
			if ( (idMarkHost[i].checked==ChkBox.checked) || (i == idxChkBox) ) {
				_check = !_check;
			}
			if (_check) idMarkHost[i].checked = ChkBox.checked;
		}
	}
}

// Отмечает все online хосты в списке
function CheckAll(){
	for (var i=0; i<idMarkHost.length; i++) {
		if (((INI['host'+i].online >= 0) || event.shiftKey) || !idCheckAll.checked) idMarkHost[i].checked = idCheckAll.checked;
	}
}

// Снимает отметку со всех хостов
function UncheckAll(){
	for (var i=0; i<idMarkHost.length; i++) idMarkHost[i].checked = false;
	idCheckAll.checked = false;
}

// Создает заголовок таблицы
function CreateHeaders() {
	var align, input_htm;
	for (var j = 0; j < column_headers.length; j++) {
		with (idHeaderRow.insertCell()) {
			align = (j==0) ? 'left' : '';
			input_htm = (j == 0) ? '&nbsp;<input id="idCheckAll" type=checkbox class=chk hidefocus onclick="CheckAll()">&nbsp;' : '';
			innerHTML = '<td><table class="tHeader"><tr><th align="' + align + '" onmouseup="if (event.button==2) {oCM.column=' + j + '; ShowContextMenuHeader();}">' + input_htm + column_headers[j] + '</th></tr></table></td>';
		}
		with (idHeaderRow.insertCell()) {
			id = "idResizer";
			onmousedown = ColumnResize_start;
		}
	}
	// Восстановление сохраненных размеров колонок
	if (column_width) {
		var width;
		for (var i = 0; i < idHeaderRow.cells.length; i+=2) {
			width = column_width[i/2];
			if (width) idHeaderRow.cells[i].style.width = width + 'px';
		}
	}
}

// Добавляет ряд в таблицу
function AddRow() {
	var HostRow = idHostsList.insertRow();
	HostRow.onmouseover = function(){ // Подсветка текущего ряда
		if (!oCM.visible) this.style.backgroundColor = "infobackground";
		if (isInfoShow) {
			var host = INI['host' + (this.rowIndex-1)];
			winInfo.idFoto.src = host.username ? ('../images/'+ host.username.replace(/^.*\\/, '') + '.jpg') : '';
		}
	};
	HostRow.onmouseout  = function(){ // Снимаем подсветку с текущего ряда
		if (!oCM.visible) this.style.backgroundColor = "";
	};
	HostRow.onmouseup = function() { // Вызов контекстного меню
		if (event.button==2) {
			copy_text = event.srcElement.innerText;
			oCM.row = this.rowIndex-1;
			INI.context_menu ? ShowContextMenuRow() : ShowContextMenuDefault();
		}
	};
	HostRow.ondblclick = function() { // Действие по умолчанию
		oCM.row = this.rowIndex-1;
		var item = INI.context_menu['cm_default'];
		if (item) {
			ContextMenuRunItem(INI.context_menu['cm_cmd'+item]);
		} else {
			WshShell.Popup("Don\'t define default command\nPlease check your INI-file!", 5, app_name, 16);
		}
	};
	// Перетаскивание ряда
	HostRow.onmousedown = function() {
		if (event.button==1) {
			this.className = 'dragRow';
		}
	};

	// Добавляем ячейки
	for (var j=0; j<column_contents.length; j++) {
		with (HostRow.insertCell()) {
			className = 'tdata';
			colSpan = 2;
		}
	}
}

// Заполняет ряд таблицы данными
function FillRow(i){
	var host = INI['host'+i];
	var oRow = idHostsList.rows[i];
	var html, oCell;
	for (var j=0; j<column_contents.length; j++) {
		oCell = oRow.cells[j];
		oCell.style.whiteSpace = "nowrap";
		html = (j==0) ? '<input id="idMarkHost" type=checkbox class=chk hidefocus onclick="CheckHosts()"><img id="idIcon" src="images/' + (host.type || 'computer') + '.ico">&nbsp;' : '';
		if (!/<host\.online>/.test(column_contents[j])) {
			oCell.innerHTML = html + '<span id="idContents">' + rr(column_contents[j], i) + '</span>';
			if (/\S+/.test(oCell.innerText)) oCell.title = oCell.innerText;
		} else {
			oCell.innerHTML = '<span id="idOnline">n</span>'
			oCell.style.textAlign = 'center';
		}
	}
	setTimeout('RowEnabled('+i+')', 0);
}

// Установка цвета ячейки idOnline в зависимости от значения ResponseTime
function ResponseTimeColor(resp_time){
	var p = Math.floor((256*resp_time/Number(INI.main.response_time_max)));
	if (p > 255) return 'rgb(255,0,0)';
	var r = (p<128) ? p*2 : 255;
	var g = (p<=128) ? 255 : 512-p*2;
	return 'rgb('+r+ ',' + g + ',0)';
}

// Делает (не)активным ряд в зависимости от значения host.online
function RowEnabled(i){
	var host = INI['host'+i];
	var oRow = idHostsList.rows[i];
	var oIcon = document.getElementsByName('idIcon')[i];
	var oOnline = document.getElementsByName('idOnline')[i];
	var icon_filter = oIcon.style.filter;
	if (oOnline && (host.online >= 0)) {
		oOnline.style.color = ResponseTimeColor(host.online);
		oOnline.title = host.online + 'ms';
	}
	if ((icon_filter == '') == (host.online >= 0)) return;
	if (host.online >= 0) { // online
		oIcon.style.filter = '';
		for (var i = 0, content; content = oRow.getElementsByTagName('SPAN')[i++];) content.removeAttribute("disabled");
	} else { // offline
		oIcon.style.filter = 'Xray';
		for (var i = 0, content; content = oRow.getElementsByTagName('SPAN')[i++];) content.disabled = true;
	}
}

// Удаляет ряд из таблицы
function RowDelete(i) {
	idHostsList.deleteRow(i);
	for (var j=i; j<hosts_count; j++) {
		INI['host'+j] = INI['host'+(j+1)];
	}
	delete INI['host'+j];
	hosts_count--;
}

// Добавление новой колонки
function ColumnAdd(){
	column_add = true;
	idHeaderRow.cells[oCM.column*2].style.backgroundColor = "infobackground";
	showModalDialog('code/column.html', self, 'status:no; help:no; dialogWidth:10px; dialogHeight:30px;');
	idHeaderRow.cells[oCM.column*2].style.backgroundColor = "";
}

// Редактирование отображаемых в колонке данных
function ColumnEdit(){
	column_add = false;
	idHeaderRow.cells[oCM.column*2].style.backgroundColor = "infobackground";
	showModalDialog('code/column.html', self, 'status:no; help:no; dialogWidth:10px; dialogHeight:30px;');
	idHeaderRow.cells[oCM.column*2].style.backgroundColor = "";
}

// Удаление выбранной колонки
function ColumnDelete(){
	column_headers.splice(oCM.column, 1);
	INI.main.column_headers = column_headers.join(',');
	column_contents.splice(oCM.column, 1);
	INI.main.column_contents = column_contents.join(',');
	column_width.splice(oCM.column+1, 1);
	INI.main.column_width = column_width.join(',');
	ShowHostsTable();
}

// Сортировка таблицы по выбранной колонке
function ColumnSort(){
	// сравнение по алфавиту
	function compareAlph(a, b) {
		var x = Html2text(a[ct]);
		var y = Html2text(b[ct]);
		if (x < y) return -1;
		if (x > y) return 1;
		return 0;
	}

	// сравнение по числовому значению (точнее - по сумме)
	function compareNum(a, b) {
		function StrSum(str){
			var sum = 0;
			var re = /(\d+)/g;
			while (re.exec(str)){
				sum += Number(RegExp.lastParen);
			}
			return sum;
		}
		var x = a[ct] ? StrSum(a[ct]) : 0;
		var y = b[ct] ? StrSum(b[ct]) : 0;
		return (x - y);
	}

	// сравнение по IP
	function compareIP(a, b) {
		function ip2num(ip) {
			var arr = /(\d+)\.(\d+)\.(\d+)\.(\d+)/.exec(ip);
			return arr ? (arr[1]*16777216 + arr[2]*65536 + arr[3]*256 + Number(arr[4])) : 0;
		}
		return ip2num(a.ip) - ip2num(b.ip);
	}

	// перегрузка значений во временный массив
	var arrHosts = [];
	for (var i=0; i<hosts_count; i++) {
		arrHosts[i] = INI['host'+i];
	}

	// выбор критерия сортировки
	var ct = column_contents[oCM.column].match(/<host\.(.*?)>/)[1];
	switch(ct){
		case "ip":
			arrHosts.sort(compareIP);
			break;
		case "proc_clock":
		case "memory_size":
		case "disks_size":
			arrHosts.sort(compareNum);
			break;
		default:
			arrHosts.sort(compareAlph);
	}

	// перегрузка значений из временного массива
	for (var i=0; i<hosts_count; i++) {
		delete INI['host'+i];
		INI['host'+i] = arrHosts[i];
	}
	ShowHostsTable();
}

var dW = dH = 0; // разница между размером окна и размером клиентской области
// Обработка эвента изменения размеров окна
function Window_OnResize(){
	if (window.screenLeft!=0) { // если не нажали кнопку "Развернуть"
		INI.main.width = document.body.clientWidth + dW;
		INI.main.height = document.body.clientHeight + dH;
	}
}

function ShowHostsTable(){
	RemoveChildren(idHeaderRow);
	RemoveChildren(idHostsList);
	for (var i=0; i<hosts_count; i++) {
		AddRow();
		FillRow(i);
	}
	CreateHeaders();
	StartRowDnD();
	idHostsCount.innerText = hosts_count;
	StartTimer();
}

// Действия при открытии окна приложения
function Window_OnLoad() {
	dW = INI.main.width - document.body.clientWidth;
	dH = INI.main.height - document.body.clientHeight;
	ShowHostsTable();
	if (INI.main.shortcut != '1') CreateShortcut();
	idFindText.focus();
}

// Удаление обработки события перемещения мыши
function DeleteEvents(){
	var Rows = idHostsList.rows;
	for (var i=0; i<Rows.length; i++) {
		Rows[i].onmouseover = null;
		Rows[i].onmouseout = null;
	}
}

var isNoSave = false; // Признак сохранения текущих настроек

// Действия перед закрытием окна приложения
function Window_OnBeforeUnLoad() {
	DeleteEvents();
	StopTimer();
	if ((!isNoSave) && (WshShell.Popup("Save current settings?", 0, document.title, 292)==6)) SaveINI();
}

// Обработка нажатий на клавиши
function OnKeyDown(){
	switch(event.keyCode){
		case 112: // F1
			open("readme.html");
			break;
		case 27: // Esc
			if (idFindText.value) { // Очистка результатов поиска текста
				idFindText.value = '';
				ClearFounds();
			} else {                // Завершение работы
				isNoSave = true;
				self.close();
			}
			break;
		case 38: // Up (на предыдущее вхождение текста)
			if (Number(idFoundCount.innerText) > 1) MarkCurrentFound(-1);
			break;
		case 40: // Down (на следующее вхождение текста)
			if (Number(idFoundCount.innerText) > 1) MarkCurrentFound(1);
			break;
	}
}
