/**
 * ajax.js
 * Objeto para implementar el control de XmlHttpRequest para
 * la comunicacion asincrona hacia el servidor. Utiliza las funciones
 * de select.js para el soporte de combos
 */
 
 
/**
 * Objeto que contiene las comunicaciones asincronas con el servidor.
 * Se deberia instanciar un objeto por peticion asincrona que quisiera implementarse
 * simultaneamente
 */ 
function Ajax()
{
   var requestObject=null;
   var callerCallback=null;
   var m_combo=null;
   var m_text=null;
   var m_table=null;
   
   this.init=init;
   /**
    * Inicializa el objeto de ajax
    */
   function init()
   {
        if(window.XMLHttpRequest) 
        {
            try {
                requestObject = new XMLHttpRequest();
            } 
            catch(e) 
            {
                requestObject = false;
            }
    // Si es windows
        } 
        else 
        {
            try {
                requestObject = new ActiveXObject("Msxml2.XMLHTTP");
            } 
            catch(e) 
            {
                try {
                    requestObject = new ActiveXObject("Microsoft.XMLHTTP");
                } 
                catch(e) 
                {
                    requestObject = false;
                }
            }
        }
   }
   
   /**
    * Realiza el callback del request
   **/
   this.requestCallback=requestCallback;
   function requestCallback()
   {
        m_combo=null;
        if(requestObject)
        {
            if(requestObject.readyState==4)
            {
                try{
                        if(callerCallback)
                        {
                            callerCallback(requestObject.responseXML);
                        }
                }
                catch(e)
                {
                    // Hubo un error al llamar a ajax
                }
            }
        
        }
   
   }
   
   /**
    * Realiza el request hacia el servidor, 
    * es necesario establecer el callback para realizar una accion
    */
    this.loadURL=loadURL;
    function loadURL(pUrl,pCallback,pParameter)
    {
        init();
        if(requestObject)
        {
            callerCallback=pCallback;
            requestObject.onreadystatechange=this.requestCallback;
            requestObject.open("POST",pUrl,true);
            requestObject.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
            if(pParameter)
            {
                requestObject.send(pParameter);
            }
            else
            {
                requestObject.send("dummy");
            }
        }
    }
    
    /**
    * Realiza el request hacia el servidor, 
    * es necesario establecer el callback para realizar una accion
    */
    this.loadURL=loadURL;
    function loadURLSync(pUrl,pCallback,pParameter)
    {
        init();
        if(requestObject)
        {
            callerCallback=pCallback;
            requestObject.onreadystatechange=this.requestCallback;
            requestObject.open("POST",pUrl,false);
            requestObject.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
            if(pParameter)
            {
                requestObject.send(pParameter);
            }
            else
            {
                requestObject.send("dummy");
            }
        }
    }
    
    /**
     * Llena un combo de manera asincrona una vez que ha llegado la respuesta de la
     * peticion del catalogo correspondiente
     */
     this.fillCombo=fillCombo;
     function fillCombo()
     {
        if(requestObject)
        {
            if(requestObject.readyState==4 && m_combo)
            {
                try{
                        //debugger;
                        var items=requestObject.responseXML.getElementsByTagName('item');
                        clearOptionsSelectElement(m_combo);
                        //alert("Elementos item "+items.length);
                        for(i=0;i<items.length;i++)
                        {
                            addOptionSelectElement(m_combo,items[i].getElementsByTagName('key')[0].firstChild.text,items[i].getElementsByTagName('value')[0].firstChild.text);
                        }
                        m_combo.disabled=false;
                        sortSelectElement(m_combo);
                        
                        if(!m_combo.fireEvent('onchange'))
                        {
                            if(m_combo.onchange)
                            {
                                m_combo.onchange();
                            }
                        }
                }
                catch(e)
                {
                    // Hubo un error al llamar a ajax
                    alert("Hubo un error al llenar el combo "+e.description);
                }
            }
        
        }
     }

    /**
     * Realiza el llenado de un combo a partir de un valor determinado
     * El parametro del combo es obligatorio y lleva el identificador "id=" en el request
     */
     this.loadCombo=loadCombo;
     function loadCombo(pUrl,pCombo,pParameter,pAsync)
     {
        try{
            var async=false;
            
            if(pAsync)
            {
                async=true;
            }
            init();
            m_combo=pCombo;
            clearOptionsSelectElement(m_combo);
            addOptionSelectElement(m_combo,'Cargando....','Cargando...');
            pCombo.disabled=true;
            if(requestObject)
            {
                callerCallback=null;
                requestObject.onreadystatechange=this.fillCombo;
                requestObject.open("GET",pUrl+"?id="+pParameter,async);
                requestObject.send();
            }
            else
            {
                alert("Request Object no iniciado!");
            }
        }
        catch(e)
        {
            alert("No fue posible cargar el combo en "+pUrl+" con parametro "+pParameter+"\n"+e.description);
        }

     }
     
     /**
      * callback para el llenado de una tabla
      */
     this.fillTable=fillTable;
     function fillTable()
     {
        if(requestObject)
        {
            if(requestObject.readyState==4 && m_table)
            {
                try{
                        //debugger;
                        var items=requestObject.responseXML.getElementsByTagName('item');
                        //alert("Elementos item "+items.length);
                        for(i=0;i<items.length;i++)
                        {
                            m_table.addRow();
                            m_table.addText('label200',items[i].getElementsByTagName('value')[0].firstChild.text);
                        }                        

                }
                catch(e)
                {
                    // Hubo un error al llamar a ajax
                    alert("Hubo un error al llenar el combo "+e.description);
                }
            }
        
        }
     
     }
      
     
     /**
      * Realiza el llenado de una tabla a partiru de un valor predeterminado
      * El parametro de la tabla es obligatorio
      */
     this.loadTable=loadTable;
     function loadTable(pUrl,pTable,pParameter,rowsToPreserve)
     {
        try{
            init();
            m_table=pTable;
            m_table.deleteLastRows(rowsToPreserve);
            if(requestObject)
            {
                callerCallback=null;
                requestObject.onreadystatechange=this.fillTable;
                requestObject.open("GET",pUrl+"?id="+pParameter,false);
                requestObject.send();
            }
            else
            {
                alert("Request Object no iniciado!");
            }
        }
        catch(e)
        {
            alert("No fue posible cargar la tabla en "+pUrl+" con parametro "+pParameter+"\n"+e.description);
        }
     
     }
     
     
     /**
      * Realiza el llenado del campo de texto
      * el xml tiene que ser del formato <data><value>?</value></data>
      */
      this.fillText=fillText;
      function fillText()
      {
        if(requestObject)
        {
            if(requestObject.readyState==4 && m_text)
            {
                try{
                       // debugger;
                        var items=requestObject.responseXML.getElementsByTagName('value');
                        
                        if(items && items.length>0)
                        {
                            setTextFieldValue(m_text,items[0].firstChild.text);
                        }
                        
                        if(m_text.onchange)
                        {
                            m_text.onchange();
                        }
                }
                catch(e)
                {
                    // Hubo un error al llamar a ajax
                    alert("Hubo un error al llenar el campo de texto: "+e.description);
                }
            }
        
        }
      }
     
     /**
      * Realiza el llenado de un campo de texto
      * El parametro del texto es obligatorio 
      */
      this.loadText=loadText;
      function loadText(pUrl,pText,pAsync)
      {
        try{
            init();
            m_combo=null;
            m_text=pText;
            var async=false;
            if(pAsync)
            {
                async=true;
            }
            if(requestObject)
            {
                callerCallback=null;
                requestObject.onreadystatechange=this.fillText;
                requestObject.open("POST",pUrl,async);
                requestObject.send();
            }
            else
            {
                alert("Request Object no iniciado!");
            }
        }
        catch(e)
        {
            alert("No fue posible cargar el campo de texto en "+pUrl+"\n"+e.description);
        }
      
      }

}
