var __dialogBg = null;
var __dialogLoad = null;
var __dialogArea = null;
var __dialogFrame = null;
var __dialogWindow = null;
var __dialogContainer = null;
var __dialogVisible = false;

var __tooltip = null;
var __trace = null;
var __traceContent = null;

var fieldSeparator = "$$@$$";
var recordSeparator = "@@$@@";

var __specialChars1 = [
	8 /* bksp */, 46 /* del */, 9 /* tab */, 13 /* enter */,
	37 /* left */, 39 /* right */, 38 /* up */, 40 /* down */, 36 /* home */, 35 /* end */
];
var __specialChars2 = [
	/* F1-F12 */ 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123
];

if (window.messages == null)
	window.messages = {};

HoverTitle.HoverAllTitles = false;

function ui()
{
	this.dialog_onreturn = null;


}

ui.initialize = function ()
{
	__tooltip = new Tooltip();
	__tooltip.addListener("onmouseover", ui.hideTooltipCancel);
	__tooltip.addListener("onmouseout", ui.error_onmouseout);


	ui.defaultFields = new Array;
	ui.autoHideElems = new Array;

	ui.initializeRowLinks();
	ui.initializeForms();
	ui.initializeTime();
	ui.initializeErrorDisplay();
	ui.initializeMessages();
	ui.initializeSwitches();
	ui.initializeBookmarks();
	ui.initializeDialog();
	ui.initializeFocus(false);
	ui.hidePleaseWait();
	ui.preloadImages(
		"images/buttonbg_blue.gif",
		"images/buttonbg_blue_a.gif",
		"images/buttonbg_disabled.gif",
		"images/loading_medium.gif");

	ui.initializeLinks();
}
ui.initializeErrorDisplay = function ()
{
	var labels = document.getElementsByTagName("label");
	for (var i = 0; i < labels.length; i++)
	{
		var controlID = labels[i].htmlFor;
		var controlError = document.getElementById("error_" + controlID);
		if (controlError != null)
		{
			evt.addHandler(labels[i], "onmouseover", ui.error_onmouseover);
			evt.addHandler(labels[i], "onmouseout", ui.error_onmouseout);
		}
	}
}

ui.initializeDialog = function ()
{
	var query = new util.querystring();
	if (query.param.dialog == 1)
	{
		var links = document.getElementsByTagName("a");
		var forms = document.getElementsByTagName("form");
		for (var i = 0; i < links.length; i++)
		{
			if (links[i].href.indexOf("javascript:;") == -1)
			{
				var linkQuery = new util.querystring(links[i].href);
				linkQuery.param.dialog = 1;

				links[i].href = linkQuery.toString(true);
				links[i].onclick = ui.dialogLink_onclick;
			}
		}
		for (var i = 0; i < forms.length; i++)
		{
			var formQuery = new util.querystring(forms[i].action);
			formQuery.param.dialog = 1;
			forms[i].action = formQuery.toString(true);
		}
	}

	if ((window != window.parent) && window.parent.ui != null)
	{
		var elems = dom.getElementsByClassName(document, "dialogReturn");
		for (var i = 0; i < elems.length; i++)
		{
			var childLinks = elems[i].getElementsByTagName("a");
			for (var j = 0; j < childLinks.length; j++)
				childLinks[j].onclick = ui.dialogReturn_onclick;

			elems[i].onmouseup = ui.dialogReturn_onmouseup;
		}
	}
}

ui.initializeSwitches = function ()
{
	var elems1 = dom.getElementsByClassName(document, "collapse-switch");
	var elems2 = dom.getElementsByClassName(document, "switch");
	var elems3 = dom.getElementsByClassName(document, "autohide");

	for (var i = 0; i < elems1.length; i++)
		evt.addHandler(elems1[i], "onclick", ui.collapse_onclick);
	for (var i = 0; i < elems2.length; i++)
		evt.addHandler(elems2[i], "onclick", ui.collapse_onclick);
	for (var i = 0; i < elems3.length; i++)
		ui.autoHideElems.push(elems3[i]);

	evt.addHandler(document, "onmouseup", ui.document_onmouseup);
}

