/**
 * Dropdown menu engine for TVG website
 * 
 * @author Garrette A. Hall <ghall@positroniks.com>
 * @copyright 2006, licensed for unrestricted use to The Vandiver Group, Inc.
 */

/**
 * @global string gahcsid Element ID string for the currently active submenu
 */
var gahcsid;
/**
 * @global int gahcsheight Current height in pixels of the active submenu
 */
var gahcsheight;


/**
 * Initialize the script and attach events to submenus
 */
function initSubmenus() {
    var menus = document.getElementsByTagName('li');
    var submenus = document.getElementsByTagName('ul');
    
    for(i in menus) {
        if(menus[i].className == 'mlink') {
            if(document.all) {
                menus[i].firstChild.attachEvent('onmouseover', openSubmenu);
            }
            else {
                menus[i].firstChild.addEventListener('mouseover', openSubmenu, false);
            }
        }
    }
    for(i in submenus) {
        if(submenus[i].className == 'submenu') {
            if(document.all) {
                submenus[i].attachEvent('onmouseleave', closeSubmenuIE);
            }
            else {
                submenus[i].addEventListener('mouseout', closeSubmenuFF, false);
            }
        }
    }
    for(i in menus) {
        if(menus[i].parentNode && menus[i].parentNode.className == 'submenu') {
            if(document.all) {
                menus[i].attachEvent('onmouseover', hilightSubitem);
                menus[i].attachEvent('onmouseleave', unhilightSubitem);
            }
            else {
                menus[i].addEventListener('mouseover', hilightSubitem, false);
                menus[i].addEventListener('mouseout', unhilightSubitem, false);
            }
        }
    }
    
    return false;
}

/**
 * Find the document element which triggered an event
 * 
 * @param eventobject e
 * @return DOMobject el 
 */
function findEl(e) {
    var el;
    
    if (!e) e = window.event;
    if(e.target) el = e.target;
    else if(e.srcElement) el = e.srcElement;
    
    return el;
}

/**
 * Find the X pixel screen origin of a document element
 * 
 * @param DOMobject el The element to find the X origin for
 * @return int curx The X pixel screen origin of element el
 */
function findX(el) {
    var curx = 0;
    
	if (el.offsetParent) {
		while (el.offsetParent) {
			curx += el.offsetLeft;
			el = el.offsetParent;
		}
	}
	else if (el.x) curx += el.x;
	
	return curx;
}

/**
 * Animate the submenu
 * 
 * @return null
 */
function growMenu() {
    var menu = document.getElementById(gahcsid);
    var bheight = menu.style.height;
    bheight = bheight.substring(0, bheight.lastIndexOf('p'));
    if(bheight < gahcsheight) {
        if(gahcsheight < 100) bheight = (bheight - 0) + (gahcsheight / 5);
        else bheight = (bheight - 0) + (gahcsheight / 10);
        menu.style.height = bheight + 'px';
        setTimeout('growMenu()', 1);
    }
    else setTimeout('fillSubmenu()', 10);
    return;
}

/**
 * Make the submenu's content visible after animation
 */
function fillSubmenu() {
    var menu = document.getElementById(gahcsid);
    var subitems = menu.getElementsByTagName('li');
    for(i in subitems) {
        if(subitems[i].nodeType == 1) {
            subitems[i].style.display = 'block';
        }
    }
}

/**
 * Begin opening a submenu
 * 
 * @param eventobject e
 * @return boolean false
 */
function openSubmenu(e) {
    var el = findEl(e)
    var curx = findX(el);
    var submenuid;
    
    closeAllSubmenus();
    if(el.nextSibling && el.nextSibling.nextSibling) {
        submenuid = el.nextSibling.nextSibling.id;
        gahcsid = submenuid;
    }
    else return;

    var menu = document.getElementById(submenuid);
    var subitems = menu.getElementsByTagName('li');
    for(i in subitems) {
        if(subitems[i].nodeType == 1) {
            subitems[i].style.display = 'none';
        }
    }
    
    switch(submenuid) {
        case 'sub_about':
            gahcsheight = 180;
            break;
        case 'sub_services':
            gahcsheight = 235;
            break;
        case 'sub_portfolio':
            gahcsheight = 20;
            break;
        case 'sub_press':
            gahcsheight = 80;
            break;
    }
    
    menu.style.left = curx + 'px';
    menu.style.height = 0;
    menu.style.display = 'block';
    setTimeout('growMenu()', 10);
    return false;
}


/**
 * Begin closing a submenu in IE browser
 * 
 * @param eventobject e
 * @return boolean false
 */
function closeSubmenuIE(e) {
    var el = findEl(e);
    
    el.style.display = 'none';
    
    return false;
}

/**
 * Begin closing a submenu in FF and other browsers
 * 
 * @param eventobject e
 * @return boolean false
 */
function closeSubmenuFF(e) {
    var el = findEl(e);
    var rel;
    
    if(el.className != 'submenu') return;
    if(e.relatedTarget) rel = e.relatedTarget;
    else if(e.toElement) rel = e.toElement;
    while(rel != el && rel.tagName != 'BODY') {
        rel = rel.parentNode;
        if(rel == el) return;
    }
    
    el.style.display = 'none';
    
    return false;
}

/**
 * Closes all open submenus
 * 
 * @return boolean false
 */
function closeAllSubmenus() {
    var submenus = document.getElementsByTagName('ul');
    
    for(i in submenus) {
        if(submenus[i].className == 'submenu') {
            submenus[i].style.display = 'none';
        }
    }
    
    return false;
}

/**
 * Hilights a submenu item when it is moused over
 * 
 * @param eventobject e
 */
function hilightSubitem(e) {
    var el = findEl(e);
    var newbg = '#8cbac7'
    
    unhilightAllSubitems();
    if(el.tagName == 'LI') {
        el.style.background = newbg;
    }
    else if(el.tagName == 'A' && el.parentNode.tagName == 'LI') {
        el.parentNode.style.background = newbg;
    }
}

/**
 * Removes the hilighting from a submenu item when the mouse mouse off of it
 * 
 * @param eventobject e
 */
function unhilightSubitem(e) {
    var el = findEl(e);
    var rel;
    
    if(el.tagName != 'LI') return;
    if(e.relatedTarget) rel = e.relatedTarget;
    else if(e.toElement) rel = e.toElement;
    while(rel != el && rel.tagName != 'BODY') {
        rel = rel.parentNode;
        if(rel == el) return;
    }
    el.style.background = 'transparent';
}

/**
 * Removes the hilighting from all submenu items
 */
function unhilightAllSubitems() {
    var subitems = document.getElementsByTagName('li');
    for(i in subitems) {
        if(subitems[i].parentNode && subitems[i].parentNode.className == 'submenu') {
            subitems[i].style.background = 'transparent';
        }
    }
}