/* DropDown menu
* @author Russ Tennant (russ@i2rd.com)
* @require logger.js
*/
if(typeof MBDD == 'undefined') var MBDD = {};

MBDD.removePageElementPath = function(path) {
	if(!path) return path;
	var split = path.split("/");
	if(split.length != 0) {
		var last = split[split.length - 1];
		if(last.match(/[a-zA-Z0-9]+,bx\d+[a-zA-Z0-9,]*/)) {
			split.length = split.length - 1;
			path = split.join("/");
		}
	}
	if(path.indexOf("/") != 0)
		path = "/" + path;
	return path;
};
MBDD.getPath = function() {
	var path = MBDD.removePageElementPath(window.location.pathname);
	return path;
};

MBDD.findSibling = function(top, nodeName) {
	var elements = top.parentNode.childNodes;
	for(var h = 0, hbound = elements.length; h < hbound; h++) {
		var el = elements[h];
		var nn = el.nodeName || "";
		nn = nn.toLowerCase();
		if(nn == nodeName)
			return el; 
	}
};

MBDD.getSelectedOption = function(select) {
	var option = select.options[select.selectedIndex];
	if(!option) {
		var elements = select.options;
		for(var h = 0, hbound = elements.length; h < hbound; h++) {
			var el = elements[h];
			if(el.selected) {
				option = el;
				break;
			}
		}		
	}
	if(!option && select.options.length > 0) option = select.options[0];
	return option;
};

MBDD.updateSelectClassAndButton = function(option, select, button) {
	select.className = select.className.replace("menuitemlabel", "");
	select.className = select.className.replace("menuitemlink", "");
	if(option.className.match(/menuitemlabel/)) {
		select.className += " menuitemlabel";
	}
	if(option.className.match(/menuitemlink/)) {
		select.className += " menuitemlink";
		// Form element and dom element different on some browsers.
		button.form[button.name].disabled = false;
	} else {
		button.form[button.name].disabled = true;
	}
};

MBDD.optionChange = function(evt) {
	var evt = evt || window.evt;
	var select = evt.target || evt.srcElement;
	var button = MBDD.findSibling(select, "button");
	var option = MBDD.getSelectedOption(select);
	MBDD.updateSelectClassAndButton(option, select, button);
};

MBDD.buttonClicked = function(evt) {
	var evt = evt || window.evt;
    if (evt.preventDefault) {
      evt.preventDefault();
      evt.stopPropagation();
    } else {
      evt.returnValue = false;
      evt.cancelBubble = true;
    }
	var button = evt.target || evt.srcElement;
	var select = MBDD.findSibling(button, "select");
	var option = MBDD.getSelectedOption(select);
	var target = /target_([^ "]+)/.exec(option.className);

	if(target && target.length == 2) {
		var nw = window.open(option.value, target[1]);
		if(nw.opener != window) {
			alert('Please disable any popup blockers for this site.');
		} else {
			nw.focus();
		}
	} else {
		window.location = option.value;
	}
};

MBDD.quickSelect = function(evt) {
	var select = evt.target || evt.srcElement;
	var option = MBDD.getSelectedOption(select);
	var target = /target_([^ "]+)/.exec(option.className);
	if(target && target.length == 2) {
		var nw = window.open(option.value, target[1]);
		if(nw.opener != window) {
			alert('Please disable any popup blockers for this site.');
		} else {
			nw.focus();
		}
	} else {
		window.location = option.value;
	}
};

MBDD.DropdownInit = function(select, quick) {
	i2rd.addEvent(select, 'change', MBDD.optionChange);
	var button = MBDD.findSibling(select, "button");
	i2rd.addEvent(button, 'click', MBDD.buttonClicked);
	var option = MBDD.getSelectedOption(select);
	MBDD.updateSelectClassAndButton(option, select, button);
	if(quick) {
		i2rd.addEvent(select, 'change', MBDD.quickSelect);
	}
	if(select.className.match(/dropdown_default_selection/)) {
		var url = MBDD.getPath();
		var bestMatch, exactMatch;
		var option, h;
		for(h = 0; (option = select.options[h]); h++) {
			var val = option.value;
			if(val.indexOf(url) == 0) {
				if(bestMatch) {
					if(bestMatch.value.length > val.length) {
						bestMatch = option;
					}
				} else {
					bestMatch = option;
				}
			}
			if(val == url) {
				exactMatch = option;
			}
		}
		var match = exactMatch || bestMatch;
		if(match) {
			if(match.index) {
				select.selectedIndex = match.index;
			} else {
				for(h = 0; (option = select.options[h]); h++) {
					if(option == match) {
						select.selectedIndex = h;
					}
				}
			}
		}
	}
};


MBDD.scan = function(start) {
    if(typeof start == 'string') start = document.getElementById(start);
	var elements = (start || document).getElementsByTagName("select");
	for(var h = 0, hbound = elements.length; h < hbound; h++) {
		var select = elements[h];
		if(select.className && select.className.match(/menubean_dropdown/)) {
			MBDD.DropdownInit(select, select.className.match(/menubean_dropdown_quick/));
		}
	}
};

