var ajax = new Object();

/**
 *
 *	Constantes do objeto
 *	Auto-explicativas
 *
 */
ajax.READY_STATE_UNINITIALIZED = 0;
ajax.READY_STATE_LOADING = 1;
ajax.READY_STATE_LOADED = 2;
ajax.READY_STATE_INTERACTIVE = 3;
ajax.READY_STATE_COMPLETE = 4;

/**
 *
 *	ContentLoader()
 *	Construtor do objeto AJAX
 *
 *	@param		url			string		URL a ser requisitada
 *	@param		onload		function	Função a ser executada no término do carregamento
 *	@param		onerror		function	Função a ser executada quando houver um erro
 *	@param		method		string		Método da requisição
 *	@param		params		string		Parâmetros a serem passados para URL
 *	@param		contentType	string		Tipo do conteúdo requisitado
 *
 */
ajax.ContentLoader = function(url, onload, onerror, method, params, contentType) {
	this.url = url;
	this.req = null;
	this.onload = onload;
	this.onerror = (onerror) ? onerror : this.defaultError;
	this.loadXMLDoc(url, method, params, contentType);
}

ajax.ContentLoader.prototype = {
	/**
	 *
	 *	loadXMLDoc
	 *	Cria o objeto XMLHttpRequest
	 *
	 *	@see	ContentLoader()
	 *
	 */
	loadXMLDoc:function(url, method, params, contentType) {
		if(!method)
			method = 'GET';
		
		if(!contentType && method == 'POST')
			contentType = 'application/x-www-form-urlencoded';
		
		if(window.XMLHttpRequest)
			this.req = new XMLHttpRequest();
		else if(window.ActiveXObject)
			this.req = new ActiveXObject("Microsoft.XMLHTTP");
		
		if(this.req) {
			try {
				var loader = this;
				this.req.onreadystatechange = function() {
					loader.onReadyState();
				}
				this.req.open(method, url, true);
				if(contentType)
					this.req.setRequestHeader('Content-Type', contentType);
				this.req.send(params);
			} catch (err) {
				this.onerror.call(this);
			}
		}
	},
	
	/**
	 *
	 *	onReadyState()
	 *	Tratamento do carregamento da requisição
	 *
	 *	@see	loadXMLDoc()
	 *
	 */
	onReadyState:function() {
		var req = this.req;
		var ready = req.readyState;
		if(ready == ajax.READY_STATE_LOADING)
			this.loading(true);
		if(ready == ajax.READY_STATE_COMPLETE) {
			this.loading(false);
			var httpStatus = req.status;
			if(httpStatus == 200 || httpStatus == 0)
				this.onload.call(this);
			else
				this.onerror.call(this);
		}
	},
	
	/**
	 *
	 *	loading()
	 *	(Des)ativa a mensagem de carregando
	 *
	 *	@param		loading		boolean		Se está carregando (true ou false)
	 *	@see		onReadyState()
	 *
	 */
	loading:function(loading) {
		var div = document.getElementById('ajaxLoader');
		if(!div)
			return;
		div.style.display = loading ? 'block' : 'none';
	},
	
	/**
	 *
	 *	defaultError()
	 *	A fins de debug
	 *
	 *	@see	loadXMLDoc(), onReadyState()
	 *
	 */
	defaultError:function() {
		alert("Erro! \n\n readyState: "+this.req.readyState+"\n Status: "+this.req.status+"\n Headers: "+this.req.getAllResponseHeaders());
	}
}
