/**  @author Russ Tennant <russ@i2rd.com> */
if(typeof MB == 'undefined') {var MB = {};}
MB.array=function(nl){
	var i,l = [];
	for(i=0; i < nl.length; i++) l.push(nl.item(i));
	return l;
};
MB.lastEventTime = new Date();
MB.addClassName=function(el,cn){
  if (!MB.hasClassName(el,cn))
    el.className = ((el.className || '') + ' ' + cn);
};
MB.err = function(m,e){if(typeof log4js != 'undefined') log4js.logger.error(m,e); else if(typeof console != 'undefined') console.log(m);};
MB.data = window.localStorage;
MB.getData=function(key){
	if(!!MB.data)return MB.data[key];
	else {
		var i=0,c,cn=key+"=",ca=document.cookie.split(';');
		for(;c=ca[i];i++) {
			while (c.charAt(0)==' ') c = c.substring(1,c.length);
			if (c.indexOf(cn) == 0) return c.substring(cn.length,c.length);
		}
		return null;
	}
};
MB.setData=function(key,val){
	if(!!MB.data) MB.data[key]=val;
	else {
		var d = new Date(); d.setDate(d.getDate()+5);
		document.cookie = key + "=" + val + "; expires=" + d.toUTCString() + "; path=/";
	}	
};
MB.removeClassName=function(el,cn){
  if (!MB.hasClassName(el,cn)) return;
  el.className = (el.className || '').replace(RegExp("(^|\\s+)" + cn + "(\\s+|$)",'g'), ' ');
};
MB.hasClassName=function(el,cn){
  var cur = (el.className || '');
  return cur == cn || (RegExp('\\b'+cn+'\\b').test(cur));
};
/** Get target of event.*/
MB.getTarget = function(evt) {
    evt = evt || window.event;
    var el = (evt.srcElement || evt.target);
    while(el && el.nodeName.toLowerCase() != "li")
        el = el.parentNode;
    return el;
};
MB.getTop = function(li) {
	var parent = li;
	while(parent && parent.className != 'menubean' && parent.nodeName.toLowerCase() != 'div') {
		parent = parent.parentNode;
	}
	if(parent == null)
		throw new Error("Unable to find top of menu");
	return parent;
};
MB.GetChildUL = function(li) {
	if(!MB.hasClassName(li, 'mi_parent')) return null;
	var h,ul,hb,t;
	var children = li.getElementsByTagName("ul");
	if(!children || children.length == 0) {
		children = li.getElementsByTagName("UL");
	}
	for(h = 0, hb = children.length; (t = children[h]);h++) {
		if(t.parentNode === li) {
			if(ul) {
				MB.err("Invalid DOM structure for menu. li.id = "+li.id+", children.length = " + (children == null ? "null" : children.length) );
				break;
			} else {
				ul = t;
			}
		}
	}
	return ul;
};
MB.SetInactiveClass = function(el) {
	var elements = el.getElementsByTagName("li");
	if(!elements || elements.length == 0) {
		try {
			elements = el.getElementsByTagName("LI");
		} catch(e) {}
	}
	var liElements = MB.array(elements);
	var node = null;
	while( (node = liElements.pop()) ) {
		// Deactivate any previous node.
		MB.removeClassName(node, 'mi_active');
		MB.addClassName(node, 'mi_inactive');
		//log4js.logger.info("Setting node mi_inactive " + nn + ": " + node.id + " mi_inactive.");
	}
};
MB.SetActive = function(li, activate) {
	//log4js.logger.info("Activating: " + li.id);
	// Set the specified list item as active.
	if(!MB.hasClassName(li,'over')) {
		MB.addClassName(li,'over');
		var ul = MB.GetChildUL(li);
		if(ul && ul.className.match("_persistent")) {
			var nodelist = MB.GetOpenState(li);
			var entry = new RegExp("\\b" + li.id + "\\b");
			if (!entry.test(nodelist)) {
				nodelist = (nodelist + "," + li.id);
			}
			MB.SetOpenState(li, nodelist)
		}
	}
	if(activate) {
		var top = MB.getTop(li);
		MB.SetInactiveClass(top);
		if(!MB.hasClassName(li, 'mi_active')) {
			MB.removeClassName(li,'mi_inactive');
			MB.addClassName(li,'mi_active');
		}
		//log4js.logger.info("Setting node mi_active: " + li.id + " active.");
	}
	var ps=li.previousSibling,ns=li.nextSibling;
	if(ps && !MB.hasClassName(ps, 'prev_sibling')){MB.addClassName(ps, 'prev_sibling');}
	if(ns && !MB.hasClassName(ns, 'next_sibling')){MB.addClassName(ns, 'next_sibling');}
};
MB.SetInActive = function(li) {
	if(!MB.hasClassName(li,'over'))
		return;
	// Set the specified list item as active.
	//log4js.logger.info("Deactivating: " + li.id);
	MB.removeClassName(li,'over');
	var ul = MB.GetChildUL(li);
	if(ul && ul.className.match("_persistent")) {
		var nodelist = MB.GetOpenState(li);
		nodelist = nodelist.replace(new RegExp("," + li.id + "\\b"), "");
		MB.SetOpenState(li, nodelist);
	}
	var ps=li.previousSibling,ns=li.nextSibling;
	if(ps){MB.removeClassName(ps, 'prev_sibling');}
	if(ns){MB.removeClassName(ns, 'next_sibling');}
};
MB.GetOpenState = function(li) {
	return MB.getData(MB.getTop(li).id + "-CMO") || ""; //nodelist
};
MB.SetOpenState = function(li, nodelist) {
	MB.setData(MB.getTop(li).id + "-CMO", nodelist);
};
MB.MenuBeanInit = function(div) {
    if(typeof div == 'string') div = document.getElementById(div);
    if(!!div.mbinited) return;
    div.mbinited=true;
	var nodelist = MB.getData(div.id + "-CMO") || "";
	var item = null;
	var elements = div.getElementsByTagName("li");
	var liElements = MB.array(elements);
	while( (item = liElements.pop()) ) {
		var pn = item.parentNode;
		if(pn && pn.nodeName.toLowerCase() == "ul") {
			pn = pn.parentNode;
			if(pn && pn.nodeName.toLowerCase() == "li" && !MB.hasClassName(pn, 'mi_parent')) {
				MB.addClassName(pn, 'mi_parent');
			}
		}
		item.onclick = function(evt) { 
				var now = new Date(); // Don't process two "simultaneous" events.
				if((now - MB.lastEventTime) < 200) return;
				MB.lastEventTime = new Date();
				var target = MB.getTarget(evt);
				if(MB.hasClassName(target,'over')) { 
					MB.SetInActive(target, true);
				}
				else {
					MB.SetActive(target);
				}
			};
		// If not persistent, watch mouse over
		if(!item.parentNode.className.match(/_persistent/)) {
			item.onmouseover = function(evt) {
					try { MB.SetActive(this); } catch(e) { 
					}
				}; 
			item.onmouseout = function(evt) {
					try { MB.SetInActive(this);} catch(e) {}	
   				};
		} else {
			var tmpId = "," + item.id;
			if(nodelist.indexOf(tmpId) == -1) {
				MB.SetInActive(item);
			}
		}
			
		
 	} // End loop
 	if(document.getElementById) {
 		//log4js.logger.info("Loading opennodelist from " + (div.id + "-CMSMenuOpen"));
		//log4js.logger.info("NodeList - " + nodelist);
		var liList = nodelist.split(",");
		for(var h = 0; h < liList.length; h++) {
			var id = liList[h];
			if(id) {
				var li = document.getElementById(id);
				if(li) {
					//log4js.logger.info("Opening " + li.nodeName + ".id=" + id);
					MB.SetActive(li);
				}
			}
		}
	}
};
MB.scan = function(start) {
    if(typeof start == 'string') start = document.getElementById(start);
	var m, div, s= (start || document), i, ib;
	if (document.evalute) {
        var result = document.evaluate("//div[contains(@class,'menubean')]", s, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
        for (i = 0, ib = result.snapshotLength; i < ib; i++){
			m[m.length] = result.snapshotItem(i);
        }
	} else {m = s.getElementsByTagName("div");}
	for(i=0, ib = m.length; i < ib; i++) {
		div = m[i];
		if((div.className||'').match(/menubean/))
			MB.MenuBeanInit(div);
	}
};

