var disappeardelay=250  //menu disappear speed onMouseout (in miliseconds)
var groups = Array;

function dMenu(obj, dropmenuID) {
	popup(obj, dropmenuID, 'g1', '', null);
}

// group == 'g1': Popup is placed below trigger object
// group != 'g1': Popup is placed partly over trigger object
// myTag == -1: Popup is placed to style="left:XXpx;top:YYpx;" instead of repositioning it to trigger
function popup(obj, dropmenuID, group, parentGroup, myTag) {
	log("////////// mouseover: "+group+" ("+obj.id+")");
	if (obj.style.visibility=="hidden") return; // do not react on rollover on hidden objects

	xp = 0;
	yp = 1;
	if (group != 'g1') {xp = 0.8; yp = 0;}

	dropmenuobj = document.getElementById(dropmenuID);

	if (groups[group] && groups[group]['menuObj'] && groups[group]['menuObj'] != null) {
		overmenu(group);	// Clear timeouts if we're on the dropdown symbol. Here in case we just entered a different button
		if (dropmenuobj != groups[group]['menuObj']) {
			// Hide previously opened menus starting from this group
			childGroup = group;
			do {
				if (groups[childGroup] && groups[childGroup]['menuObj'] && groups[childGroup]['menuObj'] != null) {
					groups[childGroup]['menuObj'].style.visibility="hidden";
					clearTimeout(groups[childGroup]['menuObj'].timerObject);
					groups[childGroup]['menuObj'].timerObject = null;
					childGroup = groups[childGroup]['childGroup'];
				} else {
					childGroup = '';
				}
			} while (childGroup != '');
		}
	}

	// document.body.style.backgroundColor = Math.ceil(Math.random()*255*255);
	
	coords = getRelativeOffsets(obj);


	d = new Date();
	nowMs = d.getTime();
	groups[group] = new Array;
	groups[group]['parentGroup'] = parentGroup;
	if (parentGroup != '') groups[parentGroup]['childGroup'] = group;
	// groups[group]['refreshTime'] = nowMs;
	groups[group]['menuObj'] = dropmenuobj;
	groups[group]['group'] = group;
	// obj.group = group;
	// dropmenuobj.group = group;

	dropmenuobj.onmouseover=function(){overmenu(group)};
	dropmenuobj.onmouseout=function(){delayhidemenu(group)};
	obj.onmouseout=function(){delayhidemenu(group)};

	
	if (myTag != -1) {	// If not -1, displace menu to link location.
	
	rx = coords[0];
	ry = coords[1];

	var windowWidth=ie5 && !window.opera? iecompattest().scrollLeft+iecompattest().clientWidth-15 : window.pageXOffset+window.innerWidth-15
	var topedge=ie5 && !window.opera? iecompattest().scrollTop : window.pageYOffset
	var windowHeight=ie5 && !window.opera? iecompattest().scrollTop+iecompattest().clientHeight-15 : window.pageYOffset+window.innerHeight-18

//	windowWidth = window.innerWidth + window.pageXOffset; // Works w/FF not IE
//	windowHeight = window.innerHeight + window.pageYOffset; // Works w/FF not IE
//	alert(window.innerHeight+" x:"+x+" y:"+y);
//	alert(dropmenuobj.clientWidth);
	if (y + obj.offsetHeight + dropmenuobj.clientHeight <= windowHeight || dropmenuobj.clientHeight > windowHeight) {
		dropmenuobj.style.top = ry + (obj.offsetHeight * yp);
	} else {
		dropmenuobj.style.top = ry - dropmenuobj.clientHeight;
	}

	if (x + obj.offsetWidth + dropmenuobj.clientWidth < windowWidth || dropmenuobj.clientWidth > windowWidth) {
		dropmenuobj.style.left = rx + (obj.offsetWidth * xp);
	} else {
		dropmenuobj.style.left = rx + obj.offsetWidth - dropmenuobj.clientWidth;
	}
	}

	dropmenuobj.style.visibility = 'visible';
}
function overmenu(group){
	//document.body.style.backgroundColor = "#"+Math.ceil(Math.random()*99) + "ffff";
	// group = this.group;
	// d = new Date();
	// nowMs = d.getTime();

	do {
		log("////////// refresh group "+group);
		// groups[group]['refreshTime'] = nowMs;
		// Clear possible hide timers
		if (groups[group]['menuObj']) {
			clearTimeout(groups[group]['menuObj'].timerObject);
			groups[group]['menuObj'].timerObject = null;
		}
		group = groups[group]['parentGroup'];
	} while (group != '');


}

function log(msg) {
	// Firebug log
	// d = new Date(); nowMs = d.getTime()
	// console.log("["+d.getMinutes()+":"+d.getSeconds()+"."+d.getMilliseconds() + "] "+msg);
}

function delayhidemenu(o) {
	obj = groups[o]['menuObj'];
	//groups[o]['closeTime'] = 
	//d = new Date(); nowMs = d.getTime();
	log("////////// mouseout: "+obj.id);


	if (obj) {
		// obj.timerObject = setTimeout(function(){d = new Date(); nowMs = d.getTime(); do { if (groups[o]['refreshTime'] < (d - disappeardelay)) { log("Hiding group "+o); if (groups[o]['menuObj']) { groups[o]['menuObj'].style.visibility='hidden'; groups[o]['menuObj'] = null; }} o = groups[o]['parentGroup']; } while (o != '');}, disappeardelay);
		obj.timerObject = setTimeout(function(){do { log("Hiding group "+o); if (groups[o]['menuObj'] && groups[o]['menuObj'].timerObject) { groups[o]['menuObj'].style.visibility='hidden'; groups[o]['menuObj'] = null; } o = groups[o]['parentGroup']; } while (o != '');}, disappeardelay);
	}
}


