/*
	Funciones javascript para el manejo de las opciones de AJAX.
	Requiere de las funciones js para el manejo de JSON ( json_parse.js)
	César Orosco
	31/10/2008

*/

ajax_util = function(){

/*
   Definimos las funciones dentro de otra función para evitar la creación de variables globales
   Los parametros a recibir por la nueva función son los siguientes:

   ajax_util(url, parametros, HttpMethod, funcionProceso);

   Donde: 
   url, es la ruta a la que se enviara la petición
   parametros, son los parametros que recibira la funcion (en cadena var1=valor&var2=valor...)
   HttpMethod, es POST o GET
   funcionProceso, es la referencia a la funcion que será invocada una vez obtenidos los datos
*/

var url = '';
var params = '';
var HttpMethod = 'GET';
var funcionProceso = null;

var req= null;

var READY_STATE_COMPLETE = 4;
var STATUS_NOT_FOUND = 404;
var STATUS_OK = 200;


/* Devuelve el objeto encargado de hacer las peticiones al servidor, para IE/Firefox */
getXMLHTTPRequest = function(){

	var xRequest=null;

	// soporte nativo para XMLHttpRequest
    if (window.XMLHttpRequest) {
        xRequest = new XMLHttpRequest();

	// para IE/Windows ActiveX 
    } else if (window.ActiveXObject) {
	
		try {
			xRequest = new ActiveXObject("Msxml2.XMLHTTP");				
		} catch(e) {
			try {
				xRequest = new ActiveXObject("Microsoft.XMLHTTP");
			} catch(e) {
				xRequest = null;
			}
		}	

    }
return xRequest;

}

/* Se encarga de manejar las llamadas a las funciones que procesarán los resultados. */
onReadyStateChange = function (){
	var ready=req.readyState;
	var data=null;
	
	// solo si se completo el procesamiento del request
	if (ready==READY_STATE_COMPLETE){
		//
		if(req.status == STATUS_NOT_FOUND){
			//pagina no encontrada, si se requiere, aqui se puede poner funcionalidad adicional
			alert('Error al recuperar los datos');
			return;
		}
		if(req.status != STATUS_OK){
			alert('Error al recuperar los datos');
			return;
		}
		//se recupera los datos (en formato JSON)
		data=req.responseText;
		
		try{
			//funcion a ser invocada para que efectue el manejo de los datos
			funcionProceso(json_parse(data,null));
		}catch(e){
			if(data.indexOf('Error al validar la informaci&oacute;n del usuario') > -1){
				alert('Error al validar la información del usuario. Debe iniciar sesión');
			} else {

				//error al parsear los datos en formato JSON, se envía null a la funcion
				alert('Error al recuperar los datos');
				funcionProceso(null);
			}
		}
		
	}
}

/* Obtiene el objeto encargado de hacer el procesamiento e invoca a la función onReadyStateChange
   para el manejo de los datos del resultado
*/
sendRequest = function(){
	if (!HttpMethod){
		HttpMethod="GET";
	}
	
	req=getXMLHTTPRequest();
	if (req){
		req.onreadystatechange=onReadyStateChange;
		req.open(HttpMethod,url,true);
		req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
		req.send(params);
	}
}

/* Retorna el resultado de la función ajax_util, invoca a las funciones encargadas de realizar la
   petición e inicializa las variables necesarias
*/
return function(path, parametros, method, functionObj){

	url = path;
	HttpMethod = method;
	params = parametros;
	funcionProceso = functionObj;
	
	sendRequest();
	
}

}();


    var isSafari = false;
    var isMoz = false;
    var isIE = false;


	if (navigator.userAgent.indexOf("Safari") > 0)
	{
	  isSafari = true;
	  isMoz = false;
	  isIE = false;
	}
	else if (navigator.product == "Gecko")
	{
	  isSafari = false;
	  isMoz = true;
	  isIE = false;
	}
	else
	{
	  isSafari = false;
	  isMoz = false;
	  isIE = true;
	}

