/**  @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.");
	}
	if(li.previousSibling && !li.previousSibling.className.match(/prev_sibling/)) {
        li.previousSibling.className+=" prev_sibling";
    }
	if(li.nextSibling && !li.nextSibling.className.match(/next_sibling/)) {
        li.nextSibling.className+=" next_sibling";
    }
};
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);
	}
    var prev = li.previousSibling;
    if (prev) {prev.className=prev.className.replace(/ prev_sibling/g, "");}
    var next = li.nextSibling;
    if (next) {next.className=next.className.replace(/ next_sibling/g, "");}
};
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) {
    if(typeof div == 'string') div = document.getElementById(div);
    if(!!div.mbinited) return;
    div.mbinited=true;
	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.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);
	}
};
