var oCM = new ContextMenu();

// Зададим значения встроенным свойствам объекта ContextMenu:
oCM.icons = true;
var icons_path = 'images\\';

// Добавим пользовательские свойства к объекту:
oCM.column = -1;  // колонка заголовка таблицы на котором открыто контекстное меню
oCM.row = -1;     // ряд таблицы на котором открыто контекстное меню (-1 - контекстного меню нет)

/* ====================================================================
Показывает контекстное меню из пунктов Items

Объект ContextMenu имеет свойства:
 .icons - контекстное меню содержит иконки
 .checks - контекстное меню содержит чекбоксы
 .visible - меню в данный момент видимо (если .visible = true)
 
Объект ContextMenu имеет события:
 .onChange - при выборе пункта меню
 .onUnload - при закрытии меню
 
Каждый объект Item массива Items имеет свойства:
 .text - текст пункта меню (если .text = '-' то вставляется разделитель)
 .icon - ссылка на иконку 16х16
 .disabled - пункт меню неактивен (если .disabled = true)
 .checked - пункт меню отмечен чекбоксом (если .checked = true)
 .accent - пункт меню выделяется жирным шрифтом (если .accent = true)
*/

function ContextMenu(Items) {
	this.Show = function () {
		var winContextMenu = window.createPopup();
		with (winContextMenu.document.createStyleSheet()){
			addRule('*','font:8pt MS Shell Dlg;');
			addRule('table','background-color:buttonface; font:menu; border:2px outset; border-collapse:collapse; cursor:default;');
			addRule('td','white-space:nowrap; padding:1px 2px;');
			addRule('.check','width:18px; font:18px Marlett; border-right:1px solid buttonshadow;');
			addRule('img','width:16px; height:16px;');
			addRule('div','border:1px inset; height:2px; overflow:hidden;');
		}
		winContextMenu.document.body.innerHTML = '<table id="idItemList"></table>';

		var Items = this.Items;
		for (var i = 0; i < Items.length; i++) {
			var NewRow = winContextMenu.document.all.idItemList.insertRow();
			if (Items[i].text == '-') {
				with (NewRow.insertCell()){
					colSpan = 1 + (this.checks || 0) + (this.icons || 0);
					innerHTML = '<div>&nbsp;</div>';
				}
			} else {
				NewRow.disabled = Items[i].disabled;
				if (this.checks) {
					with (NewRow.insertCell()) {
						className = 'check';
						if (Items[i].checked) innerHTML = 'a';
					}
				}
				if (this.icons) {
					NewRow.insertCell().innerHTML = '&nbsp;<img src="' + Items[i].icon + '"' + (Items[i].disabled ? ' style=filter:Xray' : '')+'>';
				}
				with (NewRow.insertCell()) {
					if (Items[i].accent) style.fontWeight = 'bolder';
					innerHTML = '&nbsp;' + Items[i].text + '&nbsp;';
				}
				// Обработка событий:
				NewRow.name = i;
				NewRow.onmouseover = function () {
					this.style.background = "activecaption";
					this.style.color = "highlighttext";
				};
				NewRow.onmouseout = function () {
					this.style.background = "";
					this.style.color = "";
				};
				var _f0 = this.onChange;
				NewRow.onclick = function () {
					_f0 (this.name);
					winContextMenu.hide();
				};
			}
		}

		winContextMenu.show(0, 0, 0, 0, document.body); // показываем меню (только для вычисления реальных размеров)
		var cm_width = winContextMenu.document.body.scrollWidth;
		var cm_height = winContextMenu.document.body.scrollHeight;
		var cm_y = (event.y+cm_height+window.screenTop > screen.availHeight) ? screen.availHeight-cm_height-window.screenTop : event.y;
		this.visible = true;
		winContextMenu.show(event.x, cm_y, cm_width, cm_height, window.document.body); // показываем меню заново, но уже вычисленного размера

		// Обработка события Unload
		var T = this;
		var _f1 = this.onUnload;
		winContextMenu.document.body.onunload = function(){
			T.visible = false;
			if (_f1) _f1();
		};
	}
}

// Контекстное меню заголовка таблицы
function ShowContextMenuHeader(){
	oCM.icons = true;
	oCM.Items = [
		{
			text: 'Add Column',
			icon: icons_path + 'add.ico',
			command: 'ColumnAdd()'
		},
		{
			text: 'Delete Column',
			icon: icons_path + 'delete.ico',
			command: 'ColumnDelete()'
		},
		{
			text: 'Edit Column Contents',
			icon: icons_path + 'edit.ico',
			command: 'ColumnEdit()'
		},
		{
			text: 'Sort by This Column',
			icon: icons_path + 'sort.ico',
			command: 'ColumnSort()'
		}
	];
	oCM.onChange = function(item_num) {
		setTimeout(oCM.Items[item_num].command, 0);
	};
	oCM.onUnload = function() {
		idHeaderRow.cells[oCM.column*2].style.backgroundColor = ''; // удаляем подсветку с ряда на котором открывалось контекстное меню
	};
	idHeaderRow.cells[oCM.column*2].style.backgroundColor = 'infobackground'; // Подсвечиваем ряд на котором открывается контекстное меню
	oCM.Show();
}