/* Completa automaticamente los resultados de una búsqueda ingresados en idVal, en otra caja de texto (id)
realiza una invocación a la página especificada por uri, y muestra los resultados bajo 
la caja de texto indicada por id, el código del valor a partir del cual buscar lo obtiene 
de idVal.
En el autocomplete normal, el id e idVal debe ser el mismo objeto
El parametro functionPost indica la funcion  que se ejecutará después de haber obtenido los
datos de respuesta desde uri, está función será la encargada de manejar los datos y su
presentación.
No se enviará el submit hasta haber ingresado no menos de "nchar" caracteres
La celda contenedora debera tener el id "TDContent" (opcional) a fin de determinar la posicion 
exacta del div */
function autocompleteOther(id, popupId, popupIdHidden, idVal, uri, accion, functionPost, nchar)
{
    var inputField = document.getElementById(id);
    var popup = document.getElementById(popupId);
    var popupHidden = document.getElementById(popupIdHidden);
    var options = new Array(); 
    var current = 0;
    var originalPopupTop = popup.offsetTop; 
    var originalPopupTopHidden = popupHidden.offsetTop;
    var valField = document.getElementById(idVal);
    var listacodigo;

    function constructUri()
    {
        var separator = "?";
        if(uri.indexOf("?") >= 0)
            separator = "&";
        return uri + separator + "accion="+accion+"&cnan=" + escape(valField.value);

    }
   
    function hidePopup()
    {
      popup.style.visibility = 'hidden';
	popupHidden.style.visibility = 'hidden';
    }

    function handlePopupOver()
    {
      removeListener(inputField, 'blur', hidePopup);
    }
    
    function handlePopupOut()
    {
      if(popup.style.visibility == 'visible')
      {
        addListener(inputField, 'blur', hidePopup);
      }
    }
    
    function handleClick(e)
    {
      inputField.value = eventElement(e).innerHTML;
	valField.value = listacodigo[current];
      popup.style.visibility = 'hidden';
	popupHidden.style.visibility = 'hidden';
      //inputField.focus();
	valField.focus();
    }
    
    function handleOver(e)
    {
      options[current].className = '';
      current = eventElement(e).index;
      options[current].className = 'selected';
    }
    
    function post(codigos)
    {
	  listacodigo = codigos;
        current = 0;
        options = popup.getElementsByTagName("li");
        if((options.length > 1)
           || (options.length == 1 
               && options[0].innerHTML != inputField.value))
        {
          setPopupStyles();
          for(var i = 0; i < options.length; i++)
          {
            options[i].index = i;
            addOptionHandlers(options[i]);
          }
          options[0].className = 'selected';
        }
        else
        {
          popup.style.visibility = 'hidden';
	    popupHidden.style.visibility = 'hidden';

        }
    }
  
    function setPopupStyles()
    {
      var maxHeight
      if(isIE)
      {
        maxHeight = 200;
        popup.style.left = '267px'; 
        popup.style.top = (originalPopupTop + inputField.offsetHeight + 86) + 'px';
	  popupHidden.style.left = '267px';
	  popupHidden.style.top = (originalPopupTopHidden + inputField.offsetHeight + 86) + 'px';
      }
      else
      {
        maxHeight = window.outerHeight/3;
	  popup.style.left = '267px';
        popup.style.top = (inputField.offsetHeight + 86) + 'px';
	  popupHidden.style.left = '267px';
	  popupHidden.style.top = (inputField.offsetHeight + 86) + 'px';
      }
      if(popup.offsetHeight < maxHeight)
      {
        popup.style.overflow = 'hidden';
	  popupHidden.style.overflow = 'hidden';
      }
      else if(isMoz)
      {
        popup.style.maxHeight = maxHeight + 'px';
        popup.style.overflow = '-moz-scrollbars-vertical';
	  popupHidden.style.maxHeight = maxHeight + 'px';
	  popupHidden.style.overflow = '-moz-scrollbars-vertical';
      }
      else
      {
        popup.style.height = maxHeight + 'px';
        popup.style.overflowY = 'auto';
	  popupHidden.style.height = maxHeight + 'px';
	  popupHidden.style.overflowY = 'auto';
      }
      popup.scrollTop = 0;
      popup.style.visibility = 'visible';
	popupHidden.scrollTop = 0;
	popupHidden.style.visibility = 'visible';
	popupHidden.style.height = popup.offsetHeight;
	
    }
    
    function addOptionHandlers(option)
    {
      addListener(option, "click", handleClick);
      addListener(option, "mouseover", handleOver);
    }

 var beforeFunctionPost = function(){
	
	var datos = arguments[0];
	var codigos = {'':''};
	var j = 0;
	for(var i in datos)
    	{
		var opt = datos[i];
		codigos[j]=opt['partida'];
            j++;    
	}

	functionPost(datos);
	post(codigos);
 }

	var updater = function(){
    
		if(document.getElementById('loadingFoto') != null){
			document.getElementById('loadingFoto').style.display = '';
		}
   	 	//var updater = liveUpdater(constructUri, post);
    		ajax_util(constructUri(),'','GET', beforeFunctionPost);
	}

    var timeout = false;
   
    function start(e) {
      if (timeout)
        window.clearTimeout(timeout);


	//no antes de n caracteres
	if(valField.value.length < nchar){
		popup.style.visibility = 'hidden';
		popupHidden.style.visibility = 'hidden';
		return;
	}

	if(isNaN(valField.value)){
		if(document.getElementById('loadingFoto') != null){
			document.getElementById('loadingFoto').style.display = 'none';
		}
		return;
	}

      //up arrow
      if(e.keyCode == 38)
      {
        if(current > 0)
        {
          options[current].className = '';
          current--;
          options[current].className = 'selected';
          options[current].scrollIntoView(false);
        }
      }
      //down arrow
      else if(e.keyCode == 40)
      {
        if(current < options.length - 1)
        {
          options[current].className = '';
          current++;
          options[current].className = 'selected';
          options[current].scrollIntoView(false);
        }
      }
      //enter or tab, solo tab
      //else if((e.keyCode == 13 || e.keyCode == 9) && popup.style.visibility == 'visible')
	else if((e.keyCode == 13) && popup.style.visibility == 'visible')
      {
        inputField.value = options[current].innerHTML;
	  valField.value = listacodigo[current];
        popup.style.visibility = 'hidden';
	  popupHidden.style.visibility = 'hidden';
        //inputField.focus();
	  valField.focus();
        if(isIE)
        {
          event.returnValue = false;
        }
        else
        {
          e.preventDefault();
        }
      }else if(e.keyCode == 9){
		popup.style.visibility = 'hidden';
		popupHidden.style.visibility = 'hidden';
      }else if((e.keyCode >= 65 && e.keyCode <= 90) || (e.keyCode>= 96 && e.keyCode <= 105) 
			|| e.keyCode == 8 || e.keyCode == 46 || (e.keyCode>= 48 && e.keyCode <= 57))
      {
        timeout = window.setTimeout(updater, 300);
      }else if(isMoz && ((e.which>= 48 && e.which <= 57) ||(e.which>= 65 && e.which <= 90) ||
			(e.which>= 97 && e.which <= 122) )){
		timeout = window.setTimeout(updater, 300);

	}
    }


  addKeyListener(valField, start);
  addListener(popup, 'mouseover', handlePopupOver);
  addListener(popup, 'mouseout', handlePopupOut);
}

