
/**  Function: void getBrowser()
*    ---------------------------------------------------------------- 
*    Purpose:           get browser details
*    Arguments:         none
*    Returns/Assigns:   alerts browser details
*/

function getBrowser(){
	var useragent = navigator.userAgent;
	var browser = navigator.appName;
	var version = parseFloat(navigator.appVersion);
	var full_version = navigator.appVersion;
	alert('appName: ' + browser + '\nappVersion: ' + full_version + '\nparsed version number: ' + version + '\nuserAgent: ' + useragent);
}


/**  Function: obj getElementByIdCrossBrowser(element)
*    ---------------------------------------------------------------- 
*    Purpose:           get an element from its id reference
*    Arguments:         element - str, the element to retrieve
*    Returns/Assigns:   returns the element (object)
*/

function getElementByIdCrossBrowser(element){
	var el;
	if(document.getElementById){
		el = document.getElementById(element);
	}else if(document.all){
		el = document.all[element];
	}else if(document.layers){
		for(var i=0; i<document.layers.length; i++){
			if(document.layers[i].name == element){
				el = document.layers[i];
			}
		}
	}
	return el;
}


/**  Function: obj getElementByEventCrossBrowser(event)
*    ---------------------------------------------------------------- 
*    Purpose:           get an element from the event that fired it
*    Arguments:         event - obj, the event that fired
*    Returns/Assigns:   returns the element (object)
*/

function getElementByEventCrossBrowser(event){
	var el;
	if(browser != 'Netscape'){
		el = event.srcElement;
	}else{
		el = event.target;
	}
	return el;
}


/**  Function: void displayMenu(el, show)
*    ---------------------------------------------------------------- 
*    Purpose:           modify visibility property of an element
*    Arguments:         el		- obj, the element to display or hide
*						show	- bln, true = show, false = hide 
*    Returns/Assigns:   shows/hides element
*/

function displayMenu(el, show){
	if(el){
		if(el.style){
			el.css = el.style;
		}else{
			el.css = el;
		}
	}

	if(show && el){
		el.css.visibility = "visible";
	}else{
		el.css.visibility = "hidden";
	}
}


/**  Function: void getMenuDivs()
*    ---------------------------------------------------------------- 
*    Purpose:           gets all menu divs for the current menu
*    Arguments:         none
*    Returns/Assigns:   sets menu divs in the menu_divs var
*/

function getMenuDivs(){
	var arg;
	var j;
	var i;
	var matches;
	var div_id;

	all_divs = document.getElementsByTagName("div");
	arg = new RegExp("^" + div_prefix,"gi");
	j = 0;

	for(i=0;i<all_divs.length;i++){
		div_id = all_divs[i].id;
		matches = div_id.match(arg);
		if(matches == div_prefix){
			menu_divs[j] = all_divs[i];
			j++;
		}
	}
}


/**  Function: arr getVisibleDivs(el)
*    ---------------------------------------------------------------- 
*    Purpose:           gets all divs that should be visible for the current menu
*    Arguments:         el	- obj, the menu element that is currently activated
*    Returns/Assigns:   an array of all visible menu divs
*/

function getVisibleDivs(el){
	var vis_divs;
	var tag;
	var arg;
	var k;
	//alert(div_prefix);

	vis_divs = new Array();
	tag = el.tagName;
	arg = new RegExp("^" + div_prefix,"gi");
	k = 0;
	while(tag != 'BODY'){
		if(tag == 'DIV'){
			matches = el.id.match(arg);
			if(matches == div_prefix && el.id != ''){
				vis_divs[k] = el;
				k++;
			}
		}
		if(browser != 'Netscape'){
			el = el.parentElement;
		}else{
			el = el.parentNode;
		}
		tag = el.tagName;
	}
	return vis_divs;
}


/**  Function: void menuOn(element)
*    ---------------------------------------------------------------- 
*    Purpose:           set the menu visibility based on the id of the element that is rolled over
*    Arguments:         el	- obj, the menu element that is currently activated
*    Returns/Assigns:   displays menu elements that should diaply on rollover
*/

