function MultiListaJS (
		id_tabla,  			//el id de la tabla de contenidos
		nro_columna_clave, 	//nro de la columna clave
		cf_seleccion, 		//funcion de callback al seleccionar una fila debe aceptar un parametro: fila (tr)
		nro_fila_ini, 		//nro de la fila inicial (opcional, por defecto = 0)
		nro_fila_fin		//nro de la fila final (opcional, por defecto = fin_de_tabla)
	) {
	this.tabla = document.getElementById(id_tabla); //tabla con los datos
	this.nroColumnaClave = nro_columna_clave; //posicion de la columna con la clave
	if (nro_fila_ini) { //nro de la primera fila de la tabla
		this.nroFilaIni = nro_fila_ini;
	} else {
		this.nroFilaIni = 0;
	}
	if (nro_fila_fin) { //nro. de la ultima fila de la tabla
		this.nroFilaFin = nro_fila_fin;
	} else {
		this.nroFilaFin = this.tabla.rows.length - 1;
	}
	if (cf_seleccion) {
		this.cfSeleccion = cf_seleccion;
	} else {
		this.cfSeleccion = null;
	}
	this.rowCursor = "pointer"; //cursor de las filas
	this.colorOver = "#CCCCEE"; //color de fondo en mouseover de una fila
	this.colorOut = ""; //color de fondo en mouseout de una fila
	this.colorSelect = "#AAAACC"; //color de una fila seleccionada
	this.arrRow = new Array(); //arreglo de los indices de las filas seleccionadas
	this.deseleccionar = false; //true, si se pueden deseleccionar filas
	var instance = this; //puntero a esta instancia
		
	this.inicializar = function() {
		//setea los eventos sobre las filas de la tabla
		for(var i = this.nroFilaIni; i <= this.nroFilaFin; i++) {
			this.arrRow[this.tabla.rows[i].cells[this.nroColumnaClave].innerHTML] = false; //elementos inicialmente deseleccionados
		}
		for(var i = this.nroFilaIni; i <= this.nroFilaFin; i++) {
			this.tabla.rows[i].style.cursor = this.rowCursor;
			this.tabla.rows[i].onmouseover = function() {
				var j = this.cells[instance.nroColumnaClave].innerHTML;
				if (instance.arrRow[j]) {
					this.style.backgroundColor = instance.colorSelect;
				} else {
					this.style.backgroundColor = instance.colorOver;
				}
			}
			this.tabla.rows[i].onmouseout = function() {
				var j = this.cells[instance.nroColumnaClave].innerHTML;
				if (instance.arrRow[j]) {
					this.style.backgroundColor = instance.colorSelect;
				} else {
					this.style.backgroundColor = instance.colorOut;
				}
			}
			this.tabla.rows[i].onclick = function() {
				var j = this.cells[instance.nroColumnaClave].innerHTML;
				instance.arrRow[j] = !instance.arrRow[j];
				if (instance.arrRow[j]) {
					this.style.backgroundColor = instance.colorSelect;	
				} else {
					this.style.backgroundColor = instance.colorOut;	
				}
			}
		}
	}
	
	this.getRows = function() {
		//devuelve las filas seleccionada
		var res = new Array();
		var j = 0;
		for(var i = this.nroFilaIni; i <= this.nroFilaFin; i++) {
			if (this.arrRow[i]) {
				res[j] = this.getRowByIndex(i - 1);
				j++;
			}
		}
		return res;
	}
	
	this.getRowByIndex = function(ind) {
		//devuelve una fila de la tabla segun el indice, null si se sale de rango
		if ((ind >= this.nroFilaIni) && (ind <= this.nroFilaFin)) {
			return this.tabla.rows[ind];
		}
		return null;
	}
	
	this.getKeys = function() {
		//devuelve el valor del campo clave de las filas seleccionadas
		var res = new Array();
		var j = 0;
		for(var i in instance.arrRow) {
			if (instance.arrRow[i]) {
				res[j] = i;
				j++;
			}
		}
		return res;
	}
	
	this.setRowByKey = function(key) {
		//selecciona una fila segun la clave
		for(var i = this.nroFilaIni; i <= this.nroFilaFin; i++) {
			if (this.tabla.rows[i].cells[this.nroColumnaClave].innerHTML == key) {
				this.arrRow[this.tabla.rows[i].cells[this.nroColumnaClave].innerHTML] = true;
				this.tabla.rows[i].style.backgroundColor = this.colorSelect;
			}
		}
	}

	this.setRowByIndex = function(ind) {
		//selecciona una fila segun el indice
		if ((ind >= this.nroFilaIni) && (ind <= this.nroFilaFin)) {
			this.arrRow[this.tabla.rows[ind].cells[this.nroColumnaClave].innerHTML] = true;
			this.tabla.rows[ind].style.backgroundColor = this.colorSelect;
		}
	}
	
	this.setRow = function(key) {
		//alias de seleccionar una fila por clave
		this.setRowByKey(key);
	}
	
	this.inicializar();
}