/* Functions to handle browser incompatibilites */
function eventElement(event)
{
  if(isMoz)
  {
    return event.currentTarget;
  }
  else
  {
    return event.srcElement;
  }
}

function removeListener(element, type, listener)
{
  if(element.removeEventListener)
  {
    element.removeEventListener(type, listener, false);
  }
  else
  {
    element.detachEvent('on' + type, listener);
  }
}

function addKeyListener(element, listener)
{

  if (isSafari)
    element.addEventListener("keydown",listener,false);
  else if (isMoz)
    element.addEventListener("keypress",listener,false);
  else
    element.attachEvent("onkeydown",listener);
}

function addListener(element, type, listener)
{
  if(element.addEventListener)
  {
    element.addEventListener(type, listener, false);
  }
  else
  {
    element.attachEvent('on' + type, listener);
  }
}

/* carga un combo con el resultado JSON devuelto
 * el objeto JSON devuelto debe tener un codigo y una descripcion */
cargarCombo = function(path, params, method, objectcombo){

	var cargarListaCombo = function(){
	
		var datos = arguments[0];
	
		/*se borran todos los elementos de la lista*/
		objectcombo.length = 0;
		objectcombo.options[0] = new Option('SELECCIONAR', '');
	
		var j = 1;
		for(var i in datos){
			var opt =datos[i];
			var opcion = new Option(opt['descripcion'],opt['codigo']);
			objectcombo.options[j] = opcion;
			j++;
		}
		if(document.getElementById('loadingCombo') != null)
			document.getElementById('loadingCombo').style.display = 'none';
	}

	ajax_util(path, params, method, cargarListaCombo);
}

