function AJAX(_method)
{
	var self = this;

	var method;
	var xmlhttp = null;

	var oncomplete;
	var onerror;

	self.getHttpRequest = function()
	{
		if (xmlhttp)
		{
			xmlhttp.abort();

			delete xmlhttp;
			xmlhttp = null;
		}

		try { xmlhttp = new XMLHttpRequest(); }
		catch(e)
		{
			try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }
			catch(e)
			{
				try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
				catch(e) { }
			}
		}

		return xmlhttp;
	}

	self.setMethod = function(_method)
	{
		method = (_method && _method.toUpperCase() == "POST" ? "POST" : "GET");
	}

	self.requestURL = function(_url, _query, _oncomplete, _onerror)
	{
		xmlhttp = self.getHttpRequest();

		oncomplete = _oncomplete;
		onerror = _onerror;

		if (typeof _query == "object")
		{
			var query = "";

			for (var i in _query)
				if (i != "extend")
					query += urlEncode(i) + "=" + urlEncode(_query[i]) + "&";

			_query = query;
		}

		if (method == "GET")
		{
			_url += "?" + _query;
			_query = "";
		}

		xmlhttp.open(method, _url, _oncomplete || _onerror ? true : false);

		if (_oncomplete || _onerror)
			xmlhttp.onreadystatechange = function() { self.onComplete(xmlhttp); }

		xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=euc-kr");

		try
		{
			xmlhttp.send(_query);
		}
		catch(e)
		{
		}

		return xmlhttp;
	}

	self.onComplete = function(xmlhttp)
	{
		if (xmlhttp.readyState == 4)
		{
			try
			{
				var error = (xmlhttp.status && xmlhttp.status != 200);

				if (error) error = { "code" : xmlhttp.status, "status" : xmlhttp.statusText };

				if (error && onerror)	onerror(error);
				else	oncomplete(error ? error : xmlhttp);
			}
			catch(e)
			{

			}

			xmlhttp = null;
		}
	}

	self.setMethod(_method);
}