var url = window.location;
var request = '';
var response = '';
var responseIdx = 0;
var RS = String.fromCharCode(30);
var US = String.fromCharCode(31);
var xmlhttp;

if (document.all)
{
	if (window.XMLHttpRequest) xmlhttp = new XMLHttpRequest();
	else if (window.ActiveXObject) xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
	else alert("Can't create XMLHttpRequest object");
}
else
{
	xmlhttp = new XMLHttpRequest();
	var eventNames = ["click","keypress","change"];
	for (var i = 0; i < eventNames.length; i++)
	{
		document.addEventListener(eventNames[i],function(e)
		{
			window.event = e;
			window.event.srcElement = e.target;
			window.event.keyCode = e.which;
		},true);
 	}
}

function selectValue(sel)
{
	var out = '';
	var i;
	for (i = 0; i < sel.options.length; ++i)
	{
		if (sel.options[i].selected)
		{
			if (out.length > 0) out += ',';
			out += sel.options[i].value;
		}
	}
	return out;
}

function findComponent(wnd,id)
{
	if (wnd == null) return null;
	var comp = wnd.document.getElementById(id);
	if (comp != null) return comp;
	var frm = wnd.document.frames;
	if (frm != null)
	{
		var i;
		for (i = 0; i < frm.length; ++i)
		{
			comp = findComponent(frm(i),id);
			if (comp != null) return comp;
		}
	}
	return null;
}

function getComponent(id)
{
	var comp = findComponent(window,id);
	if (comp == null) comp = findComponent(window.top,id);
	if (comp == null) comp = findComponent(window.opener,id);
	if (comp == null) comp = findComponent(window.dialogArguments,id);
	return comp;
}

function purgeEvent(cond,id,req,val,ret)
{
	if (!cond) return false;
	return ret;
}

function delayedEvent(cond,id,req,val,ret)
{
	if (!cond) return false;
	request += id + US + req + US + val + RS;
	return ret;
}

function immediateEvent(cond,id,req,val,ret)
{
	if (!cond) return false;
	delayedEvent(true,id,req,val,ret);
	communicate();
	return ret;
}

function readUntil(sep)
{
	if (responseIdx < 0) return null;
	var oldIdx = responseIdx;
	responseIdx = response.indexOf(sep,oldIdx);
	if (responseIdx < 0) return response.substring(oldIdx);
	return response.substring(oldIdx,responseIdx++);
}

function focusComponent(foc)
{
	var comp = getComponent(foc);
	if (comp)
	{
		try
		{
			comp.focus();
		}
		catch (x)
		{
		}
	}
}

function communicate()
{
	try
	{
		xmlhttp.open("POST",url,false);
		xmlhttp.setRequestHeader("Content-Type","text/plain");
		xmlhttp.send(request);
		if (xmlhttp.status == 200) response = xmlhttp.responseText;
		else
		{
			window.location.reload(true);
			return;
		}
		request = '';
		responseIdx = 0;
		var foc = readUntil(RS);
		var cmd = readUntil(US);
		while (cmd != null)
		{
			switch (parseInt(cmd))
			{
				case 1:
				{
					try
					{
						var id = readUntil(US);
						var html = readUntil(RS);
						var component = getComponent(id);
						if (component != null)
						{
							if (document.all) component.outerHTML = html;
							else
							{
								var range = component.ownerDocument.createRange();
								range.setStartBefore(component);
								var docFrag = range.createContextualFragment(html);
								component.parentNode.replaceChild(docFrag,component);
							}
						}
					}
					catch (x)
					{
					}
					break;
				}
				case 2:
				{
					try
					{
						var jscript = readUntil(RS);
						window.eval(jscript);
					}
					catch (x)
					{
					}
					break;
				}
			}
			cmd = readUntil(US);
		}
		if (foc != '') setTimeout("focusComponent('" + foc + "');",100);
	}
	catch (x)
	{
	}
}