ui.initializeBookmarks = function ()
{
	var social_networking = document.getElementById("social_networking");
	if (social_networking)
	{
		var links = social_networking.getElementsByTagName("a");
		for (var i = 0; i < links.length; i++)
		{
			links[i].href = links[i].href.replace(/@URL/, escape(document.location)).replace(/@TITLE/, escape(document.title));
		}
		css.display(social_networking);
	}
}

ui.initializeLinks = function ()
{
	var ctrl_print = document.getElementById("ctrl_print");
	if (ctrl_print != null)
		ctrl_print.onclick = function () { print(); } /**/
}

ui.initializeMessages = function ()
{
	var close = document.getElementById("messages_close");
	if (close != null)
		close.onclick = ui.closeMessages;

	var elems = dom.getElementsByClassName(document, "message", "div");
	for (var i = 0; i < elems.length; i++)
	{
		var descr = dom.getElementsByClassName(elems[i], "description", "div");
		if (descr.length != 0)
			descr[0].onclick = ui.toggleMessageDetail;
	}
}

ui.initializeRowLinks = function ()
{
	var elems = document.getElementsByTagName("TR");
	for (var i = 0; i < elems.length; i++)
	{
		if (css.containsClassName(elems[i], "link"))
		{
			if (window.is_ie6)
			{
				evt.addHandler(elems[i], "onmouseover", ui.rowlink_onmouseover);
				evt.addHandler(elems[i], "onmouseout", ui.rowlink_onmouseout);
			}
			evt.addHandler(elems[i], "onmousedown", ui.rowlink_onmousedown);
			evt.addHandler(elems[i], "onmouseup", ui.rowlink_onmouseup);
			evt.addHandler(elems[i], "onmousemove", ui.rowlink_onmousemove);
		}
	}
}

ui.initializeTime = function ()
{
	var offset = new Date().getTimezoneOffset();
	var elems = dom.getElementsByClassName(document, 'utctime');
	for (var i = 0; i < elems.length; i++)
	{
		var value = dom.innerText(elems[i]);
		var date = Date.parse(value);
		if (date != null)
		{
			date.setMinutes(date.getMinutes() - offset);
			dom.setInnerText(elems[i], date.toString("dd-mm-yyyy hh:nn"));
		}
	}
}

ui.initializeForms = function ()
{
	var elems1 = document.getElementsByTagName("input");
	var elems2 = document.getElementsByTagName("select");
	var elems3 = document.getElementsByTagName("textarea");
	var elems = new Array;

	for (var i = 0; i < elems1.length; i++)
		if (elems1[i].type.match(/text|checkbox|radio|password|hidden|file/))
			elems.push(elems1[i]);
	for (var i = 0; i < elems2.length; i++)
		elems.push(elems2[i]);
	for (var i = 0; i < elems3.length; i++)
		elems.push(elems3[i]);

	for (var i = 0; i < elems.length; i++)
	{
		if (elems[i].type != "checkbox" && elems[i].type != "radio" && elems[i].type != "file")
		{
			if (elems[i].tagName.toLowerCase() == "select" && window.is_ie)
				continue;

			util.applyPrototypes(elems[i], FormField);
		}
		if (elems[i].type == "file")
		{
			evt.addHandler(elems[i], "onchange", ui.file_onchange);
			evt.addHandler(elems[i], "onmouseout", ui.file_onchange);
		}
		if (css.containsClassName(elems[i], "xfiletext"))
			elems[i].value = "";

		if (elems[i].className.match(/restrict-([^\s]+)/))
		{
			var restrict = RegExp.$1;
			util.applyPrototypes(elems[i], FormFieldRestrict);
			if (restrict == "date")
				util.applyPrototypes(elems[i], DateInput);
		}

		if (css.containsClassName(elems[i], "defaultvalue"))
		{
			util.applyPrototypes(elems[i], FormFieldDefault);
			ui.defaultFields.push(elems[i]);
		}
	}

	var elems = document.getElementsByTagName("textarea");
	var counter = document.createElement("div");
	counter.className = "counter";
	for (var i = 0; i < elems.length; i++)
	{
		if (elems[i].getAttribute("maxlength") != null)
			util.applyPrototypes(elems[i], FormFieldTextMaxLength);
	}

	var forms = document.getElementsByTagName("form");
	for (var i = 0; i < forms.length; i++)
	{
		evt.addHandler(forms[i], "onsubmit", ui.form_onsubmit);
		evt.addHandler(forms[i], "onreset", ui.form_onreset);
	}

	ui.setDefaultValues();
}

