// variable globales
   var selection_color = '#ffffcc';
   var m_row_index = -1;	
   var m_row_clone = null;


//************ OBJETO PARA MANEJO DE TABLAS DE DATOS *************************
function XS_Grid( sId, sTitle, sClass, sWidth, sHeight, sOverflow)
{
    this.type = 'Grid';
	this.id = sId;
	this.Container = null;
	this.display = 'block';
	this.pageLength = 10;
	this.page = null;
	this.nextPage = 1;
	this.iniPage = null;
	this.endPage = null;
	this.sectionPage = 1;
	this.sectionLength = 100;
    this.loaderFunction = null;	
	this.m_row_index = -1;
	this.m_row_clone = null;
    this.Id_newRow = -1;    
	if (sTitle != null && sTitle != '')
        this.Title = sTitle
    else
        this.Title = '';
    this.Header = ''
    this.onLoadRow = null    
    this.Message = "";
    this.selectedRow = null;   
    this.idxRow = null;
    this.aObjects = new Array() //Objetos de edición
    this.Key = null
    this.Totals = false        	
    this.nCols = 0
    this.lastRow = 0
    this.editing = false;
    this.aCols = new Array()    // Definición de columnas

    this.Width = sWidth;
	if (sWidth != null)
	    var sAncho = ' width:' + sWidth + ';'
	else
	    var sAncho = ' ';
	    
	if (sHeight != null)
	    var sAlto = ' height:' + sHeight + ';'
	else
	    var sAlto = ' ';

    //Area de acciones
    this.divAcc = document.createElement('DIV')	
	this.AccionesOff = document.createElement('DIV')	
    this.AccionesOff.innerHTML = '<DIV style="display:none"></DIV>'
	this.AccionesOn = document.createElement('DIV')	
    this.AccionesOn.innerHTML = '<DIV style="display:none"></DIV>'
    this.nAcc = 0

	//Tabla de Grilla
	this.divGrid = document.createElement('DIV')
    this.divGrid.id = this.id + '_grid';
    var sGrilla = ''	
	sGrilla = sGrilla+ '<TABLE id=' + sId + '_table class=' + sClass + ' style= "' + sAncho + '" cellspacing=1 cellpadding=0 num=0>';
	sGrilla = sGrilla + '<TR id=' + sId + '_header ></TR>';
    sGrilla = sGrilla + '</TABLE>';

    //Tabla Marco	    
    var sTabla = '<TABLE cellspacing="0" cellpadding="0" style= "background-color:White; ' + sAncho + '">'
        if(this.Title != '')
            sTabla += '<TR><TD class="XS_gridTitle" height="25">' + this.Title + '</TD></TR>';
        else    
            sTabla += '<TR style="display:none" class="XS_gridTitle" height="25"><TD></TD></TR>';

    sTabla += '<TR id="' + this.id + '_pags" ><TD class="XS_SecTip" style="display:block; text-align:right"><div></div></TD></TR>';                 //Botones de paginación
    
    sTabla += '<TR><TD>' + sGrilla + '</TD></TR><TR><TD class="XS_SecTip" style="height:16px" id="' + this.id + '_tips" >&#160;</TD></TR></TABLE>';	

	this.divGrid.innerHTML = sTabla
	this.getContent = function()
	                   {
	                        return '<div id="' + this.id + '_grid" style="padding-top:5px; padding-bottom:5px;">' + this.getContainer().innerHTML + '</div>';
	                   }	
	                   
    this.getHTML = function() { return this.getContent() };
    	                   	
	this.getContainer = function()
	    {
	        if($(this.id + '_grid') == null)
	            return this.divGrid
	        else
	            return $(this.id + '_grid');
	    }	
	    
	    
	this.getTable = function()
	                {
	                    var oTable = $(this.id + '_table')
	                    if (oTable==null) 
	                        oTable=this.divGrid.firstChild.rows[2].cells[0].firstChild;
	                    return oTable;
	                }
	                
    this.toggleActions = function(sDisplay)
                    {
                        if(sDisplay == null) sDisplay = 'none';
                        var Table = this.getTable();
                        var nCol = Table.rows[0].cells.length-1;
                        for(var nR=0; nR<Table.rows.length; nR++)
                        {
                            Table.rows[nR].cells[nCol].style.display = sDisplay;
                        }
                    }	                
    
    this.setTitle = function(sTitle)
        {
            var obj = this.getContainer();
            obj.firstChild.rows[0].cells[0].innerHTML = sTitle;
        }
        
    this.setColumnsTitle = function(sTitle)
        {
            var obj = this.getContainer();
            obj.firstChild.rows[0].innerHTML = sTitle;
        }
                         
    this.toggle = function()
                    {
                        if(this.display == 'none')
                            this.show()
                        else
                            this.hide();
                    }
                     	                 
	this.hide =function()
	                {
	                    $( this.getContainer()).hide()                
	                    this.display = 'none';
	                }                 
	this.show =function()
	                {
	                    $( this.getContainer()).show()                
	                    this.display = 'block';
	                }  
	                
	                                     
    this.rowCount = function()
                    {
                        return this.getTable().rows.length-1;   
                    }                             
    		
    this.setColumns = function(aColumns)
                      {
                        for(var nC=0;nC<aColumns.length;nC++)
                        {
                            jColumn = aColumns[nC];
                            this.setColumn( jColumn, null);
                        }    
                      }  

    this.setColumn = function(jColumn, jControl)
                    {
                        //Crea la columna
                        jColumn = Object.toJSON(jColumn).evalJSON();
                        this.aCols[this.nCols] = jColumn;
                        this.Header = this.Header + jColumn.name  
                        var oTabla = this.getTable()
                        oTR = oTabla.rows[0]
                        oTH = document.createElement('TH')
                        if(jColumn.display != null)
                            oTH.style.display = jColumn.display;
                        oTH.setAttribute("num", this.nCols);
                        if(jColumn.format!=null)
                            oTH.setAttribute("format", jColumn.format);
                        oTH.setAttribute("height","20");
                        oTH.setAttribute("align", "center");
                        if (sWidth != null)
                            oTH.setAttribute("width", jColumn.width);
                        if (jColumn.tip != null)
                            oTH.setAttribute("tip", jColumn.tip);                                    
                        oTH.setAttribute("col", oTR.cells.length );    
                        oTH.setAttribute("onMouseOver","_MouseIn(this,'" + this.id + "_tips')" );
                        oTH.setAttribute("onMouseOut","_MouseOut(this,'" + this.id + "_tips')" );
                        oTH.innerHTML = jColumn.name;
                        oTR.appendChild(oTH)
                        
                        //Crea el objeto de edición de la columna
                        if ( jControl == null)
                            this.aObjects[this.nCols] = null
                        else
                        {
                            var oControl =  XS_createControl(jControl)
                            var oDiv = document.createElement('div');
                            oDiv.appendChild(oControl);
                            this.aObjects[this.nCols] = oDiv;
                        }    
                        this.nCols++
                        return oTH                                     
                     }
	                    
    this.setActions = function(jActions)
                    {
                        jActions = Object.toJSON(jActions).evalJSON();
                        
                        //Crea la columna de Acciones
                            var oTabla = this.getTable()
                            oTR = oTabla.rows[0]
                            oTH = document.createElement('TH')
                            oTH.setAttribute('id','acc_col');
                            oTH.setAttribute("height","20");
                            oTH.setAttribute("align", "center");
                            oTH.setAttribute("width", jActions.width);
                            oTH.setAttribute("col", oTR.cells.length );    
                            oTH.setAttribute("onMouseOver","_MouseIn(this,'" + this.id + "_tips')" );
                            oTH.setAttribute("onMouseOut","_MouseOut(this,'" + this.id + "_tips')" );

                            if (jActions.check + '' != 'undefined' && jActions.check + '' != null)
                                oTH.innerHTML = jActions.name + '<input id="' + this.id + '_check' + '" type="checkbox" onClick="' + jActions.check + '(this)"/>';
                            else
                                oTH.innerHTML = jActions.name;

                            oTR.appendChild(oTH)

                        //Crea los botones de acción
                            for(var nI=0;nI<jActions.list.length;nI++)
                            {
                                    var oAction = jActions.list[nI]
                                    var sIcon = oAction.icon;
                                    var sType = 'button';
                                    if (jActions.list[nI].type + '' != 'undefined' && jActions.list[nI].type + '' != null)
                                    {
                                        sType = jActions.list[nI].type;
                                        sType = sType.toLowerCase();
                                    }                
                                                           
                                    if (oAction.action.substr(0,1) == '#')
                                    {
                                        var sAction = oAction.action.substr(1);
                                        sType = sAction.toLowerCase();
                                    }
                                        
                                    if (sType == 'button')
                                    {
                                        var sAction = oAction.action;
                                        if (oAction.active == null || oAction.active == 'undefined')
                                            var sActive = 'off'
                                        else
                                            var sActive = oAction.active;
                                    }
                                    else
                                    if (sType == 'edit')
                                    {
                                        sAction = this.id + ".editRowOn()";
                                        var sActive = 'off';
                                    }                                
                                    else
                                    if (sType == 'cancel')
                                    {
                                        sAction = this.id + ".cancelRow()"
                                        var sActive = 'on';
                                    }                                  
                                    else
                                    if (sType == 'check')
                                    {
                                        var sAction = oAction.action;
                                        var sActive = 'off';
                                    }                                  
                                    

                                    if (sActive == 'off')
                                    {
                                        var objAcc = this.AccionesOff.childNodes[0];
                                        var objA = this.createAction(sAction, sIcon, oAction.tip, null, sType)
	                                        objAcc.appendChild(objA)
	                                    this.nAcc++
	                                }   
	                                else
	                                {
                                        var objAcc = this.AccionesOn.childNodes[0];
                                        var objA = this.createAction(sAction, sIcon, oAction.tip, null, sType)
                                        objAcc.appendChild(objA)
	                                } 
                            }
                        }	                 

    this.setKey = function(sKeys, m)
                  {
                    if(m == 0)
                        alert(sKeys)
                    this.Key = sKeys
                  }
				
    this.checkRow = function(sIdRow, lStatus)
                  {
                        if(lStatus==null)lStatus=true;
                          var oTR = $(sIdRow);
                          var nC = oTR.cells.length-1;
                          var oTD = oTR.cells[nC];
                          var nP = oTD.childNodes.length-1;
                          oCheck = oTD.childNodes[nP];

                        if( lStatus == true)
                        {
                           oCheck.checked = true;
                        } 
                        else
                        {
                           oCheck.checked = false;
                        } 
                  }  
    //Recupera el objeto checkBox de una fila              
	this.getCheck = function(sIdRow)
	              {
                          if (typeof(sIdRow) == 'object')
                             var oTR = sIdRow
                          else
                             var oTR = this.getRow(sIdRow)
                          var nC = oTR.cells.length-1;
                          var oTD = oTR.cells[nC];
                          var nP = oTD.childNodes.length-1;
                          var oCheck = oTD.childNodes[nP];
	                      return oCheck;   
	              }						
	this.selectAll = function()
	            {
	                var oCheck = null;
	                    oCheck = $(this.id + '_check');
	                    if(oCheck == null)
	                    {
	                        alert('No se identficó Botón Check');
	                        return;
	                    }
	                    
	                    var sSel = oCheck.getAttribute('checked');
	                    if(sSel==null)
	                        sSel= false;
	                        
	                    if( oCheck.checked == true)
	                       var sAction = 1
	                    else   
	                       var sAction = 0

	                var oTable = this.getTable();
	                var oTD = null;
	                var oTR = null;
	                var nP = null;
	                var nR = 0;
	                var nC = oTable.rows[0].cells.length-1;
	                var nSel = 0;
	                for(nR=1;nR<oTable.rows.length;nR++)
	                {
	                    oTR = oTable.rows[nR];
	                    oTD = oTR.cells[nC];
	                    nP = oTD.childNodes.length-1;
	                    oCheck = oTD.childNodes[nP];
	                    sSel = $(oCheck).checked 
	                    if(sSel==null)
	                        sSel=false;
	                        
	                    if(sAction == 1)    
	                    {
	                        if( sSel == false)
	                        {
	                           oCheck.checked = true;
	                           oTR.style.backgroundColor = '#ffffd9';
	                           nSel++; 
	                        } 
	                    }    
	                    else
	                    {
	                        if( sSel == true)
	                        {
	                           oCheck.checked = false;
	                           oTR.style.backgroundColor= '#ffffff';
	                           nSel++; 
	                        } 
	                    }    
	                    
	                }
	                return nSel;
	            }
	            
    //Retorno arreglo con campos (field) de las filas seccionadas con checkbox
    //getSelected( [ {field:'id_rubro',type:'key'} ]);
	this.getSelected = function(aFields)
	            {

	                var aSel = new Array();
	                var oTable = this.getTable();
	                var oTD = null;
	                var oTR = null;
	                var nP = null;
	                var nR = 0;
	                var nL = oTable.rows[0].cells.length-1;
	                var nSel = 0;
	                var jValue = null;
        
	                for(nR=1;nR<oTable.rows.length;nR++)
	                {
	                    oTR = oTable.rows[nR];
	                    oTD = oTR.cells[nL];
	                    nP = oTD.childNodes.length-1;
	                    oCheck = oTD.childNodes[nP];
	                    sSel = $(oCheck).checked 
	                    if(sSel==null)
	                        sSel=false;
                        if( sSel == true)
                        {
	                        if(aFields == null)
                                aSel[nSel++] = nR
	                        else
	                        {
	                            jValue = '';
                                for(var nF=0;nF<aFields.length;nF++)
                                {
                                    if (jValue!='')
                                        jValue += ',';
                                    jValue += aFields[nF].field + ":" ;
                                    if(aFields[nF].type=='key')
                                        jValue += "'" + oTR.getAttribute(aFields[nF].field) + "'"
                                    else
                                    {
                                        var nC = this.getColumnPos( aFields[nF].field ); 
                                        if(nC==null)
                                        {
                                            alert('XS_Grid.getSelected() : No se identificó campo ' + sCampo)
                                            return
                                        }                                        
                                        jValue += "'" + oTR.cells[nC].innerHTML + "'";
                                    }    
                                }
                                jValue = '{' + jValue + '}'
                                aSel[nSel++] =  jValue.evalJSON();
	                        }
	                                           
                        } 
	                }
	                return aSel;
	            }

    //Limpia el arreglo de filas seleccionadas con checkbox
	this.clearSelection = function()
	            {
	                var oTable = this.getTable();
	                var oTD = null;
	                var oTR = null;
	                var nP = null;
	                var nR = 0;
	                var nC = oTable.rows[0].cells.length-1;
	                var nSel = 0;
	                for(nR=1;nR<oTable.rows.length;nR++)
	                {
	                    oTR = oTable.rows[nR];
	                    oTD = oTR.cells[nC];
	                    nP = oTD.childNodes.length-1;
	                    oCheck = oTD.childNodes[nP];
	                    sSel = $(oCheck).checked 
	                    if(sSel==null)
	                        sSel=false;
                        if( sSel == true)
                        {
                           oCheck.checked = false;
                           oTR.style.backgroundColor= '#ffffff';
                           nSel++; 
                        } 
	                }
	                return nSel;
	            }

	            					        	
	this.assign = function (sIdContainer) 
							{
								if (sIdContainer == null)
	  								oDiv = $(this.Container) 
	  							else
	  								oDiv =  $(sIdContainer);	  	
                                if (oDiv.childNodes.length>0)
                                {
                                    for(var nI=0;nI<oDiv.childNodes.length; nI++)
                                    {
                                        oNod = oDiv.childNodes[nI]
                                        oDiv.removeChild(oNod)
                                    }    
                                } 	  																				
	  							oDiv.appendChild( this.divGrid )	
							}
	
	//Inseta una Fila para poner los totales de las columnas
    this.totalRow = function()
                    {
                        var Tabla = this.getTable()
                        var Fila = Tabla.insertRow(Tabla.rows.length);
                        Fila.id = 'Totals';
                        this.Totals = true;
                        return Fila;
                    }

    
    //Para la Fila inserta en la columna nCol una celda con valor, tipo y alineación
	this.insertCell = function(Fila, nCol, sValor, sTipo, sAlign)
                    {
	                    var Celda = Fila.insertCell(nCol-1);
                    	
	                    if (sTipo != null)
		                     Celda.id = sTipo;
                    		 
	                    if (sAlign != null)
		                    Celda.align = sAlign ;
                    	
	                    Celda.innerHTML = sValor;
	                    return Celda;
                    }
                    	        
                    	        
	this.addCell = function(Fila, sValor, sAlign, sColspan)
                    {
	                    var oCel = document.createElement("TD")
                            if(this.aCols[nC].display!=null)
                                oCel.style.display = this.aCols[nC].display;
	                    if (sAlign != null)
		                    oCel.setAttribute("align", sAlign);
	                    if (sColspan != null)
		                    oCel.setAttribute("colspan", sColspan);
	                    if (sValor == null || sValor == '')
	                        oCel.innerHTML = '&#160'
	                    else
		                    oCel.innerHTML = sValor;	
	                    Fila.appendChild(oCel);	
	                    return oCel;
                    }
                    
    //Inserta nNum celdas con espacios en la Fila                    
    this.spaceCell = function(Fila, nNum)
                    {
                       for(var i=0;i<nNum;i++) 
                       {
                           var oCel = document.createElement("TD")
		                   oCel.innerHTML = " "                        
		                   Fila.appendChild(oCel)    
		               }
                    }
                    
	this.totalCell = function(sValor, sAlign, sColspan)
                        // Para la Fila agrega al final una celda de la fila final
                        {
                            var Tabla = this.getTable()
	                        var Fila = Tabla.rows[Tabla.rows.length-1]
	                        var oCel = document.createElement("TD")
	                        if (sValor != null)
		                        if (sValor.substr(0,4) =='SUM(' || sValor.substr(0,4) =='AVG(')
		                        {
		                           oCel.setAttribute("eval", sValor);
		                        }
		                        else
		                        {
		                           oCel.innerHTML = sValor;	
		                        }
	                        if (sAlign != null)
		                        oCel.setAttribute("align", sAlign);
	                        if (sColspan != null)
		                        oCel.setAttribute("colspan", sColspan);
	                        Fila.appendChild(oCel);	
	                        return oCel;
                        }
                        
    //Suma los elementos de una columna                        
	this.Sum = function(nCol)
	                    {
	                        var Tabla = this.getTable();
							var sSuma = _SumColumn(Tabla, nCol, this.Totals);		
							return sSuma;
	                    }

    //Agrega una acción a la columna acción
    this.addIcon = function(sFila, sAction, sIcon, sAlt, sType)
                        {
                            if ( typeof(sFila) == 'object' )
                                var Fila = sFila
                            else
                                var Fila = $(sFila);
                                
	                        var Celda = Fila.cells[Fila.cells.length-1];
	                        if (Celda.id != 'acc_col')
	                        {
	                            Celda = Fila.insertCell(Fila.cells.length);
	                            Celda.setAttribute("align","center");
	                            Celda.setAttribute("nowrap","true")
	                            Celda.id = 'acc_col'	
	                        }    
	                        var objA = this.createAction(sAction, sIcon, sAlt, Fila.id, sType);
	                        Celda.appendChild(objA);                            
                        }

                        
    //Crea un objeto de acción
	this.createAction = function(sAction, sIcon, sAlt, sId, sType)
                        {
                            if (sId == null)
                                sId='#';
                            if(sType == "check")
                            {
                                var objA = document.createElement('div');
                                if(sAction == '')
                                    objA.innerHTML = '<input type="checkbox" id="chk_#" value=""/>';
                                else
                                {
                                    sAction = sAction.replace('()', '(this,\'#\')');
                                    objA.innerHTML = '<input type="checkbox" id="chk_#" value="" onClick="javascript:' + sAction + '"/>';
                                }                                    
	                            return objA.firstChild;	            
                            }    
                            else
                            {
                                var aAcc = sAction.split(';');
                                var sParam = '';
                                var sHref = 'javascript:';
                                for(var nA=0;nA<aAcc.length;nA++)
                                {
                                    var sAcc = aAcc[nA];
                                        sAcc = sAcc.replace('(','');
                                        sAcc = sAcc.replace(')','');
                                        sParam = '"' + sAcc + '", "' + sId + '", "' + this.id + '_table"' 
                                        sHref += 'XS_Eval('+ sParam + ');'; 
                                }        
                                    var objA = document.createElement('A'); 
	                                    objA.setAttribute("href", sHref)
	                                    objA.setAttribute("title", sAlt)
	                                    objA.setAttribute("rel", sIcon.toLowerCase())
    	                                
	                                var objImg = document.createElement('IMG');
	                                    objImg.src = '/XS_Include/Icons/icon_' + sIcon + '.gif';
	                                    objImg.setAttribute("border","0")
	                                    objImg.setAttribute("hSpace","2")
	                                    objA.appendChild(objImg);	
	                                    return objA;	            
	                        }                                            
                        }

    //Oculta Icono de accion
	this.hideAction = function(oObj, sIcon)
	                  {
	                    if(typeof(oObj) == 'string')
	                        var oTR = $(oTR)
	                    else
	                        var oTR = oObj;
	                    if(oTR!=null)
	                    {    
	                        var aAcc = oTR.cells[oTR.cells.length-1].childNodes;
	                        for(var nA=0;nA<aAcc.length;nA++)
	                        {
                                sIcon = sIcon.toLowerCase();
	                            if(aAcc[nA].getAttribute('rel') == sIcon)
	                                aAcc[nA].style.display = 'none';
	                        }
	                    }
	                    else
	                        alert('XS_Grid.hideAction: No se identificó fila ' + sIdRow);
	                  }  

    //Muestra Icono de accion
	this.showAction = function(oObj, sIcon)
	                  {
	                    if(typeof(oObj) == 'string')
	                        var oTR = $(oTR)
	                    else
	                        var oTR = oObj;
	                    var aAcc = oTR.cells[oTR.cells.length-1].childNodes;
	                    for(var nA=0;nA<aAcc.length;nA++)
	                    {
	                        if(aAcc[nA].getAttribute('name') == sIcon)
	                            aAcc[nA].style.display = 'block';
	                    }
	                  }  


    //Recupera la posición de la columna asociada al campo
    this.getColumnPos = function(sCampo)
                        {    
                            if(sCampo==null)
                            {
                                alert('XS_Grid.getColumnPos: Parámetro campo es nullo ');
                                return null;
                            }
                            var sAux = '';
                            for(var nC=0; nC<this.aCols.length; nC++)
                            {
                               sAux = this.aCols[nC].field.toUpperCase(); 
                               if(sAux.indexOf(':') == -1)
                               {
                                   if ( sAux == sCampo.toUpperCase() )
                                      return nC;   
                               }    
                               else
                               {
                                    if (sAux.indexOf(sCampo.toUpperCase()) != -1)
                                    {
                                      return nC;   
                                    }  
                               }    
                            }
                            return null
                        }

    //Recupera el objeto de definición del campo de una columna
    this.getColumn = function(sCampo)
                        {    
                            var nC = this.getColumnPos(sCampo);
                            if(nC!=null)
                               return this.aCols[nC]   
                            else
                               return null;
                        }
                        
	this.getRow = function(sId_Row) 
	                 {
	                    return $(sId_Row)
	                 }   

    this.getKey = function(sIdRow, sKey)
                    {
                        if (typeof(sIdRow) == 'object')
                           var Fila = sIdRow
                        else
                           var Fila = this.getRow(sIdRow);
                        if(sKey==null)
                        {
                            alert('XS_Grid.getKey: Falta definición de parámetro');
                            return null;
                        }   
                        if(Fila == null)
                        {
                            alert('XS_Grid.getKey: No se encontró fila ' + sIdRow);
                            return null;
                        }   
                        return Fila.getAttribute(sKey);
                    }    

    this.putKey = function(sIdRow, sKey, sValue)
                    {
                        if (typeof(sIdRow) == 'object')
                           var Fila = sIdRow
                        else
                           var Fila = this.getRow(sIdRow);
                        if(Fila == null)
                            alert('XS_Grid: No se encontró fila ' + sIdRow)
                        else
                            Fila.setAttribute(sKey,sValue);
                        return
                    }    
                                
    //Desde la fila sIdRow, recupera el valor de la celda definida para el campo
    this.getValue = function(sIdRow, sCampo, lAlert)
                        {
                           if(lAlert == null)
                              lAlert = false;
                               
                           if (typeof(sIdRow) == 'object')
                               var Fila = sIdRow
                           else
                               var Fila = this.getRow(sIdRow)
                        
                            if(Fila == null)
                            {
                                if(lAlert==true)alert('XS_Grid.getValue : No se identificó la fila')
                                return null;
                            }    
                            
                            var sRet = null;
                            var nC = this.getColumnPos(sCampo); 
                            if(nC==null)
                            {
                                if(lAlert==true)('XS_Grid.getValue() : No se identificó campo ' + sCampo)
                                return null
                            }    
                            else
                            {
                                sRet = Fila.cells[nC].innerHTML;                                    
                            }
                            return sRet;
                        }
                        

    //Desde la fila sIdRow, recupera el código asociado a la celda definida para el campo
    this.getCode = function(sIdRow, sCampo)
                        {
                           if (typeof(sIdRow) == 'object')
                               var Fila = sIdRow
                           else
                               var Fila = this.getRow(sIdRow)
                        
                            if(Fila == null)
                            {
                                alert('XS_Grid.getValue : No se identificó la fila')
                                return null;
                            }    
                            
                            var sRet = null;
                            var nC = this.getColumnPos(sCampo);
                            if(nC == null)
                            {
                                alert('XS_Grid.getCode() : No se identificó campo ' + sCampo)
                                return null
                            }    
                            else
                            {
                                sRet = Fila.cells[nC].getAttribute('code');                                    
                            }
                            return sRet;
                        }

    //En la fila sIdRow, asigna el valor de la celda definida para el campo
    this.putValue = function(sIdRow, sCampo, sValue)
                        {
                           if (typeof(sIdRow) == 'object')
                               var Fila = sIdRow
                           else
                               var Fila = this.getRow(sIdRow)
                        
                            if(Fila == null)
                            {
                                alert('XS_Grid.getValue : No se identificó la fila')
                                return null;
                            }    
                            
                            var sRet = null;
                            var nC = this.getColumnPos(sCampo); 
                            if(nC==null)
                            {
                                alert('XS_Grid.putValue() : No se identificó campo ' + sCampo)
                                return null
                            }    
                            else
                            {
                                var oTD = Fila.cells[nC]
                                oTD.innerHTML= sValue;                                    
                            }
                            return oTD;
                        }
                        


    //Busca en todas las filas el valor de una llave
    this.searchKey = function(sKey, sValue)
                        {
                            var nCol = this.getColumnPos(sCampo);
	                        var oTabla = this.getTable()
	                        var Fila = null;
                            for(var nR=1;nR<oTabla.rows.length;nR++)
                            {
                                var oTR = oTabla.rows[nR];
                                if(oTR.getAttribute(sKey) == sValue)
                                {
                                    Fila = oTabla.rows[nR];
                                    this.selectedRow = Fila.getAttribute('id');
                                    break;
                                }
                            }
                            return Fila;
                        }
    
    //Busca en todas las filas el código en una columna
    this.searchCode = function(sCampo, sCode)
                        {
                            var nCol = this.getColumnPos(sCampo);
	                        var oTabla = this.getTable()
	                        var Fila = null;
                            for(var nR=1;nR<oTabla.rows.length;nR++)
                            {
                                var oCelda = oTabla.rows[nR].cells[nCol];
                                if(oCelda.getAttribute('code') == sCode)
                                {
                                    Fila = oTabla.rows[nR];
                                    this.selectedRow = Fila.getAttribute('id');
                                    break;
                                }
                            }
                            return Fila;
                        }

    //Busca en todas las filas el valor en una columna
    this.searchValue = function(sCampo, sValue)
                        {
                            var nCol = this.getColumnPos(sCampo);
	                        var oTabla = this.getTable()
	                        var Fila = null;
                            for(var nR=1;nR<oTabla.rows.length;nR++)
                            {
                                var oCelda = oTabla.rows[nR].cells[nCol];
                                if(oCelda.innerHTML == sValue)
                                {
                                    Fila = oTabla.rows[nR];
                                    this.selectedRow = Fila.getAttribute('id');
                                    break;
                                }
                            }
                            return Fila;
                        }

    //Busca todas las filas que el valor (sValue) para las celdas de la columna definida para el campo (sCampo)
    this.filter = function(sCampo, sValue)
                        {
                            var nNumFil = 0;
                            var nCol = this.getColumnPos(sCampo);
                            if(nCol == null)
                            {
                                alert('No se encontró campo: ' + sCampo);
                                return;
                            }
	                        var oTabla = this.getTable()
	                        var sCelda = '';
	                        if( sValue != '')
	                        {
	                            sValue = sValue.toLowerCase();
                                for(var nR=1;nR<oTabla.rows.length;nR++)
                                {
                                    var Fila = $(oTabla.rows[nR]);
                                    sCelda = Fila.cells[nCol].innerHTML;
                                    sCelda = sCelda.toLowerCase();
                                    if( sCelda.indexOf(sValue) == -1 ) //No está en la celda
                                    {
                                        Fila.hide();
                                    }
                                    else
                                    {
                                        Fila.show();
                                        nNumFil++;
                                    }
                                }
                                if(nNumFil>0)
                                {
                                    if(this.page!=null)
                                        $(this.id + '_pags').style.visibility = 'hidden'; 
                                }
                            }    
                            else
                            {
                                nNumFil = this.clearFilter();         
                            }
                            return nNumFil;
                        }
    
    //Limpia los filtros de una tabla
    this.clearFilter = function()
                         {
	                            var oTabla = this.getTable()
                                var nNumFil = 0;
                                if(this.page!=null)
                                {
                                    var oPag = $(this.id + '_pags');
                                    if(oPag != null)
                                        oPag.style.visibility = 'visible'; 
                                    var nIni = (this.page-1)*this.pageLength + 1;
                                    var nFin = (this.page-1)*this.pageLength + this.pageLength;
                                    for(var nR=1;nR<oTabla.rows.length;nR++)
                                    {
                                        if (nR>=nIni && nR<=nFin)
                                            $(oTabla.rows[nR]).show();
                                        else
                                            $(oTabla.rows[nR]).hide();
                                        nNumFil++;
                                    }
                                }
                                else                                    
                                for(var nR=1;nR<oTabla.rows.length;nR++)
                                {
                                    $(oTabla.rows[nR]).show();
                                    nNumFil++;
                                }
                                return nNumFil;
                        }    

    //Asigna una formula de calculo en una columna                        	
	this.setCalc = function(nCol, sCalc)
	        {
	                var Tabla = this.getTable()
	                var Fila = Tabla.rows[0]
	                var Celda = Fila.childNodes[nCol-1]	
	                Celda.setAttribute("eval",sCalc)	
	        }
	
	//Calcula el total de las columnas
	this.evalTotals = function() 
                        {
	                        _CalculaTotales( this.getTable())	
                        }

                    	
    //Transforma una fila a objetos de Edición                	    
	this.editRowOn = function(sId_Row) 
	                {
		                var Tabla = $(this.id + '_table')
		                this.editing = true;
	                    if (sId_Row == null)
	                        var sIdRow = this.id + "_" + this.lastRow;
                        else
	                        var sIdRow = sId_Row;
                        
			                aFilas = Tabla.rows		
			                var current_row = -1;
			                for(var r=1; r <aFilas.length; r++)
			                {
				                if (aFilas[r].getAttribute("id") == sIdRow)
				                {
					                var current_row = r;
					                var fila = aFilas[r];
					                break;								
				                }
			                }
                                        					 				     	
			                if (current_row == -1)
			                {
				                alert('No se indetificó la fila : ' + sIdRow)    
		 		                return
		 	                }
                   		 
		                    if ( current_row != this.m_row_index )
		                    {
	                           if ( this.m_row_index != -1 )
	                             this.editRowOff ( fila.parentNode.rows[this.m_row_index], 'false' )
	                           else
                               if ( this.Id_newRow != -1 && this.Id_newRow != sId_Row)
                               {    
		                            var NewFila = this.selectRow(this.Id_newRow) 
		                            if (NewFila != null)
		                            {
                                        if (confirm('Cancelar nuevo ingreso?'))
                                        {
                                             this.cancelRow(this.Id_newRow);
                                             this.Id_newRow = -1;
                                        }
                                        return;
                                    }     
                               }     
                	
	                          this.m_row_index = current_row;
	                          this.m_row_clone = fila.cloneNode(true);
                               //Asigna los objetos de edición en las celdas de la fila 
	                           for ( var i=0 ; i < fila.cells.length ; i++ )
	                           {
	                                var celda = fila.cells[i];
   		    	                    if ( celda.getAttribute('id') == 'acc_col') //Asigna los botones de acción
   		    	                    {
   		    	                         var sAcc = this.AccionesOn.childNodes[0].innerHTML;
	                                     sAcc = Replace(sAcc,'#', sIdRow );
   		    	                         celda.innerHTML = sAcc;
   		    	                    }     
   		    	                    else
                                    if (this.aObjects[i] != null)
                                    {
                                       var oDiv = this.aObjects[i];
                                       var oEdit = oDiv.firstChild;
                                       if (oEdit == null)
                                       {
                                            alert('No se encontró objeto para la columna ' + i);
                                            return;
                                       }
                                       var sNodeType = oEdit.nodeName.toUpperCase();
	    	                           switch ( sNodeType )
	    	                           {
	    	   	                           case 'INPUT':
	    	   	                                var sValor = celda.innerHTML;
	    	   	                                sValor = sValor.unescapeHTML()
	    	   	                                if (sValor.blank())
                                                    oDiv.firstChild.setAttribute('value', '')
                                                else
                                                    oDiv.firstChild.setAttribute('value', sValor);
                                                celda.innerHTML = oDiv.innerHTML; 
                                                break;
	    	   	                           case 'SELECT':
                                                var sCode = celda.getAttribute('code');
	    	   	                                var oSelect = oDiv.firstChild;
    	   	                                    var aOpciones = oSelect.childNodes;
                                                 for ( var nI = 0; nI < aOpciones.length ; nI++ )
                                                 {
 	                                                if ( aOpciones[nI].getAttribute('value') == sCode)
 	                                                {
 	    	                                             aOpciones[nI].setAttribute('selected', true);	     	    	
 	    	                                        }     
                                                 }
                                                 celda.innerHTML = oDiv.innerHTML; 
                                                break;
	    	   	                           case 'TABLE':
	    	   	                                var sValor = celda.innerHTML;
	    	   	                                if(oDiv.firstChild.getAttribute('type') == 'date')
	    	   	                                {
	    	   	                                    if (sValor.blank())
	    	   	                                        oDiv.firstChild.rows[0].cells[0].firstChild.setAttribute('value', '');
                                                    else
	    	   	                                        oDiv.firstChild.rows[0].cells[0].firstChild.setAttribute('value', sValor);
	    	   	                                    var oTD = oDiv.firstChild.rows[0].cells[1];
	    	   	                                    var oImg = oTD.firstChild.firstChild;
                                                    celda.innerHTML = oDiv.innerHTML; 
                                                }    
                                                break;
	    	   	                       } 
                                    }
	                           }                			      			         
		                   }
	                 }

     this.editRowOff = function ( sFila, editar )
                     {
                           this.editing = false;	                                             
                           this.Id_newRow = -1;
                           if (typeof(sFila) == 'object')
                               var fila = sFila
                           else
                               var fila = $(sFila);
	                       for ( var i=0 ; i < fila.childNodes.length; i++ )
	                       {
	   		                    var celda = fila.childNodes[i];
	   		                    if(this.m_row_clone != null)
	   		                        if(this.m_row_clone.childNodes.length>0)
			                            var celda_clon = this.m_row_clone.childNodes[i];
	   		                    if ( celda.innerHTML!='' && celda.firstChild.nodeType == 1 )
	   		                    {	   		    	
   		    	                   var element_name = celda.firstChild.nodeName;
   		    	                   switch ( element_name )
   		    	                   {
   		    	   	                   case 'INPUT':
						                  if ( editar == true )
						                  {
						                     //var valor = celda.firstChild.getAttribute('value');
						                     var oInput = celda.firstChild;
						                     var valor = oInput.value;
							                 if ( valor != '')
							                    celda.innerHTML = valor
							                 else
							                    celda.innerHTML = '';
						                  }
						                  else
						                  {
						                     if(celda_clon!=null)
						                     {
						                         if (celda_clon.childNodes.length>0)
					                                celda.innerHTML = celda_clon.firstChild.nodeValue
					                             else
					                                celda.innerHTML = '';
					                         }
					                         else
					                            celda.innerHTML = '';
					                      }   
						                  break;

   		    	   	                   case 'TABLE':
            	   		    	   	      if (editar == true)
            	   		    	   	      {
	   	                                        if(celda.firstChild.getAttribute('type') == 'date')
	   	                                        {
	   	                                                        //Div / Tabla    /fila   /columna  /Input
  	                                                        
	   	                                           var oInput = celda.firstChild.rows[0].cells[0].firstChild                  	   	                                           
                                                  celda.innerHTML = oInput.value;
                                                }  
                                                break;            	   		    	   	      
            	   		    	   	      }
            	   		    	   	      else
            	   		    	   	      {
					                         celda.innerHTML = celda_clon.firstChild.nodeValue;            	   		    	   	      
            	   		    	   	      };
	    	   	                          break;
	    	   	                                      	   		    	   	        
		   		    	                case 'SELECT': 
						                  if ( editar == true )
						                     celda.innerHTML = celda.firstChild.options[celda.firstChild.selectedIndex].text
						                  else
						                     celda.innerHTML = celda_clon.firstChild.nodeValue;
	    	   	                          break;
   		    	                   }
   		    	                   if ( celda.getAttribute('id') == 'acc_col')
   		    	                   {
   		    	                     if(celda_clon!=null)
   		    	                        celda.innerHTML = celda_clon.innerHTML;
   		    	                     else
   		    	                     {
   		    	                       	 var sAcc = this.AccionesOff.childNodes[0].innerHTML;
	                                     sAcc = Replace(sAcc,'#', sFila );
   		    	                         celda.innerHTML = sAcc;
                                     }   
   		    	                   }
	   		                    }
	                      }
	                      
	                      this.m_row_index = -1;
	                      this.m_row_clone = null;
 
                    }
	
	this.editConfirm = function(sIdRow) 
					{
							this.editRowOff( sIdRow, true ); 		
							this.m_row_index = -1;
					}   	


    this.unSelect = function()
                {
                    if(this.selectedRow!=null)
                    {
                        this.colorRow(this.selectedRow, '#ffffff');
                        this.selectedRow = null;
                    } 
                }
                
    // Recupera el objeto de la fila según id=sIdRow
    this.selectRow = function(sIdRow)
                        {
		                    var Tabla = $(this.id + '_table')
		                    if ( this.Totals)
		                        var nNumLin = Tabla.rows.length-1
		                    else
		                        var nNumLin = Tabla.rows.length;

                            for(var r=0;r<nNumLin;r++)
                            {
	                            if (Tabla.rows[r].id == sIdRow)
	                            {
	                                this.unSelect()
	                                this.selectedRow = Tabla.rows[r];
	                                this.colorRow(this.selectedRow, selection_color)
	                                this.idxRow = r;
			                        return this.selectedRow;
	                            }
                            }	 				 	
                            //alert('selectRow: No se indetificó la fila : ' + sIdRow)
                            return null
                        }

	this.cancelRow = function(sIdRow) 
                    {
                        if (this.m_row_index == -1)
                            this.deleteRow(sIdRow)    
                        else
                            this.editRowOff(sIdRow, false);
                        this.editing = false;    
                    }

	
	this.newRow = function()
	                {
                        var Fila = this.addRow();
                        this.Id_newRow = Fila.getAttribute('id')                        
                        this.editRowOn(this.Id_newRow)
					    this.m_row_index = -1;
                    	this.m_row_clone = null;
                        return this.Id_newRow;
	                }
	                
	this.deleteRow = function(sIdRow) 
	                {
		                var Tabla = $(this.id + '_table')
	                    for(var r=1;r<Tabla.rows.length;r++)
	                    {
		                    if (Tabla.rows[r].id == sIdRow)
		                    {
			                    var Fila = Tabla.rows[r]
			                    Tabla.deleteRow(r);					
			                    _CalculaTotales(Tabla)
			                    return true;
		                    }
	                    }	 				 	
	                    return false;	                
	                }
	
	this.colorRow = function(sIdRow, sColor) 
                    {
                        if(sIdRow == null)
                           sIdRow = this.selectedRow;
                        var Fila = $(sIdRow)
                        if(Fila == null)
		                    var Fila = this.selectRow(sIdRow);
		                if(Fila != null)
		                {    
	                        if (sColor == null)
			                    sColor = '#ffffff';
                            for(var nC=0;nC<Fila.cells.length;nC++)
			                    Fila.cells[nC].style.background = sColor;
			            }    
                    }	
                    	
	this.getTotal = function(nCol)
	                {
	                    var Tabla = this.getTable();
	                    var Fila = Tabla.rows[Tabla.rows.length-1];
	                    sRet = Fila.cells[nCol-1].innerHTML;
	                    if (sRet == '') sRet = 0;
                        return sRet;
	                 }									

    this.createRow = function(nPos)
                    {
                        var Tabla = this.getTable();                 
                        var nUlt = Tabla.rows.length;
                        if(this.Totals)nUlt--
                        var nNum = parseInt(Tabla.getAttribute("num"))
                        nNum = nNum + 1;
                        if(nPos == null)
                            var Fila = Tabla.insertRow(nUlt)
                        else    
                            var Fila = Tabla.insertRow(nPos);
                        this.lastRow = nUlt;
                        Fila.id = this.id + "_" + nNum;
                        Fila.setAttribute("height","20");
                        Fila.setAttribute('onMouseOver',"_rowIn(this)")
                        Fila.setAttribute('onMouseOut', "_rowOut(this)")
                        Tabla.setAttribute("num", nNum);
                        return Fila
                    }
                    
    this.insertRow = function(jParams)
                     {
                        jParams = Object.toJSON(jParams).evalJSON();
                        if(jParams.position == null)
                            var Fila = this.createRow(null)
                        else    
                            var Fila = this.createRow(jParams.position)
                        
                        //Crea las celdas vacías    
                        for(var nC=0;nC<this.aCols.length;nC++)
                        {
                            var Celda = this.createCell(nC, '');
                            Fila.appendChild(Celda)
                        }
                        if (this.nAcc>0)
                        {
                            var Celda = Fila.cells[Fila.cells.length-1];
                            if (Celda.getAttribute('id') != 'acc_col') 
                            {
                                Celda = Fila.insertCell(Fila.cells.length)
                                Celda.setAttribute("align","center")	
                                Celda.setAttribute("id","acc_col")
                                Celda.setAttribute("nowrap","true")
                            }
                            objDiv = this.AccionesOff.childNodes[0];
                            var sAcc = objDiv.innerHTML
                            sAcc = Replace(sAcc,'#', Fila.id )
                            Celda.innerHTML = sAcc
                        }

                        var aFields= jParams.fields;                       
                        if(aFields != null)
                        {
                            for(var nF=0;nF<aFields.length;nF++)
                            {
                                var nC = this.getColumnPos(aFields[nF].field); 
                                if(nC!=null)
                                {
                                    Fila.cells[nC].innerHTML = aFields[nF].value;
                                    if(aFields[nF].type == 'list' || aFields[nF].type=='pop')
                                    {
                                        Fila.cells[nC].setAttribute('code', aFields[nF].code );
                                    }
                                }
                            }    
                        }
                        
                        return Fila
                     }

    this.updateRow = function(jParams)
                     {
                        jParams = Object.toJSON(jParams).evalJSON();
                        if(jParams.id != null)
                            var Fila = this.selectRow(jParams.id);
                        if(Fila==null)
                        {
                            alert('No se identificó la fila ' + jParams.id)
                            return false
                        }    
                        var aCells = jParams.fields; 
                        if (jParams.fields != null)
                        {
                            for(var nC=0;nC<aCells.length;nC++)
                            {
                                var Celda = Fila.cells[nC];
                                Celda.innerHTML = sAcc;
                            }
                        }        
                        return Fila
                    }
                    
    this.loadForm = function(oForm, sIdRow)
                    {
                        if(sIdRow == null)
                            var Fila = this.insertRow({position:1})
                        else    
                        {
                            if(typeof(sIdRow) == 'object')
                                var Fila = sIdRow
                            else
                                var Fila = this.selectRow(sIdRow);
                        }    
                            
                        for(var nC = 0; nC<this.aCols.length; nC++)              //Lista de columnas definidas para la grilla
                        {
                            var oValue = oForm.getField( this.aCols[nC].field ); //Recupera valor del campo desde el formulario
                            if(oValue != null)                         
                            {   
                                Fila.cells[nC].innerHTML = oValue.value;            
                                if(oValue.type == 'list' || oValue.type == 'pop')
                                {
                                   Fila.cells[nC].setAttribute('code', oValue.code);                                     
//                                   alert(Fila.cells[nC].outerHTML)
                                }   
                            }    
                        }
                    }
                    
    this.createCell = function(nC, sValue, sCode)
                    {
                        var oCel = document.createElement("TD"); 
                            if(this.aCols[nC].display!=null)
                                oCel.style.display = this.aCols[nC].display;
                            oCel.setAttribute("height","20")
                            oCel.setAttribute("align", this.aCols[nC].align);
                            oCel.setAttribute("width", this.aCols[nC].width);
                            oCel.setAttribute("onMouseOver","_MouseIn(this,'" + this.id + "_tips')" );
                            oCel.setAttribute("onMouseOut","_MouseOut(this,'" + this.id + "_tips')" );
                            oCel.setAttribute("col", nC );    
                            
                            if(this.aCols[nC].format!=null)
                            {
                                var sFormat = this.aCols[nC].format
                                sFormat = sFormat.toLowerCase();
                            }    
                            else
                                var sFormat = '';
                                
                                
                            if (sFormat == 'currency')
                               oCel.innerHTML = _FormatCurrency(sValue)               
                            else 
                            if (sFormat == 'percent')
                               oCel.innerHTML = sValue + ' %'
                            else
                            if (sFormat == 'list')
                               oCel.innerHTML = sValue
                            else
                            {
                               if (sValue == '')
                                    oCel.innerHTML = ''	
                               else                                                                           
                                    oCel.innerHTML = sValue;	
                            }   
                            
                            if (sCode!=null)
                               oCel.setAttribute("code", sCode);

                               
                            return oCel;
                    }
               
                                                   
	this.addRow = function(oTable, rowNodes)
                        {
                            if (rowNodes != null)
                                var lLoad = true
                            else
                                var lLoad = false;
                                
                            if (oTable == null)                                    
		                        var Tabla = $(this.id + '_table')
		                    else
		                        var Tabla = oTable;
		                    
		                    if (Tabla == null)
		                    {
		                        alert('addRow: No se indetificó la Tabla');
		                        return;
		                    }    
	                        var nUlt = Tabla.rows.length;
	                        if(this.Totals)nUlt--
	                        var nNum = parseInt(Tabla.getAttribute("num"))
	                        var sId_Table = Tabla.getAttribute("id")		
	                        nNum = nNum + 1;
	                        var Fila = Tabla.insertRow(nUlt)
	                        this.lastRow = nUlt;
	                        
	                        Fila.id = this.id + "_" + nNum;
	                        
	                        Fila.setAttribute("height","20");
	                        Tabla.setAttribute("num", nNum + '')
                            for(var nC=0;nC<this.aCols.length;nC++)
                            {
                                if (lLoad == true)
                                {
                                    var sField = this.aCols[nC].field;
                                    if(sField == 'undefined')
                                    {
                                        nC++;
                                        alert('XS_Grid.addRow: No se definió el campo de la columna ' + nC + ' de la grilla ' + this.id);
                                        return null
                                    }    
                                    sField = sField.toUpperCase()
                                    var sField2 = '';
                                    if (sField != '' && sField != null)
                                    {
                                        if(sField == '#I')
                                        {
                                            oCel = this.createCell(nC, nNum + ''); 
                                            sValue = (this.sectionPage-1)*this.sectionLength + nNum;
                                        }
                                        else
                                        {   
                                            sField = sField.replace(':','|')
                                            var aField = sField.split('|')
                                            
                                            if (aField.length > 1)
                                            {
                                                sField  = aField[0];
                                                sField2 = aField[1];
                                            }  
                                            var sValue = getNode( rowNodes, sField)
                                            
                                            if (sField2 == '')
                                            {
                                                oCel = this.createCell(nC, sValue);
                                            }
                                            else
                                            {
                                                var sCode = getNode( rowNodes, sField2);
                                                //oCel.setAttribute("code", sCode)
                                                oCel = this.createCell(nC, sValue, sCode);
                                                
                                            }
                                        }                                        
                                    }    
                                    else
                                    {
                                        oCel = this.createCell(nC, '');
                                    }
                                }
                                else
                                    oCel = this.createCell(nC, '');

                                if (lLoad == true && sField != '')
                                {
                                    if(this.aCols[nC].format!=null)
                                    {
                                        var sFormat = this.aCols[nC].format.toLowerCase()
                                    }    
                                    else
                                        var sFormat = '';
                                    if (sFormat == 'currency')
                                       oCel.innerHTML = _FormatCurrency(sValue)               
                                    else 
                                    if (sFormat == 'list')
                                       oCel.innerHTML = sValue
                                    else 
                                    if (sFormat == 'percent')
                                       oCel.innerHTML = sValue + ' %'
                                    else                                       
                                    if (sFormat == 'text')
                                    {
                                       sValue = sValue.sub(String.fromCharCode(13),'');
                                       sValue = sValue.sub(String.fromCharCode(10),'<BR/>');
                                       oCel.innerHTML = sValue;
                                    }   
                                    else
                                    {
                                       if (sValue == '')
                                            oCel.innerHTML = ''	
                                       else                                                                           
                                            oCel.innerHTML = sValue;	
                                    }   
                                }    
                                Fila.appendChild(oCel);	
                            }                    
                                    
                            if (this.nAcc>0)
                            {
                                var Celda = Fila.cells[Fila.cells.length-1];
                                if (Celda.getAttribute('id') != 'acc_col') 
                                {
	                                Celda = Fila.insertCell(Fila.cells.length)
	                                Celda.setAttribute("align","center")	
	                                Celda.setAttribute("id","acc_col")
	                                Celda.setAttribute("nowrap","true")
	                            }
	                            objDiv = this.AccionesOff.childNodes[0];
	                            var sAcc = objDiv.innerHTML
	                            sAcc = Replace(sAcc,'#', Fila.id )
	                            Celda.innerHTML = sAcc
                            }
                                    
                            if (this.Key != null)
                            {
                                aKey = this.Key.split(',')
                                sKey = ""
                                for(var nK=0;nK<aKey.length;nK++)
                                {
                                    sCampo = aKey[nK];
                                    sCampo = sCampo.toUpperCase();
                                    if ( lLoad == true)
                                        sValue = getNode(rowNodes, sCampo)
                                    else
                                        sValue = '';
                                    Fila.setAttribute(sCampo, sValue) 
                                }
                                Fila.setAttribute('row', this.lastRow)
                            }
                            return Fila
                        }


	this.appendRow = function(aValues, aAttributes)
                        {
		                    var Tabla = $(this.id + '_table')
		                    
		                    if (Tabla == null)
		                    {
		                        alert('appendRow: No se indetificó la Tabla');
		                        return;
		                    }    
	                        var nUlt = Tabla.rows.length;
	                        if(this.Totals)nUlt--
	                        var nNum = parseInt(Tabla.getAttribute("num"))
	                        var sId_Table = Tabla.getAttribute("id")		
	                        nNum = nNum + 1;
	                        var Fila = Tabla.insertRow(nUlt)
	                        this.lastRow = nUlt;
	                        
	                        Fila.id = this.id + "_" + nNum;
	                        
	                        Fila.setAttribute("height","20");
	                        Tabla.setAttribute("num", nNum + '')
                            for(var nC=0;nC<this.aCols.length;nC++)
                            {
                                    var sField = this.aCols[nC].field;
                                    if(sField+'' == 'undefined')
                                    {
                                        nC++;
                                        alert('XS_Grid.appendRow: No se definió el campo de la columna ' + nC + ' de la grilla ' + this.id);
                                        return null
                                    }    
                                    sField = sField.toUpperCase()
                                    
                                    var sField2 = '';
                                    if (sField != '' && sField != null)
                                    {
                                        if(sField == '#I')
                                        {
                                            oCel = this.createCell(nC, nNum + ''); 
                                            sValue = nNum;
                                        }
                                        else
                                        {   
                                            sField = sField.replace(':','|')
                                            var aField = sField.split('|')
                                            
                                            if (aField.length > 1)
                                            {
                                                sField  = aField[0];
                                                sField2 = aField[1];
                                            }  
                                            var sValue = aValues[nC];
                                            
                                            if (sField2 == '')
                                            {
                                                oCel = this.createCell(nC, sValue);
                                            }
                                            else
                                            {
//                                                var sCode = getNode( rowNodes, sField2);
//                                                //oCel.setAttribute("code", sCode)
//                                                oCel = this.createCell(nC, sValue, sCode);
                                            }
                                        }                                        
                                    }    

                                    if(this.aCols[nC].format!=null)
                                        var sFormat = this.aCols[nC].format.toLowerCase(); 
                                    else
                                        var sFormat = '';
                                    if (sFormat == 'currency')
                                       oCel.innerHTML = _FormatCurrency(sValue)               
                                    else 
                                    if (sFormat == 'list')
                                       oCel.innerHTML = sValue
                                    else 
                                    if (sFormat == 'percent')
                                       oCel.innerHTML = sValue + ' %'
                                    else                                       
                                    if (sFormat == 'text')
                                    {
                                       sValue = sValue.sub(String.fromCharCode(13),'');
                                       sValue = sValue.sub(String.fromCharCode(10),'<BR/>');
                                       oCel.innerHTML = sValue;
                                    }   
                                    else
                                    {
                                       if (sValue == '')
                                            oCel.innerHTML = ''	
                                       else                                                                           
                                            oCel.innerHTML = sValue;	
                                    }   
                                Fila.appendChild(oCel);	
                            }                    

                            if(aAttributes!=null) //Pone atributos
                            {
                                for(var i=0;i<aAttributes.length;i++)
                                    Fila.setAttribute(aAttributes[i].attr, aAttributes[i].value);
                            }
                                    
                            if (this.nAcc>0)
                            {
                                var Celda = Fila.cells[Fila.cells.length-1];
                                if (Celda.getAttribute('id') != 'acc_col') 
                                {
	                                Celda = Fila.insertCell(Fila.cells.length)
	                                Celda.setAttribute("align","center")	
	                                Celda.setAttribute("id","acc_col")
	                                Celda.setAttribute("nowrap","true")
	                            }
	                            objDiv = this.AccionesOff.childNodes[0];
	                            var sAcc = objDiv.innerHTML
	                            sAcc = Replace(sAcc,'#', Fila.id )
	                            Celda.innerHTML = sAcc
                            }
                                    
                            if (this.Key != null)
                            {
                                aKey = this.Key.split(',');
                                sKey = "";
                                for(var nK=0;nK<aKey.length;nK++)
                                {
                                    sCampo = aKey[nK];
                                    sCampo = sCampo.toUpperCase();
                                    Fila.setAttribute(sCampo, sValue); 
                                }
                                Fila.setAttribute('row', this.lastRow);
                            }
                            
                            if (this.onLoadRow != null)
                            {
                                var sRow = this.onLoadRow;
                                sRow = sRow.replace('(','');
                                sRow = sRow.replace(')','');
                                var sFunc = sRow + '("' + Fila.id + '")';
                                eval(sFunc);
                                //alert(sFunc)
                            }
                            return Fila;
                        }

    this.clearRows = function(){ this.clearContent(); }
                    
	this.clearContent = function()
	                {
	                    var oTable = this.getTable();
	                    var oTBody = oTable.firstChild; 
	                    var aRows = oTBody.childNodes;
                        var i=0;
                        while (aRows.length>1)
                        {
                            oTBody.removeChild( aRows[aRows.length-1] );
                            i=i+1;
                        }
                        oTable.setAttribute("num", '0')
                        this.page = 1;
                        this.botonesPaginacion(1);
                        this.clearFilter();
						this.selectedRow = null;
                        return;
	                 }									

    this.loadXML = function(objDat, lReplace)
                            {
							    this.selectedRow = null;
                                if(lReplace == true)
                                   this.clearContent();
                                   
                                //Filas de Datos
                                var objXML = objDat.XML;
                                if (objXML == null)
                                {
                                    alert('XS_Grid.loadXML: No hay contenedor XML')
                                    return false;                                    
                                }
                                var aRows = objXML.getElementsByTagName('ROWS')
                                if (aRows.length == 0)
                                {
                                    alert('XS_Grid.loadXML: No hay registros XML')
                                    return false;
                                }    
                                var aNodos = aRows[0].childNodes;                                     
                                if (aNodos.length>0)
                                {
                                    for(var nR=0;nR<aNodos.length;nR++)
                                    {
		                                var Fila = this.addRow(this.getTable(), aNodos[nR])		                                
                                        if (this.onLoadRow != null)
                                        {
                                            var sRow = this.onLoadRow;
                                            sRow = sRow.replace('(','');
                                            sRow = sRow.replace(')','');
                                            var sFunc = sRow + '("' + Fila.id + '")'
                                            eval(sFunc)
                                            //alert(sFunc)
                                        }
                                        if (this.pageLength!=null)
                                        {
                                            if (nR>this.pageLength-1)
                                                Fila.style.display = 'none';
                                        }    
                                    }
                                }                         
                                           
                                if (this.pageLength!=null)
                                {
                                    this.page = 1;
                                    this.botonesPaginacion(null);
                                    this.iniPage=null;
                                    this.endPage=null;
                                    if (this.sectionLength==null)
                                    {
                                       this.sectionPage = 1;
                                       this.sectionLength = parseInt(this.pageLength)*10;
                                    }
                                }
                            }

    this.loadRowXML = function(objDat, sIdRow)
                            {
                                var objXML = objDat.XML;
                                if (objXML == null)
                                {
                                    alert('XS_Grid.loadRowXML: No hay contenedor XML')
                                    return false;                                    
                                }
                                var aRows = objXML.getElementsByTagName('ROWS')
                                if (aRows.length == 0)
                                {
                                    alert('XS_Grid.loadRowXML: No hay registros XML')
                                    return false;
                                }    
                                var rowNodes = aRows[0].childNodes;   //Recupera los nodos de ROW                                  

                                if ( sIdRow == null )
                                    var Fila = this.selectedRow;
                                else
                                if ( typeof(sIdRow) == 'object' )
                                    var Fila = sIdRow
                                else
                                    var Fila = $(sIdRow);

                                for(var nC=0;nC<this.aCols.length;nC++)
                                {
                                        var sField = this.aCols[nC].field;
                                        sField = sField.toUpperCase()
                                        var sField2 = '';
                                        if (sField != '' && sField != null)
                                        {
                                              sField = sField.replace(':','|')
                                              var aField = sField.split('|')
                                              
                                              if (aField.length > 1)
                                              {
                                                  sField  = aField[0];
                                                  sField2 = aField[1];
                                              }  
                                              var sValue = getNode( rowNodes, sField)
                                              
                                              if (sField2 == '')
                                              {
                                                   Fila.rows[nC].innerHTML = sValue;
                                              }
                                              else
                                              {
                                                  var sCode = getNode( rowNodes, sField2);
                                                  var oCel = Fila.rows[nC];
                                                  oCel.setAttribute("code", sCode);
                                                  oCel.innerHTML = sValue;
                                              }
                                      }    
                                }                    
                                
                                //Actualización de llaves
                                if (this.Key != null)
                                {
                                    aKey = this.Key.split(',')
                                    sKey = ""
                                    for(var nK=0;nK<aKey.length;nK++)
                                    {
                                        sCampo = aKey[nK];
                                        sCampo = sCampo.toUpperCase();
                                        if ( lLoad == true)
                                            sValue = getNode(rowNodes, sCampo)
                                        else
                                            sValue = '';
                                        Fila.setAttribute(sCampo, sValue) 
                                    }
                                    Fila.setAttribute('row', this.lastRow)
                                }
                                //Actualización en carga		                                
                                if (this.onLoadRow != null)
                                {
                                    var sRow = this.onLoadRow;
                                    sRow = sRow.replace('(','');
                                    sRow = sRow.replace(')','');
                                    var sFunc = sRow + '("' + Fila.id + '")'
                                    eval(sFunc)
                                    //alert(sFunc)
                                }
                            }


    this.botonesPaginacion  = function(nCurrPage)
                    {
                        var sPaginas = 'Pág ';
                        var nNumRows = this.getTable().rows.length-1;
                        var nDiv = nNumRows/this.pageLength;
                        var nNumPags = Math.floor(nDiv); 
                        
                        if ( Math.ceil(nDiv) > nNumPags)
                             nNumPags = nNumPags + 1;
                        if (nNumPags==0)
                            sPaginas = ''
                        else
                        {
                            var nSec = (this.sectionPage-1)*this.pageLength;
                            var nSecAnt = this.sectionPage-1;
                            var nSecPos = this.sectionPage+1;
                            var nTotPags=nNumPags;
                           
                            if(this.loaderFunction != null  && nNumPags>this.pageLength)
                            {
                               nNumPags = this.pageLength;
                              // nSecPos=nSec+1;
                            }   
                            
                            if(this.sectionPage>1) //Si estoy en una seccion posterior
                                sPaginas += '<a href="javascript:' + this.id +'.goSection(' + nSecAnt + ',' + nSec + ')">&lt;</a>&#160;'; 

                            if(nCurrPage==null)
                               nCurrPage = this.nextPage;
                            
                            for(var nP=nSec+1;nP<nSec+nNumPags+1;nP++)
                            {
                                if(nP == nCurrPage)
                                    sPaginas += nP + '&#160;'
                                else
                                    sPaginas += '<a href="javascript:' + this.id +'.goPage(' + nP + ')">' + nP +'</a>&#160;'; 
                            }

                            
                            //if(nSecPos>0 && nP<=nTotPags)
                            //alert(nP + ' ' + nNumPags)
                            if(nSecPos>0 && this.loaderFunction!=null)
                            {   
                                sPaginas += '<a href="javascript:' + this.id +'.goSection(' + nSecPos + ',' + nP + ')">&gt;</a>&#160;'; 
                            }    
                            if(nSec+nNumPags==1)
                            {
                                sPaginas=''
                            }
                            
                        }
                        this.getContainer().firstChild.rows[1].cells[0].innerHTML = sPaginas;
                        var oTip=$(this.id + '_tips');
                        if(oTip != null)oTip.innerHTML = '';
                        return sPaginas
                    }                        

    this.goSection = function(nSec, nPag)
                    {
//                        this.sectionPage = nSec;
//                        this.nextPage = nPag;
                        var sFunc = this.loaderFunction;
                        sFunc=sFunc.replace('(','');
                        sFunc=sFunc.replace(')','');
                        sFunc=sFunc + '(' + nSec + ',' + nPag + ')';
                        $(this.id + '_tips').innerHTML = '<img src="/XS_Include/Icons/icon_rotor.gif"> Cargando ...</img>';
                        eval(sFunc);
                        //this.goPage(nPag);
                    }

    this.goPage = function(nPag)
                    {
                        var aRows = this.getTable().rows;
                        var nLar = aRows.length;
                        if(this.iniPage==null)
                        {
                            var nIni = 1;
                            var nFin = this.pageLength+1;
                        }
                        else
                        {
                            var nIni = this.iniPage;
                            var nFin = this.endPage;
                        }

                        for(var nR=nIni; nR<nFin; nR++)
                        {
                           var oTR = $(aRows[nR]);
                           if(oTR!=null)
                              oTR.hide();
                        }
                        
                        var nIni = (nPag-1) * this.pageLength + 1 
                        if(this.sectionPage>1)
                           nIni = nIni - (this.sectionLength*(this.sectionPage-1));
                           
                        var nFin = nIni + this.pageLength;
                        for(var nR=nIni; nR<nFin; nR++)
                        {
                            if (nR<nLar)
                            {
                               var oObj = $(aRows[nR]);
                               if(oObj != null)
                                  oObj.show();
                            }    
                        }
                        this.iniPage = nIni;
                        this.endPage = nFin;
                        this.page = nPag;
                        this.getContainer().firstChild.rows[1].cells[0].innerHTML = this.botonesPaginacion(nPag);
                    }

	this.validate = function(sFunctionEval)
	                {
	                    this.Message = "";
		                var Table = $(this.id + '_table')
	                    
	                    var oRow = Table.rows[this.m_row_index];
	                    var aCells = oRow.cells;
	                    var nErrores = 0;
	                    var sMsg = "";
	                    var sLabel = "";
	                    for(var nC=0;nC<aCells.length;nC++)
	                    {
	                            sMsg = "";
	   		                    var celda = oRow.cells[nC];
	                            var celda_clon = this.m_row_clone.childNodes[nC];
	                            
	                            var sType = Table.rows[0].cells[nC].getAttribute('format');
	                            
	                            var obj = null
	                            switch ( sType )
	                            {
	   	                           case 'text':
                                        var obj = celda.firstChild;
                                        sMsg = XS_textEdit_val(obj);
                                        break;
                                        
	   	                           case 'number':
                                        var obj = celda.firstChild;
                                        sMsg = XS_numberEdit_val(obj);
                                        break;

	   	                           case 'percent':
                                        var obj = celda.firstChild;
                                        sMsg = XS_numberEdit_val(obj);
                                        break;
                                                                                
	   	                           case 'rut':
                                        var obj = celda.firstChild;
                                        var sMsg = XS_rutEdit_val(obj);
                                        break;

	   	                           case 'date':
                                        var oTable = celda.firstChild;
                                        var obj = oTable.rows[0].cells[0].firstChild;
                                        var sMsg = XS_dateEdit_val(obj);
                                        break;                                
                                        
	   	                           case 'email':
                                        var obj = celda.firstChild;
                                        var sMsg = XS_emailEdit_val(obj);
                                        break
	   	                           
	   	                           case 'textarea':
                                        var obj = celda.firstChild;
                                        var sMsg = XS_textAreaEdit_val(obj);
                                        break;

	   	                           case 'list':
                                        var obj = celda.firstChild;
                                        var sMsg = XS_listEdit_val(obj);
                                        break;                                

	   	                           case 'pop':
                                        var oTable = celda.firstChild;
                                        var obj = oTable.rows[0].cells[0].firstChild;
                                        var sMsg = XS_popEdit_val(obj);
                                        break;                                

	   	                           case 'check':
	   	                                alert('valid check')
                                        break;                                

	   	                           case 'option':
	   	                                alert('valid option')
                                        break;                                
                                }                
                                if (obj != null)
	                                if( sMsg == "" )	  
	                                    obj.style.border = "1px #cccccc solid"                           
	                                else
	                                {
	                                    obj.style.border = "1px red solid"                           
	                                    nErrores++
	                                    if(nErrores == 1)
	                                        this.Message = sMsg
	                                    else
	                                        this.Message = nErrores + ' Errores detectados';
                               }	                                
                                
	                    }

	                    return nErrores;	
	                }			   


    this._G_addObject = function(nCol, obj) //Almacena el Objeto de Edición
            {
                        var oDiv = document.createElement('div');
                        oDiv.appendChild(obj);
                        if ( nCol > -1 && nCol < this.aObjects.length) 
                        {
                            this.aObjects[nCol] = oDiv;
                            return true;
                        }    
                        else
                        {
                            alert('Fuera del rango de columnas de la Grilla');
                            return false;
                        }
            }
}
//Ejecuta la función asociada a un botón de acción
function XS_Eval(sFunc, sIdRow, sIdTable)
{
    var Fila = $(sIdRow)
    if (Fila != null)
    {
        var sEval = sFunc + '("' + sIdRow + '","' + sIdTable + '", ' + Fila.getAttribute('key') + ')'
        setTimeout(sEval,30);
    }    
}

