// DHTML/JS menu 2.0

// Written by David J. Taylor
// © djtSoft
// http://www.djtsoft.com/

var menuAr = [];

function menuInit(options) {
	if (!document || !document.createElement || !document.body || !document.body.appendChild || (!document.attachEvent && !document.addEventListener) || !window || !window.setTimeout) return false;

	var settings = $.extend({
		className:				"menu",
		width:					0,
		maxHeight:				0,
		scrollHoverSpeed:			50,
		scrollClickSpeed:			150,
		scrollHorizontalSpeedMultiplier:	4,
		scrollReset:				true,
		openDelay:				500,
		closeDelay:				1000,
		bubbleCloseDelay:			50,
		target:					"",
		menus:					[]
	}, options);

	if (menuAr.length < 1) $(window).bind("load resize", menuUpdate);

	function createMenu(menu, topLevel) {
		menu = $.extend({
			className:		settings.className,
			x:			null,
			y:			null,
			width:			settings.width,
			horizontal:		true,
			maxHeight:		settings.maxHeight,
			scrollHoverSpeed:	settings.scrollHoverSpeed,
			scrollClickSpeed:	settings.scrollClickSpeed,
			scrollReset:		settings.scrollReset,
			openDelay:		settings.openDelay,
			closeDelay:		settings.closeDelay,
			bubbleCloseDelay:	settings.bubbleCloseDelay,
			target:			settings.target
		}, menu);

		if (topLevel && (menu.x == null || menu.y == null)) return;

		menu.topLevel = topLevel;
		menu.horizontal = menu.horizontal && menu.topLevel;
		if (menu.horizontal) {
			menu.scrollHoverSpeed *= menu.scrollHorizontalSpeedMultiplier;
			menu.scrollClickSpeed *= menu.scrollHorizontalSpeedMultiplier;
		}

		var otable = document.createElement("table");
		otable.cellSpacing = 0;
		$(otable)
			.addClass(menu.className)
			.css({
				position: "absolute",
				tableLayout: "fixed"
			})
			.bind("selectstart mousemove dblclick", cancelSelect)
			.bind("mouseover mouseout mousedown mouseup click", menuEvent);

		$.extend(otable, {
			isMenu:			true,
			open:			menu.topLevel,
			x:			menu.x,
			y:			menu.y,
			w:			menu.width,
			maxHeight:		menu.maxHeight,
			topLevel:		menu.topLevel,
			horizontal:		menu.horizontal,
			scrollHoverSpeed:	menu.scrollHoverSpeed,
			scrollClickSpeed:	menu.scrollClickSpeed,
			scrollReset:		menu.scrollReset,
			scrollSpeed:		0,
			openDelay:		menu.openDelay,
			closeDelay:		menu.closeDelay,
			bubbleCloseDelay:	menu.bubbleCloseDelay
		});

		if (menu.topLevel) {
			$(otable).addClass("toplevel");
		} else {
			$(otable)
				.addClass("submenu")
				.css({
					visibility: "hidden",
					left: "0px",
					top: "0px"
				});

			if ($.browser.msie) {
				otable.iframe = document.createElement("iframe");
				otable.iframe.scrolling = "no";
				otable.iframe.frameBorder = 0;
				$(otable.iframe).css({
					visibility: "hidden",
					position: "absolute",
					left: "0px",
					top: "0px",
					width: "0px",
					height: "0px",
					opacity: 0
				});
				document.body.appendChild(otable.iframe);
			}
		}

		var otd, tr, td;

		if (menu.horizontal) {
			$(otable).addClass("horizontal");

			tr = otable.insertRow(0);

			td = tr.insertCell(0);
			$(td).addClass("scrollarrow scrollarrowup");
			td.scrollDir = -1;
			td.textContent = td.innerText = String.fromCharCode(9668);
			otable.scroll1 = td;

			otd = tr.insertCell(1);
			$(otd).width("100%");

			td = tr.insertCell(2);
			$(td).addClass("scrollarrow scrollarrowdown");
			td.scrollDir = 1;
			td.textContent = td.innerText = String.fromCharCode(9658);
			otable.scroll2 = td;
		} else {
			$(otable).addClass("vertical");

			tr = otable.insertRow(0);
			td = tr.insertCell(0);
			$(td).addClass("scrollarrow scrollarrowup");
			td.scrollDir = -1;
			td.textContent = td.innerText = String.fromCharCode(9650);
			otable.scroll1 = td;

			tr = otable.insertRow(1);
			otd = tr.insertCell(0);

			tr = otable.insertRow(2);
			td = tr.insertCell(0);
			$(td).addClass("scrollarrow scrollarrowdown");
			td.scrollDir = 1;
			td.textContent = td.innerText = String.fromCharCode(9660);
			otable.scroll2 = td;
		}

		otd.style.padding = "0px";
		otable.outerBody = document.createElement("div");
		$(otable.outerBody)
			.css("overflow", "hidden")
			.bind("selectstart", cancelSelect);
		if (!menu.horizontal) $(otable.outerBody).width("100%");
		otd.appendChild(otable.outerBody);

		otable.innerBody = document.createElement("table");
		$(otable.innerBody).bind("selectstart", cancelSelect);
		otable.innerBody.cellSpacing = 0;
		if (!menu.horizontal) $(otable.innerBody).width("100%");

		if (menu.horizontal) tr = otable.innerBody.insertRow(0);
		var i = 0;

		if (menu.menuItems) $.each(menu.menuItems, function(index) {
			var menuItem = $.extend({
				className:		"",
				text:			"",
				allowWrap:		false,
				icon:			"",
				highlightedIcon:	"",
				action:			"",
				target:			menu.target,
				submenu:		null
			}, this);

			if (!menu.horizontal) {
				tr = otable.innerBody.insertRow(index);
				i = 0;
			}

			if (menuItem.text == "-") {
				td = tr.insertCell(i++);
				$(td)
					.addClass("separator")
					.addClass(menuItem.className);
				var div = document.createElement("div");
				$(div)
					.addClass("separator")
					.addClass(menuItem.className)
					.bind("selectstart", cancelSelect);
				if (!menu.horizontal) td.colSpan = 3;
				td.appendChild(div);
			} else {
				td = tr.insertCell(i++);
				$(td)
					.addClass("menuitem icon")
					.addClass(menuItem.className)
					.css("border-right-width", "0px")
					.width("1px");
				if (!menuItem.submenu && menuItem.action == "") $(td).addClass("nolink");

				var img;
				if (menuItem.icon != "") {
					img = document.createElement("img");
					img.src = menuItem.icon;
					td.appendChild(img);
				} else {
					td.style.padding = "0px";
					td.style.fontSize = "0pt";
					td.innerHTML = "<br />";
				}

				td = tr.insertCell(i++);
				$(td)
					.addClass("menuitem")
					.addClass(menuItem.className)
					.css("border-left-width", "0px");
				if (!menu.horizontal) $(td).width("100%");

				$.extend(td, {
					action:			menuItem.action,
					target:			menuItem.target,
					icon:			menuItem.icon,
					highlightedIcon:	menuItem.highlightedIcon
				});

				if (menuItem.icon != "") td.img = img;
				td.textContent = td.innerText = menuItem.text;
				if (!menuItem.allowWrap) $(td).css("white-space", "nowrap");
				if (menuItem.submenu) {
					if (menuItem.action == "") $(td).css("border-right-width", "0px");
					td.submenu = createMenu(menuItem.submenu, false);

					td = tr.insertCell(i++);
					$(td)
						.addClass("menuitem submenuarrow")
						.addClass(menuItem.className)
						.css("border-left-width", "0px")
						.width("1px");
					if (menuItem.action == "") $(td).css("padding-left", "0px");
					td.textContent = td.innerText = String.fromCharCode((menu.horizontal) ? 9660 : 9658);
				} else {
					if (!menu.horizontal) td.colSpan = 2;
					if (menuItem.action == "") $(td).addClass("nolink");
				}
			}
		});

		otable.outerBody.appendChild(otable.innerBody);
		document.body.appendChild(otable);
		menuScroll(otable, 0);
		menuAr.push(otable);

		return otable;
	}

	$.each(settings.menus, function() {
		createMenu(this, true);
	});

	menuDoUpdate();

	return true;
}