ui.initializeFocus = function (overflows)
{
	var forms = document.getElementsByTagName("form");
	if (forms.length != 0)
	{
		var elems = forms[0].getElementsByTagName("input");
		for (var i = 0; i < elems.length; i++)
		{
			if (elems[i].type == "text" && elems[i].offsetHeight && !elems[i].disabled)
			{
				elems[i].focus();
				break;
			}
		}
	}

	// disable tab focus of elements overflowed with 'auto' in mozilla
	if (overflows && window.is_moz)
	{
		var forms = document.getElementsByTagName("FORM");
		for (var z = 0; z < forms.length; z++)
		{
			var elems = forms[z].getElementsByTagName("DIV");
			for (var i = 0; i < elems.length; i++)
			{
				var currentStyle = dom.currentStyle(elems[i]);
				if (currentStyle && currentStyle.overflow == "auto")
					elems[i].tabIndex = -1;
			}
		}
	}
}

ui.isPostback = function (e)
{
	var html = document.getElementsByTagName("html")[0];
	if (html.className == "post")
		return true;
	else
		return false;
}

ui.setDefaultValues = function ()
{
	for (var i = 0; i < ui.defaultFields.length; i++)
		ui.defaultFields[i].setDefault();
}

ui.removeDefaultValues = function (e)
{
	for (var i = 0; i < ui.defaultFields.length; i++)
		ui.defaultFields[i].removeDefault();
}

ui.file_onchange = function (e)
{
	if (this.className == "xfile")
	{
		var inputs = this.parentNode.getElementsByTagName("input");
		for (var i = 0; i < inputs.length; i++)
		{
			if (inputs[i].type == "text")
				inputs[i].value = this.value;
		}
	}
}

ui.form_onsubmit = function (e)
{
	ui.beginSubmit();
}

ui.form_onreset = function (e)
{
	if (ui.isPostback())
		document.location = document.location;
}

ui.beginSubmit = function ()
{
	ui.removeDefaultValues();
	ui.disableForms();
	ui.showPleaseWait();
}

ui.cancelSubmit = function ()
{
	try
	{
		ui.setDefaultValues();
		ui.enableForms();
		ui.hidePleaseWait();
	}
	catch(e)
	{
		log.error(e.message);
	}
}

ui.disableForms = function ()
{
	for (var i = 0; i < document.forms.length; i++)
		ui.disableFormButtons(document.forms[i]);

	if (window.is_ie6)
	{
		var sels = document.getElementsByTagName("select");
		for (var i = 0; i < sels.length; i++)
			css.hide(sels[i]);
	}
}

ui.enableForms = function ()
{
	for (var i = 0; i < document.forms.length; i++)
		ui.enableFormButtons(document.forms[i]);

	if (window.is_ie6)
	{
		var sels = document.getElementsByTagName("select");
		for (var i = 0; i < sels.length; i++)
			css.show(sels[i]);
	}
}

ui.disableFormButtons = function (formObj)
{
	var elems = formObj.getElementsByTagName("input");
	for (var i = 0; i < elems.length; i++)
	{
		var type = elems[i].type;
		if (type.match(/^submit|reset|button|image$/i))
			ui.disableButton(elems[i]);
	}
}

ui.disableButton = function (buttonObj)
{
	buttonObj.disabled = true;
	css.addClassName(buttonObj, "disabled");
}

ui.enableFormButtons = function (formObj)
{
	var elems = formObj.getElementsByTagName("input");
	for (var i = 0; i < elems.length; i++)
	{
		var type = elems[i].type;
		if (type.match(/^submit|reset|button|image$/i))
			ui.enableButton(elems[i]);
	}
}

