GLB.namespace("GLB.util");
GLB.util.httpRequest = function(){
	/*
		.version: 1.0
		
		.date:
		20/09/2007
		
		.usage:
		GLB.util.httpRequest.get("url", {params}, callback=function(){}, waitResponse);
		or
		GLB.util.httpRequest.post("url", {params}, {scope: object, onComplete: function(){}, arguments: {}}, waitResponse);
		
	*/	
	var _events = ["onStart", "onOpen", "onSend", "onLoad", "onComplete"];
	var _filter = encodeURIComponent;
	var	_objectsHTTP = [
						function(){return new XMLHttpRequest();},
						function(){return new ActiveXObject("MSXML2.XMLHTTP.3.0");},
						function(){return new ActiveXObject("Msxml2.XMLHTTP");},
						function(){return new ActiveXObject("Microsoft.XMLHTTP");}
						];
	/*
		 *- MetÃ³do de verificaÃ§Ã£o sobre o suporte ao HTTPRequest
		 |method _isSupported
		 |private static
		 |return {Boolean}  retorna o suporte ao uso do Objeto HTTP
	*/
	var _isSupported = function(){
		return !!_getConnection();
	};
	/*
		MÃ©todo de captura de conexÃ£o
		|method _getConnection
		|private static
		|return {HTTP}  retorna o Objeto HTTP
	*/
	var _getConnection = function(){
		for(var i=0; i<_objectsHTTP.length; i++){
			try{
				return _objectsHTTP[i]();
			}catch(e){};
		}
		return null;
	};
	/*
		FormataÃ§Ã£o dos paramÃªtros para envio via GET ou POST
		|method _formatParams
	 	|private static
		|param  {Object} params - lista dos parametros a ser formatado
		|return {String} retorna uma string com os parÃ¢metros formatados
	*/
	var _formatParams = function(params){
		var i, r = [];
		for(i in params){
			r[r.length] = i + "=" + (_filter ? _filter(params[i]) : params[i]);
		}
		return r.join("&");
	};
	/*
		MetÃ³do de execuÃ§Ã£o da consulta principal
		|method _request
	 	|private static
		|param  {String} method 			- MetÃ³dod de consulta: GET ou POST
		|param  {String} url 				- Url do arquivo requisitado
		|param  {Object} params 			- Lista de paramÃªtros a ser enviado ao arquivo
		|param  {Object||Function} handler	- callback
		|param  {String} headers 			- CabeÃ§alho para envio na solicitaÃ§Ã£o
		|param  {Boolean} waitResponse		- DefiniÃ§Ã£o sobre a assincronia na consulta
		|return {Booelan} retorna um valor booleano sobre o sucesso da consulta
	*/
	var _request = function(method, url, params, handler, headers, waitResponse){
		if(!GLB.util.delegate && handler)_log("Erro: O uso desse mÃ©todo (get || post) exige o pacote GLB.util.delegate jÃ¡ carregado");
		var i, o = _getConnection(), f = typeof handler === "function", a = typeof handler === "object" && handler.arguments;
		try{
			if(typeof handler === "object" && handler.arguments)handler.arguments.result = o;

			o.open(method, url, !waitResponse);

			waitResponse || (o.onreadystatechange = function(){
				var s = _events[o.readyState];
				var func = f ? handler : (handler[s] ? handler[s]: null);
				if(func){
					if(typeof handler === "object" && typeof handler.scope==="object")var func = GLB.util.delegate.create(handler.scope, func);			
					func((typeof handler === "object" && handler.arguments)? handler.arguments : o)
				}				
			});
			
			o.setRequestHeader("HTTP_USER_AGENT", "XMLHttpRequest");
			
			for(i in headers)o.setRequestHeader(i, headers[i]);
			o.send(params);
			
			var func = f ? handler : ((handler["onComplete"])? handler["onComplete"]: null);			
			if(waitResponse && func){
				if(typeof handler === "object" && typeof handler.scope === "object")var func = GLB.util.delegate.create(handler.scope, "onComplete");
				func((typeof handler === "object" && handler.arguments)? handler.arguments : o)
			}			
			
			return o;
		}
		catch(e){
			return false;
		}
	};
	
	var _log = function(message){
		alert(" >> "+message);
	}
	
	return {
		/*
			MetÃ³do de execuÃ§Ã£o da consulta via GET
			|method get
			|public static
			|param  {String} url 				- Url do arquivo requisitado
			|param  {Object} params 			- Lista de paramÃªtros a ser enviado ao arquivo
			|param  {Object||Function} handler	- callback
			|param  {Boolean} waitResponse		- DefiniÃ§Ã£o sobre a assincronia na consulta
			|return {Booelan} retorna um valor booleano sobre o sucesso da consulta
		*/
		get:function(url, params, handler, waitResponse){
			var queryString = _formatParams(params);
			
			var conector = "";
			// verifica se ja tem "?"
			if (url.indexOf("?") >= 0) {
				
				// adiciona parametros
				if (queryString.length > 0) {
					conector = "&";
				}
			} // não tem "?", verifica se tem parametro pra query string 
			else if (queryString.length > 0) {
				// tem, entao coloca "?"
				conector = "?";
			}
			
			var urlCompleta = url + conector + queryString;
			
			return _request("GET", urlCompleta , null, handler, {
				"Content-Type": "text/html; charset:UTF-8",
				"Content-length": 0,
				"Connection": "close"			
			}, waitResponse);
		},
		/*
			MetÃ³do de execuÃ§Ã£o da consulta via POST
			|method post
			|public static
			|param  {String} url 				- Url do arquivo requisitado
			|param  {Object} params 			- Lista de paramÃªtros a ser enviado ao arquivo
			|param  {Object||Function} handler	- callback
			|param  {Boolean} waitResponse		- DefiniÃ§Ã£o sobre a assincronia na consulta
			|return {Booelan} retorna um valor booleano sobre o sucesso da consulta
		*/
		post:function(url, params, handler, waitResponse){
			return _request("POST", url, params = _formatParams(params), handler, {
				"Connection": "close",
				"Content-Length": params.length,
				"Method": "POST " + url + " HTTP/1.1",
				"Content-Type": "application/x-www-form-urlencoded; charset=utf-8"
			}, waitResponse);
		}
	}	
}();
