var openDefaultMenusDelay = 1;
var openDefaultMenusDuration = 0.1;

var currentOpenTop = -1;
var currentOpenSecond = -1;

var currentlyOverTop = -1;
var currentlyOverSecond = -1;
var mousePauses = [];
var mouseMoveCounter = 0;
var mouseMoveInterval = 3;
var mouseMoveSecondPausesDefined = 0;
var maxMouseMoveSecondPauses = 5;

var topLevel = [];
var secondLevel = [];
var dur = .4;

var animatingTop = false;
var animatingSecond = false;

var imageRoot = "/images/menuSystem/";
var menuClose = imageRoot+"menuClose.jpg";
var menuOpen = imageRoot+"menuOpen.jpg";
var menuCloseHover = imageRoot+"menuCloseHover.jpg";
var menuOpenHover = imageRoot+"menuOpenHover.jpg";
var secondLevelMenuClose = imageRoot+"secondLevelMenuClose.jpg";
var secondLevelMenuOpen = imageRoot+"secondLevelMenuOpen.jpg";
var secondBack = imageRoot+"secondLevelNavBGHover.jpg";
var thirdBack = imageRoot+"thirdLevelNavBGHover.jpg";

function setBackground(image, url) {
    image.setStyle({backgroundImage: "url("+url+")"});
}
function getLinkFromImage(image) {
    return image.up().down();
}
function getLinkFromMenu(menu) {
    return menu.up().down();
}
function getImage(menu) {
    return menu.up().immediateDescendants().last();
}
function getSubMenu(image) {
    return image.up().down().next();
}
function isOpen(menu) {
    return currentOpenTop == menu.identify() || currentOpenSecond == menu.identify();
}
function hasSubMenu (linkTag) {
    return linkTag.next() && linkTag.next().match('ul');
}

function openDefaultTop (menu) {
    currentOpenTop = menu.identify();
    setBackground(getLinkFromMenu(menu), menuClose);
    new Effect.BlindDown(menu, {duration: openDefaultMenusDuration});
}
function openDefaultSecond (menu) {
    currentOpenSecond = menu.identify();
    setBackground(getLinkFromMenu(menu), secondLevelMenuClose);
    new Effect.BlindDown(menu, {duration: openDefaultMenusDuration});
}


function topMenuMouseOver(image) {
    var menu = getSubMenu(image);
    if(isOpen(menu))
        setBackground(getLinkFromImage(image), menuCloseHover);
    else
        setBackground(getLinkFromImage(image), menuOpenHover);
}
function topMenuMouseOut(image) {
    var menu = getSubMenu(image);
    if(isOpen(menu))
        setBackground(getLinkFromImage(image), menuClose);
    else
        setBackground(getLinkFromImage(image), menuOpen);
}
function openTopMenu(menu) {
	animatingTop = true;
	new Effect.BlindDown(menu, {duration: dur, afterFinish: function(obj) { topMenuOpenDone(); }});
}
function closeTopMenu(menu) {
	animatingTop = true;
	new Effect.BlindUp(menu, {duration: dur, afterFinish: function(obj) { topMenuOpenDone(); }});
}
function topMenuOpenDone() {
	animatingTop = false;
	//mouseMovePauseDefined = false;

}
function openSecondMenu(menu) {
	animatingSecond = true;
	new Effect.BlindDown(menu, {duration: dur, afterFinish: function(obj) { animatingSecond = false; }});
}
function closeSecondMenu(menu) {
	animatingSecond = true;
	new Effect.BlindUp(menu, {duration: dur, afterFinish: function(obj) { animatingSecond = false; }});
}
function topMenuMouseClicked(image) {
    var menu = getSubMenu(image);
    if(currentOpenTop == -1) {
        currentOpenTop = menu.identify();
        setBackground(getLinkFromImage(image), menuClose);
        openTopMenu(menu);
        //setTimeout(function() { centerSubMenuImages(menu); }, dur*1000);
    } else if (isOpen(menu)) {
    	currentOpenTop = -1;
    	setBackground(getLinkFromImage(image), menuOpen);
    	closeTopMenu(menu);
	} else {
		var currentOpen = $(currentOpenTop);
		currentOpenTop = menu.identify();

		var currentImage = getImage(currentOpen);
		setBackground(getLinkFromImage(currentImage), menuOpen);
		setBackground(getLinkFromImage(image), menuClose);

		closeTopMenu(currentOpen);
		openTopMenu(menu);
		//setTimeout(function() { centerSubMenuImages(menu); }, dur*1000);
	}
}


