///////////////////////////////////////////////////////////////
/**
* Constantes relacionadas ? configura??o da requisi??o
*
* Requisition Config Constants
*//////////////////////////////////////////////////////////////
    /**
    *
    * M?todo que ser? utilizado na requisi??o pelo xml http request
    *
    * Method what will be used in the xml http request
    */
	var XML_LOAD_TYPE = "POST";
	
/////////////////////////////////////////////////////////////
/**
 * Constantes das pastas
 * 
 * Folter constants
*//////////////////////////////////////////////////////////////
	/**
	* Pasta da A??o do Xml Request
	*
	* Xml Request Action Folder
	*/
	var FOLDER_ACTION_XMLREQUEST = "../../action/xmlrequest"
	
	/**
	* Nome da A????o do Xml Request
	*
	* Xml Request Action Name
	*/
	var ACTION_NAME_XMLREQUEST = "receiveXmlRequest.php"

/////////////////////////////////////////////////////////////
/**
* Constantes do acesso ao servidor
* 
* Server Acess Constants
*//////////////////////////////////////////////////////////////
	/**
	* Nome da fun??o que est? aguardando a chamada Xml Http Request
	*
	* Function Name how is waiting the Xml Http Request 
	*/
	var SERVER_FUNCTION_NAME = "call_class_action"
	


/**
 * Funcao que recebe as menssagens INTERNAS de erro (fatais ou avisos) e decide o que fazer com as mesmas,
 * mostrar ao usuario ou nao, a forma como mostrara, etc.
 *
 * Function who receive the INTERNAL messages of errors (warnig or fatal) and choice what do with them.
 * As if will be show to the user, how to show, etc.
 *
 * @author		CAIXA
 * @date		17/10/2005
 * @version		1.0
 * @param       Message of Error
 * @package		Xml Request
 * @subpackage	Javascrit Xml Request
 * @return void
 */
function debuggerAlert( strMessage )
{
}

/**
 * Global Vertical Absolute Position of The Table
 * @date 	2005-12-26
 */
arrGlobalStackXmlRequest = Array();

/**
 * Global Singletoon XmlDoc Controler
 * @date 	2005-12-26
 */
globalBoolOnLoadXMLDoc = false;

/**
 * Fun??o que gera o objeto Xml Http Request conforme o sistema operacional do usu?rio
 *
 * @Author		CAIXA
 * @Date			01/11/2005
 * @Version		1.0
 * @package		Xml Request
 * @subpackage	Javascrit Xml Request
 * @return object XMLHttRequest
 */
function xmlRequest()
{
	// code for Mozilla, etc.
	if ( window.XMLHttpRequest )
	{
		xmlHttp = new XMLHttpRequest()
		return xmlHttp;
	}
	// code for IE
	else if ( window.ActiveXObject )
	{
		xmlHttp = new ActiveXObject( "Microsoft.XMLHTTP" )
		if ( xmlHttp )
		{
		return xmlHttp;
		}
	}
	return null;
}

function simpleLoadXmlDoc( strUrl, funcJavascriptAfterLoad, objectJavascriptAfterdo )
{
	loadXMLDoc( strUrl, "", Array( ), funcJavascriptAfterLoad, objectJavascriptAfterdo );
}


/**
 * Fun??o que efetua a requisi??o para o servidor, aguarda o xml de retorno e chama a funcao indicada 
 * ap?s o retorno enviando os dados adquiridos.
 * Os parametros a serem enviados e a ordem dos mesmo est?o de acordo com o esperado pelo SAJAX.
 *
 * @Author		CAIXA
 * @Date			01/11/2005
 * @Version		1.0
 * @package		Xml Request
 * @subpackage	Javascrit Xml Request
 * @return object XMLHttRequest
 */
