// Adaptação do script oyXMLRPC.js
//
//  Copyright 2005, Pavel Simakov, 
//  http://www.softwaresecretweapons.com
//
//
function ServerRequest () 
{	
	var status = null;
   var noCache = '?noCache=' + (new Date()).getTime();
	var url = null;	
	var req = null;
	var msgCount = 0;	
	var nIndex = 0;
	var inProgress = false;
	var isComplete = false;
	var maxLogMsgs = 1000;
	var aFunctions = Array;
	var typeSubmit = 'GET';
   var wSend      = null;

	var STATE_COMPLETED = 4;
	var STATUS_200 = 200;
		
	var oThis = this;
		
	// Diz enquanto está ocupado carregando o arquivo
	var internalIsBusy = function(){
		return inProgress && !isComplete;
	}	
	
	// Função chamada enquanto é carregado o arquivo
	var internalRequestComplete = function() {
		if (!internalIsBusy()) { /* nenhum request foi enviado */	}
		
		if (req.readyState == STATE_COMPLETED) {
			status     = req.status;
			inProgress = false;
			isComplete = true;

			if (status == STATUS_200){
				if(oThis.onComplete){
					oThis.onComplete(req.responseText, req.responseXML);
					oThis.runScripts();
				}
			} else {
				// Erro
			}
		}
	}	
	
	this.getSubmit = function(){
	   return typeSubmit;
	}

	this.setSubmit = function(val){
	   typeSubmit = val.toUpperCase();
	}
	
   this.getSend = function(){
      return wSend;
   }

   this.setSend = function(arrDados){
      wSend = arrDados;
   }

	this.getLastModified= function(){
		return req.getResponseHeader("Last-Modified");
	}
	
	// Chamar está função para verificar se pode ter mais chamadas ou se o request feito já foi finalizado
	this.isBusy = function(){
		return internalIsBusy();
	}		

	//  Enviar um novo request
	this.submit = function(_url){	
		if (internalIsBusy()) { /* processando outro request */ }
		if (_url.indexOf("?") != -1) { noCache = noCache.replace("?","&"); }		
		url        = _url + noCache;	
		status     = null;
		inProgress = true;
		isComplete = false;
		
      if (window.XMLHttpRequest) {
         req = new XMLHttpRequest();
         req.open(typeSubmit, url, true);
         req.onreadystatechange = internalRequestComplete;
         if(wSend){
            req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
            req.setRequestHeader('encoding','ISO-8859-1'); 
            
            req.setRequestHeader("Content-Length", wSend.length);
            req.send(wSend);
         } else
            req.send(null);
      } else {
         
	    	if (window.ActiveXObject) {
   			try {
   			   req = new ActiveXObject('Msxml2.XMLHTTP');
   			} catch (e) {
   			   try {
   			      req = new ActiveXObject('Microsoft.XMLHTTP');
   			   } catch (e) {
   			   
   			   } 
   			}	  
            
		    	if (req) {
               if(wSend) {
                  req.open(typeSubmit, url, true);
                  req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                  req.setRequestHeader('encoding','ISO-8859-1'); 
                  req.setRequestHeader("Content-Length", wSend.length);
                  req.send(wSend);
                  req.onreadystatechange = internalRequestComplete;
               } else{ 
   					req.onreadystatechange = internalRequestComplete;
   					req.open(typeSubmit, url, true);
   					req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); 
   					req.setRequestHeader('encoding','ISO-8859-1');  
   		    	   req.setrequestheader("Pragma","no-cache");
   	   	  	   req.setrequestheader("Cache-control","no-cache");
	      	      req.send();	
               }
				} else {
					// Erro... impossivel criar Microsoft.XMLHTTP
	    	   }
	      } else {
	    	   // Erro... o browser nao suporta XML HTTP Request
	      }
      }
  	   return req;
	}
	
	// essa função é chamada quando é finalizado o request, pode ser sobrescrita
	this.onComplete = function(responseText, responseXML){
		
	}

	this.run = function(fctn){
		aFunctions[nIndex++] = fctn;
	}

	this.runScripts = function(){
		for (i in aFunctions)
			eval(aFunctions[i]);
	}
}