// Recupera el objeto de la fila según id=sIdRow
function XS_selectRow(Tabla, sIdRow)
{
	sFila = sIdRow
	
	for(var r=0;r<Tabla.rows.length-1;r++)
	{
			if (Tabla.rows[r].id == sFila)
			{
					return Tabla.rows[r];
			}
	}	 				 	
	alert('No se indetificó la fila : ' + sIdRow)
	return null
}


// Elimina la Fila según id=sIdRow
function XS_deleteRow(objTabla, sIdRow)
{
	var Tabla = $(objTabla.id)
	for(var r=1;r<Tabla.rows.length-1;r++)
	{
			
			if (Tabla.rows[r].id == sIdRow)
			{
					var Fila = Tabla.rows[r]
					
					Tabla.deleteRow(r);					
					_CalculaTotales(Tabla)
					return true;
			}
	}	 				 	
	return false;
}



function _CalculaTotales( Tabla )	
{
		
	Fila = Tabla.rows[Tabla.rows.length-1]
	for(var nC=0;nC<Fila.cells.length;nC++)
	{

		oCel = Fila.cells[nC];
		
		sEval = oCel.getAttribute("eval")
		if ( (sEval != null) && (sEval != ''))
		{
			if (sEval.substr(0,4) == 'SUM(') 
			{
				if (Tabla.rows.length>1)
				{
						sAux = sEval.substr(5);
						sAux = sAux.substr(0,sAux.length-2)
						nCol = parseInt(sAux)
						if ( nCol > Tabla.rows[0].cells.length )
							alert('No existe la columna ' + nCol)
						else 
						{
							sSuma = _SumColumn(Tabla, nCol, true);		
							oCel.innerHTML = _FormatCurrency(sSuma );
						}
				}
			  else
						oCel.innerHTML = "0";
			}
		}
	}
}


