/*
	Expandable Listmenu 
	Based on script by Thomas Bakketun http://www.bakketun.net/listmenu/
*/


function elementHasClass( element, className ) {
  if ( ! element.className ) { 
    return false;
  }
  var re = new RegExp( "(^|\\s+)" + className + "($|\\s+)" );
  return re.exec( element.className ); 
}

var currMenuItem;

function initMenus() {
	if ( ! document.getElementsByTagName ) {
		return;
	}
	
	var singleopen, keepopen
	var menus = document.getElementsByTagName( "ul" );
	for ( var i = 0; i < menus.length; i++ ) {
		if (elementHasClass( menus[ i ], "treemenu" )) {
			currMenuItem = null;
			initMenu( menus[ i ], elementHasClass( menus[ i ], "singleopen" ), elementHasClass( menus[ i ], "keepopen" ));
			if (currMenuItem != null) currMenuItem.className +=" selected";
			menus[i].style.display="block";
		}
		
	}
}

function getChildNodes( element, tag ) {
  var foundNodes = new Array();
  var childNodes = element.childNodes;
  for (var i = 0; i < childNodes.length; i++ ) {
    var node = childNodes[ i ];
    //FIXME: should only do convert to lowercase when i HTML-mode
    if ( node.tagName && ( node.tagName.toLowerCase() == tag ) ) {
      foundNodes.push( node );
    }
  }
  return foundNodes;
}

function createA(menu) {
  var a, text;
  text = menu.firstChild;
  a = document.createElement("a");
  a.href = "#";
  
  menu.replaceChild(a, text);
  a.appendChild(text);
  return a;
}

function initMenu(menu, singleopen, keepopen) {
  var currURL = new String(window.location);
  var item, a, open;
  var items = getChildNodes(menu, "li");
  open = false;
  for (var i = 0; i<items.length; i++) {
    item = items[i];
    a = getChildNodes(item, "a")[0];
    var submenu = getChildNodes(item, "ul")[0];
    if (submenu) {
      if (!a) {
        a = createA(item);
      }
	  a.innerHTML = '<span class="arr">&darr;</span>' + a.innerHTML;
      open = initMenu(submenu, singleopen, keepopen) || open;
      a.onclick = function() { return menuonclick(this, singleopen); }
    } else {
		
      //if (a) open = open || (keepopen && a.href == window.location);
	  if (a) open = open || (keepopen && (currURL.indexOf(a.href) !=-1));
	  
	  //if((a) && a.href == window.location && a.href == window.location) a.className="current";
	  //Revision 1:if((a) && (currURL.indexOf(a.href) !=-1)) a.className += " selected";
	  if ((a) && (currURL.indexOf(a.href) !=-1)) {
	  	if ((!currMenuItem) || (a.href.length >= currMenuItem.href.length)) currMenuItem = a;
	  };
    }
    if (item.className == "treenodeopen") setMenuInit(item, true);
    open = open || item.className == "treenodeshow";
  }
  setMenuInit(menu.parentNode, open);
  //if (a.href == window.location) a.className += " selected";
  //if (currURL.indexOf(a.href) !=-1) a.className += " selected";
  
  return open;
}

function menuonclick(a, singleopen) {
  setMenu(a.parentNode, a.className == "treeclosed");
  var menus = getChildNodes(a.parentNode.parentNode, "li");
  if (singleopen) {
    for (var i = 0; i<menus.length; i++) {
      if (menus[i] != a.parentNode) {
        setMenu(menus[i], false);
      }
    }
  }
  
  a.blur();
  return false;
}

function setMenu(menu, open) {
	var a = getChildNodes(menu, "a")[0];
	var ul = getChildNodes(menu, "ul")[0];
	if (a && ul) {
		if (open) {
			a.className = "treeopen";
			if (menu.className.indexOf("treeopen")==-1) menu.className += " treeopen";
			a.className = "treeopen";

			//ul.style.display = "block";
			if (ul.isFolding!=true) {
				ul.isFolding=true;
				Effect.BlindDown(ul,{
				duration:0.5,
				afterFinish:function(){
					ul.isFolding=false; 
					//if (document.all) ul.style.height = Element.getHeight(ul)+'px';
				} 
				});
			}
		} else {
			
			//ul.style.display = "none";
			if (ul.isFolding!=true) {
				ul.isFolding=true;
				
				Effect.BlindUp(ul,{
				duration:0.5,
				afterFinish:function(){
					a.className = "treeclosed";
					//menu.className = "treeclosed";
					ul.isFolding=false;
				} 
				});
			}
		}
	}
}

function setMenuInit(menu, open) {
  var a = getChildNodes(menu, "a")[0];
  var ul = getChildNodes(menu, "ul")[0];
  var li = getChildNodes(ul,"li");
  li[0].className+=" firstitem";
  li[li.length-1].className+=" lastitem";
  if (a && ul) {
    if (open) {
      a.className = "treeopen";
	  	menu.className += " treeopen";
		a.className = "treeopen";
      //ul.style.display = "block";
	  Element.show(ul);
	
    } else {
      a.className = "treeclosed";
      Element.hide(ul);
	  //ul.style.display = "none";
    }
  }
}

initMenus();