var x, y;
var mouseThreshold = 10;
var mouseNavYThreshold = 2;
var rolloffDelay = 400;
var lastNav;

function rollover(e)
{
	var obj = Event.element(e);
	group("rollover", obj.id);	
	if( obj.hasClassName("nav-link") )
	{
		lastNav = obj.id
	}
	log('event', e);
	window.setTimeout( function(){ 
	showNav(obj, e.pointerX(), e.pointerY()); 
	}, 100);
	groupEnd();
}

function rolloff(e)
{
	var obj = Event.element(e);
	group('rolloff', obj);
	log('event', e);
	if( obj.hasClassName("nav-link") )
	{
		nav = obj;
		sub = $(getSubID(nav));
	
		if( lastNav != nav.id ) log("lastNav != rolloff", lastNav, nav.id);
		lastNav = null;
	}
	else
	{
		sub = obj;
		if( sub.tagName == 'A' )
		{
			sub = sub.up('div').up('div'); // need the second up because we added an inner div for Effects
		}
		
		nav = $(getParentID(sub));
	}
	
	log('nav', nav, nav.getClientRects()[0]);	
	log('sub', sub, nav.getClientRects()[0]);
	if( nav != null )
	{
		if( sub == null || sub.tagName == 'DIV' )
		{
			//log("set timeout hideNav");
//			x = e.pointerX();
//			y = e.pointerY();
			window.setTimeout( function(){ 
						log("timeout hideNav fired"); hideNav(nav, e.pointerX(), e.pointerY(), sub); log("timeout hideNav done");
			}, 100);
			//log("timeout set");
		}
		else
		{
			log('skipping hideNav', sub);
			log('tag', sub.tagName);
		}
	}
	groupEnd();
}

function getParentID(obj)
{
	return 	obj.id.gsub("sub","");
}

function getSubID(obj)
{
	return 	"sub" + obj.id;
}

function hideNav(nav, eventX, eventY, sub)
{
	group('hideNav', nav, sub, eventX, eventY, x, y);
	var curX, curY;
	curX = x;
	curY = y;
	var subTop, subLeft;
	nav = $(nav);
	var id = nav.id;
	var sub = $("sub"+id);
	var hiding = false;
	
	if( nav != null  )
	{
		log(nav, sub);
		if( sub != null )
		{
			logXYDetail(nav, sub);
			log(eventX, eventY, Position.within(sub, eventX, eventX),  Position.within(nav, eventX, eventX))
//			if( Position.within(sub, eventX, eventX) == false && Position.within(nav, eventX, eventX) == false )
//			{

			if( x < 50 )
			{
				log("mouse is lying to us, ignore it");
				curX = x + nav.cumulativeOffset().left;
				curY = y + nav.cumulativeOffset().top;
				logXYDetail(nav, sub, curX, curY);
			}

			if( Position.within(sub, curX, curY) == false && Position.within(nav, curX, curY) == false )
			{

				if( curX > nav.cumulativeOffset().left - mouseThreshold 
					&& curX < nav.cumulativeOffset().left + nav.getDimensions().width + mouseThreshold 
					&& curY > nav.cumulativeOffset().top - mouseNavYThreshold 
					&& curY < nav.cumulativeOffset().top + nav.getDimensions().height + mouseNavYThreshold 
					)
				{
					log("mouse near nav, not hiding yet");
					window.setTimeout(function() { hideNav(nav, eventX, eventY, sub); }, rolloffDelay);
				} else
				{
					if( x < 50 )
					{
						log("mouse is lying to us, ignore it");
						curX = x + sub.cumulativeOffset().left;
						curY = y + sub.cumulativeOffset().top;
						logXYDetail(nav, sub, curX, curY);
					} else
					{
						curX = x;
						curY = y;
					}

					subTop = sub.cumulativeOffset().top;
					subLeft = sub.cumulativeOffset().left;
					
					if( subTop == 0 || subLeft == 0 )
					{
						subTop = parseInt(sub.style.top.replace("px",""));
						subLeft = parseInt(sub.style.left.replace("px",""));
						log("dom is bad, going to style",subTop , subLeft);
					}

					if( subTop > 0 && subLeft > 0 )
					{
						if( curX > subLeft  - mouseThreshold 
							&& curX < subLeft + sub.getDimensions().width + mouseThreshold 
							&& curY > subTop  - mouseThreshold 
							&& curY < subTop  + sub.getDimensions().height + mouseThreshold 
							)
						{
							log("mouse near sub, not hiding yet");
							window.setTimeout(function() { hideNav(nav, eventX, eventY, sub); }, rolloffDelay);
						} else
						{
							//sub.hide();
		
							log("hiding");
							window.setTimeout(function(){ new Effect.SlideUp(sub, {duration: 0.10, afterFinish: function() { resetCSS(sub);} }); }, 0);
		
							hiding = true;
						}
					} else
					{
						log("style gave 0,0 as well, bailing");
					}
				}
			}
		}
	
		if( sub == null || hiding == true )
		{
			if( nav.hasClassName("static") == false )
			{
				log('remove rollover img', nav, 'url(/images/nav/' + nav.id.gsub("nav-","") + '.png)');
				nav.setStyle( {backgroundImage: 'url(/images/nav/' + nav.id.gsub("nav-","") + '.png)'});
			}
		}
	}
	else
	{
		log('hideNav', id + " or " + "sub" + id + " not found");
	}
	groupEnd();
}

