Inabyte			= (typeof(Inabyte) == 'object') ? Inabyte : {};

/*
	Inabyte.Query
*/

Inabyte.Query =
{
	m_url				: "query.php",
	m_msxml_progid		: ['MSXML2.XMLHTTP.3.0','MSXML2.XMLHTTP','Microsoft.XMLHTTP'],

	m_requests			: [],
	m_request_id		: 0,
	m_LastRequest   	: 0,
	m_DisconnectHandler	: null
};

Inabyte.Query.SetDisconnectHandler = function(handler)
{
	this.m_DisconnectHandler = handler;
}

/*
	Commands
*/

Inabyte.Query.invoke = function(command, params, result_handler, custom_data, url)
{
	var request = this.createRequest();
	if(!request)
		return;
	
	var now								= new Date();

	var request_entry					= {};
	request_entry.id					= this.m_request_id;
	request_entry.request				= request;
	request_entry.result_handler		= result_handler;
	request_entry.custom_data			= custom_data;
	request_entry.time					= now.getTime();
	request_entry.onreadystatechange	= new Function("Inabyte.Query.on_request_readystatechange('" + this.m_request_id + "');");

	this.m_LastRequest = now.getTime();
	this.m_requests.push(request_entry);
	this.m_request_id++;

	try
	{
		request.onreadystatechange = request_entry.onreadystatechange;
		
		var sReqParams = this.createRequestParams(command, params);
		
		if (!url)
			url = this.m_url;

		if (sReqParams)
		{
			request.open("POST", url, true);
			request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			request.setRequestHeader("Content-length", sReqParams.length);
			request.setRequestHeader("Accept-Encoding", "gzip,deflate");
			request.setRequestHeader("Connection", "close");
			
			request.send(sReqParams);
		}
		else
		{
			request.open("GET", url, true);
			request.setRequestHeader("Accept-Encoding", "gzip,deflate");
			request.setRequestHeader("Connection", "close");
			
			request.send(null);
		}
	}
	catch(e) { }
	
	return request_entry.id;
}

Inabyte.Query.on_request_readystatechange = function(request_id)
{
	var request_index = -1;
	for(request_index = 0; request_index < this.m_requests.length; request_index++)
		if(this.m_requests[request_index].id == request_id)
			break;
	
	var request_entry = ((0 <= request_index) && (request_index < this.m_requests.length)) ? this.m_requests[request_index] : null;
	if(request_entry && request_entry.request && (request_entry.request.readyState == 4))
	{
		this.m_requests.splice(request_index, 1);
		
		if (this.m_DisconnectHandler && request_entry.request.responseText == "Disconnected")
			this.m_DisconnectHandler();
		else
		{
			if(request_entry.result_handler)
				request_entry.result_handler(request_entry.request.responseText, request_entry.custom_data, request_id);
		}

		request_entry.id					= null;
		request_entry.request				= null;
		request_entry.result_handler		= null;
		request_entry.custom_data			= null;
		request_entry.onreadystatechange	= null;
	}
}

Inabyte.Query.invoke_sync = function(command, params, url)
{
	var request = this.createRequest();
	if(!request)
		return "";
	
	try
	{
		var now			= new Date();
		var sReqParams	= this.createRequestParams(command, params);

		this.m_LastRequest = now.getTime();
		
		if (!url)
			url = this.m_url;
			
		if (sReqParams)
		{
			request.open("POST", url, false);
			request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			request.setRequestHeader("Content-length", sReqParams.length);
			request.setRequestHeader("Accept-Encoding", "gzip,deflate");
			request.setRequestHeader("Connection", "close");
			
			request.send(sReqParams);
		}
		else
		{
			request.open("GET", url, false);
			request.setRequestHeader("Accept-Encoding", "gzip,deflate");
			request.setRequestHeader("Connection", "close");
			
			request.send(null);
		}

		return request.responseText;
	}
	catch(e) { }
	return "";
};

/*
	Helpers & Utilities
*/

Inabyte.Query.createRequest = function()
{
	var request = null;
	
	try
	{
		request = new XMLHttpRequest();
	}
	catch(e)
	{
		for(var i = 0; i < this.m_msxml_progid.length; i++)
		{
			try
			{
				request = new ActiveXObject(this.m_msxml_progid[i]);
				break;
			}
			catch(e) {}
		}
	}
	finally
	{
		return request;
	}
}

Inabyte.Query.createRequestParams = function(command, params)
{
	var sReqParams = "";
	
	if (command)
		sReqParams = "command=" + command;
		
	if (typeof(params) == "string")
	{
		if (0 < sReqParams.length)
			sReqParams += "&";
		sReqParams += params;
	}
	
	if ((typeof(params) == "array") || (typeof(params) == "object"))
	{
		for(var index in params)
		{
			if (0 < sReqParams.length)
				sReqParams += "&";
			sReqParams += index + "=" + params[index];
		}
	}
		
	//prompt('Inabyte.Query.invoke', sReqParams);
	return sReqParams;
}

