///////////////////////////////////////
//FRAMEWORK AJAX RequestData
///////////////////////////////////////
// Version 1.5
// Author: Renato César Galiciano Ramos
// Gerente de Projetos
// GB2 Tecnologia + Automação
// renato@gb2.com.br
// http://www.gb2.com.br

/////////////////////////////////////////////////////////////////////////
//Classe para requisições de dados e fragmentos de html com AJAX
/////////////////////////////////////////////////////////////////////////


/////////////////////////////////////////
//Vetor global de ERROS
////////////////////////////////////////
var vetERROR = new Array(5);
vetERROR[0] = "";
vetERROR[1] = "";
vetERROR[2] = "";
vetERROR[3] = "";
vetERROR[4] = "";

function SHOW_TXTERROR(id){
	alert(vetERROR[id]); 
}

function requestData(ID, OBJMSG, FORM, URL, EXECAFTER, EXECAFTER_setdata){
	
	//Atributos
	var self = this;
	var fieldArray, objmsg, objhttp, url, form, response, ready, sizereg, sizefield, identifier, progress, state, execafter, firstop, ex_firstop, text_firstop;
	var loadedcolor, unloadedcolor, barheight, barwidth, bordercolor, parameters;
	var blocksize, loaded, perouter, perdone, execsetdata, execsincrono;
	var RS, sizeRS;
		
	//Métodos 
	
	/* Construtor */
	this.constructor = function(){
		self.fieldArray = new Array();
		self.ready = false;
		self.progress = false;
		self.identifier = ID;
		self.objmsg = OBJMSG;
		self.form = FORM;
		self.url = URL;
		self.state = 0;
		self.execafter = EXECAFTER;
		self.execsetdata = EXECAFTER_setdata;
		self.execsincrono = false;
		self.firstop = false;				        //Identifica quando ja foi inserida a opção "Escolha" no ComboBox
		self.ex_firstop = true;				        //Identifica quando deve ser considerada a opção "Escolha" no ComboBox				
		self.text_firstop = "Escolha";		        //Texto padrão da primeira opção do combo
		self.sizeRS = 0;
		self.parameters = "";                       //Parametro que é enviado pelo metodo post para a página de gravação no banco
		self.timeout = 0;                           //Parametro que indica o timeout para requisição e execução dos scripts
        self.script = "";                           //Parametro que guarda o script retirado da página requisitada    
		self.objscript = null;                      //Parametro que vai receber o ponteiro do objeto que servirá para colocar o script
				
		//Configurações barra de progresso
		self.loadedcolor="#3366CC";                 // PROGRESS BAR COLOR
		self.unloadedcolor="lightgrey";             // BGCOLOR OF UNLOADED AREA
		self.barheight=5;                           // HEIGHT OF PROGRESS BAR IN PIXELS
		self.barheight=Math.max(4,self.barheight);
		self.barwidth=70;                           // WIDTH OF THE BAR IN PIXELS
		self.bordercolor="lightgrey";               // COLOR OF THE BORDER
		self.blocksize=(self.barwidth-2)/100;
		self.loaded=0;
		self.perouter=0;
		self.perdone=0;
	}
	
	//Coloca o texto do erro em um vetor de erros para poder ser exibido //
	this.setERROR = function(txt_erro){
		vetERROR[self.identifier] = txt_erro;
	}

	/* preenche o atributo que recebe os parametros para envio do post */
	this.setPARAM = function(param){
	    self.parameters = param;
	}
	/* Retorna o identificador do objeto */
	this.getID = function(){
		return self.identifier;
	}
	/* Preenche a propriedade URL */
	this.setURL = function(url){
		self.url = url; 
	}
	/* Retorna a propriedade URL */
	this.getURL = function(){
		return self.url; 
	}
	/* Preenche a propriedade URL */
	this.setFORM = function(form){
		self.form = form; 
	}
	/* Coloca o conteudo retornado pela requisição na atributo response */
	this.setRESPONSE = function(response){
		self.response = response; 
	}
	/* Retorna  apropriedade response */
	this.getRESPONSE = function(){
		return self.response;
	}
	/* preenche a propriedade ready */
	this.setREADY = function(ready){
		self.ready = ready;
	}
	/* retorna a propriedade ready */
	this.getREADY = function(){
		return self.ready;
	}
	/* preenche a propriedade objmsg */
	this.setOBJMSG = function(objmsg){
		self.objmsg = objmsg;	
	}
	/* preenche a propriedade ex_firstop*/
	this.setFIRSTOP = function(ex_firstop){
		self.ex_firstop = ex_firstop;	
	}
	/* preenche a propriedade text_firstop*/
	this.setEXFIRSTOP = function(text_firstop){
		self.text_firstop = text_firstop;	
	}
	/* preenche a propriedade execafter */
	this.setEXECAFTER = function(execafter){
		self.execafter = execafter;	
	}
	/* preenche a propriedade execafter_setdata */
	this.setEXECAFTER_setdata = function(execafter_setdata){
		self.execsetdata = execafter_setdata;	
	}
	/* preenche a propriedade exesincrono */
	this.setEXECSINCRONO = function(execsincrono){
		self.execsincrono = execsincrono;	
	}
	/* preenche a propriedade timeout em milisegundos */
	this.setTIMEOUT = function(time){
	    self.timeout = time;
	}
	/* preenche a propriedade objscript que vai receber os script */
	this.setOBJSCRIPT = function(objscript){
	    self.objscript = objscript;
	}
	
	/* Metodo para adicionar uma novo campo na matriz */
	this.addField = function(fld, obj, qtde, prop, reg){
	
		//fld -		Nome do campo igual ao banco de dados
		//obj -		Objeto que irá receber os valores do campo
		//qtde -	Indica quantos registros devem ser retornados EX: 0 - todos, 1 - Apenas o primeiro
		//prop -	Indica a propriedade utilizada para inserir o valor retornado EX: value, options, innerHTML, checked
		//reg -		Indica qual registro deve ser utilizado para preencher o campo EX: nome1, nome2, nome3 - Utilizar o nome2
		
		var i = self.getSizefieldArray();
		
		self.fieldArray[i] = new Array(5);
		self.fieldArray[i][0] = fld;
		self.fieldArray[i][1] = obj;
		self.fieldArray[i][2] = qtde;		
		self.fieldArray[i][3] = prop;
		self.fieldArray[i][4] = reg;
	}
	/* Seleciona uma opção do combo*/
	this.setCombo= function(field, obj){
		var j, objeto;
		
		objeto = eval(obj);
		for(j=0; j<objeto.length; j++){
			if(objeto[j].value == self.getRS(field, 0)){
				objeto[j].selected = true;		
				break;
			}
		}
	}
	/* Metodo para adicionar os dados em uma matriz denominada RS, para ser utilizada por códigos externos*/
	this.setRS = function(){
		var count, str, reg, aux, size, i, j, arr, field; 
		count = parseInt(self.getRecordCount());
		if( count == 0) return 0;
		str = self.getRESPONSE();
		reg = new RegExp("#F#[^#]+#.#", "ig");
		aux = str.match(reg);
		try{size = aux.length;}
		catch(e){size = 0;}
		if(size >0){
			self.sizeRS = size;
			self.RS = new Array(size);
			for(i=0; i<size; i++){
				self.RS[i] = new Array();
				field = aux[i].substring(3, aux[i].length-3); 
				self.RS[i][0] = field;	
				reg = new RegExp("#" + field + "#::[^+]+", "ig");
				arr = str.match(reg);
				for(j=0;j<count;j++){
					pos = arr[j].indexOf("#::", 1);
					self.RS[i][j+1] = (pos!=-1)?arr[j].substr(pos+3):"";
				}		
			}
		}
	}
	/* Metodo para retornar um dado especifico da matriz RS*/
	this.getRS = function(field, rec){
		var i;
		for(i=0;i<self.sizeRS;i++){
			if(self.RS[i][0] == field)
				return self.RS[i][rec+1];
		}
		return 0;
	}
	
	/* Retorna o tamanho da matriz de objetos */
	this.getSizefieldArray = function(){
		return self.fieldArray.length;
	}
			
	/* Preenche um valor específico na matriz de campos */
	this.setValuefieldArray = function(i, j, value){
		if(self.fieldArray[i][j] != null){
			self.fieldArray[i][j] = value;
			return true;
		}else
			return false;
	}
	
	/* Retorna um valor epecífico da matriz de campos */
	this.getValuefieldArray = function(i, j){
		if(self.fieldArray[i][j] != null)return self.fieldArray[i][j];
		else return null;
	}

	/* Retorna o número de regitros retornados pela página de requisição */
	this.getRecordCount = function (){
		var reg, arr, size, field, str, aux;
		str = "";
		str = self.getRESPONSE();
		reg = new RegExp("#[^#]+#::", "i");	
		aux = str.match(reg);
		try{
			field = aux[0].substring(1, aux[0].indexOf("#::")); 
			reg = new RegExp("#" + field + "#::[^+]+", "ig");
			arr = str.match(reg);
			try{size = arr.length;}
			catch(e){size = 0;}
			return size; 
		}catch(e){return 0;}
	}

	/* coloca no parametro self.script o código em javascript que fica entre as tags <!--begin_script--> e <!--end_script--> e retira da página*/
	this.extractScript = function (){
	    var reg, str, aux, i;
	    //¥ chr 190 ascii
	    reg = new RegExp("<[^>]*begin_script[^>]*>[^¥]+<[^>]*end_script[^>]*>", "ig");	
	    str = self.getRESPONSE();
	    //procura em  toda a pagina os scripts dentro das tags e coloca novetor aux
		aux = str.match(reg);
		//apaga, da pagina, todas as ocorrencias dos scripts
		self.setRESPONSE(str.replace(reg, ""));
		//coloca no parametro self.script
		try{
		    self.script = "";
		    for(i=0; i<aux.length; i++){
		        self.script += aux[i].substring(20, aux[0].length - 18);
		    }
		}
		catch(e){self.script = "";}
	}
	
	/* coloca o script no objeto para ser executado*/
	this.placeScript = function (){
	    var scriptobj;
    
	    if((self.script == "") || (self.objscript == null)) return;
	    
	    scriptobj = document.createElement('script');
	    scriptobj.setAttribute('language', 'javascript');
	    scriptobj.setAttribute('type', 'text/javascript');
	    scriptobj.text = self.script;
	    
	    try{
	        //Limpa o objeto que vai receber o código javascript
	        self.objscript.innerHTML = "";
	        //coloca o códgio javascript que poderá ser executado
	        self.objscript.appendChild(scriptobj);
	    }
	    catch(e){}
	}
		
	/* Coloca uma mensagem em um único objeto */
	this.setMessage = function(msg, bar, type){
		if(self.objmsg == null) return;
		var ctype, j
		//Pega o tipo de objeto//
		try{ctype = self.objmsg.type.toLowerCase();}
		catch(e){ctype = 'other';}
		//Verifica se é do tipo texto para colocar a mensagem da prop value//
		if((ctype == 'text')||(ctype == 'textarea'))
			self.objmsg.value = msg;
		//verifica se é do tipo select para colocar a msg no primeiro option//
		else if (ctype == 'select-one'){
			//Apaga todos os optios existentes no select//
			if(self.objmsg.options.length > 0){
				for(j=self.objmsg.options.length; j>=0; j--)
					self.objmsg.options[j] = null;
			}
			//Cria um novo option e coloca os valores para text e value//
			var OP = document.createElement("OPTION");
			OP.text = msg;
			OP.value = 0;
			//Insere a mensagem no único option existente//
			self.objmsg.options.add(OP);
		}
		else{
			if(bar){
				self.progress = true;
				self.progressBarInit(self.objmsg, msg, type);
			}
			else 
				self.objmsg.innerHTML = "<table border=0><tr name=bar" + self.identifier + " id=bar" + self.identifier + "><td style='FONT-SIZE:11px;FONT-FAMILY:Tahoma,Arial,SansSerif,Verdana;COLOR:#464646;'>" + msg + "</td></tr></table>";
		}			
	}
	
	this.clearMessage = function(){
		if(self.objmsg == null) return;
		var ctype;
		//Pega o tipo de objeto//
		try{ctype = self.objmsg.type.toLowerCase();}
		catch(e){ctype = 'other';}
		//Verifica se é do tipo texto para apagar prop value//
		if((ctype == 'text')||(ctype == 'textarea'))
			self.objmsg.value = "";
		//verifica se é do tipo select para apagar o primeiro option//
		else if (ctype == 'select-one'){
			if(self.objmsg.options.length > 0){
				self.objmsg.options[0].text = "";
				self.objmsg.remove(0);
				//self.objmsg.options[0] = null;
			}
		}
		else{
			try{self.setCount(99);}
			catch(e){}
			eval("setTimeout(function(){self.clearHtml();}, 200)");
		}			
	}
	
	/*Limpa o html do objeto onde está sendo mostrada a mensagem com a barra de progresso*/
	this.clearHtml = function(){
	    try{self.objmsg.innerHTML = "";}
	    catch(e){};
	}
	
	/* Limpa todos os objetos inseridos na matriz de objetos e campos */ 
	this.clearDados = function(){
		if(self.fieldArray[0] == null) return;
		var ctype, i;
		//Faz para todos os objetos inseridos na matriz//
		for(i=0; i<self.fieldArray.length; i++){
			//Pega o tipo de objeto//
			try{ctype = self.fieldArray[i][1].type.toLowerCase();
			}catch(e){ctype = 'other';}
			//Se for do tipo texto, limpa a propriedade value//
			if((ctype == 'text')||(ctype == 'textarea'))
				self.fieldArray[i][1].value = "";
			//Se for do tipo select apaga todas as options//
			else if (ctype == 'select-one'){
				if(self.fieldArray[i][1].options.length > 0){
					for(j=self.fieldArray[i][1].options.length; j>=0; j--)
						self.fieldArray[i][1].options[j] = null;
				}
			}
			else{
				try{self.fieldArray[i][1].innerHTML = "";}
				catch(e){};
			}
		}
	}
	
	/* Função que irá rodar numa thread e preencher os dados para os campos txt */
	this.setDataInTXT = function(field, sizeRS){
		var times, j, aux, indice;
		aux = ""	
		//verifica quantos registros devem ser retornados para o objeto. Caso "0" retorna todos//
		times = (self.fieldArray[field][2] == 0)?sizeRS:self.fieldArray[field][2];
		for(j=0; j<times; j++){
			indice = (self.fieldArray[field][4] != null)?self.fieldArray[field][4]:j;
			aux += self.getRS(self.fieldArray[field][0], indice);
		}
		
		self.fieldArray[field][1].value = (aux == "null")?"":aux;
		
		if(self.execafter) EXEC_AFTER();
	}
	
	/* Função que irá rodar numa thread e preencher os dados para os objetos que trabalham com a prop innerHTML */
	this.setDataInHTML = function(field, sizeRS){
		var times, j, indice, aux="";
		//verifica quantos registros devem ser retornados para o objeto. Caso "0" retorna todos//
		times = (self.fieldArray[field][2] == 0)?sizeRS:self.fieldArray[field][2];
		for(j=0; j<times; j++){
			indice = (self.fieldArray[field][4] != null)?self.fieldArray[field][4]:j;
			aux += self.getRS(self.fieldArray[field][0], indice);
		}
		self.fieldArray[field][1].innerHTML = (aux == "null")?"":aux;
		
		if(self.execafter) EXEC_AFTER();
	}
	
	/* Função que irá rodar numa thread e preencher os dados para os campos radio */
	this.setDataInRADIO = function(field){
		if( self.form != null ){
			var times, j, objeto, indice;
			objeto = eval("document." + self.form.name + "." + self.fieldArray[field][1].name);
			indice = (self.fieldArray[field][4] != null)?self.fieldArray[field][4]:0;  
			if(self.fieldArray[field][3] == 'checked'){
				times = objeto.length;
				for(j=0; j<times; j++){
					if(objeto[j].value == self.getRS(self.fieldArray[field][0], indice)){
						objeto[j].click();
						break;
					}
				}
			}
		}
		else{
			/*  Coloca uma mensagem de erro de codigo 05 - Não foi especificado um FORM */
			setMessage("ERRO Cod 05");	
		}
		if(self.execafter) EXEC_AFTER();
	}
	
	/* Função que irá rodar numa thread e preencher os dados para os campos checkbox */
	this.setDataInCHKBOX = function(field){
		if(self.fieldArray[field][3] == 'checked'){
			var indice = (self.fieldArray[field][4] != null)?self.fieldArray[field][4]:0;
			var aux = self.getRS(self.fieldArray[field][0], indice).toLowerCase();
			
			if((aux == "true") || (aux == "1") || (aux == "sim")){
				self.fieldArray[field][1].checked = true;
			}
			else{
				self.fieldArray[field][1].checked = false;
			}
		}
		
		if(self.execafter) EXEC_AFTER();
	}
	
	/* Função que irá rodar numa thread e preencher os dados para os campos select */
	this.setDataInSELECT = function(field, sizeRS){
		var j, times, OP, init;
		
		init = 0;
		if(self.ex_firstop){
			for(j=0; j<self.fieldArray[field][1].options.length; j++){
				if(self.fieldArray[field][1].options[j].value == 0){
					self.fieldArray[field][1].options[j].text = self.text_firstop;		
					break;
				}
			}
			init = 1;
		}
		//Ja existem opções criadas no combo//
		if(self.fieldArray[field][1].options.length > 0){
			if(self.fieldArray[field][3] == 'value'){
				for(j=init; j<self.fieldArray[field][1].options.length; j++)
					self.fieldArray[field][1].options[j].value = self.getRS(self.fieldArray[field][0], j-init); 
			}
			else if(self.fieldArray[field][3] == 'options'){
				for(j=init; j<self.fieldArray[field][1].options.length; j++)
						self.fieldArray[field][1].options[j].text =  self.getRS(self.fieldArray[field][0], j-init); 
			}
		}
		//Não existem opções criadas no combo//
		else{
			//verifica quantos registros devem ser retornados para o objeto. Caso "0" retorna todos// 
			times = (self.fieldArray[field][2] == 0)?sizeRS:self.fieldArray[field][2];

			if((self.ex_firstop)&&(!self.firstop)){
				self.firstop = true;
				OP = document.createElement("OPTION");
				OP.value = 0;
				OP.selected = true;
				try{self.fieldArray[field][1].add(OP);}
				catch(e){self.fieldArray[field][1].options.add(OP);}
			}
	
			for(j=0; j<times; j++){
				OP = document.createElement("OPTION");
								
				if(self.fieldArray[field][3] == 'options'){
					OP.text = self.getRS(self.fieldArray[field][0],j);
					OP.value = j
				}
				else if(self.fieldArray[field][3] == 'value'){
					OP.value = self.getRS(self.fieldArray[field][0],j);
					OP.text = j
				}
				//Adiciona a opção no combo//
				try{self.fieldArray[field][1].add(OP);}
				catch(e){self.fieldArray[field][1].options.add(OP);}
			}
		}
					
		if(self.execafter) EXEC_AFTER();
	}
	
	/* Função que irá rodar numa thread e preencher os dados para os campos de um objeto que deverá receber um fragmento de html */
	this.setHtmlInHTML = function(){
		try{self.fieldArray[0][1].innerHTML = self.getRESPONSE();}
		catch(e){}
		
		if(self.execafter) EXEC_AFTER();
	}
	
	/* Preenche os valores retornados no atributo response, pela função callback, para os campos adicionados
	na matriz de objetos e campos */
	this.setDataInFields = function(){
		if(self.fieldArray[0] != null){
			var ctype, i, sizeArrayValues, j, times, part;
			/* Pega o tamanho do vetor de dados encontrados pela REG */
			sizeArrayValues = self.getRecordCount();
			/* Pega o valor necessário para incrementar n abarra de progresso*/
			part = Math.ceil(60/self.getSizefieldArray());
			if(part < 1) part = 1;
			/* Apaga os dados dos objetos inseridos na matriz*/
			self.clearDados();
			//Faz para todos os objetos inseridos na matriz//
			for(i=0; i<self.getSizefieldArray(); i++){
				//Pega o tipo de objeto//
				try{ctype = self.fieldArray[i][1].type.toLowerCase();}
				catch(e){ctype = 'other';}
				//Preenche os campos de texto e hidden pois possuem a propriedade value//
				if((ctype == 'text')||(ctype == 'textarea')||(ctype == 'hidden')){
					if(self.execsincrono){
					    self.setDataInTXT(i,sizeArrayValues); 
					    if(self.progress) self.incrCount(part); 
					    else self.incrProgress(part);
					}
					else
					    eval("setTimeout(function(){self.setDataInTXT(" + i + "," + sizeArrayValues + ");if(self.progress) self.incrCount(" + part + "); else self.incrProgress(" + part + ");},10)");
				}	
				//Preenche os campos de select, combobox//
				else if (ctype == 'select-one'){
					if(self.execsincrono){
					    self.setDataInSELECT(i,sizeArrayValues); 
					    if(self.progress) self.incrCount(part); 
					    else self.incrProgress(part);
					}
					else
					    eval("setTimeout(function(){self.setDataInSELECT(" + i + "," + sizeArrayValues + "); if(self.progress) self.incrCount(" + part + "); else self.incrProgress(" + part + ");},10)");
				}
				//Preenche os campos de radiobutton//
				else if (ctype == 'radio'){
					if(self.execsincrono){
					    self.setDataInRADIO(i); 
					    if(self.progress) self.incrCount(part); 
					    else self.incrProgress(part);
					}
					else
					    eval("setTimeout(function(){self.setDataInRADIO(" + i + "); if(self.progress) self.incrCount(" + part + "); else self.incrProgress(" + part + ");},10)");					
				}
				//Preenche os campos de checkbox//
				else if (ctype == 'checkbox'){
					if(self.execsincrono){
					    self.setDataInCHKBOX(i); 
					    if(self.progress) self.incrCount(part); 
					    else self.incrProgress(part);
					}
					else
					    eval("setTimeout(function(){self.setDataInCHKBOX(" + i + "); if(self.progress) self.incrCount(" + part + "); else self.incrProgress(" + part + ");},10)");
				}
				//Preenche os campos de innerHTML//
				else{
					if(self.execsincrono){
					    self.setDataInHTML(i,sizeArrayValues); 
					    if(self.progress) self.incrCount(part); 
					    else self.incrProgress(part);
					}
					else
					    eval("setTimeout(function(){self.setDataInHTML(" + i + "," + sizeArrayValues + "); if(self.progress) self.incrCount(" + part + "); else self.incrProgress(" + part + ");},10)");
				}
			}
			
			if(self.execsetdata) setTimeout("EXEC_AFTER_SETDATA()", 10*self.getSizefieldArray());
		}
		else{
			/*  Coloca uma mensagem de erro de codigo 06 - Não foi especificado um campo para resultados */
			self.setMessage("ERRO cod 06");		
		}
	}

	/* Preenche o fragmento de html retornado, no objeto inserido na matriz de dados */
	this.setHtmlInFields = function(){
		if(self.fieldArray[0] != null){ 
			var part;
			part = Math.ceil(60/self.getSizefieldArray());
			
			if(self.execsincrono)
			    self.setHtmlInHTML();
			else
			    setTimeout(self.setHtmlInHTML, 10);
			    
			if(self.progress) self.incrCount(part);
			else self.incrProgress(part);
		}
		else{
			/*  Coloca uma mensagem de erro de codigo 06 - Não foi especificado um campo para resultados */
			self.setMessage("ERRO cod 06");	
		}
	}
	
	this.incrProgress = function(prcnt){
		self.loaded += prcnt;
		if(self.loaded>=60)setTimeout(self.hidebar, 200);
	}
	
	/* Função chamada a cada mudança de estado na requisição */
	this.callback = function(){
		var state, status;

		try{state = self.objhttp.readyState;}
		catch(e){state = -1;}
		
		if(state==1){
			if((self.progress)&&(self.state<1)){ 
				self.incrCount(25);
				self.state++;
			}
		}
		else if(state==2){
			if((self.progress)&&(self.state<2)){ 
				self.incrCount(5);
				self.state++;
			}
		}
		else if(state==3){
			if((self.progress)&&(self.state<3)){ 
				self.incrCount(5);
				self.state++;
			}
		}
		else if (state==4) {
		    
		    try{status = self.objhttp.status;}
		    catch(e){
		        try{status = self.objhttp.status;}
		        catch(ex){status = -1;}
		    }
		
			if (status == 200){
				/* Preenche o valor da resposta no atributo response */
				self.setRESPONSE(unescape(self.objhttp.responseText));
				/* Indica que neste instante os dados ja foram colocados na variável response 
				e a partir deste instante podem ser colocados nos campos destinados*/
				self.setREADY(true);
				/* Dispara o evento onready após 10 milisegundos*/
				setTimeout(self.onready, 10);
				/* Apaga o atributo que tem o ponteiro para o HTTPRequest */
				self.delObjectHttp(self.objhttp);
			}
			else{
				/* Coloca uma menagem de erro codigo 02 - Erro de resposta do servidor / timeout / Servidor retornou erro */
				self.setERROR(self.objhttp.responseText);
				self.setMessage("<a href='javascript:SHOW_TXTERROR(" + self.identifier + ");'>ERRO</a> cod 02 STATUS cod " + status);
				
			}
			if((self.progress)&&(self.state<4)){ 
				self.incrCount(10);
				self.state++;
			}
		}
		else{
		    /*  Coloca uma mensagem de erro de codigo 02 - Erro de resposta do servidor / timeout / Servidor retornou erro */
			self.setERROR(self.objhttp.responseText);
			self.setMessage("<a href='javascript:SHOW_TXTERROR(" + self.identifier + ");'>ERRO</a> cod 02 STATE -1");		
		}
	}
		
	//executa a função de requisição de página, dependendo do método escolhido é preciso enviar os parâmetros//
	this.OPEN = function (type){
		if(self.url != null){
			self.objhttp = new self.getObjectHttp();
			if(self.objhttp){
				
				if(type == null) type = "GET";
				
				var t_date = new Date();
				var t_nocache = "";
				t_nocache += t_date.getHours();
			  	t_nocache += t_date.getMinutes();
				t_nocache += t_date.getSeconds();
				t_nocache += t_date.getMilliseconds();
				
				if(type == "GET"){
					
					self.url += (self.url.indexOf("?")>0)?"&nocache="+t_nocache:"?nocache="+t_nocache;
					 	
					self.objhttp.open("GET", self.url, true);
					self.objhttp.onreadystatechange=self.callback;
					self.objhttp.setRequestHeader("Cache-Control", "no-store, no-cache, must-revalidate");
					self.objhttp.setRequestHeader("Cache-Control", "post-check=0, pre-check=0");
					self.objhttp.setRequestHeader("Pragma", "no-cache");
					self.objhttp.send(null);
				}
				else if(type == "POST"){
				
					self.parameters += "&nocache="+t_nocache;
					
					self.objhttp.onreadystatechange=self.callback;
					self.objhttp.open('POST',self.url,true);
					//self.parameters = encodeURI(self.parameters);
					self.parameters = escape(self.parameters);
					self.objhttp.setRequestHeader("Content-type", "text/html;application/x-www-form-urlencoded;charset=iso-8859-1");
					self.objhttp.setRequestHeader("Content-length", self.parameters.length);
					self.objhttp.setRequestHeader("Cache-Control", "no-store, no-cache, must-revalidate");
					self.objhttp.setRequestHeader("Cache-Control", "post-check=0, pre-check=0");
					self.objhttp.setRequestHeader("Pragma", "no-cache");
					self.objhttp.setRequestHeader("Connection", "close");
					self.objhttp.send(self.parameters);	
				}
			}
			else{
				/*  Coloca uma mensagem de erro de codigo 01 - Erro na criação do objeto AJAX */
				self.setMessage("ERRO cod 01");	
			}
		}
		else{
			/*  Coloca uma mensagem de erro de codigo 04 - Não foi especificada uma URL */
			self.setMessage("ERRO cod 04");	
		}
	}
	
	//Obtem os valores dos campos e coloca-os nos objetos destinados//
	this.PUTPAGE = function (){
		if(self.url != null){
			self.objhttp = new self.getObjectHttp();
			if(self.objhttp){
                self.objhttp.onreadystatechange=self.callback;
                self.objhttp.open('POST',self.url,true);
                //self.parameters = encodeURI(self.parameters);
                self.parameters = escape(self.parameters);
	            self.objhttp.setRequestHeader("Content-type", "text/html;application/x-www-form-urlencoded;charset=iso-8859-1");
	            self.objhttp.setRequestHeader("Content-length", self.parameters.length);
	            self.objhttp.setRequestHeader("Cache-Control", "no-store, no-cache, must-revalidate");
	            self.objhttp.setRequestHeader("Cache-Control", "post-check=0, pre-check=0");
	            self.objhttp.setRequestHeader("Pragma", "no-cache");
	            self.objhttp.setRequestHeader("Connection", "close");
	            self.objhttp.send(self.parameters);
			}
			else{
				/*  Coloca uma mensagem de erro de codigo 01 - Erro na criação do objeto AJAX */
				self.setMessage("ERRO cod 01");	
			}
		}
		else{
			/*  Coloca uma mensagem de erro de codigo 04 - Não foi especificada uma URL */
			self.setMessage("ERRO cod 04");	
		}
	}
	
	//Função que captura todos os valores dos objetos de um form, e retorna como uma string do tipo querystring//
	this.getInputsForm = function(){
	    var i, idfield, namefield, nameform, poststr="", cont=0;
        nameform = self.form.name;
        
        //Faz um FOR de acordo com o número de objetos presentes no form//	
	    for(i=0; i<self.form.length; i++){
		    
		    //obtem o tipo de objeto que está sendo avaliado//
		    ctype = self.form[i].type;
		    ctype = ctype.toLowerCase();
    		
    		//Verifica se este objeto é de um tipo que pode conter valores//
		    if((ctype != "button") && (ctype != "submit") && (ctype != "file") && (ctype != "image") && (ctype != "reset")){
			    
			    //Pega o id do objeto//
			    idfield = self.form[i].id;
			    //Pega o nome do objeto//
			    namefield = self.form[i].name;
    			
    			//Verifica se o objeto é do tipo radio//
			    if( ctype == "radio" ){
				    obj = eval("document." + nameform + "." + namefield + "[" + cont + "]");			
				    if(obj.checked){
					    if(poststr != "") poststr += "&";
					    //poststr += idfield + "=" + encodeURI(obj.value);					
					    poststr += idfield + "=" + obj.value;					
				    }
				    cont++;
			    }
			    //Verifica se o objeto é do tipo checkbox//
			    else if(ctype == "checkbox"){
				    if(poststr != "") poststr += "&";
				    //poststr += idfield + "=" + encodeURI(document.getElementById(idfield).checked);					
				    poststr += idfield + "=" + document.getElementById(idfield).checked;					
				    cont=0;
			    }
			    //Para objetos do tipo select: será capturado o Value do item selecionado//
			    //Para objetos de tipo texto: será capturado o texto//
			    else{
				    if(document.getElementById(idfield).value != ""){
					    if(poststr != "") poststr += "&";
					    //poststr += idfield + "=" + encodeURI(document.getElementById(idfield).value);
					    poststr += idfield + "=" + document.getElementById(idfield).value;
				    }
				    cont=0;
			    }
		    }
	    }		
        //Retorna uma string do tipo querystring para ser enviada por post//           
	    return poststr; 
    }
		
	/* Função para criar e retornar o objeto HTTPREQUEST  de acordo com o browser*/
	this.getObjectHttp = function() {
		var m_xmlhttp, success;
		try {m_xmlhttp = new XMLHttpRequest();} 
		catch (e){
	            success = false;
	            var MSXML_XMLHTTP_PROGIDS = new Array(
	                'MSXML2.XMLHTTP',
			        'Microsoft.XMLHTTP',
	                'MSXML2.XMLHTTP.5.0',
	                'MSXML2.XMLHTTP.4.0',
	                'MSXML2.XMLHTTP.3.0'
	            );
	            for(var i=0;i < MSXML_XMLHTTP_PROGIDS.length && !success; i++) {
	                try{m_xmlhttp = new ActiveXObject(MSXML_XMLHTTP_PROGIDS[i]); success = true;}
	                catch (e){m_xmlhttp = null;}
	            }
	        }
	        return m_xmlhttp;
	}
	
	/* Função para apagar o objeto HTTPREQUEST */
	this.delObjectHttp = function(obj){
		if(obj) delete(obj);
	}
	
	////////////////////////////////////////
	//EVENTOS
	///////////////////////////////////////
	/* Evento ONREADY */
	this.onready = function(){
		self.setRS();
		eval("ONREADY_" + self.getID() + "(self)");
	}
	
	///////////////////////////////////////
	//FUNÇÕES BARRA DE PROGRESSO
	///////////////////////////////////////
	// Percent Bar - Version 1.0
	// Author: Brian Gosselin of http://scriptasylum.com
	// Script featured on http://www.dynamicdrive.com
	// Note: Modified by Dynamicdrive so incr/decrCount() accepts any percentage
	// Note: Modified by Renato César Galiciano Ramos
	 
	/*Inicia a progress bar com a mensgem na frente*/
	this.progressBarInit = function(obj, msg, wnd, type){
		try{obj.innerHTML=self.createBAR(self.identifier, msg, type);}
		catch(e){}
		
		if(wnd == "parent"){
		    self.perouter=window.parent.document.getElementById('perouter'+self.identifier);
		    self.perdone=window.parent.document.getElementById('perdone'+self.identifier);
		}
		else{
		    self.perouter=document.getElementById('perouter'+self.identifier);
		    self.perdone=document.getElementById('perdone'+self.identifier);
		}
		    
		self.clipid(self.perdone, 0, 0, self.barheight-2, 0);
		self.perouter.style.visibility = "visible";
		self.setCount(0);
	}
	
	/*Retorna o código da progress bar*/	
	this.createBAR = function(ID, MSG, TYPE){
		var txt='', txtmsg='';
		txtmsg=(TYPE == 1)?"<BR><BR>" + MSG + "<BR><BR>":MSG;
		txt+='<table cellpadding=0 cellspacing=0 border=0 style="border:lightgrey 1px solid; background-color:#FFFFFF;">';
		txt+='<tr name="bar' + ID + '" id="bar' + ID + '" height=23><td style="width:5px;"></td><td style="font-size:11px;font-family:Tahoma,Arial,SansSerif,Verdana;color:#444444;vertical-align:middle;">' + txtmsg + '</td><td style="width:5px;"></td><td>';
		txt+='<div id="perouter' + ID + '" onmouseup="hidebar()" style="position:relative; visibility:hidden; background-color:' + self.bordercolor + '; width:' + self.barwidth + 'px; height:' + self.barheight + 'px;">';
		txt+='<div style="position:absolute; top:1px; left:1px; width:' + (self.barwidth-2) + 'px; height:' + (self.barheight-2) + 'px; background-color:' + self.unloadedcolor + '; z-index:100; font-size:1px;"></div>';
		txt+='<div id="perdone' + ID + '" style="position:absolute; top:1px; left:1px; width:0px; height:' + (self.barheight-2) + 'px; background-color:' + self.loadedcolor + '; z-index:100; font-size:1px;"></div>';
		txt+='</div></td><td style="width:5px;"></td></tr></table>';
			
		return txt;
	}
	/*Incrementa a barra de progresso*/
	this.incrCount = function(prcnt){
		self.loaded += prcnt;
		self.setCount(self.loaded);
	}
	/*Decrementa a barra de progresso*/
	this.decrCount = function(prcnt){
		self.loaded -= prcnt;
		self.setCount(self.loaded);
	}
	/*Seta a barra de progresso para um valor específico*/
	this.setCount = function(prcnt){
		self.loaded=prcnt;
		if(self.loaded<0)self.loaded=0;
		else if(self.loaded>=100)self.loaded=100;
		self.clipid(self.perdone, 0, self.blocksize*self.loaded, self.barheight-2, 0);
	}
	/*Esconde a barra de progresso*/
	this.hidebar = function(){
		try{document.getElementById("bar" + self.identifier).style.display = 'none';}
		catch(e){};
	}
	/*Muda, graficamente o tamanho da barra */
	this.clipid = function(id,t,r,b,l){
		id.style.width=r;
		if( self.loaded == 100 )setTimeout(self.hidebar, 200);
	}
			
	//Chamando o construtor da classe RequestData
	this.constructor();
}

//Eventos

//Deve se construir esta função na página que esta utilizando a classe.
//Esta função é utilizada para disparar eventos após retornado o conteudo da página URL 
//O número após o "_" indica o identificador do objeto. Este identificador é passado no contrutor da classe

//////////////////////////
//function ONREADY_1(){}
//////////////////////////

//////////////////////////
//function EXEC_AFTER(){}
//////////////////////////

function DELETE(obj){
	if( obj )delete(obj);
}