ui.enableButton = function (buttonObj)
{
	buttonObj.disabled = false;
	css.removeClassName(buttonObj, "disabled");
}

ui.showPleaseWait = function ()
{
	var __pleaseWait = document.getElementById("__pleaseWait");

	var html = document.getElementsByTagName("HTML")[0];
	var scrollTop = html.scrollTop;
	var scrollLeft = html.scrollLeft;

	var overflowHtml = dom.currentStyle(html).overflow || "auto";
	html.style_overflow = overflowHtml;
	html.style.overflow = "hidden";

	__pleaseWait.style.left = scrollLeft + "px";
	__pleaseWait.style.top = scrollTop + "px";

	if (!window.is_ie6)
	{
		__pleaseWait.style.right = -scrollLeft + "px";
		__pleaseWait.style.bottom = -scrollTop + "px";
	}

	css.display(__pleaseWait);

	if (scrollTop != 0)
		html.scrollTop = scrollTop;
}

ui.hidePleaseWait = function ()
{
	var __pleaseWait = document.getElementById("__pleaseWait");

	if (__pleaseWait != null)
	{
		css.undisplay(__pleaseWait);

		var html = document.getElementsByTagName("HTML")[0];
		if (html.style_overflow != null)
			html.style.overflow = html.style_overflow;
	}
}

ui.preloadImages = function ()
{
	for (var i = 0; i < arguments.length; i++)
	{
		var image = new Image;
		image.src = arguments[i];
	}
}

ui.expandHref = function (href)
{
	var baseHref = "";
	var base = document.getElementsByTagName("base");
	for (var i = 0; i < base.length; i++)
	{
		if (base[i].getAttribute("href"))
		{
			baseHref = base[i].getAttribute("href");
			break;
		}
	}
	if (href.indexOf(baseHref) != 0)
		return baseHref + href;
	else
		return href;
}

ui.returnValue = function (returnValue)
{
	if (ui.dialog_onreturn != null)
		ui.dialog_onreturn(returnValue);

	ui.hideDialog();
}