/* 20100106 LLG : carga un combo con el resultado JSON devuelto
 * el objeto JSON devuelto debe tener un codigo y una descripcion, se agrega ademas
 * un parametro (functionDependiente) para el manejo de eventos asincronos*/
cargarCombo1 = function(path, params, method, objectcombo, functionDependiente){
    
	var cargarListaCombo = function(){
	
		var datos = arguments[0];
	
		/*se borran todos los elementos de la lista*/
		objectcombo.length = 0;
		objectcombo.options[0] = new Option('SELECCIONAR', '');
	
		var j = 1;
		for(var i in datos){
			var opt =datos[i];
			var opcion = new Option(opt['descripcion'],opt['codigo']);
			objectcombo.options[j] = opcion;
			j++;
		}
		if(document.getElementById('loadingCombo') != null)
			document.getElementById('loadingCombo').style.display = 'none';

		if(functionDependiente != '')
			functionDependiente();
	}

	ajax_util(path, params, method, cargarListaCombo);
}

/* Percy Huamani Mendoza 
 * Carga un combo con el resultado JSON devuelto
 * 
 */
cargarComboAjx = function(path, params, method, objectcombo, campoCodigo, campoDescripcion, idCarga, functionDependiente){

	var cargarListaCombo = function(){
	
		var datos = arguments[0];
	
		/*se borran todos los elementos de la lista*/
		objectcombo.length = 0;
		
		var j = 0;
		for(var i in datos){
			var opt =datos[i];
			var opcion = new Option(opt[campoDescripcion],opt[campoCodigo]);
			objectcombo.options[j] = opcion;
			j++;
		}
		if(idCarga != '' && document.getElementById(idCarga) != null){
			document.getElementById(idCarga).innerHTML = '';
		}
		
		if(functionDependiente != '')
			functionDependiente();
	}
	
	if(campoCodigo != '' && campoDescripcion != ''){
		params = params + '&campoCodigo=' + campoCodigo + '&campoDescripcion=' + campoDescripcion;
	}	

	if(idCarga != '' && document.getElementById(idCarga) != null){
		document.getElementById(idCarga).innerHTML = "<img src='/a/imagenes/loading.gif' align='absmiddle'>";;
	}
	
	ajax_util(path, params, method, cargarListaCombo);
}

/* Percy Huamani Mendoza 
 * Carga un combo con el resultado JSON devuelto
 * 
 */
cargarComboAjxArica = function(path, params, method, objectcombo, campoCodigo, campoDescripcion, idCarga, functionDependiente, destinoArica){

	var cargarListaCombo = function(){
	
		var datos = arguments[0];
	
		/*se borran todos los elementos de la lista*/
		objectcombo.length = 0;
		
		var j = 0;
		for(var i in datos){
			var opt =datos[i];
			if (opt[campoCodigo] != destinoArica){
				var opcion = new Option(opt[campoDescripcion],opt[campoCodigo]);
				objectcombo.options[j] = opcion;
				j++;
			}
		}
		if(idCarga != '' && document.getElementById(idCarga) != null){
			document.getElementById(idCarga).innerHTML = '';
		}
		
		if(functionDependiente != '')
			functionDependiente();
	}
	
	if(campoCodigo != '' && campoDescripcion != ''){
		params = params + '&campoCodigo=' + campoCodigo + '&campoDescripcion=' + campoDescripcion;
	}	

	if(idCarga != '' && document.getElementById(idCarga) != null){
		document.getElementById(idCarga).innerHTML = "<img src='/a/imagenes/loading.gif' align='absmiddle'>";;
	}
	
	ajax_util(path, params, method, cargarListaCombo);
}