// Suma la columna de una tabla
function _SumColumn(Tabla, nCol, lTotalizer)
{
	var nSuma = 0;
	if (lTotalizer == true)
		 var nFilas = Tabla.rows.length-1
    else
		 var nFilas = Tabla.rows.length;
  	
  	
	for(var r=1;r<nFilas;r++)
	{
			aFila = Tabla.rows[r].cells;
			nValor = aFila[nCol-1].innerHTML;
			if (nValor != '')
			{
			      nValor = Replace(nValor,'.','');
				  nSuma = nSuma + parseInt(nValor)
		  }
	}	 				 	
	return nSuma
}







// Asigna valor la celda nCol de la Fila
function XS_setCell(Fila, nCol, sValor)
{
	var aFila = Fila.cells;
	aFila[nCol-1].innerHTML	= sValor;
}

// Asigna formula a celda
function XS_setEval(Fila, nCol, sEval)
{
	var Celda = Fila.cells[nCol-1];
	Celda.setAttribute("eval", sEval)
}




// Recupera el objeto de la Celda
function XS_getCell(Fila, nCol)
{
	var aFila = Fila.cells;
	if (nCol-1 < aFila.length)
			return aFila[nCol-1]
	else
	{
			alert('La columna ' + nCol + ' no corresponde')
			return '';
	}		
}


