function menu(content,details){
	this.content=content;
	this.details=details;
	this.addItem=addNewItem;
}

function getoffsetLeft(element){
	if(!element) return 0;
	return element.offsetLeft+getoffsetLeft(element.offsetParent);
}

function getoffsetTop(element){
	if(!element) return 0;
	return element.offsetTop+getoffsetTop(element.offsetParent);
}

function createMenu(element,menuClassName,elementClassName){
	var elementsMouseOver=element.onmouseover;
	var elementsClassName=element.className;
	element.onmouseover=null;
	if(typeof(elementClassName)!=='undefined'){
		element.className=elementClassName;
	}
	
	var menu_container_outer=document.createElement('div');
	menu_container_outer.style.position='absolute';
	menu_container_outer.style.left=getoffsetLeft(element)+'px';
	menu_container_outer.style.top=getoffsetTop(element)+element.offsetHeight+'px';
	menu_container_outer.className=menuClassName;
	document.body.appendChild(menu_container_outer);
	
	var menu_container=document.createElement('div');
	menu_container_outer.appendChild(menu_container);
	
	var menu_content_outer=document.createElement('div');
	menu_container.appendChild(menu_content_outer);
	
	var menu_content=document.createElement('div');
	menu_content_outer.appendChild(menu_content);
	
	var menu_details_outer=document.createElement('div');
	menu_details_outer.style.display='none';
	menu_container.appendChild(menu_details_outer);
	
	var menu_details=document.createElement('div');
	menu_details_outer.appendChild(menu_details);
	
	var borders=document.createElement('div');
	borders.className='borders';
	var e;
	e=document.createElement('div');
	e.className='rc';
	borders.appendChild(e);
	e=document.createElement('div');
	e.className='rb';
	borders.appendChild(e);
	e=document.createElement('div');
	e.className='cb';
	borders.appendChild(e);
	e=document.createElement('div');
	e.className='lb';
	borders.appendChild(e);
	e=document.createElement('div');
	e.className='lc';
	borders.appendChild(e);
	e=document.createElement('div');
	e.className='lt';
	borders.appendChild(e);
	e=document.createElement('div');
	e.className='ct';
	borders.appendChild(e);
	e=document.createElement('div');
	e.className='rt';
	borders.appendChild(e);
	
	menu_content_outer.appendChild(borders);
	menu_details_outer.appendChild(borders.cloneNode(true));
	
	var newMenu=new menu(menu_content,menu_details);
	
	createHideMenuHandler(element,elementsMouseOver,elementsClassName,menu_container);
	
	return newMenu;
}

function createHideMenuHandler(element,elementsMouseOver,elementsClassName,menu_container){
	var hideMenuHandler=function(e){hideMenu(e,element,elementsMouseOver,elementsClassName,menu_container.parentNode,hideMenuHandler)}
	if(document.addEventListener){
		window.addEventListener('mousemove',hideMenuHandler,false);
	}
	else{
		document.body.attachEvent('onmousemove',hideMenuHandler);
	}
}