ui.showDialog = function (url, width, height, top, left, onreturn)
{
	ui.dialog_onreturn = onreturn;

	if (url.indexOf("dialog=1") == -1)
	{
		var loc = url;
		var hash = "";

		if (url.indexOf("#") != -1)
		{
			loc = url.substring(0, url.indexOf("#"));
			hash = url.substring(url.indexOf("#"));
		}
		if (loc.indexOf("?") != -1)
			loc += "&dialog=1";
		else
			loc += "?dialog=1";

		url = ui.expandHref(loc + hash);
	}

	if (__dialogBg == null)
	{
		var bg = document.createElement("div");
		bg.className = "dialogbg";
		var pl = document.createElement("div");
		pl.className = "dialogpreload";
		var dg = document.createElement("div");
		dg.className = "dialog";
		var sv = dg.appendChild(document.createElement("div"));
		sv.className = "shadowvertical";
		var sh = dg.appendChild(document.createElement("div"));
		sv.className = "shadowhorizontal";
		var df = dg.appendChild(document.createElement("div"));
		df.className = "frame";
		df.innerHTML = '<iframe src="about:blank" frameborder="no" width="100%" height="100%" onload="ui.dialog_onload(this)" allowtransparency="true"></iframe>"';

		css.undisplay(bg);
		css.undisplay(dg);

		document.body.insertBefore(dg, document.body.childNodes[0]);
		document.body.insertBefore(pl, document.body.childNodes[0]);
		document.body.insertBefore(bg, document.body.childNodes[0]);

		__dialogBg = bg;
		__dialogLoad = pl;
		__dialogArea = dg;
		__dialogContainer = df;
		__dialogFrame = df.getElementsByTagName("IFRAME")[0];
		__dialogWindow = __dialogFrame.contentWindow;

		util.makeUnselectable(__dialogBg, true);
		util.makeUnselectable(__dialogArea, true);
		util.makeUnselectable(__dialogLoad, true);

		evt.addHandler(window, "onresize", ui.dialog_onresize);
		evt.addHandler(__dialogBg, "onclick", ui.hideDialog);
	}

	var html = document.getElementsByTagName("HTML")[0];
	var body = document.body;

	var positionDialog = dom.currentStyle(__dialogBg).position;
	var overflowHtml = dom.currentStyle(html).overflow || "auto";

	var scrollTop = html.scrollTop;
	var scrollLeft = html.scrollLeft;

	html.style_overflow = overflowHtml;
	html.style.overflow = "hidden";
	html.scrollTop = scrollTop;

	css.setPixelWidth(__dialogContainer, width);
	css.setPixelWidth(__dialogArea, width);
	css.setPixelHeight(__dialogContainer, height);
	css.setPixelHeight(__dialogArea, height);

	if (top == null || left == null)
	{
		top = (html.offsetHeight / 2) - height / 2;
		left = (html.offsetWidth / 2) - width / 2;

		__dialogArea.fixed = false;
	}
	else
		__dialogArea.fixed = true;

	try
	{
		var bodyHeight = scrollTop + html.offsetHeight;
		var bodyWidth = scrollLeft + html.offsetWidth;
		var dialogBottom = top + height;
		var dialogRight = left + width;

		if (dialogBottom > bodyHeight)
			top = bodyHeight - height - 10;
		if (dialogRight > bodyWidth)
			left = bodyWidth - width - 10;

		__dialogArea.__top = null;
		__dialogArea.__left = null;
		__dialogArea.__width = width;
		__dialogArea.__height = height;

		__dialogBg.style.left = scrollLeft + "px";
		__dialogBg.style.top = scrollTop + "px";
		__dialogBg.style.right = -scrollLeft + "px";
		__dialogBg.style.bottom = -scrollTop + "px";

		css.hide(__dialogLoad);
		css.display(__dialogLoad);

		__dialogLoad.style.top = ((html.offsetHeight / 2) - (__dialogLoad.offsetHeight / 2)) + "px";
		__dialogLoad.style.left = ((html.offsetWidth / 2) - (__dialogLoad.offsetWidth / 2)) + "px";

		__dialogArea.style.top = (top - scrollTop) + "px";
		__dialogArea.style.left = left + "px";

		if (__dialogWindow.document.location != url)
		{
			__dialogWindow.document.location = url;
			css.show(__dialogLoad);
			css.display(__dialogBg);
			css.undisplay(__dialogArea);
		}
		else
		{
			css.display(__dialogBg);
			css.display(__dialogArea);
			css.hide(__dialogLoad);
		}

		__dialogVisible = true;
	}
	catch(err)
	{
		log.error(err.message);
	}
}

ui.scrollToElement = function (elemObj, length)
{
	if (elemObj == null)
		return;

	if (isNaN(length))
		length = 700;

	var html = document.getElementsByTagName("html")[0];
	var targetTop = dom.getTop(elemObj) - 10;

	if (window.anim != null)
	{
		var scroll = new anim.Scroll(html, targetTop, 0, length, Math.easeOutExpo);
		scroll.run();
	}
	else
		html.scrollTop = targetTop;

	return false;
}

ui.hideDialog = function ()
{
	if (__dialogVisible)
	{
		css.undisplay(__dialogBg);
		css.hide(__dialogLoad);
		css.undisplay(__dialogArea);

		var html = document.getElementsByTagName("HTML")[0];
		html.style.overflow = html.style_overflow;

		__dialogVisible = false;
	}
}

ui.dialog_onload = function ()
{
	css.display(__dialogArea);
	css.undisplay(__dialogLoad);

	evt.addHandler(document, "onkeyup", ui.document_onkeyup);
	evt.addHandler(__dialogWindow.document, "onkeyup", ui.document_onkeyup);
}

