function getXmlHttp()
{
	var req = null;
	if(window.XMLHttpRequest)
	{
		//Browser has native support for XMLHttpRequest object
		req = new XMLHttpRequest();
		if (req.overrideMimeType)
			req.overrideMimeType('text/xml');
	}
	else if(window.ActiveXObject)
	{
		//Try XMLHTTP ActiveX (Internet Explorer) version
		req = new ActiveXObject("Microsoft.XMLHTTP");
	}
	return req;
}
function http_build_query(dataArray)
{
	var query = "";
	var first = true;
	for(key in dataArray)
	{
		if(first)
		{
			first = false;
			query = query + escape(key) + '=' + escape(dataArray[key])
		}
		else
			query = query + '&' + escape(key) + '=' + escape(dataArray[key]); 
	}
	return query;
}
function parse_str(query)
{
	var pairs = query.split('&');
	var i, n, eqInd, j, m;
	var name, value;
	var result = new Array();
	n = pairs.length;
	for(i = 0; i < n; i++)
	{
		m = pairs[i].length;
		for(j = 0; j < m; j++)
		{
			if(pairs[i].charAt(j) == '+')
				pairs[i] = pairs[i].substr(0, j) + ' ' + pairs[i].substr(j + 1);
		}
		eqInd = pairs[i].search("=");
		if(eqInd == -1)
		{
			name = unescape(pairs[i].replace('\+', ' '));
			value = "";
		}
		else
		{
			name = unescape(pairs[i].substr(0, eqInd).replace('\+', ' '));
			value = unescape(pairs[i].substr(eqInd + 1).replace('\+', ' '));
		}
		result[name] = value;
	}
	return result;
}
function makeXmlHttpRequest(url, callback, instance, method, params, headers)
{
    //Check if URL specified
    if(url == null)
        throw "XML HTTP request URL can not be NULL.";
    //Create XMLHTTP request
    var request = getXmlHttp();    
    if(request == null)
        throw "This browser does not support AJAX.";
    //Apply callback to request
    if(callback != null)
        request.onreadystatechange = callback; 
    //Prepare request method string
    if(method == null)
        method = "GET";
    else
    {
        method = method.toUpperCase();
        if((method != "POST") && (method != "GET"))
            throw "Unsupported HTTP request method.";
    }
    //Apply GET parameters
    if((method == "GET") && (params != null))
    {
        var query = http_build_query(params);
        if(url.indexOf("?") >= 0)
            url = url + "&" + query;
        else
            url = url + "?" + query;
    }
    //Attach instance member
    if(instance != null)
        request.instance = instance;
    //Open request
    request.open(method, url, true);
    //Apply request headers
    if(headers != null)
    {
        try
        {
            for(headerName in headers)
                request.setRequestHeader(headerName, headers[headerName]);
        }
        catch(e){}
    }
    //Apply POST parameters and send request
    if((method == "POST") && (params != null))
    {
        var query = http_build_query(params);
        try
        {
            request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        }
        catch(e){}
        request.send(query); 
    }
    else
        request.send(null);
    //Return request object
    return request;
}