//

// if( AjaxRequests == null )
//	eval("var AjaxRequests = new Array();");

try
{
	var AjaxTemp = AjaxRequests;
	AjaxRequests = AjaxTemp;
}catch(e)
{
	AjaxRequests = new Array();
}

// trys to load XML from url and on succeed calls SuccedFunc, on Fail calls FailFunc
// returns number of request if succeed or less then 0 on fail. 
//		if isSync is true then returned value or null or XML
// when functions is
// SuccedFunc( XML, requestNumber )
// FailFunc( requestNumber )
function AjaxLoad( url, SucceedFunc, FailFunc, method, data, isSync, oHeaders )
{
	// find empty reqest
	var i, r, k;
	do
	{
		i = Math.round(Math.random()*1000000000);
	}while( AjaxRequests[i] );

	// create object if need
	if (window.XMLHttpRequest) 
		r = new XMLHttpRequest();
	else if (window.ActiveXObject) 
		r = new ActiveXObject("Microsoft.XMLHTTP");
	else
		return -1; // Ajax is not supported

	AjaxRequests[i] = {req: r, URL: url, suc: SucceedFunc, fal: FailFunc };
	if(!isSync) r.onreadystatechange = new Function("AjaxLoaded("+i+")");
	r.open( method?method:"GET", url, !isSync );

	if( oHeaders )
		for( k in oHeaders )
			r.setRequestHeader( k, oHeaders[k] );
	r.send(data);
	if( isSync ) return AjaxLoaded(i, isSync);
	return i;
}

function AjaxLoaded(no, isSync)
{
	var req = AjaxRequests[no].req;
	if(req.readyState == 4) 	// only if req shows "complete"
	{
		try
		{
			if(req.status==200)// only if "OK"
			{
				var XML = req.responseXML; 
				if( (!XML || !XML.documentElement) && typeof(string2xml)!='undefined') XML = string2xml(  req.responseText ) ;
				
				if( isSync )
				{
					AjaxRequests[no] = null; // free the object
					return XML;
				}
				AjaxRequests[no].suc(XML, no);
				AjaxRequests[no] = null; // free the object
			}
			else
			{
				if( isSync ) return AjaxRequests[no] = null;
				AjaxRequests[no].fal(no);
				AjaxRequests[no] = null; // free the object
			}
		}
		catch(e)
		{
			AjaxRequests[no] = null; // free the object
		}
	}		
}

// transform xml  by xslt to text
function transformToText(oXml,oXslt)
{
	if(window.ActiveXObject) return oXml.transformNode(oXslt);
	if(typeof(XSLTProcessor)!="undefined")
	{
		var oProcessor=new XSLTProcessor();
		oProcessor.importStylesheet(oXslt);
		var oResultDom=oProcessor.transformToDocument(oXml);
		var sResult=(new XMLSerializer()).serializeToString(oResultDom);
		return sResult;;
	}
	return "No XSLT engine found. Try to use Explorer 6 or Firefox 1.5";
}

// part of history functions
function addEvent(obj, evType, fn)
{
	if (obj.attachEvent) return obj.attachEvent("on"+evType, fn);
	if (obj.addEventListener)
	{
		obj.addEventListener(evType, fn, true);
		return true;
	} 
	return false;
}

function removeEvent(obj, evType, fn)
{
	if (obj.detachEvent) return obj.detachEvent("on"+evType, fn);
  if (obj.removeEventListener)
  {
    obj.removeEventListener(evType, fn, true);
    return true;
  } 
	return false;
}

function encodeText( txt )
{
	var i, res = "";
	for( i = 0; i < txt.length; i++ )
		res += txt.charCodeAt( i ) + "_";
	return res;
}	