// Recupera el valor de la Celda
function XS_getCellValue(Fila, nCol)
{
	var aFila = Fila.cells;
	
	if (nCol-1 < aFila.length)
	{
			Celda = aFila[nCol-1]
			aNod = Celda.childNodes;
			for (i=0;i<aNod.length;i++)
			{
					if (aNod[i].nodeType == 3 ) // Texto
					{
							sResult = aNod[i].nodeValue;
							sResult = sResult.replace('.','')
							return sResult;
					}	
					if (aNod[i].nodeName == 'INPUT')
					{
							sResult = aNod[i].getAttribute('value');
							sResult = sResult.replace('.','')
							aNod[i].setAttribute('value',sResult);
							return sResult;
					}	
			}				
			return '';
	}		
	else
	{
			alert('La columna ' + nCol + ' no corresponde')
			return '';
	}		
}




// Crea la celda de acción
/*
function XS_actionCell(Fila, nCol)
{
	var Celda = Fila.insertCell(nCol-1);
	Celda.id = Fila.id;
	Celda.align = 'center';
	
	sDIV = '<DIV id="a_view_' + Celda.id + '" style="left:0px;top:0px;width:40px;height:20px"></DIV>'
	sDIV = sDIV + '<DIV id="a_edit_' + Celda.id + '" style="position:relative;left:0px;top:0px;width:40px;height:20px;display:none"></DIV>'

	Celda.innerHTML = sDIV

	return Celda;
}
*/



