var aj;
var ajxTarget;
var customFunc;

if (window.XMLHttpRequest) aj = new XMLHttpRequest();
else if (window.ActiveXObject) aj = new ActiveXObject('MSXML2.XMLHTTP.3.0');
else alert('Browser not supported');

String.prototype._replace = function(regexp,replacement)
	{
		var result = this;
		while (result.search(regexp)>=0) result=result.replace(regexp,replacement);
		return result;
	}

function $(id)
	{
		return document.getElementById(id);
	}

function _(tag)
	{
		return document.createElement(tag);
	}

function _el(tagName,innerHTML,id,name)
	{
		var result = _(tagName);
		if (innerHTML) result.innerHTML = innerHTML;
		if (id != undefined) result.id = id;
		if (name != undefined) result.name = name;
		return result;
	}

function _option(text,value,id,name)
	{
		var result = _el('OPTION',text,id,name);
		result.value = (value==undefined)?text:value;
		return result;
	}

function _table(id,name)
	{
		result = _el('TABLE',null,id,name);
		result.tbody = result.appendChild(_('TBODY'));
		return result;
	}

function _td(text,id,name)
	{
		return _el('TD',text,id,name);
	}

function _button(text,width)
	{
		var result = _('input');
		result.value = text;
		result.className = 'button';
		result.style.width = width+'px';
		return result;
	}

function ajax()
	{
		aj.abort();
	}

var ajaxReceiver;

function ajx(url,func,data)
	{
		ajax();
		d = new Date;
		ajaxReceiver = null;
		if (typeof func != 'undefined')
			ajaxReceiver = func;
		aj.onreadystatechange = function()
			{
			try
				{
//					alert(aj.readyState+','+aj.status+','+aj.statusText);
//					uploadStatus.innerHTML += "<br>"+ aj.readyState+','+aj.status+','+aj.statusText;
				if ((aj.readyState==4) && (aj.status==200))
					{
//						alert(aj.responseText.substr(3000));
						loading.style.display = 'none';
						if (ajaxReceiver != null)
								ajaxReceiver(aj.responseText);
					}
				}
			catch(e)
				{
				}
			}
		loading.style.display = '';
		if (data==undefined)
			{
				aj.open('GET',url+(url.match(/\?\&/)?'':('&'+d.getTime())));
				aj.send(null);
			}
		else
			{
				aj.open('POST',url);
				aj.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
				aj.send(data.join('&'));
			}
	}

function loadData(result)
	{
		ajxTarget.innerHTML = result;
		if (customFunc != undefined)
			{
				customFunc();
				customFunc = undefined;
			}
	}

function ajxPP(url,func1)
	{
		func = loadData;
		customFunc = func1;
		ajx(url,func);
	}

function ajo(url)
	{
		var obj = document.createElement('DIV');
		ajxTarget = obj;
		ajxPP(url);
		return obj;
	}

function collectData(el,data)
	{
		for (var i in el.childNodes)
			{
				var j = el.childNodes[i];
				switch (j.tagName)
					{
						case 'SELECT':
							data.push(j.name+'='+escape(j.options[j.selectedIndex].value));
							break;
						case 'INPUT':
							data.push(j.name+'='+escape(j.value));
							break;
						case 'TEXTAREA':
							data.push(j.name+'='+escape(j.innerHTML));
							break;
						default:
							collectData(el.childNodes[i],data);
					}
			}
	}
