// sets a class on an element

function addClass(elem, cssClass) {

	var pattern = new RegExp("\\b ?" + cssClass + "\\b");

	if(!elem.className.match(pattern)) {

		elem.className += " " + cssClass;

	}

}



// removes a class from an element

function delClass(elem, cssClass) {

	var pattern = new RegExp("\\b ?" + cssClass + "\\b");

	//alert(pattern + "\n" + elem.className + "\n" + cssClass);

	while(elem.className.match(pattern)) {

		elem.className = elem.className.replace(pattern, "");

	}

}

	

function addEvent(elm, evType, fn, useCapture) {

  // cross-browser event handling for IE5+, NS6 and Mozilla

  // By Scott Andrew

  if (elm.addEventListener) {

    elm.addEventListener(evType, fn, useCapture);

    return true;

  } else if (elm.attachEvent) {

    var r = elm.attachEvent('on' + evType, fn);

    EventCache.add(elm, evType, fn);

    return r;

  } else {

    elm['on' + evType] = fn;

  }

}



addEvent(window, 'unload', EventCache.flush, false);



function init() {

  var divs = document.getElementsByTagName('div');

  for (var i = 0; i < divs.length; i++) {

    if (divs[i].className.search(/\bproblemMenu\b/) == -1) continue;

    var lis = divs[i].getElementsByTagName('li');

    for (var j = 0; j < lis.length; j++) {

      var node = lis[j];

      if (node.nodeName.toLowerCase() == 'li' &&

          node.getElementsByTagName('ul').length > 0) {

        addEvent(node, 'mouseover', getMoverFor(node), false);

        addEvent(node, 'mouseout', getMoutFor(node), false);

      }

    }

  }

}



addEvent(window, 'load', init, false);



function getMoverFor(node) {

  return function(e) { mover(e, node); };

}



function getMoutFor(node) {

  return function(e) { mout(e, node); };

}



function mover(e, targetElement) {

  var el = window.event ? targetElement : e ? e.currentTarget : null;

  if (!el) return;

  clearTimeout(el.outTimeout);

  for (var i = 0; i < el.childNodes.length; i++) {

    var node = el.childNodes[i];

    if (node.nodeName.toLowerCase() == 'a') {

      addClass(node, 'open');

    }

    if (node.nodeName.toLowerCase() == 'ul') {

      node.style.display = 'block';

    }

  }

}



function mout(e, targetElement) {

  var el = window.event ? targetElement : e ? e.currentTarget : null;

  if (!el) return;

  el.outTimeout = setTimeout(function() { mout2(el); }, 1);

}



function mout2(el) {

  for (var i = 0; i < el.childNodes.length; i++) {

    var node = el.childNodes[i];

    if (node.nodeName.toLowerCase() == 'ul') {

      node.style.display = 'none';

    }

    if (node.nodeName.toLowerCase() == 'a') {

      delClass(node, 'open');

    }

  }

}



// handle selections from the javascript menus

function menuChoice(choiceNum, choiceText, input, choice, menuItem) {

	//alert("choice is: " + choiceNum + " (" + choiceText + ") for: " + input + ", " + choice);

	document.getElementById(input).value = choiceNum;

	document.getElementById(choice).value = choiceText;

	//document.getElementById(choice).innerText = choiceText;

	closeMenu();

}



// collapse the tree when a choice is made

function closeMenu() {

  var divs = document.getElementsByTagName('div');

  for(var i = 0; i < divs.length; i++) {

    if(divs[i].className.search(/\bproblemMenu\b/) == -1) continue;

    var lis = divs[i].getElementsByTagName('li');

    for(var j = 0; j < lis.length; j++) {

			var uls = lis[j].getElementsByTagName('ul');

      for(var k = 0; k < uls.length; k++) {

				uls[k].style.display = 'none';

      }

    }

    var as = divs[i].getElementsByTagName('a');

    for(var l = 0; l < as.length; l++) {

			delClass(as[l], 'open');

    }

  }

}