// Agrega un botón de acción
/*
function XS_AddAction(Tabla, Celda, sEstado, sAction, sIcon, sAlt)
{
	sNum = Tabla.getAttribute("num");
	Celda.setAttribute("id", Celda.parentNode.id);
	sId = "a_" + sEstado + "_" + Celda.parentNode.id;
	objDiv = document.getElementById(sId)
	
    var objA = document.createElement('A'); objA.setAttribute("href", 'javascript:' + sAction + '_' + Tabla.id + '(' + sNum + ')' )
		var objImg = document.createElement('IMG');
		objImg.src = '/XS_Include/Icons//icon_' + sIcon + '.gif';
		objImg.setAttribute("border","0")
		objImg.setAttribute("hSpace","2")
		objImg.setAttribute("alt",sAlt)
		objA.appendChild(objImg);		

		objDiv.appendChild(objA)
}
*/





//************************* EDICIÓN DE LA TABLA ************************* 



// Edición de fila
function XS_editRow(objTabla, sIdRow  )
{
//    try
    {
    		var Tabla = $(objTabla.id + '_table')
				aFilas = Tabla.rows		
				var current_row = -1;
				
				for(var r=1; r <aFilas.length; r++)
				{
						if (aFilas[r].getAttribute("id") == sIdRow)
						{
								var current_row = r;
								var fila = aFilas[r];
								break;								
						}
				}
					 				 	
				if (current_row == -1)
				{
					alert('No se indetificó la fila : ' + sIdRow)    
			 		return
			 	}
			 	   	 
   		 
		   if ( current_row != m_row_index )
		   {
	           if ( m_row_index != -1 )
	           {
	             _limpiarSeleccion ( fila.parentNode.rows[m_row_index], 'false' );
	           }
	
	          m_row_index = current_row;
	          m_row_clone = fila.cloneNode(true);
			  _editRowOn(fila);
			      			         
		   }

		}
//		catch (e)
//		{
//			   alert( e.name + ' - '  + e.message );
//		}		


}





