var DivWin, Listado, PaginaListado;

/*
 * Widget que lista un conjunto de opciones que concuerdan con lo que uno escribe.
 * Las opciones aparecen paginadas.  
 */
DivWin = function() {};
DivWin.prototype = {
    ultimoAbierto: null,
    
    abre: function(datos, event) {
        if(this.ultimoAbierto) {
            this.ultimoAbierto.cerrar();
        }
        if(this.codigoTecla(event) != 13) {
            datos.valor_actual = this.getField(datos.campo, datos.linea).value;
            datos.divWin = this;
            this.ultimoAbierto = new Listado(datos);
            this.ultimoAbierto.leePagina();
        }
        else {
            if(this.ultimoAbierto && this.ultimoAbierto.cantidadEntradas() > 0) {
                this.ultimoAbierto.opcion(0);
            }
        }
    },
    
    cancelaEnter: function(event) {
        return this.codigoTecla(event) != 13;
    },
    
    codigoTecla: function(event) {
        var keynum;
        if(window.event) // IE
        {
            keynum = event.keyCode;
        }
        else if(event.which) // Netscape/Firefox/Opera
        {
            keynum = event.which;
        }
        return keynum;
    },   
    
    /*
     * Asignaciones a partir de una opción elegida que incluyen también
     * el campo donde se hizo la elección.  
     */
    asignaciones: function(fieldValues, numrow) {
        var fieldName, field;
        for(fieldName in fieldValues) {
            field = this.getField(fieldName, numrow);
            if(field) {
                this.asignacion(field, fieldValues[fieldName]);
            }
        }
    },
    
    /*
     * Asignación de un valor a un campo del formulario.  
     */
    asignacion: function(field, fieldValue) {
        field.value = fieldValue;
    },

    getField: function(fieldName, numrow) {
      var fields, field;
      if(numrow) {
        fields = $(".row-" + numrow + " :input[name=" + fieldName + "]");
      }
      if(!numrow || fields.length === 0) {
        fields = $(":input[name=" + fieldName + "]");
      }
      if(fields.length > 0) {
        field = fields[0];
      }
      else if(numrow) {
        throw("No existe el campo " + fieldName + "( linea " + numrow + ")");
      }
      else {
        throw("No existe el campo " + fieldName);
      }
      return field;
    },

    getDescription: function(fieldName, numrow) {
      var objs, obj;
      if(numrow) {
        objs = $(".row-" + numrow + " ." + fieldName + "_descripcion ");
      }
      if(!numrow || objs.length === 0) {
        objs = $("." + fieldName + "_descripcion");
      }
      if(objs.length > 0) {
        obj = objs[0];
      }
      else if(numrow) {
        throw("No existe la descripción de " + fieldName + "( linea " + numrow + ")");
      }
      else {
        throw("No existe la descripción de " + fieldName);
      }
      return obj;
    },
    
    setDescription: function(fieldName, numrow, value) {
      var description = this.getDescription(fieldName, numrow);
      description.innerHTML = value;
    }
    
};
divWin = new DivWin();

/*
 * Muestra un listado paginado.
 */
Listado = function(datos) {
                        //this.id = $.uuid('Listado');
                        this.campo = datos.campo;
                        this.linea = datos.linea;
                        this.url = datos.url;
                        this.idContenedor = datos.idContenedor;
                        this.contenedor().data('listado', this);
                        this.actualizaDatosPagina(datos);
                        this.muestraCodigo = datos.muestraCodigo;
                        this.muestraDescripcion = datos.muestraDescripcion;
                        this.onclick = datos.onclick;
                        this.divWin = datos.divWin;
                        // consulta
                        this.tabla = datos.tabla;
                        this.codigo = datos.codigo;
                        this.rcodigo = datos.rcodigo || '';
                        this.condicion = datos.condicion || '';
                        this.valor_actual = datos.valor_actual;
                        this.asignaciones = datos.asignaciones || '';
                        this.ingreso_permitido = datos.ingreso_permitido;
                        this.multiple = datos.multiple;
                        this.orden = datos.orden;
                        this.opcionVacia = datos.opcionVacia;
                        this.campos_extra = datos.campos_extra;
                    };