function secondMenuMouseClicked (image) {
    var menu = getSubMenu(image);
    if(currentOpenSecond == -1) {
        currentOpenSecond = menu.identify();
        setBackground(getLinkFromImage(image), secondLevelMenuClose);
        new Effect.BlindDown(menu, {duration: dur});
        //setTimeout(function() { centerSubMenuImages(menu); }, dur*1000);
    } else if (currentOpenSecond == menu.identify()) {
	    currentOpenSecond = -1;
	    setBackground(getLinkFromImage(image), secondLevelMenuOpen);
	    new Effect.BlindUp(menu, {duration: dur});
	} else {
		var currentOpen = $(currentOpenSecond);
		currentOpenSecond = menu.identify();
		
		var currentImage = getImage(currentOpen);
		setBackground(getLinkFromImage(currentImage), secondLevelMenuOpen);
		setBackground(getLinkFromImage(image), secondLevelMenuClose);
		
		new Effect.BlindUp(currentOpen, {duration: dur});
		new Effect.BlindDown(menu, {duration: dur});
		//setTimeout(function() { centerSubMenuImages(menu); }, dur*1000);
	}
}

function mouseMoved(event) {
	if(animatingTop || animatingSecond) {
		return;
	}
	
	var location = event.pointerY() - 205;
	processLocation(location);
	event.stop();
}

function processLocation(location) {	
	var totalHeight = 0;
	//debugClear('');
	var c = 0;
	var lastHeight = 0;
	for(c = 0; c < topLevel.length; c++) {
		lastHeight = topLevel[c].getHeight();
		totalHeight += lastHeight;
		//debug(topLevel[c].getHeight());
		if(totalHeight > location) {
			currentlyOverTop = topLevel[c];
			break;
		}
	}
	
	var item = currentlyOverTop;
	if(!item)
		return;
	
	var linkTag = item.down();
	
	if(!hasSubMenu(linkTag))
		return;
	var subMenu = getSubMenu(linkTag);
	
	// check the submenu to see if something should be opened there
	if(isOpen(subMenu)) {
    	var secondLevel = $$('#'+subMenu.identify()+' > li');
    	totalHeight -= item.getHeight();
    	totalHeight += linkTag.getHeight()
    	//debug('  '+linkTag.getHeight());
    	var d = 0;
    	//debug(' '+location+'  '+totalHeight);
    	for(d = 0; d < secondLevel.length; d++) {
    		totalHeight += secondLevel[d].getHeight();
    		//debug(' '+totalHeight);
    		if(totalHeight > location) {
    			currentlyOverSecond = secondLevel[d];
    			break;
    		}
    	}
		
		var secondItem = currentlyOverSecond;
		var secondLink = secondItem.down();
		if(!hasSubMenu(secondLink))
			return;
		if(mouseMoveSecondPausesDefined < maxMouseMoveSecondPauses) {
			mouseMoveSecondPausesDefined++;
			var secondMenu = getSubMenu(secondLink);
			setTimeout(function() { mouseMovePauseSecond(location, secondItem, secondMenu, secondLink, d); }, 80);
		}
	} else {
		//debug(mousePauses[c]);
		if(!mousePauses[c]) {
			mousePauses[c] = true;
			var pause = 200;
			if(lastHeight > 30) {
				pause *= 2;
			}
			setTimeout(function() { mouseMovePause(location, item, subMenu, linkTag, c); }, pause);
		}
	}
}

function mouseMovePause(location, item, menu, link, c) {
	if(animatingTop || animatingSecond) {
		mousePauses[c] = false;
		return;
	}
	
	if(currentlyOverTop == item) {
		var image = getSubMenu(menu);
		if(currentOpenTop == -1) {
	        currentOpenTop = menu.identify();
	        setBackground(link, menuClose);
	        openTopMenu(menu);
	    } else if (isOpen(menu)) {
	    	// check if we should open the submenu
		} else {
			var currentOpen = $(currentOpenTop);
			currentOpenTop = menu.identify();
	
			var currentImage = getImage(currentOpen);
			setBackground(getLinkFromImage(currentImage), menuOpen);
			setBackground(link, menuClose);
	
			closeTopMenu(currentOpen);
			openTopMenu(menu);
		}
	}
	mousePauses[c] = false;
}