function loadXMLDoc( strUrl, strFunctionServerName, arrServerFunctionArguments, funcJavascriptAfterLoad, objectJavascriptAfterdo, arrParameters )
{
    var xmlResult;
    var txtResult;
    
	var objectDo;
	if (objectJavascriptAfterdo)
		objectDo = objectJavascriptAfterdo;
		
	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);" );
					
					debuggerAlert( strCommand + " <br/>\n" + txtResult , "receivedXml" );
					
					try{
						eval( strCommand );
					}catch( e )
					{
						document.body.innerHTML += strCommand;
					}
					loopLoadXMLDoc();
				}
				else
				{               
					if (objectDo)
					{
						if ( !isFunction( objectDo[ funcJavascriptAfterLoad ] ) )
						{
						debuggerAlert( "Error after receive the xmlHttpResponse" );
					    debuggerAlert( " unknow method " + funcJavascriptAfterLoad + " in " + objectDo ) ;
						}
						
						debuggerAlert( funcJavascriptAfterLoad + " <br/>\n" + txtResult , "receivedXml" );
						
						objectDo[ funcJavascriptAfterLoad ]( txtResult, xmlResult, arrParameters );
						loopLoadXMLDoc();
					}
	                else if ( !isFunction(funcJavascriptAfterLoad) )
	                {
						debuggerAlert( "Error after receive the xmlHttpResponse" );
					    debuggerAlert( " unknow function " + funcJavascriptAfterLoad ) ;
					    loopLoadXMLDoc();
					    return false;
	                }
					else
					{
						debuggerAlert( funcJavascriptAfterLoad + " <br/>\n" + txtResult , "receivedXml" );
                		funcJavascriptAfterLoad( txtResult, xmlResult, arrParameters );
                		loopLoadXMLDoc();
                	}
				}
			}
			else
			{
				// case error
				debuggerAlert( "Problem retrieving XML data " + strUrl )
				loopLoadXMLDoc();
				return true;
			}
		}
		else
		{
			// loading //
		}
	};
	
	
	// 1. MAKING THE COMMAND LINE TO SEND THE ARGUMENTS TO THE SERVER FUNCTION
	
	strUrlParameters = "";
	if ( XML_LOAD_TYPE == "GET" ) 
	{
		if ( strUrlParameters.indexOf( "?" ) == -1 ) 
		{
			strUrlParameters = strUrlParameters + "?rs=" + escape( strFunctionServerName );
		}
		else
		{
			strUrlParameters = strUrlParameters + "&rs=" + escape( strFunctionServerName );
		}
			
		for ( var i = 0; i < arrServerFunctionArguments.length; ++i ) 
		{
			strUrlParameters = strUrlParameters + "&rsargs[]=" + escape( arrServerFunctionArguments[ i ] );
		}
			
		strUrlParameters = strUrlParameters + "&rsrnd=" + new Date( ).getTime( );
		
		strPostData = null;
	} 
	else 
	{
		strPostData = "rs=" + escape( strFunctionServerName );
		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

	var objXmlRequest = xmlRequest( );

	xmlHttp.open( XML_LOAD_TYPE , strUrl , true )
	
	if ( XML_LOAD_TYPE == "POST" ) 
	{
		objXmlRequest.setRequestHeader( "Method", "POST " + strUrl + strUrlParameters + " HTTP/1.1" );
		objXmlRequest.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded" );
	}
	
	xmlHttp.onreadystatechange = funcLoading;
	xmlHttp.send( strPostData );	
}

/**
 * Fun??o que converte os campos n?o triviais (tais como objetos e array) 
 * do array de parametros a serem enviados em objetos xml e prepara a chamada
 * da fun??o call_class_action no servidor.
 *
 * @author		CAIXA
 * @date		01/11/2005
 * @version		1.0
 * @param       strClass 		Nome da Classe
 * @param       strAction		Nome da Action
 * @param		arrParameters 	Parametros Enviados ao Servidor
 * @param		funcAfterDo		Fun??o ou string do Nome Metodo que ser? chamado ap?s a requisi??o
 * @param		objectAfterDo	Objeto que cont?m o m?todo ( caso o par?metro anterior n?o seja uma fun??o )
 * @package		Xml Request
 * @subpackage	Javascrit Xml Request
 * @example 	do_call_class_action( "actionFolder", "actionName",  Array( 'param1', 'param2' ) , "afterSendedObjectMethod", objSended );
 * @example 	do_call_class_action( "actionFolder", "actionName",  Array( 'param1', 'param2' ) , funcAfterSended );
 * @return 		void
 */
function do_call_class_action( strClass, strAction, arrParameters, funcAfterDo, objectAfterDo )
{
	debuggerEnterFunction( "do_call_class_action" );
	var arrParam = Array();
	arrParam[ arrParam.length ] = strClass;
	arrParam[ arrParam.length ] = strAction;
	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 strUrl = FOLDER_ACTION_XMLREQUEST + "/" + ACTION_NAME_XMLREQUEST;
	
	debuggerAlert( strUrl + "<br/>\n" + implode( " " , arrParam ) , "sendedXml" );
	
	var objRequest = Array();
	objRequest[0] = strUrl;
	objRequest[1] = SERVER_FUNCTION_NAME;		
	objRequest[2] = arrParam;
	objRequest[3] = funcAfterDo;
	objRequest[4] = objectAfterDo;
	objRequest[5] = arrParameters; 
	debuggerAlert( arrGlobalStackXmlRequest.length );
	arrGlobalStackXmlRequest[ arrGlobalStackXmlRequest.length ] = ( objRequest );
	debuggerAlert( arrGlobalStackXmlRequest.length ); 
	singletonLoadXMLDoc();
	//loadXMLDoc( strUrl	 ,  SERVER_FUNCTION_NAME , arrParam, funcAfterDo, objectAfterDo, arrParameters );
	
	debuggerOutFunction();
}

function singletonLoadXMLDoc()
{
	debuggerEnterFunction( "singletonLoadXMLDoc" ); 
	if ( globalBoolOnLoadXMLDoc == true )
	{
		debuggerOutFunction();
		return false;
	}
	globalBoolOnLoadXMLDoc = true;
	loopLoadXMLDoc();
	debuggerOutFunction();
	return true;
}

/**
 *
 @date 2006-01-17
 */
function loopLoadXMLDoc()
{
	debuggerEnterFunction( "loopLoadXMLDoc" );
	debuggerAlert( arrGlobalStackXmlRequest.length );
	if ( arrGlobalStackXmlRequest.length == 0 )
	{
		globalBoolOnLoadXMLDoc = false;
		debuggerOutFunction();
		return false;
	}
	
	var objRequest = arrGlobalStackXmlRequest.pop();
	loadXMLDoc( objRequest[0]	 ,  objRequest[1] , objRequest[2], objRequest[3], objRequest[4], objRequest[5] );
	//loadXMLDoc( strUrl	 ,  SERVER_FUNCTION_NAME , arrParam, funcAfterDo, objectAfterDo, arrParameters );
	debuggerOutFunction();
	return false;
}
	