/* Percy Huamani Mendoza 
 * Carga un combo con el resultado JSON devuelto
 * 
 */
cargarObjetosAjx = function(path, params, method, form, arrObjetos, idCarga, functionDependiente){

	var cargarObjeto = function(){
		var datos = arguments[0];
		var opt = datos[0];
		
		for(z=0; z<arrObjetos.length; z++){
			var objeto = arrObjetos[z];
			form[objeto].value = opt[objeto];
		}		
		
		if(idCarga != '' && document.getElementById(idCarga) != null){
			document.getElementById(idCarga).innerHTML = '';
		}
		
		if(functionDependiente != '')
			functionDependiente();
	}
	
	if(idCarga != '' && document.getElementById(idCarga) != null){
		document.getElementById(idCarga).innerHTML = "<img src='/a/imagenes/loading.gif' align='absmiddle'>";;
	}
	ajax_util(path, params, method, cargarObjeto);
}

/* Percy Huamani Mendoza 
 * Carga un combo con el resultado JSON devuelto
 * el objeto JSON devuelto debe tener un codigo y una descripcion 
 * 
 */
cargarComboAjx2 = function(path, params, method, objectcombo, campoCodigo, campoDescripcion, idCarga, functionDependiente){

	var cargarListaCombo = function(){
	
		var datos = arguments[0];
	
		/*se borran todos los elementos de la lista*/
		objectcombo.length = 0;
		
		var j = 0;
		for(var i in datos){
			var opt =datos[i];
			var values = opt[campoDescripcion].split(" :: ");
			var opcion = new Option(opt[campoDescripcion],values[0]);
			objectcombo.options[j] = opcion;
			j++;
		}
		if(idCarga != '' && document.getElementById(idCarga) != null){
			document.getElementById(idCarga).innerHTML = '';
		}
		
		if(functionDependiente != '')
			functionDependiente();
			
		
	}
	
	if(campoCodigo != '' && campoDescripcion != ''){
		params = params + '&campoCodigo=' + campoCodigo + '&campoDescripcion=' + campoDescripcion;
	}	

	if(idCarga != '' && document.getElementById(idCarga) != null){
		document.getElementById(idCarga).innerHTML = "<img src='/a/imagenes/loading.gif' align='absmiddle'>";;
	}
	
	ajax_util(path, params, method, cargarListaCombo);
}

/* Cargar Campo Texto */
cargarCampoTextoAjx = function(path, params, method, objecttexto, campoCodigo, campoDescripcion, idCarga, functionDependiente){

	var cargarCampoTexto = function(){
	
		var datos = arguments[0];
	
		/*se borran todos los elementos de la lista*/
		objecttexto.value = '';
		objecttexto.value = datos[0][campoDescripcion];
		
		if(idCarga != '' && document.getElementById(idCarga) != null){
			document.getElementById(idCarga).innerHTML = '';
		}
		
		if(functionDependiente != '')
			functionDependiente();
	}
	
	if(campoCodigo != '' && campoDescripcion != ''){
		params = params + '&campoCodigo=' + campoCodigo + '&campoDescripcion=' + campoDescripcion;
	}	

	if(idCarga != '' && document.getElementById(idCarga) != null){
		document.getElementById(idCarga).innerHTML = "<img src='/a/imagenes/loading.gif' align='absmiddle'>";;
	}
	
	ajax_util(path, params, method, cargarCampoTexto);
}