function menuOn(element){
	// requires menu_divs, vis_divs, timeouts to be available
	var el;
	var vis;
	var t;
	var m;
	var n;

	// get the element with id 'element';
	el = getElementByIdCrossBrowser(element);

	// clear any existing timeouts
	if(timeoutid){
		window.clearTimeout(timeoutid);
	}
	
	// find out which divs should be visible
	vis_divs = getVisibleDivs(el);

	for(m=0;m<menu_divs.length;m++){
		vis = 0;
		for(n=0;n<vis_divs.length;n++){
			if(menu_divs[m].id == vis_divs[n].id){
				vis = 1;
			}
		}

		if(vis != 1){
			// alert('not visible: ' + menu_divs[m].id);
			// turn on the div
			displayMenu(menu_divs[m],0);
		}else{
			// turn off the div
			//alert('visible: ' + menu_divs[m].id);
			displayMenu(menu_divs[m],1);
		}
	}
}


/**  Function: void menuOff()
*    ---------------------------------------------------------------- 
*    Purpose:           set timeouts for all menus to disappear
*    Arguments:         none
*    Returns/Assigns:   calls menuClear
*/

function menuOff(){
	timeoutid = window.setTimeout("menuClear()",delay);
}


/**  Function: void menuClear()
*    ---------------------------------------------------------------- 
*    Purpose:           if the timeout is reached this fires and clears all menu divs
*    Arguments:         none
*    Returns/Assigns:   none
*/

function menuClear(){
	for(n=0;n<vis_divs.length;n++){
		displayMenu(vis_divs[n],0);
	}
}


/**  Function: int getX(el)
*    ---------------------------------------------------------------- 
*    Purpose:           get the x position of an element
*    Arguments:         el, the element to get position of
*    Returns/Assigns:   an x co-ordinate
*/

function getX(el){
	var x = 0;
	if(el.offsetParent){
		while(el.offsetParent){
			x += el.offsetLeft;
			el = el.offsetParent;
		}
	}else if(el.x){
		x += el.x;
	}
	return x;
}


/**  Function: int getY(el)
*    ---------------------------------------------------------------- 
*    Purpose:           get the y position of an element
*    Arguments:         el, the element to get position of
*    Returns/Assigns:   a y co-ordinate
*/

function getY(el){
	var y = 0;
	if (el.offsetParent){
		while (el.offsetParent){
			y += el.offsetTop
			el = el.offsetParent;
		}
	}else if(el.y){
		y += el.y;
	}
	return y;
}


/**  Function: void setMenu(event, id, top, left)
*    ---------------------------------------------------------------- 
*    Purpose:           set the position of a parent menu element
*    Arguments:         event		- event, the event that fired
*						id			- str, the element id to set
*						top			- int, the x position
*						left		- int, the y position
*    Returns/Assigns:   positions element
*/

function setMenu(event, id, top, left){
	var parent;
	var el;
	var set_left;
	var set_top;

	parent = getElementByEventCrossBrowser(event);
	set_left = adjustPosition(parseInt(getX(parent) + left), 'left');
	set_top = adjustPosition(parseInt(getY(parent) + top), 'top');

	el = getElementByIdCrossBrowser(id);
	el.style.left = set_left + 'px';
	el.style.top = set_top + 'px';
}


/**  Function: void setChildMenu(parent, id, top, left)
*    ---------------------------------------------------------------- 
*    Purpose:           set the position of a child menu element
*    Arguments:         parent		- parent, the id of the parent element
*						id			- str, the element id to set
*						top			- int, the x position
*						left		- int, the y position
*    Returns/Assigns:   positions element
*/

function setChildMenu(parent, id, top, left){
	parent = getElementByIdCrossBrowser(parent);
	el = getElementByIdCrossBrowser(id);
	el.style.left = left + 'px';
	el.style.top = top + 'px';
}


/**  Function: int adjustPosition(pos, dir)
*    ---------------------------------------------------------------- 
*    Purpose:           modify visibility property of an element
*    Arguments:         pos		- int, the current position
*						dir		- str, direction to adjust - can be 'top' or 'left'
*    Returns/Assigns:   an adjusted position
*/

function adjustPosition(pos, dir){
	var arg = new RegExp("firefox","gi");
	//alert(navigator.userAgent);
	if(dir == 'top'){
		if(navigator.userAgent.match(arg) == 'Firefox'){
			//pos = (pos - 9);
		}
	}else if(dir == 'left'){
		if(navigator.userAgent.match(arg) == 'Firefox'){
			pos = (pos - 1);
		}
	}
	return pos;
}