function hideMenu(e,element,elementsMouseOver,elementsClassName,menu_container,hideMenuHandler){
	var shadowOffset=menu_container.firstChild.firstChild.firstChild.firstChild.offsetHeight;
	if(e.pageX||e.pageY){
		if((e.pageX < getoffsetLeft(element)-shadowOffset && e.pageY < getoffsetTop(menu_container)) || 
				(e.pageX < getoffsetLeft(menu_container)-shadowOffset && e.pageY > (getoffsetTop(element)+element.offsetHeight))|| 
				(e.pageX < getoffsetLeft(menu_container)-shadowOffset && e.pageY < getoffsetTop(menu_container) && e.pageY <  (getoffsetTop(menu_container) + menu_container.offsetHeight+shadowOffset)) ||
				(e.pageY > (getoffsetTop(menu_container) + menu_container.offsetHeight))|| (e.pageX > (getoffsetLeft(menu_container) + menu_container.offsetWidth+shadowOffset) && e.pageY > (getoffsetTop(element) + element.offsetHeight)) || 
				(e.pageX > (getoffsetLeft(element) + element.offsetWidth) && e.pageY < getoffsetTop(menu_container)) || ( e.pageY < getoffsetTop(element))){
			removeMenu(element,elementsMouseOver,elementsClassName,menu_container,hideMenuHandler);
		}
	}
	else if(e.clientX||e.clientY){
		positionX=e.clientX+document.body.scrollLeft+document.documentElement.scrollLeft;
		positionY=e.clientY+document.body.scrollTop+document.documentElement.scrollTop;
		if(	(positionX < getoffsetLeft(element)-shadowOffset && positionY < getoffsetTop(menu_container)) || 
				(positionX < getoffsetLeft(menu_container)-shadowOffset && positionY > (getoffsetTop(element)+element.offsetHeight))|| 
				(positionX < getoffsetLeft(menu_container)-shadowOffset && positionY < getoffsetTop(menu_container) && positionY <  (getoffsetTop(menu_container) + menu_container.offsetHeight+shadowOffset)) ||
				(positionY > (getoffsetTop(menu_container) + menu_container.offsetHeight))|| (positionX > (getoffsetLeft(menu_container) + menu_container.offsetWidth+shadowOffset) && positionY > (getoffsetTop(element) + element.offsetHeight)) || 
				(positionX > (getoffsetLeft(element) + element.offsetWidth) && positionY < getoffsetTop(menu_container)) || ( positionY < getoffsetTop(element))){
			removeMenu(element,elementsMouseOver,elementsClassName,menu_container,hideMenuHandler);
		}
	}
}

function removeMenu(element,elementsMouseOver,elementsClassName,menu_container,hideMenuHandler){
	if(window.removeEventListener){
		window.removeEventListener('mousemove',hideMenuHandler,false);
	}	
	else if(document.body.detachEvent){
		document.body.detachEvent('onmousemove',hideMenuHandler);
	}
	element.onmouseover=elementsMouseOver;
	element.className=elementsClassName;
	document.body.removeChild(menu_container);
}

function addNewItem(label,anchor,image,description,className){
	var item=document.createElement('div');
	var menuDetails=this.content.parentNode.nextSibling.firstChild;
	
	if(className){
		item.className=className;
	}
	if(anchor){
		var createAnchor=document.createElement('a');
		createAnchor.appendChild(item);
		createAnchor.href=anchor;
	}
	if(image){
		var img=document.createElement('img');
		img.alt='';
		img.src=image;
		img.style.verticalAlign='middle';
		img.style.marginRight='5px';
		item.appendChild(img);
	}
	if(label){
		item.appendChild(document.createTextNode(label));
	}
	if(description){
		var openDetails=function(e){addItemDetails(item,menuDetails,description,openDetails)}
		if(item.addEventListener){
			item.addEventListener('mouseover',openDetails,true);
		}
		else if(item.attachEvent){
			item.attachEvent('onmouseover',openDetails);
		}
	}
/*	else{
		var deleteDetails=function(e){deleteDetail(menuDetails)}
		if(document.addEventListener){
			item.addEventListener('mouseover',deleteDetails,true);
		}
	}*/
	if(anchor){
		this.content.appendChild(createAnchor);
	}
	else{
		this.content.appendChild(item);
	}
}

function addItemDetails(item,menuDetails,description,openDetails){
	while(menuDetails.hasChildNodes()){
		menuDetails.removeChild(menuDetails.lastChild);
	}
	
	var itemDetails=document.createElement('div');
	itemDetails.innerHTML=description;
	menuDetails.appendChild(itemDetails);
	menuDetails.parentNode.style.display="block";
}

function deleteDetail(menuDetails){
	while(menuDetails.hasChildNodes()){
		menuDetails.removeChild(menuDetails.lastChild);
	}
	menuDetails.parentNode.style.display='none';
}