function cancelSelect(e) {
	if ((this.tagName.toLowerCase() != "input" || this.type != "text") && this.tagName.toLowerCase() != "textarea") {
		e.stopPropagation();
		e.preventDefault();
	}
}

function calcSize(s) {
	if (typeof s == "function") return s();
	return s;
}

function menuUpdate() {
	// give the browser time to perform content layout
	window.setTimeout(menuDoUpdate, 10);
}

function menuDoUpdate() {
	$.each(menuAr, function() {
		if (this.topLevel) {
			var x = calcSize(this.x), y = calcSize(this.y);

			$(this).css({
				left: x,
				top: y
			});

			if (this.iframe) $(this.iframe).css({
				left: x,
				top: y
			});
		}

		var w;

		// first set the width to 1px so that the menu isn't being included in case the width is calculated from the page width
		$(this)
			.width("1px")
			.width(w = calcSize(this.w));

		if (this.iframe) $(this.iframe).width(w);

		menuScroll(this, 0);
	});
}

function menuGetMenu(src) {
	while (src) {
		if (/^table$/i.test(src.tagName) && src.isMenu) return src;
		src = src.parentNode;
	}

	return;
}

function menuClearTimer(menu) {
	if (menu && menu.timer) {
		window.clearTimeout(menu.timer);
		menu.timer = null;
	}
}

