/**  @author Russ Tennant <russ@i2rd.com> */
if(typeof MB == 'undefined') {var MB = {};}

MB.lastEventTime = new Date();
/** 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(!li.className.match("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) {
				log4js.logger.error("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 = [];
	liElements.pushAll(elements);
	var node = null;
	while( (node = liElements.pop()) ) {
		// Deactivate any previous node.
		node.className = node.className.replace("mi_active", "");
		node.className = node.className.replace("mi_inactive", "");
		node.className += " 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(!li.className.match(/over/)) {
		li.className += " over";
		var ul = MB.GetChildUL(li);
		if(ul && ul.className.match("_persistent")) {
			var nodelist = MB.GetOpenState(li);
			var entry = "," + li.id;
			if(nodelist.indexOf(entry) == -1) {
				nodelist += entry;
			}
			MB.SetOpenState(li, nodelist)
		}
	}
	if(activate) {
		var top = MB.getTop(li);
		MB.SetInactiveClass(top);
		if(!li.className.match(/mi_active/)) {
			li.className = li.className.replace("mi_inactive", "");	
			li.className += " mi_active";
		}
		//log4js.logger.info("Setting node mi_active: " + li.id + " active.");
	}
}

MB.SetInActive = function(li) {
	if(!li.className.match(/over/))
		return;
	// Set the specified list item as active.
	//log4js.logger.info("Deactivating: " + li.id);
	li.className=li.className.replace("over", "");
	var ul = MB.GetChildUL(li);
	if(ul && ul.className.match("_persistent")) {
		var nodelist = MB.GetOpenState(li);
		nodelist = nodelist.replace("," + li.id, "");
		MB.SetOpenState(li, nodelist);
	}
}
MB.GetOpenState = function(li) {
	var nodelist = i2rd.getCookie(MB.getTop(li).id + "-CMO");
	if(!nodelist) nodelist = "";
	return nodelist;
}
MB.SetOpenState = function(li, nodelist) {
	var time = new Date();
	time.setMonth(time.getMonth() + 1);
	i2rd.setCookie(MB.getTop(li).id + "-CMO", nodelist, time, "/");
}
MB.MenuBeanInit = function(div) {
	var nodelist = i2rd.getCookie(div.id + "-CMO") || "";
	var item = null;
	var elements = div.getElementsByTagName("li");
	if(!elements || elements.length == 0) {
		try {
			elements = div.getElementsByTagName("LI");
		} catch(e) {}
	}
	var liElements = [];
	liElements.pushAll(elements);
	while( (item = liElements.pop()) ) {
		var pn = item.parentNode;
		if(pn && pn.nodeName.toLowerCase() == "ul") {
			pn = pn.parentNode;
			if(pn && pn.nodeName.toLowerCase() == "li" && pn.className && !pn.className.match("mi_parent")) {			
				pn.className += " 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(target.className.match(/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.inited = false;
MB.init = function(evt) {
	if(MB.inited) return;
	MB.inited = true;
	var m, div, s= 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);
	}
	i2rd.removeEvent(window, 'load', MB.init);
}


try { // "Activate" the menu asap.
	var ua = navigator.userAgent;
	if (document.addEventListener && 
		(ua.match(/Firefox/) || ua.match(/SeaMonkey/))) {
		document.addEventListener("DOMContentLoaded", MB.init, false);
	} else if(document.attachEvent  &&  !window.opera) {
        document.write("<script id=__mbOnContentLoad defer " + "src='//:'><\/script>");
        document.getElementById("__mbOnContentLoad").onreadystatechange = function() {
            if (this.readyState == "complete") {
                this.onreadystatechange = null;
                MB.init();
            }
        };
    } else { 
		MB._timer = setInterval(function() {
            var drs = document.readyState;
			if ((drs && /complete|loaded/.test(drs))
			    || MB.inited ) {
				clearInterval(MB._timer);
				delete MB._timer;
				MB.init();
			}
		}, 10);
	}
} catch(e) {
	//alert("Unable to setup oncontentload check." + e.message);
}
// Fallback in case, we didn't get an onContentLoad event.
i2rd.addEvent(window, 'load', MB.init);

