//Copyright 2007 www.chatlb.net
//Version 1.0

var chatlb_Ajax = 
{
	Requests: [],
	AjaxObject: function()
	{
		var r = null;
		try
		{
			r = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch(e)
		{
			try
			{
				r = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch(ee)
			{
				try
				{
					r = new XMLHttpRequest(); //for firefox
				}
				catch(eee){}
			}
		}
		return r;
	},
	Stop: function ()
	{
		with(chatlb_Ajax)
		{
			for(var i=0; i<AjaxRequests.length; i++)
			{
				if(AjaxRequests[i] != null)
					AjaxRequests[i].abort();
			}
		}
	},
	CreateRequest: function(Context)
	{
		with(chatlb_Ajax)
		{
			for(var i=0; i<Requests.length; i++)
			{
				if(Requests[i].readyState == 4)
				{
					Requests[i].abort();
					Requests[i].Context = Context;
					return Requests[i];
				}
			}
			var p = chatlb_Ajax.Requests.length;
	
			Requests[p] = [];
			Requests[p].obj = new chatlb_Ajax.AjaxObject();
			Requests[p].Context = Context;
	
			return Requests[p];
		}
	},
	Request: function (url, data, callback, Context)
	{
		with(chatlb_Ajax)
		{
			var req = CreateRequest(Context);
			var async = typeof(callback) == 'function';

			if(async) req.obj.onreadystatechange = function()
			{
				if(req.obj.readyState == 4)
					callback(new Response(req));
			};
			
			with(req.obj)
			{
				open("POST", url, async);
				setRequestHeader("Connection","close");
				setRequestHeader("Cache-Control", "no-cache");
				setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
				url = "http://localhost" + url;
				setRequestHeader("Method", "POST " + url + "HTTP/1.1");
			
				try
				{
					req.obj.send(data);
				}
				catch(e)
				{
					return "";
				}
			}
			if(!async)
				return new Response(req);
		}
	},
	Response: function (request)
	{
		this.Request = request.obj;
		this.Error = null;
		this.Value = null;
		this.Context = request.Context;
		
		if(request.obj.status == 200)
		{
			try
			{
				this.Value = chatlb_Ajax.GetObject(request);
				
				if(this.Value && this.Value.error)
				{
					this.Error = this.Value.error;
					this.Value = null;
				}
			}
			catch(e)
			{
				this.Error = new chatlb_Ajax.Error(e.name, e.description, e.number);
			}
		}
		else
		{
			this.Error = new chatlb_Ajax.Error("HTTP request failed with status: " + request.obj.status, request.obj.status);
		}
		
		return this;
	},
	GetObject: function (request)
	{
		if(request.obj.responseXML != null && request.obj.responseXML.xml != null && request.obj.responseXML.xml != '')
			return request.obj.responseXML;
		
		var r = null;
		try
		{
			eval("r=" + request.obj.responseText + ";");
		}
		catch(e)
		{
			return request.obj.responseText;
		}
		return r;
	},
	Error: function (n, d, no)
	{
		this.name = n;
		this.description = d;
		this.number = no;
		return this;
	},
	Encode: function (str)
	{
		return str.replace(/\\r/g,"");
	}
}
chatlb_Ajax.Error.prototype.toString = function()
{
	return this.name + " " + this.description;
};