ui.dialog_onresize = function ()
{
	var html = document.getElementsByTagName("HTML")[0];
	var scrollTop = html.scrollTop;
	var scrollLeft = html.scrollLeft;

	__dialogBg.style.left = scrollLeft + "px";
	__dialogBg.style.top = scrollTop + "px";
	__dialogBg.style.right = -scrollLeft + "px";
	__dialogBg.style.bottom = -scrollTop + "px";

	__dialogLoad.style.top = ((html.offsetHeight / 2) - (__dialogLoad.offsetHeight / 2)) + "px";
	__dialogLoad.style.left = ((html.offsetWidth / 2) - (__dialogLoad.offsetWidth / 2)) + "px";

	if (!__dialogArea.fixed)
	{
		var top = (html.offsetHeight / 2) - __dialogArea.__height / 2;
		var left = (html.offsetWidth / 2) - __dialogArea.__width / 2;

		if (!(isNaN(top) || isNaN(left)))
		{
			__dialogArea.style.top = top + "px";
			__dialogArea.style.left = left + "px";
		}
	}
}

ui.dialogLink_onclick = function ()
{
	document.location.replace(this.href);
	return false;
}

ui.dialogReturn_onmouseup = function ()
{
	if (this.className.match(/return-(\S+)/))
	{
		var returnValue = RegExp.$1;
		if ((window != window.parent) && window.parent.ui != null)
		{
			window.parent.ui.returnValue(returnValue);
		}
	}
	return false;
}

ui.dialogReturn_onclick = function ()
{
	return false;
}

ui.collapse_onclick = function ()
{
	if (this.id.match(/(.*)_switch$/))
	{
		var elemID = RegExp.$1;
		var elemObj = document.getElementById(elemID);
		if (elemObj != null)
		{
			var state = elemObj.offsetHeight ? 0 : 1;
			if (state == 0)
			{
				css.undisplay(elemObj);
				css.addClassName(this, "closed");
			}
			else
			{
				css.display(elemObj);
				css.removeClassName(this, "closed");
			}
			cookie.set(elemID, state, null, null, "/");
		}
		return false;
	}
}

ui.rowlink_onmouseover = function (e)
{
	css.addClassName(this, "hover");
}

ui.rowlink_onmouseout = function (e)
{
	css.removeClassName(this, "hover");
}

ui.rowlink_onmousedown = function (e)
{
	this.mousedown = true;
}

ui.rowlink_onmousemove = function (e)
{
	if (this.mousedown)
		this.cancelEvent = true;
}

ui.rowlink_onmouseup = function (e)
{
	var event = util.getEvent(e);
	var source = evt.srcElement(event);
	var isLink = false;
	var tagName = source.tagName;
	while (!isLink && source && tagName)
	{
		isLink = tagName.toLowerCase() == "a";
		source = source.parentNode;
		tagName = source.tagName;
	}
	if (isLink)
		return;

	if ((event.which != 1) && (event.button != 1))
		return;

	if (this.cancelEvent == true)
	{
		this.mousedown = false;
		this.cancelEvent = false;
		return;
	}

	var link = this.getElementsByTagName("a")[0];
	if (link != null)
		document.location = link.href;
}

ui.error_onmouseover = function (e)
{
	ui.hideTooltipCancel();

	var controlID = this.htmlFor;
	var displayTarget = this.getAttribute("target");
	var controlObj = document.getElementById(displayTarget || controlID);
	var controlError = document.getElementById("error_" + controlID);
	var alignSide = Tooltip.alignCenterLeft;

	if (this.className.match(/\b(TL|TR|TC|BL|BR|BC|ML|MC|MR)\b/))
		alignSide = RegExp.$1;

	if (controlError != null)
		__tooltip.show(controlError.innerHTML, controlObj, alignSide, null, false);
}

ui.error_onmouseout = function ()
{
	ui.hideTooltipTimeout = window.setTimeout(ui.hideTooltip, 100);
}

ui.hideTooltipCancel = function ()
{
	if (ui.hideTooltipTimeout != null)
		window.clearTimeout(ui.hideTooltipTimeout);
}

ui.hideTooltip = function ()
{
	__tooltip.hide();
}

ui.document_onkeyup = function (e)
{
	var event = util.getEvent(e);
	if (event.keyCode == 27)
	{
		if (__dialogVisible)
		{
			ui.hideDialog();
			return false;
		}
	}
}