function menuEvent(e) {
	var item = e.srcElement || e.target;
	while (true) {
		if (!item) return;
		if (/^td$/i.test(item.tagName)) break;
		item = item.parentNode;
	}

	if ($(item).hasClass("icon")) item = item.nextSibling;
	var arrow = $(item).hasClass("submenuarrow") || item.action == "";
	if ($(item).hasClass("submenuarrow")) item = item.previousSibling;

	var menu = menuGetMenu(item);
	if (!menu) return;

	menuClearTimer(menu);

	switch (e.type.toLowerCase()) {
		case "mouseover":
			menuMouseOverItem(item, true, arrow);
			menu.mouseover = true;
			break;
		case "mouseout":
			menuMouseOverItem(item, false);
			menu.mouseover = false;
			if (menu.openSubMenuItem) menuHighlight(menu.openSubMenuItem, true, true);
			menu.timer = window.setTimeout(function() {
				menuHide(menu);
			}, menu.closeDelay);
			break;
	}

	if (item.scrollDir) {
		var oldspeed = menu.scrollSpeed;

		switch (e.type.toLowerCase()) {
			case "mousedown":
				menu.scrollSpeed = menu.scrollClickSpeed;
				break;
			case "mouseout":
				menu.scrollSpeed = 0;
				break;
			default:
				menu.scrollSpeed = menu.scrollHoverSpeed;
		}

		if (menu.scrollSpeed > 0 && oldspeed == 0) menuScroll(menu, item.scrollDir);
	}

	if (e.type != "click" || $(item).hasClass("separator")) return;

	if (item.submenu && arrow) {
		menuShow(item);
		return;
	}
	if (item.action == "") return;

	if (menu && !menu.topLevel) {
		menu.mouseover = false;
		menuMouseOverItem(item, false, false, true);
	}

	if (typeof item.action == "function") {
		item.action();
	} else {
		switch (item.target) {
			case "":
			case "_self":
				window.location.href = item.action;
				break;
			case "_top":
				top.location.href = item.action;
				break;
			case "_blank":
				window.open(item.action);
				break;
			default:
				try {
					$("#" + item.target)[0].location.href = item.action;
				}
				catch (ex) {
				}
		}
	}
}

function menuHighlight(item, flg, arrow) {
	if (!item) return;

	var menu = menuGetMenu(item);
	if (!menu) return;

	$(item).toggleClass("highlighted", flg);

	if (item.previousSibling) $(item.previousSibling).toggleClass("highlighted", flg);
	if (item.icon != "" && item.img) {
		item.img.src = (flg && item.highlightedIcon != "") ? item.highlightedIcon : item.icon;
	}

	if (item.submenu && item.nextSibling) {
		$(item.nextSibling).toggleClass("highlighted", flg && arrow);
	}
}

