var CMS_REQUEST_COUNTER = 1;
var CMS_REQUEST = new Array();
var bufferMensajes;
var debugMensajes = "";

//Función para implementar document.writes en objetos tipo Client Side Include
function imprimirCodigo(mensaje)
{
   bufferMensajes = bufferMensajes + mensaje;
}

//Retorna el enesimo parametro de un objeto:
function func_get_arg(n)
{
   return CMS_PARAMETROS[n-1];  
}

//Retorna el numero de parametros pasados al objeto:
function func_num_args()
{
   return CMS_CONTADOR_PARAMETROS;
}

//Retorna un arreglo con los parámetros pasados al objeto:
function func_get_args()
{
  return CMS_PARAMETROS;
}

//Retorna el valor de una variable de la URL:
function obtenerValorVariable(nombre_variable)
{
   return URL_PARAMETROS[nombre_variable];
}

//Retornar un objeto de tipo HttpRequest:
function obtenerBrowser()
{
	var _xmlhttp;
	/*@cc_on @*//*@if (@_jscript_version >= 5)
	var idAX = ["Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "Msxml2.XMLHTTP.3.0", "Msxml2.XMLHTTP", "Microsoft.XMLHTTP"];

	for(var i=0; !_xmlhttp && i<idAX.length; i++)
	{
		try
		{ 
			_xmlhttp = new ActiveXObject(idAX[i]);
		}
		catch(ex) 
		{ 
			_xmlhttp = false; 
		}
	}@end @*/

	if (!_xmlhttp && typeof XMLHttpRequest!='undefined') 
	{	
	   _xmlhttp = new XMLHttpRequest();
	} 

	return _xmlhttp;
}

//Generar un request para un objeto dado su alias, un objeto de tipo XMLHttpRequest (browser)
//la url correspondiente y una función de call back a ser invocada una vez
//el request haya sido ejecutado
function lanzarRequest(alias,browser,url,callback)
{	
    CMS_REQUEST[CMS_REQUEST_COUNTER] = new Object();
    CMS_REQUEST[CMS_REQUEST_COUNTER].llamado = callback;
    CMS_REQUEST[CMS_REQUEST_COUNTER].alias = alias;
    

try
{
            		
	if(browser)	
	{			    	
	    //Registrar el manejador de eventos para cuando el request este completo			
		browser.onreadystatechange = function()
		{		
	    	var contenido = new String();
	    	
   			//alert('Registró el manejador de eventos para el objeto: ' + alias);
		
			/** readyState:	0 = sin inicializar	1 = cargando	2 = cargado	3 = interactivo	4 = completo	*/				
			if (browser.readyState == 4) 
			{				
				/**	status:	Nuemero de respuesta del servidor ejemplo	200 = OK	404 = Not Found 	*/
				if (browser.status == 200) 
				{		
					//Identificar el codigo del request, basado en el header CMS_REQUEST_ID
					var request_id = Number(browser.getResponseHeader("CMS_REQUEST_ID"));
																			
					contenido = browser.responseText;																																
					
					//Variable para acumular el codigo que se va a escribir.
					var total = "";
					
					//Parsing de codigo javascript
					inicio = contenido.indexOf("<" + "scr" + "ipt>");
					cadena_final = contenido.indexOf("</" + "scr" + "ipt>");
					
					var previo;
					var ultimo;
					var inicio;
					var codigo;
					var total;
					//Buscar piezas de codigo JavaScript en el codigo del objeto:
					while(inicio != -1 && cadena_final != -1)
					{					
					   //Fraccionar la cadena para aislar el codigo JavaScript
					   previo = contenido.substr(0,inicio);
					   ultimo = contenido.substr(cadena_final+9);
					   inicio = inicio +8;
					   codigo = contenido.substr(inicio,cadena_final-inicio);
					   bufferMensajes = "";
					   
					   //Como la página ya está cargada, un document.write borrará todo el documento
					   //por lo tanto los encapsulamos a través de una función propietaria:
					   codigo = codigo.replace(/document\.write/g,"imprimirCodigo");
					   
		               eval(codigo);	
					   
					   //Tomamos el código generado por los document.write y lo 
					   //incluimos dentro del codigo que será insertado en el DIV:			   
					   total = total + previo + bufferMensajes;
					   
					   //Preparamos la siguiente iteración para seguir buscando piezas JavaScript:
					   contenido = ultimo;					   
					   inicio = contenido.indexOf("<" + "scr" + "ipt>");
					   cadena_final = contenido.indexOf("</" + "scr" + "ipt>");					   
					}
						
					total = total + contenido;
					
					//Después del proceso de interpretación del objeto estamos listos
					//para incluirlo en la página:					
					
					//alert("Voy a incluir el resultado del objeto en el DIV: CMS_" + alias);
					
					//Primero miramos si nos pasaron un DIV o una funcion de callback;					
				    var llamado;
				    
				    if(request_id > 0)
				    {    		
				    	llamado = CMS_REQUEST[request_id].llamado;
				    	mi_alias = CMS_REQUEST[request_id].alias;				    
				    }
				    else
				    {
				        llamado = callback;
				     }
				    
				    mi_div = document.getElementById(llamado);
				    				    
					if(mi_div) 					
					{  
					   mi_div.innerHTML = total;
					}
					else if(callback == "CMS_INCLUDE")
					  document.getElementById("CMS_" + alias).innerHTML = total;
					else
					  llamado(total);			
					  
				    
				} 
				else 
				{		
				    //Aqui se debería generar un error en caso de que el objeto no responda
				    //actualmente no hacemos nada porque considero que es mejor que 
				    //el usuario no se entere en caso de que algo salga mal:
				    
					//alert('Se genero un error: ' +	browser.statusText);
				}	
			}
		}				
		   		
		//Si la URL es relativa, la completamos
		
		if(url.substring(0,4) != "http")
		{		
		   //Mirar si la URL inicia con /
		   if(url.substring(0,1) == "/")
		   {
		      url = document.location.protocol + "//" + document.location.host + url;
		   }
		   else
		   {
		      //Buscar el directorio actual:
		      re = /\/([^\/]*?)$/g;  //Reg Exp para eliminar todo lo que se encuentre en el URL después del último /
		      directorio = document.location.pathname;
		      directorio = directorio.replace(re,"");
		      directorio = directorio + "/";
		      url = document.location.protocol + "//" + document.location.host + directorio + url;
		   }
		}
		
				
		//Vamos a colocar las variables del query string del documento actual
		//en la URL que vamos a invocar:
		if(url.indexOf("?") > 0)
		  separador = "&";
		else
		  separador = "?";
		
		for (nombre_variable in URL_PARAMETROS)
		{
           url = url + separador + nombre_variable + "=" + escape(URL_PARAMETROS[nombre_variable]);
           separador = "&";
		}
		
		//Vamos a colocar el id del request como variable adicional
		if(url.indexOf("?") > 0)
		  separador = "&";
		else
		  separador = "?";
        
        url = url + separador + "id_request=" + CMS_REQUEST_COUNTER;
        CMS_REQUEST_COUNTER++;
        		
		//alert("Voy a abrir la url: " + url);
		browser.open("GET", url, true);
		browser.send(null);	
	}
}catch(e)
{

   //alert('ERROR: ' + e);
  
}

}