// Контекстное меню из единственного пункта "AddHosts"
function ShowContextMenuAddHosts(){
	oCM.icons = true;
	oCM.Items = [
		{
			text: 'Add Hosts',
			icon: icons_path + 'add.ico',
			command: 'AddHosts()'
		}
	];
	oCM.onChange = function(item_num) {
		setTimeout(oCM.Items[item_num].command, 0);
	};
	oCM.onUnload = null;
	oCM.Show();
}

// Дефолтное контекстное меню
function ShowContextMenuDefault(){
	oCM.icons = true;
	oCM.Items = [
		{
			text: 'Add Hosts',
			icon: icons_path + 'add.ico',
			command: 'AddHosts()'
		},
		{
			text: 'Delete Host',
			icon: icons_path + 'delete.ico',
			command: 'RemoveSelHost()'
		},
		{
			text: 'Get Host Info',
			icon: icons_path + 'info.ico',
			command: 'GetSelHostInfo()',
			disabled: (INI['host'+oCM.row].online == -1)
		},
		{
			text: 'Edit Host Info',
			icon: icons_path + 'edit.ico',
			command: 'EditHostInfo()'
		}
	];
	oCM.onChange = function(item_num) {
		setTimeout(oCM.Items[item_num].command, 0);
	};
	oCM.onUnload = function() {
		idHostsList.rows[oCM.row].style.backgroundColor = ''; // удаляем подсветку с ряда на котором открывалось контекстное меню
	};
	idHostsList.rows[oCM.row].style.backgroundColor = 'infobackground'; // Подсвечиваем ряд на котором открывается контекстное меню
	oCM.Show();
}

// Контекстное меню ряда таблицы
function ShowContextMenuRow(){
	var n = 0;
	oCM.Items = [];
	while (true){
		var item = INI.context_menu['cm_item'+n];
		if (!item) break;
		var oItem = {};
		if ((item == 'separator') || (item == '-')) {
			oItem.text = '-';
		} else {
			switch(INI.context_menu['cm_offline_disabled'+n]){
				case '1':
					oItem.disabled = (INI['host'+oCM.row].online == -1);
					break;
				case '-1':
					oItem.disabled = (INI['host'+oCM.row].online >= 0);
					break;
			}
			oItem.text = item;
			oItem.icon = (/\\/.test(INI.context_menu['cm_icon'+n]) ? '' : icons_path) + INI.context_menu['cm_icon'+n];
			oItem.command = INI.context_menu['cm_cmd'+n];
			oItem.accent = (n==INI.context_menu['cm_default']);
		}
		oCM.Items.push(oItem);
		n++;
	}
	oCM.onChange = function(item_num) {
		ContextMenuRunItem(oCM.Items[item_num].command);
	};
	oCM.onUnload = function() {
		idHostsList.rows[oCM.row].style.backgroundColor = ''; // удаляем подсветку с ряда на котором открывалось контекстное меню
	};
	idHostsList.rows[oCM.row].style.backgroundColor = 'infobackground'; // Подсвечиваем ряд на котором открывается контекстное меню
	oCM.Show();
}

// Запуск команды из пункта контекстного меню
function ContextMenuRunItem(cmd) {
	function rr (text, i) {
		var err = false;
		function replacer(sub, n1, n2, offset, str) {
			var r = INI[(n1=='') ? 'main' : 'host'+i][n2];
			if (r == INI.main.util_dir) r = util_dir;
			if (!r) {
				if ((n1 != '') && (n2 == 'name')) r = INI['host'+i]['ip']; // если <host.name> не задан, используем вместо него <host.ip>
				if ((n1 != '') && (n2 == 'radmin_port')) r = '4899';       // если <host.radmin_port> не задан, то считаем его = 4899
				if (!r) {
					alert ('Parameter\n'+ ((n1=='') ? '[main' : '[host'+i) + '] ' + n2 + '\nnot defined!');
					err = true;
				}
			}
			return r;
		}
		var re = /<([^.]*?)[.]?([^.>]*?)>/g;
		var str = text.replace(re, replacer);
		return err ? '' : str;
	}

	if (/^@/.test(cmd)) {
		// Internal command
		setTimeout(cmd.replace(/^@/,'') + '('+oCM.row+')', 0);
	} else {
		// External command
		cmd = rr (cmd, oCM.row);
		if (cmd != '') {
			cmd = WshShell.ExpandEnvironmentStrings(cmd);
			WshShell.CurrentDirectory = script_path;
			try {
// cmd = prompt(script_path, cmd); //test
				WshShell.Run(cmd);
			} catch(e) {
				WshShell.Popup("Don\'t run command:\n" + cmd + "\nPlease check your INI-file!", 5, app_name, 16);
			}
		}
	}
}