// Evalua una expresión
function XS_EvalExp(Fila, sEval)
{
	var sStr = sEval;
	var sAnt = ''; 
	while (1==1)
	{
		sStr = sStr.replace("[", "XS_getCellValue(Fila," )
		sStr = sStr.replace("]", ")" )
		if (sStr != sAnt)
			sAnt = sStr
		else
		    break;
	} 
	sResult  = eval( sStr );
	return sResult;
}




// Evalua las celdas formulas de la Fila
function XS_EvalRow(Fila)
{
	var lCambio = false
	var Tabla = Fila.parentNode
	var Head = Tabla.rows[0]
	for(var nC=0;nC<Head.cells.length;nC++)
	{
		oCel = Head.cells[nC];
		sEval = oCel.getAttribute("eval")
		if (sEval != null)
		{
			sResult = XS_EvalExp(Fila, sEval)
			Fila.cells[nC].innerHTML = sResult;
			lCambio = true
		}
	}
	
	return lCambio
	
}




// Cancela la edición de fila
function XS_cancelRow(objTabla, sIdRow )
{
		 var Tabla = $(objTabla.id)	
     // Ejecute el rescate de la informacion desde la tabla  Datos
	    try
	    {
		    // rescate la fila que actualmente se encuentra seleccionada			
	    	 var fila = XS_selectRow(Tabla, sIdRow)

				
				for(var nC=0;nC<fila.childNodes.length;nC++)
				{
	   		    var celda = fila.childNodes[nC]

						oOld = m_row_clone.childNodes[nC];
						
   					celda.replaceChild( oOld.firstChild, celda.firstChild);     
						
			  }
								
				_toggleView( fila )
		        fila.style.backgroundColor='#ffffff';
		 		fila.style.background= '#ffffff';		
		 		m_row_index = -1;		    		    
				_CalculaTotales(Tabla)


			}
			catch (e)
			{
			     // Indique si se ha producido un error
				   alert( e.name + ' - '  + e.message );
			}		
}