function resetCSS(obj)
{
	obj.style.left="-300px";
	obj.style.top="-300px";
}

function showNav(nav, eventX, eventY)
{
	group('showNav');
	nav = $(nav);
	var id = nav.id;
	var sub = $("sub"+id);
	var showing = false;
	if( nav != null )
	{
		log(nav, sub);
		if( sub != null )
		{
			logXYDetail(nav, sub);
			if( Position.within(nav, x, y) || Position.within(sub, x, y) )
			{
				log("mouse still here, showing");
				if( sub.visible() == false )
				{
					//sub.hide();
					sub.style.left = nav.cumulativeOffset().left + nav.getWidth() + "px";
					sub.style.top = nav.cumulativeOffset().top + "px";
					//Event.observe(nav, 'mouseout', rolloff.bindAsEventListener());
					//sub.show();
					//window.setTimeout(function(){ 
					new Effect.SlideDown(sub,{duration: 0.5}); 
					//}, 0);
					showing = true;
				}
				else
				{
					log('sub already visible');
				}
			} else
			{
				log("mouse no longer here, skipping show"); 
			}
		}		
		if( sub == null || showing == true )
		{
			nav.setStyle( {backgroundImage: 'url(/images/nav/rollover/' + nav.id.gsub("nav-","") + '.png)'});
		}
	}
	else
	{
		log('showNav', id + " or " + "sub" + id + " not found");
	}

	window.setTimeout(function(){ cleanupNav(nav, eventX, eventY) }, 500);

	groupEnd();
}

function cleanupNav(nav, eventX, eventY)
{
	group("hide others");
	var links = $$('.nav-link');
	
	for( x = 0; x < links.length; x++ )
	{
		log('remove', links[x]);
		sub = $(getSubID(links[x]));
		
		var nav2 = links[x];

		if( nav2.id != nav.id && lastNav != nav2.id)
		{
			log('calling hideNav',  links[x]);
			//window.setTimeout(function() { 
			hideNav(nav2, eventX, eventY); 
			//}, 0);
		} else
		{
			log("cleanup skip", nav2.id, nav.id, lastNav);
		}
	}
	groupEnd();
}

function hookObservers()
{
	group("hookObservers");
	var links = $$('.nav-link');
	var sub;
	
	for( x = 0; x < links.length; x++ )
	{
		log('hook', links[x]);
		sub = $(getSubID(links[x]));
		
		links[x].removeClassName("nojs");
		
		Event.observe(links[x], "mouseover", rollover.bindAsEventListener());
		Event.observe(links[x], "mouseout", rolloff.bindAsEventListener());
		if( sub != null )
		{
			Event.observe(sub, "mouseout", rolloff.bindAsEventListener());
			log('sub observe', sub);
		}
		if( links[x].hasClassName("static") == false )
		{
			links[x].setStyle( {backgroundImage: 'url(/images/nav/' + links[x].id.gsub("nav-","") + '.png)'});
		} else
		{
			if( Prototype.Browser.IE )
			{
			links[x].setStyle( {backgroundImage: 'url(/images/nav/rollover/' + links[x].id.gsub("nav-","") + '.png)'});
			}
		}
	}
	Event.observe(document, 'mousemove', mouseCoords);
	groupEnd();
}

function mouseCoords(e)
{
	x = Event.pointerX(e);
	y = Event.pointerY(e);
}

function logXYDetail(nav, sub, curX, curY)
{
	group("x/y detail");
	log("mouse", x, y);
	log("cur",  curX, curY);
	log("sub", sub.cumulativeOffset().left, sub.cumulativeOffset().top, sub.getDimensions().height, sub.getDimensions().width, sub.style.left, sub.style.top);
	log("nav", nav.style.position, nav.cumulativeOffset().left, nav.cumulativeOffset().top, nav.getDimensions().height, nav.getDimensions().width);
	groupEnd();
}

Event.observe(window, 'load', function() { hookObservers(); });




