﻿function writeHTML(html)
{
	document.write(html);
}

function showSubMenu(parent, id)
{
	menuItemHide = false;
	if (menuItemCurrent && menuItemCurrent.id == "menuitem" + id)
		return;
	if (menuItemCurrent)
	{
		if (menuItemCurrent.filters && menuItemCurrent.filters.length)
			menuItemCurrent.filters[0].apply();
		menuItemCurrent.style.visibility = "hidden";
		if (menuItemCurrent.filters && menuItemCurrent.filters.length)
			menuItemCurrent.filters[0].play();
	}
	var item = document.getElementById("menuitem" + id);
	if (!item) return;
	var isRtl = document.body.style.direction == "rtl";
	item.style.top = _offsetTop(parent) - 1;
	item.style.left = _offsetLeft(parent) - (isRtl ? item.offsetWidth - 30 : -parent.offsetWidth + 30);
	if (item.filters && item.filters.length)
		item.filters[0].apply();
	item.style.visibility = "visible";
	if (item.filters && item.filters.length)
		item.filters[0].play();
	menuItemCurrent = item;
}
function hideSubMenu()
{
	if (!menuItemHide || !menuItemCurrent)
		return;
	if (menuItemCurrent.filters && menuItemCurrent.filters.length)
		menuItemCurrent.filters[0].apply();
	menuItemCurrent.style.visibility = "hidden";
	if (menuItemCurrent.filters && menuItemCurrent.filters.length)
		menuItemCurrent.filters[0].play();
	menuItemCurrent = null;
	menuItemHide = false;
}
var menuItemCurrent = null;
var menuItemHide = false;
var globalEvent;

function _offsetTop(obj)
{
	var top = 0;
	for (; obj; obj=obj.offsetParent)
		top += obj.offsetTop;
	return top;
}

function _offsetLeft(obj)
{
	var left = 0;
	for (; obj && obj != document.body; obj=obj.offsetParent)
		left += obj.offsetLeft;
	return left;
}

// returns true if node a contains event.toElement/relatedTarget.
function containsToElement(a)
{
	var b = globalEvent.toElement ? globalEvent.toElement : globalEvent.relatedTarget;
	if (!b) return false;
	while (b.parentNode)
		if ((b = b.parentNode) == a)
			return true;
	return false;
}

/*
	Validate a form's elements according to varius attributes
*/
function validateForm(form, elements, title)
{
	var message = "";
	for (var i = 0; i < elements.length; i++)
	{
		input = form.elements[elements[i]];
		// skip input when it's not rendered (ie. parent display:none)
		if (input.offsetHeight == 0) continue;
		valid = true;
		// Validate value according to element type and validation pattern
		switch (input.type)
		{
			case "text":
			case "password":
			case "textarea":
			case "file":
				if (input.getAttribute("mandatory"))
					if (input.value.length == 0)
						valid = false;
				if (input.value.length && input.getAttribute("pattern"))
				{
					var regExp = new RegExp();
					regExp.pattern = input.getAttribute("pattern");
					valid = regExp.test(input.value);
				}
				break;
			case "select-one":
			case "select-multiple":
				if (input.getAttribute("mandatory"))
					if (input.selectedIndex == 0)
						valid = false;
				break;
			case undefined:
				switch (input[0].type)
				{
					case "radio":
						if (input[0].getAttribute("mandatory"))
						{
							valid = false;
							for (var j = 0; j < input.length; j++)
								if (input[j].checked)
								{
									valid = true;
									break;
								}
						}
						input = input[0];
						break;
				}
				break;
		}
		if (!valid)
		{
			if (input.getAttribute("validationError"))
				message += input.getAttribute("validationError") + "\n";
			else
				message += "Error in field: " + input.name + "\n";
		}
	}
	if (message.length)
	{
		alert((title ? title + "\n" : "") + message);
		return false;
	}
	return false;
}
