/**
 * xbdhtml library functions
 */
 
function Is ()
{   // convert all characters to lowercase to simplify testing
    var agt=navigator.userAgent.toLowerCase()

    // --- BROWSER VERSION ---
    this.major = stringToNumber(navigator.appVersion)
    this.minor = parseFloat(navigator.appVersion)

    this.nav  = ((agt.indexOf('mozilla')!=-1) && ((agt.indexOf('spoofer')==-1)
                && (agt.indexOf('compatible') == -1)))
    this.nav2 = (this.nav && (this.major == 2))
    this.nav3 = (this.nav && (this.major == 3))
    this.nav4 = (this.nav && (this.major == 4))
	
	//Netscape 6
	this.nav5 =	(this.nav && (this.major == 5))
	this.nav6 = (this.nav && (this.major == 5))
	this.gecko = (this.nav && (this.major >= 5))

    this.ie   = (agt.indexOf("msie") != -1)
    this.ie3  = (this.ie && (this.major == 2))
    this.ie4  = (this.ie && (this.major == 3))
    this.ie5  = (this.ie && (this.major == 4))


    this.opera = (agt.indexOf("opera") != -1)
     
    this.nav4up = this.nav && (this.major >= 4)
    this.ie4up  = this.ie  && (this.major >= 4)
    
    
    // added by dbw
    this.mac = (agt.indexOf('mac') != -1)
    this.win = (agt.indexOf('win') != -1)
    this.webtv = (agt.indexOf('webtv') != -1)
}

var is = new Is();

function getElt () 
{ if (is.nav4)
  {
    var currentLayer = document.layers[getElt.arguments[0]];
    for (var i=1; i<getElt.arguments.length && currentLayer; i++)
    {   currentLayer = currentLayer.document.layers[getElt.arguments[i]];
    }
    return currentLayer;
  } 
  else if(document.getElementById && document.getElementsByName)
  { 
    var name = getElt.arguments[getElt.arguments.length-1];
    if(document.getElementById(name))                      //First try to find by id
       return document.getElementById(name);
    else if (document.getElementsByName(name))             //Then if that fails by name
	   return document.getElementsByName(name)[0];
  }
  else if (is.ie4up) {
    var elt = eval('document.all.' + getElt.arguments[getElt.arguments.length-1]);
    return(elt);
  }

}

function showElt(elt)
{
	setEltVisibility(elt,'visible');
}

function hideElt(elt)
{
	setEltVisibility(elt, 'hidden');
}

function setEltVisibility (elt, value)
{  if (is.nav4) elt.visibility = value;
   else if (elt.style) elt.style.visibility = value;
}

function moveEltTo (elt, x, y) 
{ if (is.nav4) elt.moveTo(x, y);
  else if (is.ie4up) {
    elt.style.pixelLeft = x;
    elt.style.pixelTop  = y;
  }
  else if (is.gecko) {
    elt.style.left = x+'px';
    elt.style.top  = y+'px';
  }
}

function getEltPageLeft(elt) {
  var x;

  if (is.nav4)
    return elt.pageX;
  if (is.ie4up) {
    x = 0;
    while (elt.offsetParent != null) {
      x += elt.offsetLeft;
      elt = elt.offsetParent;
    }
    x += elt.offsetLeft;
    return x;
  }
  if (is.gecko) {
    x = 0;
    while (elt.offsetParent != null) {
      x += elt.offsetLeft;
      elt = elt.offsetParent;
    }
    x += elt.offsetLeft;
    return x;
  }
  return -1;
}

function getEltPageTop(elt) {
  var y = 0;

  if (is.nav4)
    return elt.pageY;
  if (is.ie4up) {
    while (elt.offsetParent != null) {
      y += elt.offsetTop;
      elt = elt.offsetParent;
    }
    y += elt.offsetTop;

    if (is.mac && is.ie5)
	{
		y += stringToNumber(document.body.currentStyle.marginTop);
	}
    return y;
  }
  
  if (is.gecko) {
    while (elt.offsetParent != null) {
      y += elt.offsetTop;
      elt = elt.offsetParent;
    }
    y += elt.offsetTop;
    return y;
  }
  return -1;
}

function stringToNumber(s)
{
        return parseInt(('0' + s), 10)
}

function eltContains(elt1, elt2) {
	var retval = false
	if (elt1.contains) { // use IE's native contains function, if present
		retval = elt1.contains(elt2)
	}
	else {
		while (elt2.parentNode) {
			if ( (elt2 = elt2.parentNode) == elt1 ) {
				retval = true
				break
			}
		}
	}
	return retval
}

/**
 * Menu Globals
 */