ui.document_onmouseup = function (e)
{
	if (ui.autoHideElems.length != 0)
	{
		var srcElement = evt.srcElement(e);
		for (var i = 0; i < ui.autoHideElems.length; i++)
		{
			var ctrl = ui.autoHideElems[i];

			if (srcElement.id == ctrl.id + "_switch")
				continue;

			if (ctrl.offsetHeight != 0)
			{
				if (!dom.elementContains(ctrl, srcElement))
					css.undisplay(ctrl);
			}
		}
	}
}

ui.trace = function (message, escape, clear)
{
	if (__traceContent == null || clear == true)
		__traceContent = [];

	if (__trace == null)
	{
		__trace = document.getElementById("trace_out");
		if (__trace == null)
		{
			__trace = document.createElement("pre");
			__trace.id = "trace_out";
			document.body.appendChild(__trace);
		}
	}
	if (message && escape)
		message = String(message).replace(/\&/g, "&amp;");

	__traceContent.push(message);
	__trace.innerText = __traceContent.join("\n");
	__trace.scrollTop = __trace.scrollHeight;
}

ui.closeMessages = function ()
{
	var messages = document.getElementById("messages");
	var messages_bgnd = document.getElementById("messages_bgnd");
	var messages_close = document.getElementById("messages_close");
	if (messages != null)
		css.undisplay(messages);
	if (messages_bgnd != null)
		css.undisplay(messages_bgnd);
	if (messages_close != null)
		css.undisplay(messages_close);
}

ui.toggleMessageDetail = function ()
{
	var elems = dom.getElementsByClassName(this.parentNode, "detail");
	if (elems.length != 0)
		if (elems[0].offsetHeight)
			css.undisplay(elems[0]);
		else
			css.display(elems[0]);
}

function FormField()
{
}

FormField.prototype.onfocus = function (e)
{
	if (!css.containsClassName(this, "nofocus"))
		css.addClassName(this, "active");
}

FormField.prototype.onblur = function (e)
{
	css.removeClassName(this, "active");
}

function FormFieldDefault()
{
	this.__default = "";
	if (this.className.match(/def\^([^\^]+)\^/))
		this.__default = RegExp.$1;
}

FormFieldDefault.prototype.setDefault = function (e)
{
	if (this.value == "")
		this.value = this.__default;

	if (this.value == this.__default)
		css.addClassName(this, "defaultvalue");
	else
		css.removeClassName(this, "defaultvalue");
}

FormFieldDefault.prototype.removeDefault = function (e)
{
	if (this.value == this.__default)
		this.value = "";

	css.removeClassName(this, "defaultvalue");
}

FormFieldDefault.prototype.onkeydown = function (e)
{
	this.removeDefault();
}

FormFieldDefault.prototype.onmouseup = function (e)
{
	this.removeDefault();
}

FormFieldDefault.prototype.onfocus = function (e)
{
	this.removeDefault();
}

FormFieldDefault.prototype.onblur = function (e)
{
	this.setDefault();
}

function FormFieldRestrict()
{
	this.restrict = "";
	if (this.className.match(/restrict-([^\s]+)/))
		this.restrict = RegExp.$1;
}

FormFieldRestrict.prototype.onkeypress = function (e)
{
	var event = e || window.event;
	var keyCode = event.keyCode;
	var charCode = event.charCode ? event.charCode : event.keyCode;

	if (__specialChars1.contains(keyCode))
		return true;
	else if (__specialChars2.contains(keyCode))
		return true;
	else if (event.ctrlKey || event.altKey)
		return true;
	else
		return this.getCharValid(charCode, this.value, this.restrict, this.separator);
}

FormFieldRestrict.prototype.getCharValid = function (charCode, value, restrict, separator)
{
	var charValue = String.fromCharCode(charCode);
	var charExpression;

	switch (restrict)
	{
		case "int":
			charExpression = "[0-9]";
			break;
		case "time":
			charExpression = "[0-9:]";
			break;
		case "float":
			if (value.indexOf(".") == -1)
				charExpression = "[0-9\\.]";
			else
				charExpression = "[0-9]";
			break;
		case "date":
			charExpression = "[0-9\\{0}]".format(separator || "-");
			break;
		default:
			charExpression = restrict == null ? "." : String(restrict);
			break;
	}

	if (charValue.match(charExpression))
		return true;
	else
		return false;
}

