/* 
	Copyright (c) 2005-2006 Metablocks, Inc, Metablocks, Ltd. and their affiliates. 
	Not to be reused without permission. All Rights Reserved.
	
	Do not remove this copyright notice.
*/

function DropdownMenu(){

	var speed = -525;
	//speed = -15; //slower
	var ddm=this;
	var menuDIV=document.createElement('DIV');

	if(document.body.childNodes.length>0)	document.body.insertBefore(menuDIV, document.body.childNodes.item(0));
	else	document.body.appendChild(menuDIV);

	this.menuDIV=menuDIV;
	with(menuDIV.style){
		position='absolute';
		display='none';
	}
	menuDIV.tbl=document.createElement('TABLE');
	menuDIV.tbl.cellSpacing='0px';
	menuDIV.tbl.cellPadding='0px';
	menuDIV.tbl.className='ddm';
	menuDIV.appendChild(menuDIV.tbl);
	var tmpObj=document.createElement('TBODY');
	menuDIV.tbl.appendChild(tmpObj);
	tmpObj.appendChild(document.createElement('TR'));
	menuDIV.tbl.rows[0].appendChild(document.createElement('TD'));
	menuDIV.itemsContainer=menuDIV.tbl.rows[0].cells[0];
	this.menuItem=undefined;
	this.menuItemTop=0;
	this.menuItemLeft=0;
	this.timer=undefined;
	this.dropped=false;
	this.isSliding=false;
	this.hoverTimeout=500; 
	this.setHoverTimeout=function(timeout){
		ddm.hoverTimeout=timeout;
	}
	this.getHoverTimeout=function(){
		return ddm.hoverTimeout;
	}
	this.menuWidth=undefined;
	this.setWidth=function(width){
		ddm.menuWidth=width;
	}
	this.getWidth=function(){
		return ddm.menuDIV.offsetWidth;
	}
	this.attachTo=function(menuItem){
		if(typeof(menuItem)=='string') menuItem=document.getElementById(menuItem);
		if(menuItem){
			if(ddm.menuItem) ddm.detach();
			ddm.menuItem=menuItem;
			if(window.addEventListener){ // Mozilla, Netscape, Firefox
				menuItem.addEventListener('mouseover', ddm.targetMouseHandler, false);
				menuItem.addEventListener('mouseout', ddm.targetMouseHandler, false);
				menuItem.addEventListener('click', ddm.targetMouseHandler, false);
				ddm.menuDIV.addEventListener('mouseover', ddm.targetMouseHandler, false);
				ddm.menuDIV.addEventListener('mouseout', ddm.targetMouseHandler, false);
				ddm.menuDIV.addEventListener('click', ddm.targetMouseHandler, false);
			} else { // IE
				menuItem.attachEvent('onmouseover', ddm.targetMouseHandler);
				menuItem.attachEvent('onmouseout', ddm.targetMouseHandler);
				menuItem.attachEvent('onclick', ddm.targetMouseHandler);
				ddm.menuDIV.attachEvent('onmouseover', ddm.targetMouseHandler);
				ddm.menuDIV.attachEvent('onmouseout', ddm.targetMouseHandler);
				ddm.menuDIV.attachEvent('onclick', ddm.targetMouseHandler);
			}
		}
	}
	this.detach=function(){
		if(menuItem){
			ddm.menuItem=menuItem;
			if(window.removeEventListener){ // Mozilla, Netscape, Firefox
				menuItem.removeEventListener('mouseover', ddm.targetMouseHandler, false);
				menuItem.removeEventListener('mouseout', ddm.targetMouseHandler, false);
				menuItem.removeEventListener('click', ddm.targetMouseHandler, false);
				ddm.menuDIV.removeEventListener('mouseover', ddm.targetMouseHandler, false);
				ddm.menuDIV.removeEventListener('mouseout', ddm.targetMouseHandler, false);
				ddm.menuDIV.removeEventListener('click', ddm.targetMouseHandler, false);
			} else { // IE
				menuItem.detachEvent('onmouseover', ddm.targetMouseHandler);
				menuItem.detachEvent('onmouseout', ddm.targetMouseHandler);
				menuItem.detachEvent('onclick', ddm.targetMouseHandler);
				ddm.menuDIV.detachEvent('onmouseover', ddm.targetMouseHandler);
				ddm.menuDIV.detachEvent('onmouseout', ddm.targetMouseHandler);
				ddm.menuDIV.detachEvent('onclick', ddm.targetMouseHandler);
			}
			ddm.menuItem=undefined;
		}
	}
	this.targetMouseHandler=function(event){ 
		var eventSource=event.srcElement ? event.srcElement : event.target; 
		switch(event.type){ 
			case 'click': 
						if(eventSource==ddm.menuItem){
							clearTimeout(ddm.timer);
							ddm.drop();
						}else{
							var parentEl=eventSource;
							while(parentEl&&parentEl!=ddm.menuDIV)
								parentEl=parentEl.parentNode;
							if(!parentEl)
								ddm.hide();
						}
					break;
			case 'mouseout':
						clearTimeout(ddm.timer);
						ddm.timer=setTimeout(ddm.hide, 500);
					break;
			case 'mouseover': 
						clearTimeout(ddm.timer);
						if(eventSource==ddm.menuItem){
							ddm.timer=setTimeout(ddm.drop, ddm.hoverTimeout);
						}else{
							var srcParent=eventSource;
							while(srcParent&&srcParent!=ddm.menuItem)
								srcParent=srcParent.parentNode;
							if(srcParent==ddm.menuItem)
								ddm.timer=setTimeout(ddm.drop, ddm.hoverTimeout);
						}
					break;
		}
	}
	this.addItem=function(itemText, url, target){
		var item=document.createElement('DIV');
		item.innerHTML=itemText;
		item.style.position='relative';
		item.className='ddmitem';
		if(window.addEventListener){ // Mozilla, Netscape, Firefox
			item.addEventListener('mouseover', function(){this.className='ddmitemhover';}, false);
			item.addEventListener('mouseout', function(){this.className='ddmitem';}, false);
		}
		else{ // IE
			item.attachEvent('onmouseover', function(){item.className='ddmitemhover';
			ddm.menuDIV.style.display='none';	// a hack for IE - gives outer DIV
			ddm.menuDIV.style.display='table-header-group';	//  it's border back
		});
			item.attachEvent('onmouseout', function(){item.className='ddmitem';});
		}
		var a=document.createElement('A');
		a.href=url;
		if(target) a.target=target;
		a.style.textDecoration='none';
		a.appendChild(item);
		ddm.menuDIV.itemsContainer.appendChild(a);
		return item;
	}
	this.removeItem=function(itemText){
		for(var i=0; i<ddm.menuDIV.childNodes.length; ++i){
			if(ddm.menuDIV.childNodes.item(i).itemText==itemText)
				ddm.menuDIV.removeChildNode(ddm.menuDIV.childNodes.item(i));
		}
	}
	this.drop=function(){ 
		if(!ddm.menuItem || ddm.dropped || ddm.isSliding || ddm.menuDIV.childNodes.length==0) return;
		ddm.menuDIV.style.display='table-header-group';	
		var mi=ddm.menuItem;
		var top=0, left=0;
		for (top=0,left=0; mi; left+=mi.offsetLeft,top+=mi.offsetTop,mi=mi.offsetParent);
		ddm.menuItemTop=top;
		ddm.menuItemLeft=left;
		ddm.menuDIV.style.clip='rect(0px,0px,0px,0px)';
		ddm.menuDIV.style.top=(ddm.menuItemTop-ddm.menuDIV.offsetHeight+ddm.menuItem.offsetHeight)+'px';
		ddm.menuDIV.style.left=ddm.menuItemLeft+'px';
		ddm.menuDIV.tbl.style.width=ddm.menuWidth?ddm.menuWidth:ddm.menuItem.offsetWidth;
		ddm.slideDown();
	}
	this.hide=function(){
		ddm.menuDIV.style.display='none';
		ddm.dropped=false;
	}
	this.slideDown=function(){
		if((ddm.menuDIV.offsetTop-ddm.menuItemTop-ddm.menuItem.offsetHeight)<speed){
			ddm.isSliding=true;
			ddm.menuDIV.style.top=(ddm.menuDIV.offsetTop+15)+'px';
			ddm.menuDIV.style.clip='rect('+(ddm.menuItemTop+ddm.menuItem.offsetHeight-ddm.menuDIV.offsetTop)+'px,auto,auto,0px)';
			setTimeout(ddm.slideDown, 40);
		}else{
			ddm.isSliding=false;
			ddm.menuDIV.style.top=(ddm.menuItemTop+ddm.menuItem.offsetHeight)+'px';
			ddm.menuDIV.style.clip='rect(auto,auto,auto,auto)';
			ddm.dropped=true;
		}
	}
	this.menuDIV.onclick=function(evt){
		ddm.hide();
	}
}