/*
 
  Objeto AJAX para comunica��o Assincrona com um servidor de aplica��es WEB

  - Fun��o AJAX
      A fun��o AJAX cria os objetos que ser�o utilizados para a conex�o assincrona com o servidor

      parametros :
      
      url      = Url que o ajax deve chamar;
      metodo   = Metodo que ser� utilizado (POST,GET,PUT,HEAD);
      params   = Parametros que devem ser passados para o servidor;
      Header   = Cabe�alho que ser� enviado ao servidor, utilizado mais especificamente no metodo POST
        a variavel Header � um ARRAY que como chave deve passar o tipo cabe�alho e depois o valor.
        ex:     var header = new Array();
		     	header["Content-Type"]   = "application/x-www-form-urlencoded";
			    header["content-length"] = parametros.length; 
	  modo     = Tipo do retorno em Modo (T)exto, Modo (X)ML, Modo (A)rray ou Modo (O)bjeto 
	    Quando o modo for (A) basta definir um separador que sera utilizado tamb�m no script (JSP/PHP) 
	    separar a String de Resultado.
	    
		Quando o modo for (O) alem de definir o separador, deve-se definir tamb�m o nome a qual valor 
		ser� atribuido utilizando a express�o ->.
		ex:
		      String resultado = "NROM_M->14<separador>DIGM_M->9<separador>NOMM_M->NEOSALDINA"
	 
   - Fun��o processaResultado 
      � a fun��o que processa o resultado enviado pelo servidor e retorna os dados para o usu�rio  

Ultimas atualiza��es
 - 19/06/2006 - 17:21 - Fabiano
    - Adicionadas os modos A e O
    - Adicionadas os metodos  processaModoObjeto e processaModoArray
    - Adicionada a propriedade separador
    

*/
function AJAX(url,metodo,params,processa,modo,Header,separador) 
 {
	this.url       = url;
	this.metodo    = (metodo) ? metodo : 'GET';
	this.params    = (metodo='GET') ? null : params;
	this.processaResultado = processa;
	this.Header    = new Array();
	this.modo      = (modo) ? modo : 'T';
	this.separador = (separador) ? separador : '&'; 
	this.conectar();
}
AJAX.prototype = {
    //Adiciona um cabe�alho na requisi��o 
	addHeader:	function(h,v) {
					this.Header[h] = v;
				},
    //Exclui o cabe�alho 
	delHeader:	function(h) {
					delete(this.Header[h]);
				},
    //Seta o Cabe�alho na requisi��o
	setHeader:	function() {
					if(this.httpRequest==null) { return;} 
					for(h in this.Header) {
						this.httpRequest.setRequestHeader(h,this.Header[h]);
					}
				},
	//Conecta com o servidor
	conectar:			function() {
							if(this.url==undefined||this.url=='') {
								return; 
							}
							this.httpRequest = null;
						   	if (window.XMLHttpRequest) { // Mozilla, Safari,...
					         	this.httpRequest = new XMLHttpRequest();
				        	} else if (window.ActiveXObject) { // IE
					         	try {
							     	 this.httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
				    	     	} catch (e) {
				               		try {
		        		           	 this.httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
									} catch (e) {}
								}
							}
							if(this.httpRequest!=null&&this.httpRequest!=undefined) {
								var obj = this;
								this.httpRequest.onreadystatechange = 	function() {
																			obj.processaRetorno.call(obj);
								}
								if(this.metodo==undefined||this.metodo=='') { this.metodo = 'GET';}
					        	this.httpRequest.open(this.metodo,this.url, true);
								this.setHeader();
						        this.httpRequest.send(this.params);
							}
						},
	//Manipula os dados vindos do servidor						
	processaRetorno:	function() {
							if(this.httpRequest.readyState==4) {
								if(this.httpRequest.status==200) 
								{
								  if((this.modo!='T')&&(this.modo!='X')&&(this.modo!='A')&&(this.modo!='O')) 
								     {
								    	this.modo = 'T';
									 }
									
									var resp = ((this.modo == 'T' )||(this.modo == 'A')||(this.modo == 'O')) ?  this.httpRequest.responseText : this.httpRequest.responseXML;
									if((this.processaResultado != null)&&(this.modo == 'T')) 
									 {
									   this.processaResultado(resp);
								     }
									else if((this.processaResultado != null)&&(this.modo == 'A')) 
									 {
									   this.processaModoArray(resp);
								     }
   									else if((this.processaResultado != null)&&(this.modo == 'X')) 
									 {
									   this.processaResultado(resp);
								     }
   									else if((this.processaResultado != null)&&(this.modo == 'O')) 
									 {									   
									   this.processaModoObjeto(resp);
								     }
									else 
									 {
									   document.write(resp) + 'Escopo de Saida em Caso de Erro no modo da Fun��o';
									 }
								} else { 
									this.processaErro();
								}
							}
						},
    //Manipula um possivel erro vindo do servidor						
	processaErro:		function() {
							alert(this.httpRequest.status + '-' + this.httpRequest.statusText + ' :-> ' + this.url);
						},
						
	//Manipula o resultado e joga num Array
	processaModoArray: function(retorno){
            var strRetorno   = retorno;
            var strSeparador = new String(this.separador);
            var arrayRetorno = strRetorno.split(strSeparador);        
      this.processaResultado(arrayRetorno);        
	},						

	//Manipula o resultado e joga num Objeto Array;
	processaModoObjeto: function(retorno){
            var strRetorno   = retorno;
            var strSeparador = new String(this.separador);
            var arrayRetorno = strRetorno.split(strSeparador);              
            this.retorno = new Array();

            for (i = 0; i < arrayRetorno.length;i++)
             {
			   var val = arrayRetorno[i].split('->');             
			  this.retorno[val[0]] = val[1];
			 }
	  this.processaResultado(this);        
	}
}