function menuMouseOverItem(item, flg, arrow, force, bubble) {
	if (!item || (item.action == "" && !item.submenu)) return;
	item.mouseover = flg;
	item.mouseoverarrow = flg && arrow;

	if (item.submenu) {
		menuClearTimer(item.submenu);
		if (!flg && item.submenu.open && item.submenu.parentMenuItem == item) {
			item.submenu.timer = window.setTimeout(function() {
				menuHide(item.submenu, force);
			}, (force) ? 10 : item.submenu.closeDelay);
			return;
		}
	}

	menuHighlight(item, flg, arrow);

	var menu = menuGetMenu(item);
	if (menu) {
		menuClearTimer(menu);
		if (flg && menu.openSubMenuItem && item != menu.openSubMenuItem) menuHighlight(menu.openSubMenuItem, false);
	}

	if (flg) {
		if (item.submenu) {
			if (arrow) {
				if (item.submenu.openDelay >= 0) item.submenu.timer = window.setTimeout(function() {
					menuShow(item);
				}, item.submenu.openDelay);
			} else {
				item.submenu.timer = window.setTimeout(function() {
					menuHide(item.submenu, force);
				}, (force) ? 10 : item.submenu.closeDelay);
			}
		}
	} else {
		if (menu && bubble) menu.timer = window.setTimeout(function() {
			menuHide(menu, force);
		}, menu.bubbleCloseDelay);
	}
}

function menuScroll(menu, dir) {
	menu = menuGetMenu(menu);
	if (!menu) return;

	var i, j;
	if (menu.horizontal) {
		var w1 = $(menu.innerBody).width(), w2 = calcSize(menu.w);
		if (w2 < w1) w2 -= $(menu.scroll1).width() + $(menu.scroll2).width();
		if (w2 > w1) w2 = w1;
		$(menu.outerBody).width(w2 + "px");

		j = w1 - w2;
		i = Math.min(Math.max($(menu.outerBody).scrollLeft() + dir * menu.scrollSpeed / 10, 0), j);

		$(menu.outerBody).scrollLeft(i);
	} else {
		var h1 = $(menu.innerBody).height(), h2 = Math.min((menu.maxHeight > 0) ? Math.min(h1, menu.maxHeight) : h1, $(window).height() - 32);
		$(menu.outerBody).height(h2 + "px");

		j = h1 - h2;
		i = Math.min(Math.max($(menu.outerBody).scrollTop() + dir * menu.scrollSpeed / 10, 0), j);

		$(menu.outerBody).scrollTop(i);
	}

	$(menu.scroll1)
		.css("display", (j > 0) ? "" : "none")
		.toggleClass("disabled", i < 1);
	$(menu.scroll2)
		.css("display", (j > 0) ? "" : "none")
		.toggleClass("disabled", i >= j);

	if (j > 0 && dir != 0 && menu.scrollSpeed > 0) window.setTimeout(function() {
		menuScroll(menu, dir);
	}, 100);
}