Listado.prototype = {
    numeroPagina: null,
    muestraCodigo: null,
    muestraDescripcion: null,
    onclick: null,
    divWin: null,
    linea: null,
    paginaActual: null,
    hayMasDatos: null,
    url: null,
    idContenedor: null,
    
    tabla: null,
    codigo: null,
    rcodigo: null,
    condicion: null,
    valor_actual: null,
    asignaciones: null,
    ingreso_permitido: null,
    multiple: null,
    orden: null,
    opcionVacia: null,
    
    html: function() {
        var retvalue, texto_ant, texto_sig;

        texto_ant = this.hayPaginaAnterior() ? '<a href="#" onclick="$(\'#' + this.idContenedor + '\').data(\'listado\').paginaAnterior(); return false;">&lt;&lt;</a>'
                                            : '';
        texto_sig = this.hayPaginaSiguiente() ? '<a href="#" onclick="$(\'#' + this.idContenedor + '\').data(\'listado\').paginaSiguiente(); return false;">&gt;&gt;</a>'
                                            : '';
        retvalue = '<table width="100%" border="0" cellpadding="0" cellspacing="0" class="paginador">' +
                    '<tr><td align="right">' + 
                    texto_ant + ' ' + texto_sig + 
                    ' <a href="#" onClick="$(\'#' + this.idContenedor + '\').data(\'listado\').cerrar(); return false;">' + 
                    ' X </a>&nbsp;</td></tr>' +
                    '</table>';
        retvalue += this.paginaActual.html();

        retvalue += '<table width=100% border="0" cellpadding="0" cellspacing="0" class="espacio">';
        retvalue += '   <tr><td align="right"><img src="/img724/10/spacer.gif" whidt="100%" height="4"></td></tr>';
        retvalue += '</table>';
        
        return retvalue;
    },
    
    hayPaginaSiguiente: function() {
        return this.hayMasDatos; 
    },
    
    hayPaginaAnterior: function() {
        return this.numeroPagina > 0; 
    },
    
    paginaSiguiente: function() {
        this.numeroPagina++;
        this.leePagina();
    },
    
    paginaAnterior: function() {
        this.numeroPagina--;
        this.leePagina();
    },
    
    leePagina: function() {
        $.ajax({
            url: this.url,
            data: this.consulta(),
            dataType: 'json',
            success: this.metodoDelegado()/*,
            error: function() {  console.log('Pedido ajax fallido.'); }*/
        });
    },
    
    metodoDelegado: function() {
        var obj = this;
        return function(datos, textoEstado) {
            obj.actualizaPagina(datos, textoEstado);
        };
    },
    
    consulta: function() {
        return {
            nombre: this.campo,
            tabla: this.tabla,
            codigo: this.codigo,
            rcodigo: this.rcodigo,
            condicion: this.condicion,
            valor_actual: this.valor_actual,
            asignaciones: this.asignaciones,
            ingreso_permitido: this.ingreso_permitido,
            multiple: this.multiple,
            orden: this.orden,
            pagina: this.numeroPagina,
            opcion_vacia: this.opcionVacia,
            campos_extra: this.campos_extra            
        };
    },
    
    actualizaPagina: function(datos, textoEstado) {
        this.actualizaDatosPagina(datos);
        if(this.cantidadEntradas() > 0) {
            this.muestra();
        }
    },
    
    actualizaDatosPagina: function(datos) {
        this.numeroPagina = datos.numeroPagina;
        this.hayMasDatos = datos.hayMasDatos;
        if(datos.datosPagina) {
            this.paginaActual = new PaginaListado(this, datos.datosPagina);
        }
    },
    
    cerrar: function() {
        this.contenedor().hide();
    },
    
    muestra: function() {
        var c = this.contenedor();
        c.html(this.html());
        c.show();
    },
    
    contenedor: function() {
        return $('#' + this.idContenedor);
    },
    
    opcion: function(indice) {
        return this.entradaElegida(this.paginaActual.entrada(indice));
    },
    
    entradaElegida: function(entrada) {
        this.divWin.asignaciones(entrada.asignaciones, this.linea);
        if(this.ingreso_permitido == '0') {
            this.divWin.setDescription(this.campo, this.linea, entrada.descripcion); 
        }
        if(this.onclick) {
            eval(this.onclick);
        }
        this.cerrar();
        this.divWin.ultimoAbierto = null;
    },
    
    cantidadEntradas: function() {
        if(this.paginaActual) {
            return this.paginaActual.cantidadEntradas();
        }
        else {
            return 0;
        }
    }
    
};



