// MWDropdown.js
//
// Automatic dropdown menus

var FADE_STEPS = 10;
var FADE_DELAY = 20;
var DROPDOWN_ID = "dropdown";
var DROPDOWN_SHADOW_ID = "dropdownShadow";
var DROPDOWN_SHADOW_OFFSET = 2;
var TRIGGER_CLASSNAME_DEFAULT = "";
var TRIGGER_CLASSNAME_HOVER = "aHover";

var dropdownTriggerElement;
var dropdownTriggerHref;
var hideDropdownTimeoutID;


//
// Behaviour for dropdown menus
//
var myrules = {
	'#menu a' : function(e){
		e.onmouseover = function() {
			showDropdown(this);
		},
		e.onmouseout = function() {
			hideDropdown();
		}
	}
};
Behaviour.register(myrules);
setTimeout("Behaviour.apply()",500);


function dropdown() {
	return elem(DROPDOWN_ID);
}


function showDropdown(element) {
	if (dropdown() && element == dropdownTriggerElement) {
		// This element's dropdown is already displayed, so just return
		clearTimeout(hideDropdownTimeoutID);
		return;
	}

	// Make sure anyone else's dropdown gets hidden
	doHideDropdown();

	// Remember the element that triggered the dropdown
	dropdownTriggerElement = element;
	dropdownTriggerHref = element.href;

	// Send an AJAX request to fetch the page source
	sendAjaxRequest(element.href,	// URL
					null,			// no params
					pageFetched,	// success callback
					null);			// no failure callback
}


function pageFetched(pageText) {
	// Stick the menu item to selected
	addClass(dropdownTriggerElement, "menuOn");

	var lines = pageText.split("\n");
	var items = new Array;

	// Parse the page to look for submenu items
	//
/*	var regexpStart = /<div id="submenu">/;
	var regexpItem = /<a href="(.+)">(.+)<\/a>/;
	var regexpEnd = /<\/div>/;
*/
	var regexpItem = /<a name="(.+)"><\/a><h2><img.+alt="(.+?)"/;

//	var looking = false;
	var added = false;
	for (i = 0; i < lines.length; i++) {
/*		if (!looking) {
			if (lines[i].match(regexpStart)) {
				looking = true;
				continue;
			}
		}
		else if (lines[i].match(regexpEnd)) {
			break;
		}
		else*/ if (lines[i].match(regexpItem)) { // we're looking
			var anchor = RegExp.$1;
			var linkText = RegExp.$2;
			if (anchor && linkText) {
				items[unescapeHTML(linkText)] = dropdownTriggerHref + "#" + anchor;
				added = true;
			}
			else {
				// .$1 syntax not supported - e.g. Safari
				// So just return without displaying the menu.
				return;
			}
		}
	}
	if (!added) {
		// No submenus, so no need to show a dropdown
		return;
	}

	// Now build and add the dropdown
	//
	var rect = getRect(dropdownTriggerElement);
	var dropdown = buildDropdown(items);
	setPosXY(dropdown, rect.Left(), rect.Bottom() - 1);//(USER_AGENT_IE ? 0 : 1));
	setWidth(dropdown, rect);
	document.body.appendChild(dropdown);

	// Finally, start the fade transition
	//
	startTimer(FADE_STEPS, FADE_DELAY, fadeDropdown);
}


function hideDropdown() {
	hideDropdownTimeoutID = setTimeout("doHideDropdown()", 50);
}


function doHideDropdown() {
	// Revert the menu item
	if (dropdownTriggerElement) {
		removeClass(dropdownTriggerElement, "menuOn");
	}
	
	// If we've called this from showDropdown(), and we've come from a neighbouring
	// item, then there's still an outstanding timeout hide the dropdown so we need
	// to cancel that now.
	clearTimeout(hideDropdownTimeoutID);

	// Restore backed up class of trigger element
	if (dropdownTriggerElement) {
		dropdownTriggerElement.className = TRIGGER_CLASSNAME_DEFAULT;
	}

	// Remove the dropdown
	removeElement(DROPDOWN_SHADOW_ID);
	removeElement(DROPDOWN_ID);
}


function fadeDropdown(count) {
	var d = dropdown();
	var fadePercent = 100 - ((100/FADE_STEPS) * count);

	if (d) {
		if (d.style.opacity != null) {
			d.style.opacity = fadePercent / 100;
		}
		else if (d.style.MozOpacity != null) {
			d.style.MozOpacity = fadePercent / 100;
		}
		else if (d.style.filter != null) {
			d.style.filter = "alpha(opacity=" + fadePercent + ")";
		}
	}

	// Finishing touch: add the shadow
	if (count == 0 && d) {
		removeElement(DROPDOWN_SHADOW_ID);
		var shadow = createElementWithID("div", DROPDOWN_SHADOW_ID);
		var rect = getRect(d);
		rect.Resize(0, DROPDOWN_SHADOW_OFFSET - 1, false);
		rect.Move(DROPDOWN_SHADOW_OFFSET, 1);
		setRect(shadow, rect);
		document.body.appendChild(shadow);
	}
}


function dropdownFocused() {
	clearTimeout(hideDropdownTimeoutID);
	dropdownTriggerElement.className = TRIGGER_CLASSNAME_HOVER;
}


//
// Build dropdown menu
//
function buildDropdown(itemArray) {
	var dropdown = createElementWithID("div", DROPDOWN_ID);

	// Add items
	for (var str in itemArray) {
		var a = createElementWithText("a", str);
		a.setAttribute("href", itemArray[str]);
		dropdown.appendChild(a);
	}

	// Add mouse handlers
	dropdown.onmouseover = dropdownFocused;
	dropdown.onmouseout = hideDropdown;

	return dropdown;
}
