function ConfigError(message)
{
	this.message	= message;	
	this.getMessage	= function(){return this.message;}
}

function RequestError(httpCode, message)
{
	this.httpCode	= httpCode;
	this.message	= message;
	
	this.getHttpCode= function(){return this.httpCode;}
	this.getMessage	= function(){return this.message;}
}

function ResponseError(message)
{
	this.message	= message;	
	this.getMessage	= function(){return this.message;}
}

function RequestParam(varName, varValue)
{
	var name		= "";
	var value		= "";
	
	this.setName	= function(n){name = n;}
	this.setValue	= function(v){value= v;}
	this.getName	= function(){return name;}
	this.getValue	= function(){return value;}
	this.toString	= function(){
		if(name != "")return name + "=" + value;
		else return "";
	}
	
	this.setName(varName);
	this.setValue(varValue);
}

function getRequestObject(onCompleteHandler, onErrorHandler)
{
	if(window.XmlHttpObject == null)
	{
		window.alert('Objeto AJAX não encontrado. Por favor, inclua o arquivo ajax.js.');
		return false;
	}
	
	if(window._requestObjects == null)
	{
		window._requestObjects	= new Array();
		position				= 0;
	}
	else
	{
		var emptySlots	= false;
		var position	= window._requestObjects.length;
		
		for(var counter = 0;counter < position;counter++)
			if(window._requestObjects[counter].isRequestFinished()){position = counter;break;}
		
		
	}
	
	window._requestObjects[position] = new XmlHttpObject(onCompleteHandler, onErrorHandler);
	return window._requestObjects[position];
}

function coreHandler()
{
	if(window._requestObjects == null)return;
	var sizeof = window._requestObjects.length;
	
	for(var counter = 0;counter < sizeof;counter++)
	{
		var currentObject = window._requestObjects[counter] != null ? window._requestObjects[counter] : null;
		if(currentObject == null)break;
		
		if(currentObject.isRequestFinished())
		{
			window._requestObjects.splice(counter,1);
			counter--;
			continue;
		}
		else
		{
			var readyState	= currentObject.getRequestObject().readyState;
			
			try
			{
				if((readyState != 4) && (readyState != 'complete'))continue;
				
				var status	= currentObject.getRequestObject().status != null ? currentObject.getRequestObject().status : -1;
				if(status == 200)
				{
					var contentType = currentObject.getRequestObject().getResponseHeader('Content-type');
					var isXML	= (contentType.indexOf('text/xml') != -1 || contentType.indexOf('application/xml') != -1);

					if(isXML)currentObject.setResponseType("XML");
					
					if(isXML && currentObject.getRequestObject().responseXML == null)
						throw new ResponseError("O documento XML retornado pelo servidor apresentou erros.");
					
					currentObject.setRequestFinished(true);
					
					if(typeof currentObject.getCompleteHandler() == 'function')
						currentObject.getCompleteHandler().call(currentObject,
						currentObject, isXML ? currentObject.getRequestObject().responseXML : currentObject.getRequestObject().responseText);
				}
				else
				{					
					if(status == 404)var message = "A URL informada não foi encontrada.";
					else if(status == 500)var message = "Ocorreu um erro de servidor da URL informada.";
					else var message = currentObject.getRequestObject().statusText;
					
					currentObject.setRequestFinished(true);
					throw new ResponseError(status, message);
				}
			}
			catch(e)
			{
					if(typeof currentObject.getErrorHandler() == 'function')
						currentObject.errorHandler.call(currentObject,status, e.message);				
			}
			
		}
	}
}