/*
 * Muestra una página del listado paginado.
 */
PaginaListado = function(listado, datos) {
                        //this.id = $.uuid('PaginaListado');
                        this.entradas = datos.entradas;
                        this.listado = listado;
                    };

PaginaListado.prototype = {
    entradas: null,
    pagina: null,
    listado: null,
    
    html: function() {
        var retvalue =
            '<table width="100%" class="listado" cellspacing="0">' + 
                '        <tbody>';
        for(i=0; i<this.entradas.length; i++) {
            retvalue += this.html_entrada(i);
        }
        retvalue +=
                '        </tbody>' +
                '   </table>';
        return retvalue;
    },
    
    html_entrada: function(indice) {
        var cols = 0;
        var jsOpcionListado = '$(\'#' + this.idContenedor() + '\').data(\'listado\').opcion(' + indice + '); return false;';
        var retvalue = '<tr>';
        if(this.muestraCodigo()) {
            retvalue +=        
            '   <td align="LEFT"><a onclick="' + jsOpcionListado + '" href="#">' +
                        this.entradas[indice].codigo + '</a></td>';
            cols++;
        }
        if(this.muestraDescripcion()) {
            retvalue +=        
            '   <td align="LEFT"><a onclick="' + jsOpcionListado + '" href="#">' + 
                        this.entradas[indice].descripcion + '</a></td>';
            cols++;
        }
        retvalue +=
                '</tr>' +
                '<tr>' +
                '   <td class="espacioInterno" colspan="' + cols + '"><img src="/img724/10/spacer.gif" width="1" height="1"></td>' +
                '</tr>';
        return retvalue;
    },
    
    entrada: function(indice) {
        return this.entradas[indice];
    },
    
    muestraCodigo: function() {
        return this.listado.muestraCodigo;
    },
    
    muestraDescripcion: function() {
        return this.listado.muestraDescripcion;
    },
    
    idContenedor: function() {
        return this.listado.idContenedor;
    },
    
    cantidadEntradas: function() {
        return this.entradas.length;
    }
    
};



/* Tests:

Agregar parametro ingreso_permitido, orden, multiple y onclick a los tests

------------------------------------------------------- Abrir widget con pedido ajax

divWin.abre({
            campo: 'P_COD_GRUPO',
            linea: 1,
            numeroPagina: 0,
            idContenedor: 'result1',
            tabla: '2343735425742535465553455253',
            codigo: '546253F4443455534552',
            rcodigo: '5354325534444655534552',
            condicion: '',
            valor_actual: '',
            asignaciones: ''
        });

------------------------------------------------------- Crear listado con datos

listado = new Listado({campo: 'P_COD_GRUPO',
                        linea: 1,
                        numeroPagina: 0,
                        hayMasDatos: true,
                        muestraCodigo: true,
                        muestraDescripcion: true,
                        url: '#',
                        idContenedor: 'result1',
                        
                        
                        datosPagina: {
                            entradas: [{codigo: 'b', descripcion: 'bbb', asignaciones: {P_COD_GRUPO: 'b', P_COD_SECTOR: 'xxxxc'}}, 
                                        {codigo: 'c', descripcion: 'ccc', asignaciones: {P_COD_GRUPO: 'c', P_COD_SECTOR: 'yyyy'}}]
                        }
                    });
listado.muestra();

------------------------------------------------------- Cambio de página

listado.actualizaPagina({
                        numeroPagina: 1,
                        hayMasDatos: true,
                        muestraCodigo: true,
                        muestraDescripcion: true,
                        datosPagina: {
                            entradas: [{codigo: 'b2', descripcion: 'bbb2', asignaciones: {P_COD_GRUPO: 'b2', P_COD_SECTOR: 'xxxxc2'}}, 
                                        {codigo: 'c2', descripcion: 'ccc2', asignaciones: {P_COD_GRUPO: 'c2', P_COD_SECTOR: 'yyyy2'}}]
                        }
});


*/


var NN = {}; // QUITAR, es para evitar errores por no estar en un frameset
//alert('carga ok');