// Des - seleccionar fila 	
function _limpiarSeleccion( fila , editar)
{
      
   // edita la fila actual
     _editRowOff( fila, editar );   	
}


function _evalRow( Fila )
{
		if ( XS_EvalRow( Fila ) == true )
		{
			_CalculaTotales(Fila.parentNode) 
		}
}	

function _styleBox( objEdit, sId )
{
   objEdit.id = sId;	
   objEdit.style.width='99%';
   objEdit.style.fontSize='10px';
   objEdit.style.fontFamily='Verdana';
   objEdit.style.background = '#ffffcc';
   objEdit.style.border = 'solid 1px #ffffcc';

//   objEdit.onclick  = function (e) { objEdit.select(); };
   objEdit.onblur   = function (e) { _evalRow(Fila); };
//	 objEdit.onchange = function (e) { _evalRow(Fila); };
//	 objEdit.onpaste  = function (e) { _evalRow(Fila); };

}

// Crea un control TextBox para editar los campos de numeros
function _crearNumBox( celda )
{
   var objEdit = document.createElement('input');

   _styleBox( objEdit, celda.id )
	
   objEdit.style.textAlign = 'right';
   objEdit.value = celda.innerHTML;
   Fila = celda.parentNode;
   celda.replaceChild( objEdit, celda.firstChild );     

}


// Crea un control TextBox para editar los campos de texto
function _crearTextBox( celda )
{
	     var objEdit = document.createElement('input');
	  
		   _styleBox( objEdit, celda.id )

	     objEdit.value= celda.innerHTML;
	  
	  // cambie el valor por el objeto
	     celda.replaceChild( objEdit, celda.firstChild );  
}



function validaPorcentaje(obj)
{
		if (!SoloTipo(obj.value,"9"))
		{
			 alert("Debe ingresar un número")
			 obj.focus()
		}	
		alert(obj.value)
}

// Crea un control TextBox para editar los campos de texto
function _crearPorBox( celda )
{
	  // cree el objeto input
	     var objEdit = document.createElement('input');

      _styleBox( objEdit, celda.id )
	  
	  	 var sTexto = celda.innerHTML;
	  	 sTexto = sTexto.replace('%','')

	     objEdit.style.width='30px';
	     objEdit.style.textAlign = 'right';
	     objEdit.value=sTexto;

	  // cambie el valor por el objeto
	     celda.replaceChild( objEdit, celda.firstChild );  
}

// Crea un control select 
function _crearSelect( celda )
{
	  // Rescate el valor de la celda
	     var optionValor = celda.firstChild.nodeValue;
	     var optionCode = celda.getAttribute('code');
	
	  // cree el objeto input
	     var objSelect = document.createElement('select');
	  
	  // Asigne los valores iniciales del objeto
	     objSelect.style.width='100%';
	     objSelect.style.fontSize='9px';
	     objSelect.style.background = selection_color;
	     objSelect.style.border = 'solid 1px #cccccc';
	     
	     	     
	  // cree y asigne las opciones
	     for ( var indice = 0 ; indice < arrOpciones.length ; indice++ )
	     {
	     	 
	     	 // cree un nodo opcion 
	     	    var objOption = document.createElement('option');
	     	    
	     	 // Declare la opcion comopredeterminada si coincide con el 
	     	 // texto de la celda
	     	    if ( arrCodigos[indice] == optionCode )
	     	    {
	     	    	objOption.setAttribute('selected', true);	     	    	
	     	    }
	     	    
	     	 // asigne el valor de option
	     	    objOption.innerHTML = arrOpciones[indice];
	     	    
	     	 // agregue el nodo al nodo padre
	     	    objSelect.appendChild(objOption);   

	     }
	     
	  // cambie el valor por el objeto
	     celda.replaceChild( objSelect, celda.firstChild );
	      
}


