ContextMenu = function(node)
{
	var t = this
	t.node = node
	t.currentTarget = null
	t.lastTarget = null
	t.a_last = null
	t.as = this.node.getElementsByTagName('a')
	
	node.unselectable = true
	/*@cc_on node.ondrag = function(){ return false } @*/
	node.onmousedown = function(e) // отменяем this.hide() и drag
	{
		noBubble(e)
	}
	
	document[/*@cc_on !@*/0 ? 'attachEvent' : 'addEventListener'](/*@cc_on 'on'+@*/'contextmenu', function(e){ return t.handleClick(e) }, false)
	
	// Opera
	if (window.opera)
	{
		window.addEventListener('mousedown', function(e)
		{
			if((e.button == 0 && e.altKey) || e.button == 2)
			{
				if (e.button == 2)
				{
					var s =
					{
						target : e.target,
						clientX: e.clientX - t.node.offsetWidth,
						clientY: e.clientY - t.node.offsetHeight
					}
					
					s.clientX = s.clientX > 0 ? s.clientX : 0
					s.clientY = s.clientY > 0 ? s.clientY : 0
					
					e = s
				}
				
				return t.handleClick(e)
			}
		}, false)
	}
	
	node.oncontextmenu = function(e)
	{
		if (t.a_last)
			t.a_last.onclick()
		return noBubble(e)
	}
	
	node.onmouseover = function(e)
	{
		var target = e ? e.target : window.event.srcElement
		if (target.tagName != 'A')
			return
		
		t.a_last = target
		
		if (node.style.display == 'none') //ie6
			return
		
		if (!window.opera)
			target.focus()
		
		target.className = 'hover'
	}
		
	node.onmousemove = function(e)
	{
		var target = e ? e.target : window.event.srcElement
		if (target.tagName != 'A')
		{
			if (t.a_last)
			{
				t.a_last.className = ''
				t.a_last.blur()
				t.a_last = null
			}
			
			return
		}
		
		if (t.a_last && t.a_last != target)
		{
			t.a_last.className = ''
			t.a_last.blur()
			target.className = 'hover'
			t.a_last = target
		}
	}
	
	node.onmouseout = function(e)
	{
		if (t.a_last)
		{
			t.a_last.className = ''
			t.a_last.blur()
		}
	}
}

ContextMenu.prototype.hide = function()
{
	if (ContextMenu.opened)
		Events.list.esc.ContextMenu()
	
	return false
}

ContextMenu.prototype.show = function(){/* используется из вне */}

ContextMenu.prototype.handleClick = function(e)
{
	var target = e.target || e.srcElement, t = this
	
	// 1. Когда сработало клик правой кнопки мыши на ссылку в контекстном меню
	if(ContextMenu.opened || ContextMenu.forbid || target.tagName == 'TEXTAREA' || target.tagName == 'INPUT' || !t.show(e))
		return
	
	var x = e.clientX, y = e.clientY, node = t.node
	
	/*if (e && document.createEvent) // Safari fix, mousedown срабатывает после контекстного меню

		evn = document.createEvent('MouseEvents');
		evn.initMouseEvent('mousedown', true, true, window, 1, e.screenX+10, e.screenY+10, e.clientX+10, e.clientY+10, false, false, false, false, 0, null);
		this.node.dispatchEvent(evn)
	//В сафари 3.1 кажись заработало
	}*/
		
	Events.add('esc', 'ContextMenu', function()
	{
		node.style.top = '-1000px'
		node.style.bottom	= 'auto'
		ContextMenu.opened = false
		
		if (t.a_last)
		{
			t.a_last.className = ''
			t.a_last = null
		}
		
		Events.del('esc', 'ContextMenu')
		Events.del('press_top', 'ContextMenu')
		Events.del('press_bottom', 'ContextMenu')
	})
	
	Events.add('press_top', 'ContextMenu', function(){ t.keyNavTop() })
	Events.add('press_bottom', 'ContextMenu', function(){ t.keyNavBottom() })
	
	node.style.visibility = 'hidden'
	
	if (node.offsetHeight+y-4 > document.body.offsetHeight)
	{
		node.style.top		= 'auto'
		node.style.bottom	= 0
	}
	else
	{
		node.style.top	= y-4+'px'
		node.style.bottom	= 'auto'
	}
	
	if (this.node.offsetWidth+x-6 > document.body.offsetWidth)
	{
		node.style.left	= 'auto'
		node.style.right	= 0
	}
	else
		node.style.left	= x-6+'px'
	
	node.style.visibility='visible'
	
	ContextMenu.opened = true
	
	if (e.preventDefault)
		e.preventDefault()
	
	return false
}

ContextMenu.prototype.keyNavTop = function()
{
	var t = this, j = null, as = this.as, l = as.length, i = l
	
	if (t.a_last)
	{
		t.a_last.className = ''
		
		// узнаем номер ноды
		for (--i; i >= 0; i--)
		{
			if (as[i] == t.a_last)
				break
		}
		
		while (j === null)
		{
			if (--i == -1)
				i = l
			else if (as[i] && as[i].offsetHeight)
				j = i
		}
		
		t.a_last = as[j]
	}
	else
	{
		while (j === null)
		{
			if (as[--i].offsetHeight)
				j = as[i]
		}
		
		t.a_last = j
	}
	
	t.a_last.className = 'hover'
	t.a_last.focus()
}

ContextMenu.prototype.keyNavBottom = function()
{
	var t = this, j = null, as = t.as, i = -1, l = as.length
	
	if (this.a_last)
	{
		t.a_last.className = ''
	
		
		// узнаем номер ноды
		for (i = l - 1; i >= 0; i--)
		{
			if (as[i] == t.a_last)
				break
		}
		
		while (j === null)
		{
			if (as[++i] && as[i].offsetHeight) // offsetHeight - проверка на скрытость
				j = i
			else if (i > l)
				i = -1
		}
		
		t.a_last = as[j]
	}
	else
	{
		while (j === null)
		{
			if (as[++i].offsetHeight)
				j = as[i]
		}
		
		t.a_last = j
	}
	
	t.a_last.className = 'hover'
	t.a_last.focus()
}

ContextMenu.opened = false
ContextMenu.forbid = false
