var debug=true;

/** 
 * Classe de manipulação de eventos Ajax
 * 
 * @class		Ajax
 * 
 * @author 		Thiago Zaranza 
 * @version 	9.03.22
 * 
 * @throws 		nsfcErro.js
 * @requires 	xml2json.js
 * 
 */
function Ajax()
{
this.referenciaModulo=null;
this.url=null;
this.dados=null;
this.modoSincronizacao='false';
this.callback=null;
this.parametros=null;
this.funcaoErro=null;
this.useJSON=true;
}

Ajax.prototype.referenteAObjeto=function(objeto)
{
this.referenciaModulo=objeto;
return this;
};

Ajax.prototype.comUrl=function(url)
{
this.url=url;
return this;
};

Ajax.prototype.comDados=function(dados)
{
this.dados=dados;
return this;
};

Ajax.prototype.sincrono=function()
{
this.modoSincronizacao='false';
return this;
};

Ajax.prototype.assincrono=function()
{
this.modoSincronizacao='true';
return this;
};

Ajax.prototype.json=function()
{
this.useJSON=true;
return this;
};

Ajax.prototype.xml=function()
{
this.useJSON=false;
return this;
};

Ajax.prototype.usandoFuncaoResposta=function(funcao)
{
this.callback=funcao;
return this;
};

Ajax.prototype.disparar=function()
{
try
{	
if (this.url==null)
	throw("Erro ao disparar ajax! URL não setada.");

if (this.dados==null)
	throw("Erro ao disparar ajax! Dados não setados.");

if (this.callback==null)
	throw("Erro ao disparar ajax! Função resposta não setada.");

var funcaoResposta=this.callback;

while (this.dados.indexOf("&&")>0)
	this.dados=this.dados.replace("&&","&");	

var requisicao=this.iniciarRequisicao();
var referenciaObjeto=this;

requisicao.onreadystatechange=function()
	{		
	referenciaObjeto.funcaoResposta(requisicao);	
	};
	
requisicao.open("POST",this.url,this.modoSincronizacao);
requisicao.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=utf-8'); 		
requisicao.setRequestHeader('Content-length',this.dados.length); 
requisicao.send(this.dados);
}
catch (e)	
	{
	new Erro(e).exibir();
	}
};

/** 
 * Inicia a requisição
 * 
 * @param		referenciaModulo		{resource}	Referencia do objeto do módulo.
 * @param		url						{string}	Url script que receberá a requisição.
 * @param		dados					{string}	Parametros que são passados na requisição.
 * @param		modoSincronizacao		{string}	'true' para requisição assíncrona, 'false' para requisição síncrona.
 * @param		funcaoResposta			{string}	Nome da função de callback. 
 * @param		parametros				{string}	
 * @param		funcaoErro				{function}	Função que será acionada em caso de erro.
 * 	
 */
Ajax.prototype.requisicao=function(referenciaModulo,url,dados,modoSincronizacao,funcaoResposta,parametros,funcaoErro,useJSON)
{
this.referenciaModulo=referenciaModulo;
this.url=url;
this.dados=dados;
this.modoSincronizacao=modoSincronizacao;
this.callback=funcaoResposta;
this.parametros=parametros;

if (useJSON!=undefined)
	this.useJSON=useJSON;
	else
	this.useJSON=true;	

if (this.funcaoErro!=undefined)
	this.funcaoErro=funcaoErro;

while (this.dados.indexOf("&&")>0)
	this.dados=this.dados.replace("&&","&");	

var requisicao=this.iniciarRequisicao();
var referenciaObjeto=this;

requisicao.onreadystatechange=function()
{	
try
{		
referenciaObjeto.funcaoResposta(requisicao);	
}
catch (e)	
	{
	new Erro(e).exibir('Ajax.requisicao('+referenciaModulo+', '+url+', '+dados+', '+modoSincronizacao+', '+funcaoResposta+', '+parametros+', '+funcaoErro+')');
	}
};
	
requisicao.open("POST",this.url,this.modoSincronizacao);
requisicao.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=utf-8'); 		
requisicao.setRequestHeader('Content-length',this.dados.length); 
requisicao.send(this.dados);
};

/**
 * 
 * @return
 */
Ajax.prototype.iniciarRequisicao=function()
{
var requisicaoHandler;

try
{
requisicaoHandler=new ActiveXObject("Msxml2.XMLHTTP");
}
catch(e1)
	{
   	try
	{
	requisicaoHandler=new ActiveXObject("Microsoft.XMLHTTP");
	}
	catch(e2)
		{
		requisicaoHandler=false;
	    }
	}

if  (!requisicaoHandler && typeof XMLHttpRequest!="undefined")
	{
    try
   	{
	requisicaoHandler=new XMLHttpRequest();
	}
	catch(e3)
    	{
        requisicaoHandler=false ;
   		}
	}

return requisicaoHandler;
};

/** 
 *
 *
 */
Ajax.prototype.funcaoResposta=function(requisicao)
{
if (this.verificarStatusRequisicao(requisicao))
	{	
	var resposta=null;	
	if (this.useJSON)
		resposta=xml2json.parser(requisicao.responseText);
		else
		resposta=requisicao.responseText;
	
	if (this.callback!=undefined && this.callback!="")		
		if (window[this.callback])
			window[this.callback](resposta,this.parametros);
			else if (this.referenciaModulo[this.callback])			
				this.referenciaModulo[this.callback](resposta,this.parametros);			
				else
				throw('Função resposta <'+this.callback+'> não encontrada!');		
	}

return false;
}; 

/**
 * 
 * @param requisicao
 * @return
 */
Ajax.prototype.verificarStatusRequisicao=function(requisicao)
{
if (requisicao.readyState==4)
	{
	if (requisicao.status==200)
		return true;
		else
		throw("Erro interno ao exibir os registros: "+requisicao.status);
	}
return false;
};