
	function contextMenuSeparator(contextMenu)
	{
		var protoElement = document.getElementById('contextMenuSeparator_prototype');
		this.element = protoElement.cloneNode(true);
		contextMenu.itemContainer.appendChild(this.element);
		
		this.contextMenu = contextMenu;
	}
	
	contextMenuSeparator.prototype.element;
	contextMenuSeparator.prototype.contextMenu;
	

	function contextMenuItem(contextMenu, name, caption, enabled, isDefault)
	{
		this.eventer = new eventer();
		
		var protoElement = document.getElementById('contextMenuItem_prototype');
		this.element = protoElement.cloneNode(true);
		this.element.contextMenuItem = this;
		this.element.className += ' ' + name + (isDefault ? ' default' : '');
		contextMenu.itemContainer.appendChild(this.element);
		
		this.contextMenu = contextMenu;
		this.name = name;
		this.caption = caption;
		this.isDefault = isDefault;
	
		var valueNode = selectNode(".//*[contains(@class, 'value')]", this.element);
		valueNode.appendChild(document.createTextNode(caption));
		
		if(!enabled) this.disable(); else this.enable();
	}

	contextMenuItem.prototype.element;
	contextMenuItem.prototype.contextMenu;
	contextMenuItem.prototype.name;
	contextMenuItem.prototype.caption;
	
	contextMenuItem.prototype.select = function()
	{
		document.eventer.forceEvent('onContextMenuItemSelect', {contextMenuItem: this});
		this.eventer.forceEvent('onContextMenuItemSelect', {contextMenuItem: this});
		this.contextMenu.close();
	}

	contextMenuItem.prototype.remove = function()
	{
		this.element.parentNode.removeChild(this.element);
	}
	
	
	contextMenuItem.prototype.isDisabled = function()
	{
		return this.element.className.search(/\bdisabled\b/) >= 0;
	}
	
	contextMenuItem.prototype.disable = function()
	{
		this.element.className += ' disabled';
		this.element.onclick = undefined;
	}

	contextMenuItem.prototype.enable = function()
	{
		this.element.className = this.element.className.replace(/\bdisabled\b/, '');
		this.element.onclick = function() {this.contextMenuItem.select()};
	}

	// Создает меню
	function contextMenu()
	{
		contextMenu.parentClass.constructor.apply(this, arguments);
		
		if(document.contextMenus == undefined) document.contextMenus = [this];
		else document.contextMenus.push(this);

		var protoElement = document.getElementById('contextMenu_prototype');
		this.eventer = new eventer();
		this.element = protoElement.cloneNode(true);
		this.element.removeAttribute('id');
		this.element.contextMenu = this;
		protoElement.parentNode.appendChild(this.element);
		this.itemContainer = selectNode(".//*[contains(@class, 'itemContainer')]", this.element);
		while(this.itemContainer.lastChild) this.itemContainer.removeChild(this.itemContainer.lastChild);
	}

	extend(contextMenu, control);

	contextMenu.prototype.getType = function()
	{
		return 'contextMenu';
	}

	contextMenu.prototype.eventer;
	contextMenu.prototype.itemContainer;

	contextMenu.prototype.addItem = function(name, caption, enabled, isDefault)
	{
		if(enabled == undefined) enabled = true;
		if(isDefault == undefined) isDefault = false;
		var item = new contextMenuItem(this, name, caption, enabled, isDefault);
		return item;
	}

	contextMenu.prototype.addSeparator = function()
	{
		return new contextMenuSeparator(this);
	}

	contextMenu.prototype.getDefaultItem = function()
	{
		var items = this.listItems();
		for(var i = 0; i < items.length; i++)
			if(items[i].isDefault) return items[i];
	}

	contextMenu.prototype.listItems = function()
	{
		var items = new Array();
		var itemElements = selectNodes("li[contains(@class, 'item')]", this.itemContainer);
		for(var i = 0; i < itemElements.length; i++)
			if(itemElements[i].contextMenuItem != undefined)
				items.push(itemElements[i].contextMenuItem);
		return items;
	}
	
	contextMenu.prototype.open = function(left, top)
	{
		closeAllContextMenus();
		this.eventer.forceEvent('onContextMenuOpen', {contextMenu: this});
		document.eventer.forceEvent('onContextMenuOpen', {contextMenu: this});
		if(top != undefined) this.element.style.top = (top - 5) + 'px';
		if(left != undefined) this.element.style.left = (left - 5) + 'px';
		this.show();
	}
	
	contextMenu.prototype.isOpen = function()
	{ 
		return !this.isHidden();
	}

	contextMenu.prototype.close = function()
	{
		if(this.isOpen())
		{
			this.hide();
			this.eventer.forceEvent('onContextMenuClose', {contextMenu: this});
			document.eventer.forceEvent('onContextMenuClose', {contextMenu: this})
		}
	}

	function closeAllContextMenus()
	{
		if(document.contextMenus)
		{
			for(var i = 0; i < document.contextMenus.length; i++)
			{
				var contextMenu = document.contextMenus[i];
				if(contextMenu.isOpen()) contextMenu.close();
			}
		}
	}
	
	document.eventer.addListener('onBodyClick',  closeAllContextMenus);