/* Cargar Datos Vehiculo */
cargarDatosVehiculoAjx = function(path, params, method, objectForm, campoCodigo, campoDescripcion, idCarga, functionDependiente){

	var cargarDatosVehiculo = function(){
	
		var datos = arguments[0];
	
		/*se borran todos los elementos de la lista*/
		//verifica el estado 
		if(datos[0]["cestado"] != '' && datos[0]["cestado"] != '00'){
			alert('Placa tiene estado no habilitado.');
			objectForm.txtPlaca.selectedIndex = 0;
			objectForm.txtMarca.value = '';
			objectForm.txtAnoFabricacion.value = '';
			objectForm.txtChasis.value = '';
			objectForm.txtCapacidad.value = '';
			objectForm.txtMotor.value = '';
			objectForm.dtipo_vehi.value = '';
			//objectForm.txtTipoVehiculo.value = '';
			
			if(idCarga != '' && document.getElementById(idCarga) != null){
				document.getElementById(idCarga).innerHTML = '';
			}
			
			return;
		}
		objectForm.value = '';
		objectForm.txtMarca.value = datos[0]["dmarca"];
		if(datos[0]["danofab"] != '' && datos[0]["danofab"] != '0')
			objectForm.txtAnoFabricacion.value = datos[0]["danofab"];
		else
			objectForm.txtAnoFabricacion.value = '';
		objectForm.txtChasis.value = datos[0]["dchasis"];
		if(datos[0]["capacidad"] != '' && datos[0]["capacidad"] != '0')
			objectForm.txtCapacidad.value = datos[0]["capacidad"];
		else
			objectForm.txtCapacidad.value = '';
		objectForm.txtMotor.value = datos[0]["n_motor"];
		objectForm.cestado.value = datos[0]["cestado"];
		objectForm.dtipo_vehi.value = datos[0]["dtipo_vehi"];
		
		objectForm.txtMarca_flag.value = '';
		objectForm.txtAnoFabricacion_flag.value = '';
		objectForm.txtChasis_flag.value = '';
		objectForm.txtCapacidad_flag.value = '';
		objectForm.txtMotor_flag.value = '';
		
		if (objectForm.txtMarca.value != ''){
			objectForm.txtMarca.disabled=true;
			objectForm.txtMarca_flag.value = '1';
		}			
		if (objectForm.txtAnoFabricacion.value != ''){
			objectForm.txtAnoFabricacion.disabled=true;
			objectForm.txtAnoFabricacion_flag.value = '1';
		}			
		if (objectForm.txtChasis.value != ''){
			objectForm.txtChasis.disabled=true;
			objectForm.txtChasis_flag.value = '1';
		}
		if (objectForm.txtCapacidad.value != ''){
			objectForm.txtCapacidad.disabled=true;
			objectForm.txtCapacidad_flag.value = '1';
		}
		if (objectForm.txtMotor.value != ''){
			objectForm.txtMotor.disabled=true;
			objectForm.txtMotor_flag.value = '1';
		}
		
		if(idCarga != '' && document.getElementById(idCarga) != null){
			document.getElementById(idCarga).innerHTML = '';
		}
		
		if(functionDependiente != '')
			functionDependiente();
	}
	
	if(campoCodigo != '' && campoDescripcion != ''){
		params = params + '&campoCodigo=' + campoCodigo + '&campoDescripcion=' + campoDescripcion;
	}	

	if(idCarga != '' && document.getElementById(idCarga) != null){
		document.getElementById(idCarga).innerHTML = "<img src='/a/imagenes/loading.gif' align='absmiddle'>";;
	}
	
	ajax_util(path, params, method, cargarDatosVehiculo);
}


//

