// global request and XML document objects
var xmlHttp;

// Metodo que sera utilizado na requisicao pelo xml http request
var XML_LOAD_TYPE = "POST";	

// Pilha de requisicoes ajax
arrGlobalStackXmlRequest = Array();

// Singletoon
globalBoolOnLoadXMLDoc = false;

// Flag para carregamento de dados via ajax
var AJAX_LOADED = true;

function checkAjaxLoaded( strUrl )
{
	if ( AJAX_LOADED == false ) {
		return;	
	} else {
		eval( strUrl );
	}
}

/**
 * Funcao que converte os campos nao triviais (tais como objetos e array) 
 * do array de parametros a serem enviados em objetos xml e prepara a chamada
 * da funcao ajaxFunctionExec no servidor.
 *
 * @param			strUrlDest			String referente a URL
 * @param			arrParameters 	Parametros Enviados ao Servidor
 * @param			funcAfterDo		Funcao ou string do Nome Metodo que sera chamado apos a requisicao 
 * @example 	ajaxFunctionExec( "banco.asp" ,  new Array( elementId, estadoNovo ) , refreshMenu );
 * @return 			void
 */
function ajaxFunctionExec( strUrlDest , arrParameters , funcAfterDo )
{
	var arrParam = new Array();
	arrParam[ arrParam.length ] = strUrlDest;
	for ( var i = 0 ; i < arrParameters.length ; ++i )
	{
		if ( isObject( arrParameters[ i ] ) )
		{
			if (!arrParameters[ i ].asXml )
			{
				var objXml = varDump( arrParameters[ i ] );
				arrParam[ arrParam.length ] = objXml.asXml();			
			}
			else
			{
				var objXml = arrParameters[ i ];
				arrParam[ arrParam.length ] = objXml.asXml();
			}
		}
		else
		{
			arrParam[ arrParam.length ] = arrParameters[ i ];
		}
	}
	
	var objRequest = Array();
	objRequest[0] = strUrlDest;
	objRequest[1] = arrParam;
	objRequest[2] = funcAfterDo;
	objRequest[3] = arrParameters;	

	arrGlobalStackXmlRequest[ arrGlobalStackXmlRequest.length ] = ( objRequest );
	singletonLoadXMLDoc();
}

function singletonLoadXMLDoc()
{
	if ( globalBoolOnLoadXMLDoc == true )
	{
		return false;
	}
	globalBoolOnLoadXMLDoc = true;
	loopLoadXMLDoc();
	return true;
}

function loopLoadXMLDoc()
{
	if ( arrGlobalStackXmlRequest.length == 0 )
	{
		globalBoolOnLoadXMLDoc = false;
		AJAX_LOADED = true;
		return false;
	}
	
	AJAX_LOADED = false;
	var objRequest = arrGlobalStackXmlRequest.shift();
	loadXMLDoc( objRequest[0]	 ,  objRequest[1]  , objRequest[2] , objRequest[3] );
	return false;
}

/**
 * Funcao que efetua a requisicao para o servidor, aguarda o xml de retorno e chama a funcao indicada 
 * apos o retorno enviando os dados adquiridos.
 */