function menuShow(item) {
	if (!item || !item.mouseoverarrow || !item.submenu) return;

	var menu = menuGetMenu(item);
	if (!menu) return;

	if (menu.openSubMenuItem && menu.openSubMenuItem != item) {
		if (menu.openSubMenuItem.submenu) menuHide(menu.openSubMenuItem.submenu, true);
		menu.openSubMenuItem = null;
	}

	if (item.submenu.open) return;

	item.submenu.open = true;
	menu.openSubMenuItem = item;
	item.submenu.parentMenuItem = item;

	if (item.submenu.scrollReset) $(item.submenu.outerBody).scrollLeft(0).scrollTop(0);
	menuScroll(item.submenu, 0);

	var x = $(item).offset().left - Math.max($(menu.outerBody).scrollLeft(), 0), y = $(item).offset().top - Math.max($(menu.outerBody).scrollTop(), 0);
	if (menu.horizontal) {
		var i = item.submenu.scroll1.offsetLeft;
		if (i) x -= i;
		y += $(menu).height();
		if (x + $(item.submenu).width() > $(window).width()) x = $(window).width() - $(item.submenu).width();
		if (y + $(item.submenu).height() > $(window).height()) y = $(item).offset().top - $(item.submenu).height() - 1;
	} else {
		x += $(menu).width();
		var i = item.submenu.scroll1.offsetTop;
		if (i) y -= i;
		if (x + $(item.submenu).width() > $(window).width()) x = $(item).offset().left - $(item.submenu).width() + 1;
		if (y + $(item.submenu).height() > $(window).height()) y = $(window).height() - $(item.submenu).height() - 1;
	}
	x = Math.max(x, 0);
	y = Math.max(y, 0);

	if (item.submenu.iframe) {
		$(item.submenu.iframe)
			.width($(item.submenu).width())
			.height($(item.submenu).height() + 2)
			.css({
				visibility: "visible",
				left: x,
				top: y
			});
	}
	$(item.submenu).css({
		left: x,
		top: y
	});

	var transitions = [];
	if (item.submenu.filters) {
		$.each(["Barn", "Blinds", "CheckerBoard", "Fade", "GradientWipe", "Inset", "Iris", "Pixelate", "RadialWipe", "RandomBars", "RandomDissolve", "Slide", "Spiral", "Stretch", "Strips", "Wheel", "Zigzag"], function() {
			if (item.submenu.filters[this] && item.submenu.filters[this].enabled) transitions.push(item.submenu.filters[this]);
			if (item.submenu.filters["DXImageTransform.Microsoft." + this]) transitions.push(item.submenu.filters["DXImageTransform.Microsoft." + this]);
		});
	}

	if (transitions.length > 0) {
		$.each(transitions, function() {
			this.stop();
			this.apply();
		});

		$(item.submenu).css("visibility", "visible");

		$.each(transitions, function() {
			this.play();
		});
	} else {
		$(item.submenu)
			.stop()
			.css({
				opacity: 0,
				visibility: "visible"
			})
			.animate({
				opacity: 1
			}, 500, "", function() {
				if (this.style.removeAttribute) {
					// remove Opacity Filter in IE
					this.style.removeAttribute("filter");
				}
			});
	}
}

function menuHide(menu, force) {
	if (!menu || menu.topLevel || !menu.open) return;

	if (menu.mouseover || menu.openSubMenuItem) {
		if (!force) return;
		if (menu.openSubMenuItem) {
			if (menu.openSubMenuItem.mouseover) return;
			if (menu.openSubMenuItem.submenu) menuHide(menu.openSubMenuItem.submenu, force);
		}
		if (menu.mouseover || menu.openSubMenuItem) return;
	}

	if (menu.parentMenuItem && menu.parentMenuItem.mouseoverarrow) return;

	menu.open = false;

	var transitions = [];
	if (menu.filters) {
		$.each(["Barn", "Blinds", "CheckerBoard", "Fade", "GradientWipe", "Inset", "Iris", "Pixelate", "RadialWipe", "RandomBars", "RandomDissolve", "Slide", "Spiral", "Stretch", "Strips", "Wheel", "Zigzag"], function() {
			if (menu.filters[this] && menu.filters[this].enabled) transitions.push(menu.filters[this]);
			if (menu.filters["DXImageTransform.Microsoft." + this]) transitions.push(menu.filters["DXImageTransform.Microsoft." + this]);
		});
	}

	if (transitions.length > 0) {
		$.each(transitions, function() {
			this.stop();
			this.apply();
		});

		$(menu).css("visibility", "hidden");

		$.each(transitions, function() {
			this.play();
		});
	} else {
		$(menu)
			.stop()
			.animate({
				opacity: 0
			}, 500, "", function() {
				$(menu).css({
					opacity: 1,
					visibility: "hidden"
				});
			});
	}

	if (menu.iframe != null) $(menu.iframe).css("visibility", "hidden");

	if (menu.parentMenuItem) {
		if (!menu.parentMenuItem.mouseover) menuMouseOverItem(menu.parentMenuItem, false, false, force, true);

		var menu2 = menuGetMenu(menu.parentMenuItem);
		if (menu2) {
			if (menu2.openSubMenuItem == menu.parentMenuItem) {
				menu2.openSubMenuItem = null;
			}
		}
		menu.parentMenuItem = null;
	}
}

