	String.prototype.trim = function() { return this.replace(/^\s*/, "").replace(/\s*$/, ""); }//Exemplo:" TESTE ".trim(); Resultado:"TESTE"

	function GetXmlHttp(){
		var oXmlHttpTemp = false;


		try{
		    oXmlHttpTemp = new XMLHttpRequest();
		}catch(xmlHttpEx1){
			var aXMLHTTP=['Msxml2.XMLHTTP','Microsoft.XMLHTTP','Msxml.XMLHTTP', 'Msxml3.XMLHTTP','Msxml2.XMLHTTP.6.0','Msxml2.XMLHTTP.4.0','Msxml2.XMLHTTP.3.0'];
	        for(var i=0;i<aXMLHTTP.length;i++){
				try{
					oXmlHttpTemp = new ActiveXObject(aXMLHTTP[i]);
					break;
				}catch(xmlHttpEx2){ }
			}
			if(!oXmlHttpTemp){
				//Outras formas de obter o objeto XmlHttp
			}
		}
		if(oXmlHttpTemp){
			try {
				oXmlHttpTemp.overrideMimeType('text/xml');
			}catch(xmlHttpEx0){	}
		}
		return oXmlHttpTemp;
	}

	/*************************/
	/* INICIO DO OBJETO AJAX */
	/*************************/
	Ajax=function(strUrl){
		var sUrl = '';
		var sMetodo = 'POST';
		var sTipoRetorno = 'TEXT';
		var fExecScript = true;
		var aPar = new Array();
		var aVal = new Array();
		var sAncora = null;
		var iStatusExec = 0; //0-Parado   1-Executando   2-Completo   3-Completo com erro
		var sIdArea = null;
		var sFuncCarregando = null;
		var sFuncCompleta = null;
		var fFila = false;
		var sFuncProcessaFila = null;
		var Retorno = null;
		var oXmlHttp = false;

		//INICIALIZACAO DO OBJETO
		if (strUrl!=null){
			if (strUrl.trim()==''){
				alert('Erro no Ajax: Parâmetro não definido - "strUrl".\nAjax Error: Parameter not defined - "strUrl".\n\nTrack Error: >new Ajax(strUrl)');
				return false;
			}else{
				sUrl = strUrl.trim();
				return true;
			}
		}

		//GET E SET URL
		this.GetUrl = function(){ return sUrl };
		this.SetUrl = function(strUrl){
			if (strUrl==null || strUrl.trim()==''){
				alert('Erro no Ajax: Parâmetro não definido - "strUrl".\nAjax Error: Parameter not defined - "strUrl".\n\nTrack Error: >SetUrl(strUrl)');
				return false;
			}else{
				sUrl = strUrl.trim();
				return true;
			}
		};
		//GET E SET METODO
		this.GetMetodo = function(){ return sMetodo };
		this.SetMetodo = function(strMetodo){
			if (strMetodo==null || strMetodo.trim()==''){
				alert('Erro no Ajax: Parâmetro não definido - "strMetodo".\nAjax Error: Parameter not defined - "strMetodo".\n\nTrack Error: >SetMetodo(strMetodo)');
				return false;
			}else{
				strMetodo = strMetodo.trim().toUpperCase();
				if (strMetodo!='GET' && strMetodo!='POST'){
					alert('Erro no Ajax: Parâmetro inválido - strMetodo="'+strMetodo+'".\nAjax Error: Invalid parameter - strMetodo="'+strMetodo+'".\n\nTrack Error: >SetMetodo(strMetodo)');
					return false;
				}else{
					sMetodo = strMetodo;
					return true;
				}
			}
		};
		//GET E SET TIPO RETORNO
		this.GetTipoRetorno = function(){ return sTipoRetorno };
		this.SetTipoRetorno = function(strTipoRetorno){
			if (strTipoRetorno==null || strTipoRetorno.trim()){
				alert('Erro no Ajax: Parâmetro não definido - "strTipoRetorno".\nAjax Error: Parameter not defined - "strTipoRetorno".\n\nTrack Error: >SetTipoRetorno(strTipoRetorno)');
				return false;
			}else{
				strTipoRetorno = strTipoRetorno.trim().toUpperCase();
				if (strTipoRetorno!='TEXT' && strTipoRetorno!='XML'){
					alert('Erro no Ajax: Parâmetro inválido - strTipoRetorno="'+strTipoRetorno+'".\nAjax Error: Invalid parameter - strTipoRetorno="'+strTipoRetorno+'".\n\nTrack Error: >SetTipoRetorno(strTipoRetorno)');
					return false;
				}else{
					sTipoRetorno = strTipoRetorno;
					if (strTipoRetorno=='XML'){
						//XML nao executa script
						fExecScript=false;
					}
					return true;
				}
			}
		};
		//GET E SET ANCORA(#)
		this.GetAncora = function(){ return sAncora };
		this.SetAncora = function(strAncora){
			if (strAncora==null || strAncora.trim()==''){
				alert('Erro no Ajax: Parâmetro não definido - "strAncora".\nAjax Error: Parameter not defined - "strAncora".\n\nTrack Error: >SetAncora(strAncora)');
				return false;
			}else{
				sAncora = strAncora.trim();
			}
		};
		//GET E SET EXECUTAR SCRIPT
		this.GetExecScript = function(){ return fExecScript };
		this.SetExecScript = function(flExecScript){
			if (flExecScript==null){
				alert('Erro no Ajax: Parâmetro não definido - "flExecScript".\nAjax Error: Parameter not defined - "flExecScript".\n\nTrack Error: >SetExecScript(flExecScript)');
				return false;
			}else{
				if (flExecScript!=true && flExecScript!=false){
					alert('Erro no Ajax: Parâmetro inválido - flExecScript="'+flExecScript+'".\nAjax Error: Invalid parameter - flExecScript="'+flExecScript+'".\n\nTrack Error: >SetExecScript(flExecScript)');
					return false;
				}else{
					fExecScript = flExecScript;
					return true;
				}
			}
		};
		//ADD E GET PARAMETRO E FORMULARIO
		this.GetParametro = function(strNomePar){
			if (strNomePar==null || strNomePar.trim()==''){
				alert('Erro no Ajax: Parâmetro não definido - "strNomePar".\nAjax Error: Parameter not defined - "strNomePar".\n\nTrack Error: >GetParametro(strNomePar)');
				return false;
			}else{
				strNomePar = strNomePar.trim();
				var arrParRetorno = new Array();
				for(var kont=0;kont<aPar.length;kont++){
					if(strNomePar==aPar[kont]){
						arrParRetorno[arrParRetorno.length]=aVal[kont];
					}
				}
				return arrParRetorno;
			}
		};
		this.AddParametro = function (strNomePar, strValorPar, flRegravarPar){
			if (strNomePar==null || strNomePar.trim()==''){
				alert('Erro no Ajax: Parâmetro não definido - "strNomePar".\nAjax Error: Parameter not defined - "strNomePar".\n\nTrack Error: >AddParametro(strNomePar, strValorPar[, flRegravarPar])');
				return false;
			}else{
				if (strValorPar==null){
					alert('Erro no Ajax: Parâmetro não definido - "strValorPar".\nAjax Error: Parameter not defined - "strValorPar".\n\nTrack Error: >AddParametro(strNomePar, strValorPar[, flRegravarPar])');
					return false;
				}else{
					if (flRegravarPar==null){
						flRegravarPar=true;
					}
					if (flRegravarPar!=true && flRegravarPar!=false){
						alert('Erro no Ajax: Parâmetro inválido - flRegravarPar="'+flRegravarPar+'".\nAjax Error: Invalid parameter - flRegravarPar="'+flRegravarPar+'".\n\nTrack Error: >AddParametro(strNomePar, strValorPar[, flRegravarPar])');
						return false;
					}else{
						var flEncontrouPar = false;
						strNomePar = strNomePar.trim();
						for(var kont=0;kont<aPar.length && flRegravarPar;kont++){
							if(strNomePar==aPar[kont]){
								aVal[kont]=strValorPar;
								flEncontrouPar = true;
							}
						}
						if(!flEncontrouPar){
							aPar[aPar.length]=strNomePar;
							aVal[aVal.length]=strValorPar;
						}
						return true;
					}
				}
			}
		};
		this.AddFormulario = function(strNomeForm){
			if (strNomeForm==null || strNomeForm.trim()==''){
				alert('Erro no Ajax: Parâmetro não definido - "strNomeForm".\nAjax Error: Parameter not defined - "strNomeForm".\n\nTrack Error: >AddFormulario(strNomeForm)');
				return false;
			}else{
				strNomeForm = strNomeForm.trim();
				if(!document.getElementById(strNomeForm)){
					alert('Erro no Ajax: Formulário não encontrado - strNomeForm="'+strNomeForm+'".\nAjax Error: Form not found - strNomeForm="'+strNomeForm+'".\n\nTrack Error: >AddFormulario(strNomeForm)');
					return false;
				}else{
					if(document.getElementById(strNomeForm).method!=null){
						this.SetMetodo(document.getElementById(strNomeForm).method);
					}
					if(document.getElementById(strNomeForm).action!=null){
						this.SetUrl(document.getElementById(strNomeForm).action);
					}
				    var elForm = document.getElementById(strNomeForm).elements;
				    var el;
				    //Loop para percorrer todos os elementos
				    for (var elKont=0; elKont<elForm.length; elKont++) {
				        el = elForm[elKont];
			            switch(el.type) {
			                //Realiza a acao dependendo do tipo de elemento
			                case 'text': case 'password': case 'hidden': case 'textarea':
								if(el.name!=null){
			                    	this.AddParametro(el.name,el.value);
			                    }
			                    break;
			                case 'select-one':
								if(el.name!=null){
				                    this.AddParametro(el.name,el.options[el.selectedIndex].value);
				                }
			                    break;
			                case 'select-multiple':
								if(el.name!=null){
				                    for (var elKont2=0; elKont2<el.options.length; elKont2++) {
				                        if (el.options[elKont2].selected) {
				                            this.AddParametro(el.name,el.options[elKont2].value,false);
				                        }
				                    }
				                }
			                    break;
			                case 'checkbox': case 'radio':
								if(el.name!=null){
				                    if (el.checked) {
				                        this.AddParametro(el.name,el.value);
				                    }
				                }
			                    break;
							default:
								//Se nao for nenhum tipo acima
								if(el.name!=null){
				                    this.AddParametro(el.name,el.value);
				                }
			                    break;

			            }
				    }
				    return true
				}
			}
		};
		//GET E SET ID AREA
		this.GetAreaCompleta = function(){ return sIdArea };
		this.SetAreaCompleta = function(strIdArea){
			if (strIdArea==null || strIdArea.trim()==''){
				alert('Erro no Ajax: Parâmetro não definido - "strIdArea".\nAjax Error: Parameter not defined - "strIdArea".\n\nTrack Error: >SetAreaCompleta(strIdArea)');
				return false;
			}else{
				sIdArea = strIdArea.trim();
				return true;
			}
		};
		//GET E SET FUNCAO COMPLETA
		this.GetFuncCompleta = function(){ return sFuncCompleta };
		this.SetFuncCompleta = function(strFuncCompleta){
			if (strFuncCompleta==null || strFuncCompleta.trim()==''){
				alert('Erro no Ajax: Parâmetro não definido - "strFuncCompleta".\nAjax Error: Parameter not defined - "strFuncCompleta".\n\nTrack Error: >SetFuncCompleta(strFuncCompleta)');
				return false;
			}else{
				if (strFuncCompleta.replace("(","").replace(")","").replace(";","").trim()==''){
					alert('Erro no Ajax: Parâmetro inválido - strFuncCompleta="'+strFuncCompleta+'".\nAjax Error: Invalid parameter - strFuncCompleta="'+strFuncCompleta+'".\n\nTrack Error: >SetFuncCompleta(strFuncCompleta)');
					return false;
				}else{
					sFuncCompleta = strFuncCompleta.replace("(","").replace(")","").replace(";","").trim();
					return true;
				}
			}
		};
		//GET E SET FUNCAO CARREGANDO
		this.GetFuncCarregando = function(){ return sFuncCarregando };
		this.SetFuncCarregando = function(strFuncCarregando){
			if (strFuncCarregando==null || strFuncCarregando.trim()==''){
				alert('Erro no Ajax: Parâmetro não definido - "strFuncCarregando".\nAjax Error: Parameter not defined - "strFuncCarregando".\n\nTrack Error: >GetFuncCarregando(strFuncCarregando)');
				return false;
			}else{
				if (strFuncCarregando.replace("(","").replace(")","").replace(";","").trim()==''){
					alert('Erro no Ajax: Parâmetro inválido - strFuncCarregando="'+strFuncCarregando+'".\nAjax Error: Invalid parameter - strFuncCarregando="'+strFuncCarregando+'".\n\nTrack Error: >GetFuncCarregando(strFuncCarregando)');
					return false;
				}else{
					sFuncCarregando = strFuncCarregando.replace("(","").replace(")","").replace(";","").trim();
					return true;
				}
			}
		};
		//GET STATUS DA EXECUCAO
		this.GetStatusExec = function(){ return iStatusExec };
		//GET RETORNO DA EXECUCAO
		this.GetRetorno = function(){ return Retorno };
		//GET OBJETO XMLHTTP
		this.GetXmlHttp = function(){ return oXmlHttp };
		//METODOS DE CONTROLE DA FILA
		this.SetFuncProcessaFila = function (strFuncProcessaFila){
			if (strFuncProcessaFila==null || strFuncProcessaFila.trim()==''){
				alert('Erro no Ajax: Parâmetro não definido - "strFuncProcessaFila".\nAjax Error: Parameter not defined - "strFuncProcessaFila".\n\nTrack Error: >SetFuncProcessaFila(strFuncProcessaFila)');
				return false;
			}else{
				if (strFuncProcessaFila.replace("(","").replace(")","").replace(";","").trim()==''){
					alert('Erro no Ajax: Parâmetro inválido - strFuncProcessaFila="'+strFuncProcessaFila+'".\nAjax Error: Invalid parameter - strFuncProcessaFila="'+strFuncProcessaFila+'".\n\nTrack Error: >SetFuncProcessaFila(strFuncProcessaFila)');
					return false;
				}else{
					sFuncProcessaFila = strFuncProcessaFila.replace("(","").replace(")","").replace(";","").trim();
					return true;
				}
			}
		}
		this.FilaConectar = function (objXmlHttpConexao){
			if (objXmlHttpConexao==null || objXmlHttpConexao.trim()==''){
				alert('Erro no Ajax: Parâmetro não definido - "objXmlHttpConexao".\nAjax Error: Parameter not defined - "objXmlHttpConexao".\n\nTrack Error: >FilaConectar(objXmlHttpConexao)');
				return false;
			}else{
				oXmlHttp = objXmlHttpConexao;
				fFila = true;
				this.Conectar();
				return true;
			}
		}
		//METODOS DE INICIO DE CONEXAO
		this.Conectar = function (){
			if (sUrl==null || sUrl==''){
				iStatusExec = 3;
				Retorno='Erro no Ajax: Url não definida.<br>Ajax Error: Url not defined.<br><br>Track Error: >Conectar()';
				return false;
			}
			if(!fFila){
				oXmlHttp = GetXmlHttp();
			}
			if(!oXmlHttp){
				iStatusExec = 3;
				Retorno='Erro no Ajax: Objeto ajax não inicializado.<br>Ajax Error: Ajax object not initialited.<br><br>Track Error: >Conectar()';
				return false;
			}else{
			    //Atribui ao objeto XMLHTTP o objeto pai
			    //oXmlHttp.parent = this;
			    //Loop para concatenar os parametros
			    var sParam='';
			    for (var parKont=0; parKont<aPar.length; parKont++) {
					sParam += encodeURI(aPar[parKont]) + '=' + encodeURI(aVal[parKont]).replace("&", "%26");
					if ((parKont+1)<aPar.length){
						sParam += '&'
					}
			    }
				if (sMetodo=='GET' && sParam.length>0){
					sUrl = sUrl + '?' + sParam;
				}
				//if (sAncora!=null || sAncora!=''){
				//	window.location = '#' + sAncora
				//}
			    //Abre a conexao
			    oXmlHttp.open(sMetodo,sUrl,true);
			    //Seta as funcoes que irao tratar a mudanca de estado do objeto XMLHTTP
			    oXmlHttp.onreadystatechange=function(){
											   //0-Nao inicializado, 1-Carregando, 2-Carregado, 3-Interativo, 4-Completo
											    if (oXmlHttp.readyState==1){
											    	//*** INICIO CARREGANDO ***//
													if(sFuncCarregando!=null){
														try{
															eval(sFuncCarregando+"(this.parent);");
														}catch(ajaxEx1){
															alert('Erro no Ajax: Erro ao executar a funcao de status carregando.\nAjax Error: Error on execute function to status changed.\n\nTrack Error: >Conectar()>ReadyState=1>Function="'+sFuncCarregando+'()"');
									        			}
													}
											    	//*** FIM CARREGANDO ***//
											    }else{
											        if (oXmlHttp.readyState==4){
												    	//*** INICIO COMPLETO ***//
													    if (oXmlHttp.status == 200 || oXmlHttp.status==0) {//Caso o status seja 200(Sucesso) ou nao utilize servidor(chamada local [C:\...]), trata o valor retornado
															iStatusExec = 2;
															if(sTipoRetorno='TEXT'){
																Retorno=oXmlHttp.responseText;//retorno=retorno.replace(/\+/g," ");
														        Retorno=unescape(Retorno);
															}else{
																Retorno==oXmlHttp.responseXML;
															}
															if(sIdArea!=null){
																if(document.getElementById(sIdArea)){
																	try{
																		document.getElementById(sIdArea).innerHTML = Retorno;
																	}catch(ajaxEx3){
																		alert('Erro no Ajax: Erro ao atribuir o retorno do ajax na área determinada.\nAjax Error: Error on set ajax\'s return to area.\n\nTrack Error: >Conectar>ReadyState=4>Status='+oXmlHttp.status+'>Area="'+sIdArea+'"');
												        			}
												        		}
															}
															if(fExecScript){
															    //Inicio da execucao dos scripts
															    var ini, pos_src, fim, codigo, texto_pesquisa, fl_anexou;
															    var objScript = null;
															    texto_pesquisa = Retorno.toLowerCase();
															    // Busca a primeira tag <script
															    ini = texto_pesquisa.indexOf('<script', 0);
															    // Executa o loop enquanto achar um <script
															    while (ini!=-1){
															        //Inicia o objeto script
															        var objScript = document.createElement("script");
															        //Busca se tem algum src a partir do inicio do script
															        pos_src = texto_pesquisa.indexOf(' src', ini);
															        // Define o inicio para depois do fechamento dessa tag
															        ini = texto_pesquisa.indexOf('>', ini) + 1;
															        //Verifica se este e um bloco de script ou include para um arquivo de scripts
															        if (pos_src < ini && pos_src >=0){//Se encontrou um "src" dentro da tag script, esta e um include de um arquivo script
															            //Marca como sendo o inicio do nome do arquivo para depois do src
															            ini = pos_src + 4;
															            //Procura pelo ponto do nome da extencao do arquivo e marca para depois dele
															            fim = texto_pesquisa.indexOf('.', ini)+4;
															            //Pega o nome do arquivo
															            codigo = Retorno.substring(ini,fim);
															            //Elimina do nome do arquivo os caracteres que possam ter sido pegos por engano
															            codigo = codigo.replace("=","").replace(" ","").replace("\"","").replace("\"","").replace("\'","").replace("\'","").replace(">","");
															            objScript.src = codigo;
															        }else{//Se nao encontrou um "src" dentro da tag script, esta e um bloco de codigo script
															            // Procura o final do script
															            fim = texto_pesquisa.indexOf('</script>', ini);
															            // Extrai apenas o script
															            codigo = Retorno.substring(ini,fim);
															            objScript.text = codigo;
															        }
															        document.getElementsByTagName('head')[0].appendChild(objScript);
															        ini = Retorno.indexOf('<script', fim);
															        objScript = null;
															    }
															    //Fim da execucao dos scripts
															}
															if(sFuncCompleta!=null){
																try{
																	eval(sFuncCompleta+"(this.parent);");
																}catch(ajaxEx2){
																	alert('Erro no Ajax: Erro ao executar a funcao de status completo.\nAjax Error: Error on execute function to status completed.\n\nTrack Error: >Conectar()>ReadyState=4>Status='+oXmlHttp.status+'>Function="'+sFuncCompleta+'()"');
											        			}
											        		}
													    }else{
															iStatusExec = 3;
															try{
															    switch (oXmlHttp.status) {
															        case 404:
																		Retorno='Página não encontrada.<br>Page not found';
															            break;
															        case 500:
																		Retorno='Erro interno do servidor.<br>Internal server error';
															            break;
															        default:
																		Retorno='Erro desconhecido.<br>Unknow error.<br><br>Track Error: >Conectar>ReadyState=4>Status=' + oXmlHttp.status + '<br>Desc:' + oXmlHttp.statusText;
															    }
															}catch(ajaxEx3){
										        			}
															return false;
													    }
												    	//*** FIM COMPLETO ***//
											        }
											    }
										  };
			    //Headers do Request
				oXmlHttp.setRequestHeader('Encoding','ISO-8859-1');
				oXmlHttp.setRequestHeader('Cache-Control', 'no-store, no-cache, must-revalidate');
				oXmlHttp.setRequestHeader('Cache-Control', 'post-check=0, pre-check=0');
				oXmlHttp.setRequestHeader('Pragma', 'no-cache');
			    if (sMetodo=='POST'){
			        oXmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
			        oXmlHttp.send(sParam);
			    }else{
			        oXmlHttp.send(null);
			    }
				iStatusExec = 1;
				return;
			}
		};
	};
	/**********************/
	/* FIM DO OBJETO AJAX */
	/**********************/