//Implementación JavaScript de incluirObjeto
//El primer parámetro debe ser el alias del objeto, después todos los parámetros
//que deben ser pasados al objeto, y por ultimo la función de callback que debe
//ser invocada una vez el request esté completo:
function incluirObjeto()
{
   parametros = incluirObjeto.arguments;
   alias = parametros[0];
         
   var url = "/cms/servirObjeto.php?id_pagina=" + CMS_ID_PAGINA_ACTUAL + "&alias_objeto="  + alias;
   
   //Agregar parámetros al URL:
   for(i=1;i<(parametros.length-1);i++)
   {
     url += "&parametros[]=" + escape(parametros[i]);   
   }
   
   //alert('Incluyendo objeto: ' + url);            
   lanzarRequest(alias,obtenerBrowser(),url,parametros[parametros.length-1]);
   
}

var CMS_PARAMETROS = new Array();
var URL_PARAMETROS = new Object();
var CMS_CONTADOR_PARAMETROS = 0;
var  uri = document.location.search; 
 
//Vamos a colocar en memoria todos los parametros que vienen en el URL:
if(uri != "")
{ 
  //Patrón para detectar nombre=valor en los URL:
  re = /(&([A-Za-z0-9_\[\]]+)\=([^&]*))/;  
  uri = uri.replace("?","&");
  
  while(re.test(uri))
  {
     matches = re.exec(uri);
     total_cadena = matches[1];
     nombre_variable = matches[2];
     valor_variable = matches[3];   
     uri = uri.replace(total_cadena,"");
     
     if(nombre_variable == "parametros[]")
     {
       CMS_PARAMETROS[CMS_CONTADOR_PARAMETROS] = unescape(valor_variable);
       CMS_CONTADOR_PARAMETROS++;
     }
     else
     {
        URL_PARAMETROS[nombre_variable] = unescape(valor_variable);
     }                 
  }    
}