function mouseMovePauseSecond(location, item, menu, link, c) {
	mouseMoveSecondPausesDefined--;
	if(animatingTop || animatingSecond) {
		return;
	}
	
	if(currentlyOverSecond == item) {
		var image = getSubMenu(menu);
		if(currentOpenSecond == -1) {
	        currentOpenSecond = menu.identify();
	        setBackground(link, secondLevelMenuClose);
	        openSecondMenu(menu);
	    } else if (isOpen(menu)) {
	    	// check if we should open the submenu
		} else {
			var currentOpen = $(currentOpenSecond);
			currentOpenSecond = menu.identify();
	
			var currentImage = getImage(currentOpen);
			setBackground(getLinkFromImage(currentImage), secondLevelMenuOpen);
			setBackground(link, secondLevelMenuClose);
	
			closeSecondMenu(currentOpen);
			openSecondMenu(menu);
		}
	}
}

function debug(str) {
	$('debug').innerHTML += str;
}
function debugClear(str) {
	$('debug').innerHTML = str;
}

function mouseOutOfNav(event) {
	currentlyOverSecond = -1;
	currentlyOverTop = -1;
	event.stop();
}
function openDefaultMenus() {
    var nav = $('nav');
//    nav.observe('mousemove', function(event) { mouseMoved(event); });
//    nav.observe('mouseout', function(event) { mouseOutOfNav(event); });
    
    topLevel = $$('#nav > li');
    for(var c = 0; c < topLevel.length; c++) {
    	mousePauses[c] = false;
        var current = topLevel[c].down();
        var topNext = current.next();
        
        if(topNext && topNext.match('ul')) {
            var topOpenButton = $(Builder.node ('div', {'class' : 'topOpenButton'}));
            current.up().appendChild(topOpenButton);
            current.addClassName('showImage');
            
            /*topOpenButton.observe('mouseover', function (event) { topMenuMouseOver(Event.element(event)); });
            topOpenButton.observe('mouseout', function (event) { topMenuMouseOut(Event.element(event)); });*/
            topOpenButton.observe('click', function (event) { topMenuMouseClicked(Event.element(event)); });
            
            secondLevel = $$('#'+topNext.identify()+' > li');
            for(var d = 0; d < secondLevel.length; d++) {
                var secondCurrent = secondLevel[d].down();
                var secondNext = secondCurrent.next();
                
                if(secondNext && secondNext.match('ul')) {
                    var secondOpenButton = $(Builder.node ('div', {'class' : 'secondOpenButton'}));
                    secondCurrent.up().appendChild(secondOpenButton);
                    secondCurrent.addClassName('showImage');
                    
                    secondOpenButton.observe('click', function (event) { secondMenuMouseClicked(Event.element(event)); });
                }
            }
        }
    }
    
    /*$$('#nav .topOpenButton').each(function (s) {centerImage($(s)); });
    $$('#nav .secondOpenButton').each(function (s) {centerImage($(s)); });
    $$('#nav .thirdOpenButton').each(function (s) {centerImage($(s)); });*/
    
    var currentHref = location.href;
    // remove the http://
    currentHref = currentHref.substring(7, currentHref.length);
    
    // find the start of the uri and isolate it (ie remove domain and www.)
    var index = currentHref.indexOf("/")
    currentHref = currentHref.substring(index, currentHref.length);	
    
    var links = $$('#nav a[href="'+currentHref+'"]');
    while(links.length == 0) {
        var index = currentHref.lastIndexOf("/");
        if(index >= 0) {
            currentHref = currentHref.substring(0, index);
            links = $$('#nav a[href="'+currentHref+'"]');
        } else
        break;
    }
    
    if(links.length==0)
        return;
    
    var currentLink = links.last();
    if(currentLink.readAttribute('href')== "/csc/comingSoon" || currentLink.readAttribute('href') == "/comingSoon")
        return;
    
    var currentLinkParents = currentLink.ancestors();
    /*
    html
    body
    #nav
    li
    top level link
    [ul
    li
    second level link
    [ul
    li
    third level link]]
    */
    
    setTimeout(function() {
        switch(currentLinkParents.length) {
            case 4:
            if(hasSubMenu(currentLink))
                openDefaultTop(currentLink.next());
            break;
            case 6:
            openDefaultTop(currentLink.up().up());
            setBackground(currentLink.up(), secondBack);
            if(hasSubMenu(currentLink))
                setTimeout(function() {openDefaultSecond(currentLink.next()); }, 10);
            break;
            case 8:
            openDefaultTop(currentLink.up().up().up().up());
            setBackground(currentLink.up(), thirdBack);
            setTimeout(function() {openDefaultSecond(currentLink.up().up()); }, 10);
            break;
        }}, openDefaultMenusDelay);
    }