var Menu = {
	     
  initialize: function(menu, options) {
    // set options
    this.options = options || {};
    this.menuItemName = this.options.menuItemName || 'menu_item';
    this.submenuName = this.options.submenuName || 'submenu';
    this.submenuItemName = this.options.submenu || 'submenu_item';
    this.selectedBackground = this.options.selectedBackground || '#FFFFFF';
    this.normalBackground = this.options.normalBackground || '#000000';
    
    this.menu = document.getElementById(menu);
    this.containers = getElementsByClassName(this.menuItemName,'',this.menu);

    for (var i = 0; i < this.containers.length; i++)
    {
      var menuitem = this.containers[i];
      menuitem.getElementsByTagName('a')[0].onfocus = this.focushandler;
      menuitem.onmouseout = this.mouseouthandler;
      menuitem.onmouseover = this.mouseoverhandler;
      menuitem.submenus = getElementsByClassName(this.submenuName,'',menuitem);
      // hide submenus
      for (var j = 0; j < menuitem.submenus.length; j++)
      {
	var subitem = menuitem.submenus[j];
	subitem.style.display = 'none';
      }
    }
  },

  contains: function(node1, node2) {
    if(node2 == node1){
      return true;
    }
    if(node2 === null) {
      return false;
    }
    else {
      return this.contains(node1, node2.parentNode);
    }
  },

  focushandler: function(e) {
    for (var i = 0; i < Menu.containers.length; i++)
    {
      // hide submenus
      var menuitem = Menu.containers[i];
      for (var j = 0; j < menuitem.submenus.length; j++)
      {
	var subitem = menuitem.submenus[j];
	subitem.style.display = 'none';
      }
    }
    this.parentNode.submenus[0].style.display = 'block';
  },

  mouseoverhandler: function(e) {
    var target = e ? e.target : event.srcElement;
    if (target.className === Menu.menuItemName) {
      target.style.background = Menu.selectedBackground;
    }
    if (target.submenus && target.submenus.length > 0) {
      target.submenus[0].style.display = 'block';
    }
  },

  mouseouthandler: function(e) {
    var target = e ? e.relatedTarget : event.toElement;
    if (!Menu.contains(this,target))
    {
      // Mouse has left the container 
      this.style.background = Menu.normalBackground; 
      if (this.submenus && this.submenus.length > 0) {
	this.submenus[0].style.display = 'none';
      }
    }
  }

};

/*
	Developed by Robert Nyman, http://www.robertnyman.com
	Code/licensing: http://code.google.com/p/getelementsbyclassname/
*/
var getElementsByClassName = function (className, tag, elm){
	if (document.getElementsByClassName) {
		getElementsByClassName = function (className, tag, elm) {
			elm = elm || document;
			var elements = elm.getElementsByClassName(className),
				nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null,
				returnElements = [],
				current;
			for(var i=0, il=elements.length; i<il; i+=1){
				current = elements[i];
				if(!nodeName || nodeName.test(current.nodeName)) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	else if (document.evaluate) {
		getElementsByClassName = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = "",
				xhtmlNamespace = "http://www.w3.org/1999/xhtml",
				namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null,
				returnElements = [],
				elements,
				node;
			for(var j=0, jl=classes.length; j<jl; j+=1){
				classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
			}
			try	{
				elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
			}
			catch (e) {
				elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
			}
			while ((node = elements.iterateNext())) {
				returnElements.push(node);
			}
			return returnElements;
		};
	}
	else {
		getElementsByClassName = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = [],
				elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
				current,
				returnElements = [],
				match;
			for(var k=0, kl=classes.length; k<kl; k+=1){
				classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
			}
			for(var l=0, ll=elements.length; l<ll; l+=1){
				current = elements[l];
				match = false;
				for(var m=0, ml=classesToCheck.length; m<ml; m+=1){
					match = classesToCheck[m].test(current.className);
					if (!match) {
						break;
					}
				}
				if (match) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	return getElementsByClassName(className, tag, elm);
};