// Permite editar la celda actual
function _editRowOn( fila )
{
	   for ( var i=0 ; i < fila.childNodes.length ; i++ )
	   {
	   		    var celda = fila.childNodes[i]
	   		    var attributo = celda.getAttribute('id');
	   		    if ( attributo != null && attributo!='' )
	   		    {	   		    	
	   		    	 switch ( attributo )
	   		    	 {
	   		    	 	  case 'textBox': _crearTextBox( celda );
	   		    	 	  break;

	   		    	 	  case 'numBox': _crearNumBox( celda );
	   		    	 	  break;

	   		    	 	  case 'porBox': _crearPorBox( celda );
	   		    	 	  break;

	   		    	 	  case 'rutBox': _crearTextBox( celda );
	   		    	 	  break;

	   		    	 	  case 'dateBox': _crearTextBox( celda );
	   		    	 	  break;

	   		    	 	  case 'select': _crearSelect( celda );
	   		    	 	  break;
	   		    	 }	   		    	
	   		    }   
	   		    
	   }
	   
	   _toggleEdit(fila)

}


function _toggleEdit(fila)
{
	fila.style.background = selection_color;
	//document.getElementById("a_off_" + fila.id).style.display="none"; 		
	//document.getElementById("a_on_" + fila.id).style.display="block"; 

}	

function _toggleView(fila)
{
	fila.style.background = "#ffffff";
	//document.getElementById("a_on_" + fila.id).style.display="none"; 
	//document.getElementById("a_off_" + fila.id).style.display="block"; 		
}	


// Permite finalizar la edicion de la fila actual
function _editRowOff( fila, editar )
{
	   for ( var i=0 ; i < fila.childNodes.length; i++ )
	   {
	   		 var celda = fila.childNodes[i];
			   
			   // Rescate la celda con el mismo indice pero de la fila clonada
			   var celda_clon = m_row_clone.childNodes[i];
	   		    
	   		 // pregunte si la calda contiene un elemento
	   		    if ( celda.firstChild.nodeType == 1 )
	   		    {	   		    	
	   		    	// Pregunte que tipo de elemento es
	   		    	   var element_name = celda.firstChild.nodeName;

	   		    	// seleccione el tio de elemento
	   		    	   switch ( element_name )
	   		    	   {
	   		    	   	case 'INPUT':
												// pregunte si el usuario quiere realmente editar la celda
												  if ( editar == true )
												  {
												   var valor = celda.firstChild.value;
													 if ( valor != '')
													 {
													   celda.innerHTML = valor;
													 }
													 else
													 {
													   celda.innerHTML = '&#160;';
													 }						     
												  }
												  else
												  {
											         celda.innerHTML = celda_clon.firstChild.nodeValue;
												  }
												  break;
	   		    	   	
			   		    	case 'SELECT': 
												  if ( editar == true )
												  {
												     celda.innerHTML = celda.firstChild.options[celda.firstChild.selectedIndex].text;
												  }
												  else
												  {
												     celda.innerHTML = celda_clon.firstChild.nodeValue;
												  }
					   		    	   	break;
	   		    	   }
	   		    }
	   }

		_toggleView(fila)

			   		    	   			    
}



// confirma la edicion de la celda
function confirmarEdicion( fila , keyCode )
{
	// pregunte si se pulso la tecla ENTER
	   if ( keyCode == 13 )
	   {
	   	 m_row_index = -1;
		   fila.style.background='transparent';
		   _editRowOff( fila, true );
	   }

}

function selectFocus( object )
{
    object.focus;
		object.selected;
}



// Permite leer la tabla de datos y determina que fila se encuentra seleccionada,
// esto para posteriormente procesar los datos 
function RecuperarDatos( rowSelected )
{
		var xResultado = "";
 
     // Ejecute el rescate de la informacion desde la tabla  Datos
	    try
	    {
		    // rescate la fila que actualmente se encuentra seleccionada			
			  var fila = document.getElementById('TablaDatos').rows(rowSelected);
			  
			// Solo guarde los datos de la tabla si rowSelected es mayor que 0
			// si es cero es que no hay seleccion
			  if ( rowSelected !=0 )
			  {
			       fila.style.background = 'transparent';
		         _editRowOff( fila, true );
				     xResultado = createContenedor( rowSelected );

			       m_row_index = -1;
				     
			  }			   
		}
		catch (e)
		{
		     // Indique si se ha producido un error
			   alert( e.name + ' - '  + e.message );
		}
		
	return xResultado;		
}

// Permite leer la tabla de datos y determina que fila se encuentra seleccionada,
// esto para posteriormente procesar los datos 
function RecuperarXML( rowSelected )
{
		var xResultado = "";
 
     // Ejecute el rescate de la informacion desde la tabla  Datos
	    try
	    {
		    // rescate la fila que actualmente se encuentra seleccionada			
			  var fila = document.getElementById('TablaDatos').rows(rowSelected);
			  
			// Solo guarde los datos de la tabla si rowSelected es mayor que 0
			// si es cero es que no hay seleccion
			  if ( rowSelected !=0 )
			  {
			       fila.style.background = 'transparent';
		         _editRowOff( fila, true );
				     xResultado = createContenedorXML( rowSelected );

			       m_row_index = -1;
				     
			  }			   
		}
		catch (e)
		{
		     // Indique si se ha producido un error
			   alert( e.name + ' - '  + e.message );
		}
		
	return xResultado;		
}

// Permite Crear un documento xml para almacenar la informacion
// de la fila, para poder guardar estos datos en la base de datos
function createContenedor( rowSelected )
{	

  try
  {
				// Rescate las filas que son necesarias para construir  nuestro documento
				// xml que representa el regstro a guardar en la base de datos
				  var tabla = document.getElementById("TablaDatos");
				  var fila_datos = tabla.rows(rowSelected);
				  var fila_head  = tabla.rows(0);
				   var sResultado = '';
						// Lea el contenido de la fila e inicie la creacion de los nodos hijos de Registro
					  for ( var i = 0 ; i < fila_datos.childNodes.length-1 ; i++ ) 
					  {
					    // Rescate el valor del header y el valor de la celda
								sID = fila_datos.childNodes[i].getAttribute('id')
								if (sID != "")
								{
										var celda_head = fila_head.childNodes[i].getAttribute('id');
										
										if (sID == "Related")
							  			celda_valor = fila_datos.childNodes[i].getAttribute('code');
									  else
							  			celda_valor = fila_datos.childNodes[i].firstChild.nodeValue;
							  			
											sResultado = sResultado + celda_head + "," + celda_valor + "|" ;
							  }
					  }
	}
	catch (e)
	{
		alert( "Error" );	
	}
	return sResultado;
}

function createContenedorXML( rowSelected )
{	

	var xResultado = "";
  try
  {
				// Rescate las filas que son necesarias para construir  nuestro documento
				// xml que representa el regstro a guardar en la base de datos
				  var tabla = document.getElementById("TablaDatos");
				  var fila_datos = tabla.rows(rowSelected);
				  var fila_head  = tabla.rows(0);
		
				// Cree el objeto document
				  var objDocument = new ActiveXObject('Microsoft.XMLDOM');
				  
				// Cree el elemento root de nuestro documento xml
				  objDocument.appendChild( objDocument.createElement('Record') );
	
		   var xXml = '';
				// Lea el contenido de la fila e inicie la creacion de los nodos hijos de Registro
			  for ( var i = 0 ; i < fila_datos.childNodes.length-1 ; i++ ) 
			  {
			    // Rescate el valor del header y el valor de la celda
						var nID = fila_datos.childNodes[i].getAttribute('id')
						if (nID != "")
						{
								var celda_head = fila_head.childNodes[i].getAttribute('id');
								if (nID == "Related")
					  			var celda_valor = fila_datos.childNodes[i].getAttribute('code');
							  else
					  			var celda_valor = fila_datos.childNodes[i].firstChild.nodeValue;

								// Cree los item del registro
								  var myItem = objDocument.createElement(celda_head);
									myItem.text = celda_valor;
				        // Guarde el nuevo elemento en el documento padre
								  objDocument.documentElement.appendChild( myItem );		
					  }
			  }
		  		  
		  	xResultado = objDocument.xml;	  

	}
	catch (e)
	{
		alert( "Error" );	
	}
	return xResultado;
}


function _MouseIn(obj, sDivMsg)
{
   var sTag = obj.nodeName 
   if ( sTag.toUpperCase() != 'TH')
   {
        obj.setAttribute('color',obj.style.backgroundColor);
        obj.style.backgroundColor= "#F0FBFF"//'#f8f8f8'; 
        obj.style.cursor = 'default'        
   }     
   var oDiv = $(sDivMsg)
   if (oDiv != null)
   { 
       var nCol = obj.getAttribute('col')
       var oTR = obj.parentNode; 
       var oTable = oTR.parentNode.parentNode;
       var sTip = oTable.rows[0].cells[nCol].getAttribute('tip')
       if (sTip == null)
            sTip = '&#160;';        
        oDiv.innerHTML = sTip
   }
}

function _MouseOut(obj, sDivMsg)
{
   var sTag = obj.nodeName 
   if ( sTag.toUpperCase() != 'TH')
   {
        obj.style.backgroundColor= obj.getAttribute('color');
        obj.setAttribute('color','');
        obj.style.cursor = 'default'        
   }     
   var oDiv = $(sDivMsg)
   if (oDiv != null)
   { 
        oDiv.innerHTML = '&#160;';
   }
}


function MouseIn(objFila, idx)
{
	if (m_row_index == idx)
        objFila.style.backgroundColor= selection_color
	else
        objFila.style.backgroundColor='#eaeaea';		
}

function MouseOut(objFila, idx)
{
	if (m_row_index != idx)
    objFila.style.backgroundColor='#ffffff';	
}

	

// Formatea un número
function _FormatCurrency(numero) 
{
    if(numero == 'undefined' || numero == null)
    {
        return '';
    }
	var textFormato = ""
	var t = 0
	var str = ""
    
	str = numero.toString();
	if ( str.length != 0 && (str.length)>3 ) 
	{
		for ( var k = str.length-1; k >= 0 ; k-- ) 
		{
			t++
			if ( t % 3 == 0 ) 
				textFormato = "." + str.substr(k, 1) + textFormato 
			else 
				textFormato = str.substr(k, 1) + textFormato; 
	    }
		
		if ( textFormato.substr(0, 1) == "," || textFormato.substr(0, 1) == ".") 
			numero = textFormato.substr(1, textFormato.length - 1) 
		else
		{	
			numero = textFormato 
	  }
	}
	return numero	
}

function _GetCurrency(numero)
{
    return parseFloat( Replace( numero ,'.','') );
}

function _rowIn(obj)
{
    obj.style.backgroundColor= "#F0FBFF"
    obj.style.cursor = 'default'
}

function _rowOut(obj)
{
    obj.style.backgroundColor='#ffffff';		
    obj.style.cursor = 'default'
}