var menus = 
{ 
  'aboutMenu':    { btn: 'aboutBtn',
			        offsetX: 14,
			        offsetY: 0,
			        data: [
			        	{text: 'About The Conference', href: 'about/index.html'},
			        	{text: 'Program', href: 'about/program.html'},
			        	{text: 'Schedule', href: 'about/schedule1.html'},
			        	//{text: 'FAQ', href: 'about/faq.html'},
			        	{text: 'Press Kit', href: 'about/press.html'}
			       	]
		          },
  
  'speakersMenu': { btn: 'speakersBtn',
     				offsetX: 26,
     				offsetY: 0,
     				data: [
     					{text: 'Speakers &amp; Session Chairs', href: 'speakers/index.html'},
     					{text: 'Abstracts', href: 'speakers/abstracts/index.html'},
			        	{text: 'Keynote Speaker', href: 'speakers/keynote.html'},
			        	{text: 'Conference Committee', href: 'speakers/committee.html'}
			       	]
     			  },
  
  'regMenu':      { btn: 'registrationBtn',
     				offsetX: 19,
     				offsetY: 0,
     				data: [
			        	{text: 'Register', href: 'registration/index.html'},
			        	{text: 'Directions &amp; Parking', href: 'registration/parking.html'},
			        	{text: 'Travel &amp; Hotel', href: 'registration/hotel.html'}
			       	] 
			      }
}

var lastMenu = ''

/**
 * Core menu functions
 */
 
function isDHTML() {
	var retval = true
	if (is.opera || is.ie4) {
		retval = false
	}
	return retval
}

function writeMenus() {
	var htmltext = ''
	var menuTmpl = 
	'<div id="{id}" class="menu"> \
		<table border="0" cellspacing="0" cellpadding="0" width="130"> \
			<tr> \
				<td class="links"> \
					{links} \
				</td> \
			</tr> \
			<tr> \
				<td class="bottom"><img src="' + root + 'images/gui/spacer.gif" width="1" height="11" alt=""></td> \
			</tr> \
		</table> \
	</div>'
	
	if ( isDHTML() ) {
		// build menu links
		for (menu in menus) {
			var links = ''
			var menutext = ''
			if (menus[menu].data) {
				for (var i = 0; i < menus[menu].data.length; i++) {
					links += menus[menu].data[i].text.link(root + menus[menu].data[i].href)
				}
			}
			menutext = menuTmpl
			menutext = menutext.replace(/\{links\}/, links)
			menutext = menutext.replace(/\{id\}/, menu)
			htmltext += menutext
		}
		document.write(htmltext)
	}
}
 
function showMenu(id) {
	if (window.isLoaded) { // wait until doc is fully loaded
		var x = getMenuLeft(id)
		var y = getMenuTop(id)
		var elt = getElt(id)
		if ( elt && (id != lastMenu) ) {
			moveEltTo (elt, x, y)
			showElt(elt)
			if (lastMenu) {
				clearMenu(lastMenu)
			}
			lastMenu = id // update
		}
	}
}

function clearMenu(id) {
	if (id) {
		var elt = getElt(id)
		if (elt) {
			hideElt(elt)
			roll_out(menus[id].btn)
		}
	}
}

function getMenuLeft(id) {
	var img = document.images[menus[id].btn]
	x = (is.nav4) ? img.x : getEltPageLeft(img)
	x += menus[id].offsetX
	return x
}

function getMenuTop(id) {
	var img = document.images['navLine']
	y = (is.nav4) ? img.y : getEltPageTop(img)
	y += menus[id].offsetY
	if (is.ie && is.win) {
		y += 1 // no idea why this is necessary...
	}
	return y
}

/**
 * Event handlers
 */
 
function noMenuHandler() {
	clearMenu(lastMenu)
	lastMenu = ''
}

function resizeHandler() {
	var id = lastMenu
	if (id) {
		lastMenu = ''
		showMenu(id)
	}
}

function menuLeaveHandler(evt) {
	var current, related
	
	if (is.nav4) {
		current = this
		related = null // nav4 doesn't do event bubbling
	}
	else if (evt) { // gecko
		current = evt.currentTarget
		related = evt.relatedTarget
	}
	else if (window.event) { // ie
		current = this
		related = window.event.toElement
	}
	
	if (is.nav4 || ((current != related) && !eltContains(current, related)) ) {
		clearMenu(current.id)
		lastMenu = ''
	}
}

function setMenuEvtHandlers() {
	var elt
	for (m in menus) {
		elt = getElt(m)
		if (elt) {
			elt.onmouseout = menuLeaveHandler
		}
	}
}

window.onresize = resizeHandler