﻿function AjaxXSLT()
{

  var _objAjax = new Ajax();
  var _objXml  = new Xml();
  var _objXsl  = new Xml();

  var _commandKey = "";         // Clave con la orden para solicitud AJAX al servidor
  var _xml = "";                // Cadena con el XML
  var _xslPath = "";            // Ruta a la XSL
  var _htmlPlaceHolderID = "";  // Identificador de la capa donde se metera el html generado
  var _arrParameters = null;    // Parametros de la Xsl => new Array(new Array("cadena clave","cadena valor"),...)
  
  ///________________________________________________________________________    
  /// <summary>
  /// Hace una peticion con el objeto Ajax a la pagina, y le solicita el proceso 
  /// del Xml obtenido
  /// </summary>
  ///========================================================================
  this.transformRequest = function( __commandKey, __xslPath, __htmlPlaceHolderID, __arrParameters ) 
  {
  
    _commandKey = __commandKey; 
    _xml = "";
    _xslPath = __xslPath; 
    _htmlPlaceHolderID = __htmlPlaceHolderID;
    _arrParameters = __arrParameters;

    _objAjax.request(document.location.href,"ajaxRequest=" + _commandKey,loadXmlData);
  }

  ///________________________________________________________________________    
  /// <summary>
  /// Hace la peticion de procesar directamente un xml indicado
  /// </summary>
  ///========================================================================
  this.transformXml = function( __xml, __xslPath, __htmlPlaceHolderID, __arrParameters ) 
  {
  
    _commandKey = ""; 
    _xml = __xml;
    _xslPath = __xslPath; 
    _htmlPlaceHolderID = __htmlPlaceHolderID;
    _arrParameters = __arrParameters;

    loadXmlData();
  }

  ///________________________________________________________________________    
  /// <summary>
  /// Si se utiliza un xl directamente, o ha acabado de realizar la consulta,
  //  empieza a cargar asincronicamente mediante un objeto Xml, la cadena XML,  
  /// y le indica a que funcion llamar cuando haya terminado		
  /// </summary>
  ///========================================================================
  function loadXmlData()
  {
  
    if ( (_xml == "" && _objAjax.isReady()) || _xml != "" )
    {

			// Obtenemos el resultado
			var strXml = _xml != "" ? _xml : _objAjax.getResultXml();

			// Si ha habido una excepcion con este formato Xml:
			// <AjaxException><Message /></AjaxException> 
			// lo mostramos y acabamos...	
			if ( strXml.indexOf("<AjaxException>") != -1 )
			{
				_objXml.loadXml(strXml,false,null);
				alert("Excepcion de Ajax: " + _objXml.xmlDocument.documentElement.selectSingleNode("Message").text);
			}
			// Si todo Ok cargamos la Xsl...
			else
				_objXml.loadXml(strXml,false,loadXslPage);
    }
  }

  ///________________________________________________________________________    
  /// <summary>
  /// Si se ha acabado de cargar el objeto Xml, comienza a realizar la misma
  /// operacion con el XSL --via inline o fichero--, si este no estuviera 
  /// cargado ya (si lo se lee la primera vez que se carga la pagina), e 
  /// indica a que funcion llamar cuando haya terminado.
  /// </summary>
  ///========================================================================
  function loadXslPage()
  {
	  // Si se ha cargado el XML ya...
	  if ( _objXml.isReady() )
	  {
			// Si no esta cargado en memoria el XSL lo cargamos y pintamos
	    if ( _objXsl.xmlDocument == null )
	    {
	      // -- Desde etiqueta (El XSL inline debe estar en un TextArea oculto, y sin saltos de linea)
	      //_objXsl.loadXml(document.getElementById("xslPlaceHolder").value,renderData);
        // -- Desde fichero:
        _objXsl.loadXmlFile(_xslPath,true,renderData);
			}
			// Si si que esta cargado, llamamos a pintar...
			else
				renderData();
    }    
  }
	
  ///________________________________________________________________________    
  /// <summary>
  /// Si el objeto Xsl ya esta preparado, el objeto Xml se transforma con el, 
  /// y se mete el Html generado en el objeto destinado a ello.
  /// </summary>
  ///========================================================================
  function renderData()
  {	
	  // Si se ha cargado el XSL ya...
	  if ( _objXsl.isReady() )
	  {

		  // Elemento contenedor del resultado HTML
		  var htmlPlaceHolder = document.getElementById(_htmlPlaceHolderID);

		  // Transformacion Xml + Xsl => Html  
		  _objXml.transformWithProcessor(_objXsl,htmlPlaceHolder,_arrParameters);
	  }
  }
}