function mostrarAutocompletarAjx(idDescripcion, popupId, popupIdHidden, idCodigo, uri, accion, functionPost, nchar, campoCodigo, campoDescripcion, idCarga, functionPostEventClick)
{
    var descripcionField = document.getElementById(idDescripcion);
    var popup = document.getElementById(popupId);
    var popupHidden = document.getElementById(popupIdHidden);
    var options = new Array(); 
    var current = 0;
    var originalPopupTop = popup.offsetTop; 
    var originalPopupTopHidden = popupHidden.offsetTop;
    var codigoField = document.getElementById(idCodigo);
    var listacodigo;
    var listadescripcion;
    
    function constructUri()
    {
        var separator = "?";
        if(uri.indexOf("?") >= 0)
            separator = "&";
        return uri + separator + "accion=" + accion + "&" + idDescripcion+ "=" + escape(descripcionField.value) + "&nun_caracteres=" + nchar;
    }
   
    function hidePopup()
    {
    	popup.style.visibility = 'hidden';
    	popupHidden.style.visibility = 'hidden';
    }

    function handlePopupOver()
    {
    	removeListener(descripcionField, 'blur', hidePopup);
    }
    
    function handlePopupOut()
    {
    	if(popup.style.visibility == 'visible')
    	{
    		addListener(descripcionField, 'blur', hidePopup);
    	}
    }
    
    function handleClick(e)
    {
    	descripcionField.value = eventElement(e).innerHTML;
    	codigoField.value = listacodigo[current];
    	popup.style.visibility = 'hidden';
    	popupHidden.style.visibility = 'hidden';
    	descripcionField.focus();
    	if(functionPostEventClick != ''){
    		functionPostEventClick();
    	}
    	//codigoField.focus();
    }
    
    function handleOver(e)
    {
    	options[current].className = '';
    	current = eventElement(e).index;
    	options[current].className = 'selected';
    }
    
    function post(codigos, descripciones)
    {
    	listacodigo = codigos;
    	listadescripcion = descripciones;
        current = 0;
        options = popup.getElementsByTagName("li");
        if((options.length > 1)
           || (options.length == 1 
               && options[0].innerHTML != descripcionField.value))
        {
        	setPopupStyles();
        	for(var i = 0; i < options.length; i++)
        	{
        		options[i].index = i;
        		addOptionHandlers(options[i]);
        	}
        	options[0].className = 'selected';
        }
        else
        {
        	popup.style.visibility = 'hidden';
        	popupHidden.style.visibility = 'hidden';
        }
    }
  
    function setPopupStyles()
    {
    	var maxHeight
    	if(isIE)
    	{
    		maxHeight = 200;
    		popup.style.left = fPosicionX(descripcionField); 
    		popup.style.top = fPosicionY(descripcionField) + descripcionField.offsetHeight;
    		popupHidden.style.left = fPosicionX(descripcionField);
    		popupHidden.style.top = fPosicionY(descripcionField) + descripcionField.offsetHeight;
    	}
    	else
    	{
    		maxHeight = window.outerHeight/3;
    		popup.style.left = fPosicionX(descripcionField);
    		popup.style.top = fPosicionY(descripcionField) + descripcionField.offsetHeight;
    		popupHidden.style.left = fPosicionX(descripcionField);
    		popupHidden.style.top = fPosicionY(descripcionField) + descripcionField.offsetHeight;
    	}
    	if(popup.offsetHeight < maxHeight)
    	{
    		popup.style.overflow = 'hidden';
    		popupHidden.style.overflow = 'hidden';
    	}
    	else if(isMoz)
    	{
    		popup.style.maxHeight = maxHeight + 'px';
    		popup.style.overflow = '-moz-scrollbars-vertical';
    		popupHidden.style.maxHeight = maxHeight + 'px';
    		popupHidden.style.overflow = '-moz-scrollbars-vertical';
    		
    		popup.style.width = descripcionField.offsetWidth;
    	}
    	else
    	{
    		popup.style.height = maxHeight + 'px';
    		popup.style.overflowY = 'auto';
    		popupHidden.style.height = maxHeight + 'px';
    		popupHidden.style.overflowY = 'auto';
    		
    		popup.style.width = descripcionField.offsetWidth;
    	}
    	popup.scrollTop = 0;
    	popup.style.visibility = 'visible';
    	popupHidden.scrollTop = 0;
    	popupHidden.style.visibility = 'visible';
    	popupHidden.style.height = popup.offsetHeight;
    }
    
    function addOptionHandlers(option)
    {
    	addListener(option, "click", handleClick);
    	addListener(option, "mouseover", handleOver);
    }

    var beforeFunctionPost = function(){
	
    	var datos = arguments[0];
    	var codigos = {'':''};
    	var descripcion = {'':''};
    	var j = 0;
    	for(var i in datos){
    		var opt = datos[i];
    		codigos[j]=opt[campoCodigo];
    		descripcion[j]=opt[campoDescripcion];
            j++;    
    	}

    	functionPost(datos);
    	post(codigos,descripcion);
    }

	var updater = function(){

    	if(descripcionField.value == ''){
    		if(idCarga != '' && document.getElementById(idCarga) != null){
    			document.getElementById(idCarga).innerHTML = "";
    		}		
    		
    		return;
    	}  
    	
		if(idCarga != '' && document.getElementById(idCarga) != null){
			document.getElementById(idCarga).innerHTML = "<img src='/a/imagenes/loading.gif' align='absmiddle'>";
		}		
		
   	 	//var updater = liveUpdater(constructUri, post);
		ajax_util(constructUri(),'','GET', beforeFunctionPost);
	}

    var timeout = false;
   
    function start(e) {
    	if (timeout)
    		window.clearTimeout(timeout);

    	//no antes de n caracteres
    	if(descripcionField.value.length < nchar){
    		popup.style.visibility = 'hidden';
    		popupHidden.style.visibility = 'hidden';
    		return;
    	}
    	
    	if(descripcionField.value == ''){
    		if(idCarga != '' && document.getElementById(idCarga) != null){
    			document.getElementById(idCarga).innerHTML = "";
    		}		
    		
    		return;
    	}    	

    	//up arrow
    	if(e.keyCode == 38)
    	{
    		if(current > 0)
    		{
    			options[current].className = '';
    			current--;
    			options[current].className = 'selected';
    			options[current].scrollIntoView(false);
    		}
    	}
    	//down arrow
    	else if(e.keyCode == 40)
    	{
    		if(current < options.length - 1)
    		{
    			options[current].className = '';
    			current++;
    			options[current].className = 'selected';
    			options[current].scrollIntoView(false);
    		}
    	}
    	//enter or tab, solo tab
    	else if((e.keyCode == 13 || e.keyCode == 9) && popup.style.visibility == 'visible')
    	//solo tab	
    	//else if((e.keyCode == 13) && popup.style.visibility == 'visible')
    	{
    		codigoField.value = listacodigo[current];
    		descripcionField.value = listadescripcion[current];
    		
    		popup.style.visibility = 'hidden';
    		popupHidden.style.visibility = 'hidden';
    		//descripcionField.focus();
    		descripcionField.focus();
    		if(isIE)
    		{
    			event.returnValue = false;
    		}
    		else
    		{
    			e.preventDefault();
    		}
    	}else if(e.keyCode == 9){
    		popup.style.visibility = 'hidden';
    		popupHidden.style.visibility = 'hidden';
    	}else if((e.keyCode >= 65 && e.keyCode <= 90) || (e.keyCode>= 96 && e.keyCode <= 105) 
    			|| e.keyCode == 8 || e.keyCode == 46 || (e.keyCode>= 48 && e.keyCode <= 57))
    	{
    		timeout = window.setTimeout(updater, 300);
    	}else if(isMoz && ((e.which>= 48 && e.which <= 57) ||(e.which>= 65 && e.which <= 90) ||
    			(e.which>= 97 && e.which <= 122) )){
    		timeout = window.setTimeout(updater, 300);

    	}
    }    

    addKeyListener(descripcionField, start);
    
    addListener(popup, 'mouseover', handlePopupOver);
    addListener(popup, 'mouseout', handlePopupOut);
}

function fPosicionX(obj)
{   var curleft = 0;
    if(obj.offsetParent)
    {	while(obj.offsetParent)
    	{	curleft += obj.offsetLeft;
        	obj = obj.offsetParent;
    	}
    }
    else if (obj.x)
        curleft += obj.x;
    return curleft;
}

function fPosicionY(obj)
{   var curtop = 0;
    if(obj.offsetParent)
    {	while(obj.offsetParent)
    	{	curtop += obj.offsetTop
        	obj = obj.offsetParent;
    	}
    }
    else if (obj.y)
        curtop += obj.y;
    return curtop;
}