function loadXMLDoc( strUrl , arrServerFunctionArguments , funcJavascriptAfterLoad , arrParameters )
{
    var xmlResult;
    var txtResult;
    
	funcLoading = function() 
	{ 
		if ( xmlHttp.readyState == 4 )
		{
			// loaded //			
			if ( xmlHttp.status == 200 )
			{
				// case OK				
				try
				{
					xmlResult = xmlHttp.responseXML;
                }
                catch( objError )
                {
                	xmlResult = "" ;
                }
                              
				try
				{
					txtResult = xmlHttp.responseText.substring(2);
                }
                catch( objError )
                {
                	txtResult = "";
                }
                
				if ( funcJavascriptAfterLoad == undefined )
				{
					strFuncJavascriptAfterLoad = "afterLoad" + strUrl.substring( 0, strUrl.indexOf( "." ) );
					strCommand = (strFuncJavascriptAfterLoad + "(txtResult,xmlResult,arrParameters);" );
					
					eval(strCommand);
					loopLoadXMLDoc();
				}
				else
				{               
					if ( !isFunction(funcJavascriptAfterLoad) )
	                {
	                loopLoadXMLDoc();
					    return false;
	                }
					else
					{	
						/*
						 * Cache de objetos serializados retornados no XML
						 */
						if( xmlResult != undefined )
						{
							var arrCacheSerial = xmlResult.getElementsByTagName( "xmlcacheserial" );
							for( var a = 0 ; a < arrCacheSerial.length ; ++a )
							{
								var arrCacheSerialData = arrCacheSerial[ a ].childNodes;
								var intCountCache = 0;
								for( var b = 0 ; b < arrCacheSerialData.length ; ++b )
								{
									if( arrCacheSerialData[ b ].nodeType == 1 )
									{
										var arrAttributes = arrCacheSerialData[ b ].attributes;
										if( arrAttributes.item( 0 ) != undefined )
										{
											++intCountCache;
											if( document.getElementById( "xmlcacheserial" + intCountCache ) == undefined )
											{
												var objInputHiddenCacheSerial = document.createElement( "INPUT" );
												objInputHiddenCacheSerial.setAttribute( "type" , "hidden" );
												objInputHiddenCacheSerial.setAttribute( "id" , "xmlcacheserial" + intCountCache );
												objInputHiddenCacheSerial.setAttribute( "name" , "xmlcacheserial" + intCountCache );
												objInputHiddenCacheSerial.value = arrAttributes.item( 0 ).value;
											}
										}
									}
								}
							}
						}
						
						//funcJavascriptAfterLoad( txtResult,xmlResult,arrParameters );
						funcJavascriptAfterLoad( arrParameters );
	
                		loopLoadXMLDoc();
                	}
				}
			}
			else
			{
				// case error
				loopLoadXMLDoc();
				return true;
			}
		}
		else
		{
			// loading //
		}
	};

	// 1. MAKING THE COMMAND LINE TO SEND THE ARGUMENTS TO THE SERVER FUNCTION
	
	strUrlParameters = "";
	var strPostData = "";
	if ( XML_LOAD_TYPE == "GET" ) 
	{
		for ( var i = 0; i < arrServerFunctionArguments.length; ++i ) 
		{
			strUrlParameters = strUrlParameters + "&rsargs[]=" + escape( arrServerFunctionArguments[ i ] );
		}
			
		strUrlParameters = strUrlParameters + "&rsrnd=" + new Date( ).getTime( );
		
		strPostData = null;
	} 
	else 
	{	
		for ( var i = 0; i < arrServerFunctionArguments.length; i++ ) 
		{
			strPostData = strPostData + "&rsargs[]=" + escape( arrServerFunctionArguments[ i ] );
		}
	}
	
	// 2. URL OF THE ACTION //
	
	if ( ( strUrl == undefined ) || ( strUrl == "" ) )
	{
		strUrl = window.location;
	}
	
	// N. CREATING THE XML HTTP REQUEST

//	if (varGlobalCPFTeste == '35858206115')
//		alert( strUrl ); 

	var objXmlRequest = xmlRequest( );

	xmlHttp.open( XML_LOAD_TYPE , strUrl , true );
	
	objXmlRequest.setRequestHeader( "Cache-Control", "no-store, no-cache, must-revalidate");        
    objXmlRequest.setRequestHeader( "Pragma", "no-cache");
	if ( XML_LOAD_TYPE == "POST" ) 
	{
		objXmlRequest.setRequestHeader( "Method", "POST " + strUrl + strUrlParameters + " HTTP/1.1" );
		objXmlRequest.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
        objXmlRequest.setRequestHeader( "Cache-Control", "post-check=0, pre-check=0");
	}
	
	xmlHttp.onreadystatechange = funcLoading;
	xmlHttp.send( strPostData );	
}

function simpleLoadXmlDoc( strUrl , funcJavascriptAfterLoad )
{
	loadXMLDoc( strUrl , Array( ) , funcJavascriptAfterLoad );
}

// Gera o objeto Xml Http Request conforme o sistema operacional do usuario
function xmlRequest()
{
	// Mozilla, etc
	if ( window.XMLHttpRequest )
	{
		xmlHttp = new XMLHttpRequest()
		return xmlHttp;
	}
	// Somente IE
	else if ( window.ActiveXObject )
	{
		xmlHttp = new ActiveXObject( "Microsoft.XMLHTTP" )
		if ( xmlHttp )
		{
		return xmlHttp;
		}
	}
	return null;
}
