function getClassNameRegex(className) {
  return new RegExp('\\b' + className + '\\b');
}

function isInClassName(element, className) {
  var regex = getClassNameRegex(className);
  return regex.test(element.className);
}

// Find the first node that contains child
function getAncestorByClassName(child, className) {
  var candidate = child.parentNode;
  var regex = getClassNameRegex(className);
  do {
    if (regex.test(candidate.className)) {
      return candidate;
    }
    candidate = candidate.parentNode;
  }
  while (candidate);
  return null;
}

function getElementsByClassName(root, className) {
  if (root.getElementsByClassName) {
    return root.getElementsByClassName(className);
  }
  else {
    var found = new Array();
    var elements = root.getElementsByTagName('*');
    var regex = getClassNameRegex(className);

    for (var i = 0; i < elements.length; i++) {
      if (regex.test(elements[i].className)) {
        found[found.length] = elements[i];
      }
    }
    return found;
  }
}

function dropdowns_onMouseOver() {
  var nav = document.getElementById('nav');
  var dropdowns = getElementsByClassName(nav, 'hidden');
  for (var i = 0; i < dropdowns.length; i++) {
    dropdowns[i].className = 'visible';
  }
}

function dropdowns_onMouseOut() {
  var nav = document.getElementById('nav');
  var dropdowns = getElementsByClassName(nav, 'visible');
  for (var i = 0; i < dropdowns.length; i++) {
    dropdowns[i].className = 'hidden';
  }
}

var nav = document.getElementById('nav');
nav.onmouseover = dropdowns_onMouseOver;
nav.onmouseout = dropdowns_onMouseOut;