function FormFieldTextMaxLength()
{
}

FormFieldTextMaxLength.prototype.onkeypress = function ()
{
	return this.fixLength();
}

FormFieldTextMaxLength.prototype.onkeyup = function ()
{
	this.fixLength();
}

FormFieldTextMaxLength.prototype.checkLength = function ()
{
	var event = e || window.event;
	var charCode = (event.charCode) ? event.charCode : ((event.keyCode) ? event.keyCode : ((event.which) ? event.which : 0));

	if (__specialChars1.contains(charCode))
		return true;
	else
	{
		if (this.value.length >= this.getAttribute("maxlength"))
			return false;
		else
			return true;
	}
}

FormFieldTextMaxLength.prototype.fixLength = function (e)
{
	if (this.value.length > this.getAttribute("maxlength"))
		this.value = this.value.substring(0, this.getAttribute("maxlength"));
}


function DateInput()
{
	this.separator = "-";
	this.dateFormat = "dd-mm-yyyy";

	if (this.className.match(/dateformat\^([^\^]+)\^/))
	{
		var format = RegExp.$1;
		if (format.match(/(?:d|m|y)+([^\d])(?:d|m|y)+\1(?:d|m|y)+/))
			this.separator = RegExp.$1;

		this.dateFormat = format;
	}
}

DateInput.prototype.parseDate = function (value)
{
	if (arguments.length == 0)
		value = this.value;

	if (value != "")
	{
		if (this.className.match(/dateformat\^([^\^]+)\^/))
		{
			var format = RegExp.$1;
			var century = 1900;
			if (this.className.match(/century\^([^\^]+)\^/))
				century = parseInt(RegExp.$1);

			if (format.match(/(?:d|m|y)+([^\d])(?:d|m|y)+\1(?:d|m|y)+/))
			{
				var separator = RegExp.$1;
				var parts = format.split(separator);
				var expression = new RegExp("(\\d{1,{0}}){3}(\\d{1,{1}}){3}(\\d{1,{2}})".format(
					parts[0].length, parts[1].length, parts[2].length, separator));

				var indexd, indexm, indexy;
				for (var i = 0; i < parts.length; i++)
				{
					if (parts[i].match("d"))
						indexd = i+1;
					else if (parts[i].match("m"))
						indexm = i+1;
					else if (parts[i].match("y"))
						indexy = i+1;
				}
				var result;
				if ((result = this.value.match(expression)))
				{
					var day = result[indexd];
					var month = result[indexm];
					var year = result[indexy];

					if (year.length == 3)
						year = year.substring(1);
					if (year.length < 4)
						year = century + parseInt(year);

					var date = new Date(year, month-1, day);
					return date;
				}
			}
		}
	}
	return null;
}

DateInput.prototype.setDate = function (date)
{
	if (date == null)
	{
		this.value = "";
		if (this.__default != null)
			this.setDefault();
	}
	else
	{
		this.value = this.formatDate(date);
		if (this.__default != null)
			this.removeDefault();
	}
}

DateInput.prototype.getDate = function ()
{
	return this.parseDate(this.value);
}

DateInput.prototype.getFormat = function ()
{
	var format = "dd-mm-yyyy";
	if (this.className.match(/dateformat\^([^\^]+)\^/))
		format = RegExp.$1;

	return format;
}

DateInput.prototype.formatDate = function (date)
{
	var format = this.getFormat();

	if (date != null)
		return date.toString(format);
	else
		return "";
}

DateInput.prototype.verifyDate = function ()
{
	var format = this.getFormat();
	var date = this.parseDate(this.value);
	if (date != null)
	{
		this.value = this.formatDate(date);
	}
	else if (this.value != "" && this.value != format)
	{
		log.error("The value {0} doesn't match the required date format ({1}).".format(this.value, format));
		this.value = "";
	}
}

DateInput.prototype.onchange = function ()
{
	this.verifyDate();
}

evt.addHandler(window, "onready", ui.initialize);
