function callback()
{
	var vars = new Array();
	var XMLHTTPRequest;
	var	pageURL	=	null;
	var	readyHandler;
	var	xmlHandler;
	var errorHandler;
	var	context;


	var encodeCallbackParam;
	if (encodeURIComponent) {
		encodeCallbackParam = encodeURIComponent;
	} else {
		encodeCallbackParam = clientEncodeUrlAsUTF8;
	}
	
	this.resetParameters = function fnResetParameters()
	{
		vars = new Array();
		vars["randomToken"] = Math.round( 10000 * Math.random() );
	}


	this.setContext = function fnSetContext(cxt)
	{
		context = cxt;
	}


	this.setURL = function fnSetURL(toURL)
	{
		pageURL = toURL;
	}


	this.addVar = function fnAddVar(name, value)
	{
		vars[name] = value;
	}


	this.setHandler = function fnSetHendler(refHandler)
	{
		readyHandler = refHandler;
	}


	this.setXMLHandler = function fnSetXMLHandler(refHandler)
	{
		xmlHandler = refHandler;
	}


	this.setErrorHandler = function fnSetErrorHandler(refHandler)
	{
		errorHandler = refHandler;
	}


	this.send = function fnSend()
	{
		XMLHTTPRequest = getXMLHTTPobj();
		XMLHTTPRequest.onreadystatechange = processReqChange;
		XMLHTTPRequest.open("POST", pageURL, true);
		var postData = serializeVars();
		XMLHTTPRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		XMLHTTPRequest.send( postData );
	}


	function serializeVars()
	{
		var ret = [];
		for(var key in vars) {
			var encodedValue = encodeCallbackParam(vars[key]);
			var kvPair = [key, '=', encodedValue].join('');
			ret.push( kvPair );
		}
		return ret.join('&');
	}


	function processReqChange()
	{
		// only if req shows "loaded"
		if (XMLHTTPRequest.readyState == 4) {
			// only if "OK"
			if (XMLHTTPRequest.status == 200) {
				if (readyHandler)
					readyHandler(XMLHTTPRequest.responseText, context);
				if (xmlHandler)
					xmlHandler(XMLHTTPRequest.responseXML, context);
			}	else {
				if (errorHandler)
					errorHandler(XMLHTTPRequest.responseText, context);
				else if (typeof(iwayMessageBox)!="undefined")
					iwayMessageBox("Error", XMLHTTPRequest.statusText, "error")
				else
					alert("There was a problem retrieving the XML data:\n" + XMLHTTPRequest.statusText);
			}
		}
	}


	function getXMLHTTPobj()
	{
		var	req	=	false;
		// branch	for	native XMLHttpRequest	object
		if(window.XMLHttpRequest)	{
			try	{
				req	=	new	XMLHttpRequest();
			}	catch(e) {
				req	=	false;
			}
		// branch	for	IE/Windows ActiveX version
		}	else if(window.ActiveXObject)	{
			try	{
				req	=	new	ActiveXObject("Msxml2.XMLHTTP");
			}	catch(e) {
				try	{
						req	=	new	ActiveXObject("Microsoft.XMLHTTP");
				}	catch(e) {
						req	=	false;
				}
			}
		}
		return req;
	}


}
