/*
Autor: Rodrigo Sánchez P. mail: rodrigosp@go.com
Ultima Actualización : 25/02/2004 16:31 pm
*/

//Declaracion de variables globales
var ArrDPnomCampo= new Array();
var ArrDp= new Array(20);
var blnChangeData=false;

/* 
 Funcion:		ValidaOp
 Descripción:	Validación sobre la opcion cantidad recuperada x los gastos efectuados
 Autor:			RSP, 9 ene 2004
 */
function VerificaOp(obj){

 if(obj.value==38){
  ArrDp[2].value='XXXX';
  ArrDp[2].disabled=true;
  blnChangeData=true;
 }
 else{
  if(ArrDp[2].disabled) ArrDp[2].value='';
  ArrDp[2].disabled=false;
  blnChangeData=true;
 }
}


/*
 Funcion:	 Agrega
 Descripción: 	Agrega los datos capturados al cuadro de abajo de los select en Deducciones personales
 Autor:		RSP, Dic 2003
*/
function Agrega(Obj,opc){
 var i,blnRFC,blnCampos,totalCap=0,totFunebres=0;
 
 blnCampos =ValidaCampos(1);
 if(blnCampos){
  var option1= new Option(ArrDp[1].options[ArrDp[1].selectedIndex].text,ArrDp[1].value);
  var option2= new Option(ArrDp[0].options[ArrDp[0].selectedIndex].text,ArrDp[0].value);
 
  if(ArrDp[11].value==0){ //se trata de nuevo registro
   blnSearch=Cmp(ArrDp[1].selectedIndex,ArrDp[0].selectedIndex,1);
   if(blnSearch){ 
    ArrDp[3].length=ArrDp[3].length+1;
    ArrDp[4].length=ArrDp[4].length+1;
    for(i=0;i<ArrDp[3].length;i++){
     if(ArrDp[3].options[i].text=="") ArrDp[3].options[i]=option1;
     if(ArrDp[4].options[i].text=="") ArrDp[4].options[i]=option2; 
    }
    alert(' Los movimientos fueron registrados '); 
    Clean(1); //limpiamos campos de captura 
   }//fin if blnSearch 
  } else { //se trata de modificacion de un registro previamente seleccionado
   ArrDp[3].options[ArrDp[10].value]=option1;
   ArrDp[4].options[ArrDp[10].value]=option2; 
   Clean(1); //limpiamos campos de captura 
  }
  var Arrtmp1=new Array(),i;
  //Se guardan los datos capturados con modificaciones si las tuvieron
  for(i=0;i<ArrDp[3].length;i++){
    Arrtmp1[i]=UnformatCurrency(ArrDp[3].options[i].value)+'+'+ArrDp[4].options[i].value;
  }  
  GuardaDatosHidden('frmDeducciones',Arrtmp1,'DedPers');  
  ArrDp[11].value=0; //indicador de modificacion de registro 1-si , 0-no 
 }  
 if(opc==1) return blnCampos; //para salvar los datos se valida si hubo errores o no
}

/*
  Función:		ValidaDatosCapt
  Descripción:	Valida el caso de cantidad recuperada por gastos efectuados y gastos funerales 
  Autor:		RSP, ene 12 2004
*/
function ValidaDatosCapt(){
 var i,totalCap=0,totFunebres=0,Gcapturados=0,blnSearch=true;
 
  for(i=0;i<ArrDp[3].length;i++){
     //se verifica que las cantidades ya capturadas sean menores a Cantidad recuperada...
   if(ArrDp[4].options[i].value==38) Gcapturados=parseFloat(UnformatCurrency(ArrDp[3].options[i].value));
   if(ArrDp[4].options[i].value!=38) totalCap+=parseFloat(UnformatCurrency(ArrDp[3].options[i].value));
   if(ArrDp[4].options[i].value==31) totFunebres+=parseFloat(UnformatCurrency(ArrDp[3].options[i].value)); //se suman los importes de Gastos Funerarios      
  }//fin for 
   if(parseFloat(Gcapturados)>parseFloat(totalCap)){
     alert('La cantidad recuperada debe ser menor o igual a las deducciones personales, favor de verificar');
     blnSearch=false;
    }
   //validamos que 'Gastos Funerarios' < (SMVG según la Z.G.  por 365 días )
   if(parseFloat(totFunebres)>=(parseFloat(arrSMGV2003[document.frmDeducciones.AreaGeo.value])*365)){
    alert('Se excede el límite establecido para gastos de funerales ('+formatCurrency(parseFloat(arrSMGV2003[document.frmDeducciones.AreaGeo.value])*365)+')');
    blnSearch=false;
   }
  return blnSearch;
}


/*
 Funcion :			Cmp
 Descripción:		Compara la cadena de cierto valor a insertar pero se verifica no exista, esto para objetos Select
 Datos de entrada:	Cadena a verificar(strVal1), indice seleccionado de auxiliar para validación, y opción para el mensaje 
 Autor: 		RSP, dic 2003
*/
function Cmp(indiceSel1,indiceSel2,opc){
 var i,Obj,strMess,blnchk=0;
 Obj=document.frmDeducciones;
 switch(opc){
  case 1: strMess='No pueden existir dos quincenas iguales para la mismo tipo de personal';
   for(i=0;i<Obj.sel1.length;i++){
    if(Obj.sel2.options[i].value==Obj.cmbQna.options[indiceSel2].value && Obj.sel1.options[i].value==Obj.cmbTper.options[indiceSel1].value){
     blnchk+=1;
     }
    }
   if(blnchk>0){ alert(strMess); return false;}
   return true;
  break;
 }//fin switch
}


/*
 Funcion :			Clean
 Descripción:		Limpia campos de la forma indicada en la opcion
 Datos de entrada:	opcion para identificar que campos se limpian
 Autor: 		RSP, dic 2003
*/
function Clean(opc){
 var i;
 switch(opc){
  case 1:
   for(i=0;i<ArrDp.length && ArrDp[i]!=null;i++){
    if(ArrDp[i].type=='select-one' )  ArrDp[i].selectedIndex=-1;
    if(ArrDp[i].type=='text') ArrDp[i].value=''; 
   }
   ArrDp[11].value=0; // limpiamos tambien el campo de posinLista
   ArrDp[7].disabled=true; //deshabilitamos el boton de eliminar   
  break;
 }
}

/*
 Función :		Show
 Descripcion :	Muestra los datos seleccionados dependiendo la opcion seran los datos mostrados 
 Autor :		RSP, dic 2003
*/

function Show(Obj,opc){
 var i,j;
  
 for(i=0;i<ArrDp.length && ArrDp[i]!=null;i++){
  if(Obj.name==ArrDp[i].name) j=i; 
 }
 
 switch(opc){
  case 1:
  if(ArrDp[j].value.length>0){
   ArrDp[0].value=ArrDp[4].options[ArrDp[j].selectedIndex].value;
   ArrDp[1].value=ArrDp[3].options[ArrDp[j].selectedIndex].value;
   ArrDp[10].value=ArrDp[j].selectedIndex; //guardamos la pos del indice seleccionado
   for(i=0;i<ArrDp.length && ArrDp[i]!=null ;i++){
    if(ArrDp[i].type=='select-one' && i!=0 && i!=1){
      ArrDp[i].selectedIndex=-1;   
      ArrDp[i].blur();
     }
    } 
   ArrDp[0].focus();
   ArrDp[7].disabled=false; //habilitamos el boton de eliminar
   ArrDp[11].value=1;  //indicador de modificacion de registro 1-si , 0-no 
  }//fin if ArrDp[j].value.length>0
  break;
 }
}


/*
 Función :	Delete
 Descripcion :	Elimina el renglón seleccionado en la tabla de datos ya capturados
 Autor :	RSP, dic 2003
*/ 
 
 function Delete(Obj,opc){

 switch(opc){
  case 1:
   if(confirm('El registro se eliminará, ¿Desea continuar?')){
    ArrDp[4].options[ArrDp[10].value]=null;
    ArrDp[3].options[ArrDp[10].value]=null;
   }
    Clean(1); //se limpian los campos de captura
    ArrDp[11].value=0; //indicador de modificacion de registro 1-si , 0-no 
    var Arrtmp1=new Array(),i;
    //Se guardan los datos capturados con modificaciones si las tuvieron
    for(i=0;i<ArrDp[3].length;i++){
     Arrtmp1[i]=UnformatCurrency(ArrDp[3].options[i].value)+'+'+ArrDp[4].options[i].value;
    }  
   GuardaDatosHidden('frmDeducciones',Arrtmp1,'DedPers');  
  break;
 }
}
 

/*
Función :		Selected
Descripción :	Funcion que selecciona las columna de los select al mismo tiempo en la forma
Autor:			RSP, 30/12/2003
*/
function Selected(Obj,opc){
 var i,j;
  
 for(i=0;i<ArrDp.length && ArrDp[i]!=null;i++){
  if(Obj.name==ArrDp[i].name) j=i; 
 }
 switch(opc){
  case 1:
   if(ArrDp[j].value.length>0){
    ArrDp[3].selectedIndex=ArrDp[j].selectedIndex;
    ArrDp[4].selectedIndex=ArrDp[j].selectedIndex;
   }//fin if ArrDp[j].value.length>0
  break;
 }
}

/*
Función :			ValidaCampos
Descripción :		Funcion que verifica que ciertos campos cumplan con las validaciones requeridas
Datos de entrada :	opcion, Objeto de la forma si es necesario
Autor:				RSP, utl. actualización 26/03/2004
*/
function ValidaCampos(opc,Obj){
 var blnchk,strMess='',strCad='',numindex;
 blnchk=0;
 
 switch(opc){
  case 1:
   if(ArrDp[0].selectedIndex==0 || ArrDp[0].selectedIndex==-1){ alert('Falta selecionar la Quincena '); blnchk+=1; ArrDp[0].focus(); return false;}
   if(ArrDp[1].selectedIndex==0 || ArrDp[1].selectedIndex==-1){ alert('Falta selecionar el Tipo de Personal '); blnchk+=1; ArrDp[1].focus(); return false;}
  break;
 }
 return true; 
}
/*
 Funcion:			verifRFC
 Descripción:		Fucnión auxiliar de validaCampos para validar el RFC si se trata de personas fisicas o morales
 Datos entrada:		opción de validación (1)RFC Moral, (2)RFC Fisica
*/
function verifRFC(opc){
  var numErr=0;
  if(opc==1){ //la cadena es menor a 13 digitos
   if( ArrDp[2].value.substring(10, 12).length<3 && ArrDp[2].value.substring(10, 12).length >=0 || !validaHomoclave(ArrDp[2].value.substring(9, 11)) || !validaDigitoVerificador(ArrDp[2].value.substring(11, 12)) ){ 
      if(!validarRFCSinHomoclave(ArrDp[2].value,"FM") && ArrDp[2].value.length==12 && validaDigitoVerificador(ArrDp[2].value.substring(11, 12)) ){
        numErr=chkErrRFC(ArrDp[2].value,"FM");
        if(parseInt(numErr,10)==1) alert('Error en RFC');
        else if(parseInt(numErr,10)==2) alert('Error en la fecha del RFC, favor de verificar');  
        else if(parseInt(numErr,10)==3) alert('La Homoclave está incompleta ó contiene algún caracter no permitido, favor de verificar');
        return false;
       }
      else{
        alert('La Homoclave está incompleta ó contiene algún caracter no permitido, favor de verificar');
        return false;
       }
     }//fin if
    else{
      if(!validarRFCSinHomoclave(ArrDp[2].value,"FM")){ alert('Error en la fecha del RFC, favor de verificar');  return false;}
    }
   }//fin opc==1
  else{ //la cadena es de 13 digitos de longitud
    if( ArrDp[2].value.substring(10, 13).length<3 && ArrDp[2].value.substring(10, 13).length >=0 || !validaHomoclave(ArrDp[2].value.substring(10, 12)) || !validaDigitoVerificador(ArrDp[2].value.substring(12, 13)) ){ 
      if(!validarRFCSinHomoclave(ArrDp[2].value,"FM") && ArrDp[2].value.length==13 && validaDigitoVerificador(ArrDp[2].value.substring(12, 13)) ){ alert('Error en la fecha del RFC, favor de verificar');  return false;}
      else{
        alert('La Homoclave está incompleta ó contiene algún caracter no permitido, favor de verificar');
        return false;
       }
     }//fin if
    else{
        numErr=chkErrRFC(ArrDp[2].value,"FM");
        if(parseInt(numErr,10)==1) alert('Error en RFC');
        else if(parseInt(numErr,10)==2) alert('Error en la fecha del RFC, favor de verificar');  
        else if(parseInt(numErr,10)==3) alert('La Homoclave está incompleta ó contiene algún caracter no permitido, favor de verificar');
        return false;
    }
  }//fin else opc==1  

}

/*
 Funcion :			chkErrRFC
 Descripción :		Valida el RFC y regresa que tipo de error ocurrio si es el caso, sino hay errores regresa 0
 Datos entrada :	rfc,tipoPersona	 
 Datos salida :		Número de error
*/
function chkErrRFC(rfc,tipoPersona) {
  var retorno           = false;
  var abreviatura	    = "";
  var anio				= "";
  var mes				= "";
  var dia				= "";
  var homoclave	  	    = "";
  var digitoVerificador	= "";
  var re=/[A-Z]/g;
  
  if(tipoPersona == TIPO_PERSONA_FISICA || tipoPersona == TIPO_PERSONA_FISICA_MORAL)
    if(rfc.length == 13){
      abreviatura	= rfc.substring(0, 4);
      anio      = rfc.substring(4, 6);
      mes	    = rfc.substring(6, 8);
      dia	    = rfc.substring(8, 10);
      homoclave = rfc.substring(10, 12);
      digitoVerificador	= rfc.substring(12, 13);
      
      if(!validaAbreviatura(abreviatura)) return 1; //error en abreviatura
      if(!validaAnio(anio) || !validaMes(mes) || !validaDia(dia,mes,anio) || (validaFecha(anio,mes,dia)>0)) return 2; //error en fecha del RFC
      if(!validaHomoclave(homoclave) || !validaDigitoVerificador(digitoVerificador)) return 3; //error homoclave incompleta
    }  
    if(tipoPersona == TIPO_PERSONA_MORAL || tipoPersona == TIPO_PERSONA_FISICA_MORAL)
      if(rfc.length == 12){
        abreviatura = rfc.substring(0, 3);
        anio = rfc.substring(3, 5);
        if(anio.search(re) != -1){ //posible rfc de persona fisica pero con homoclave incompleta
         abreviatura	= rfc.substring(0, 4);
         anio      = rfc.substring(4, 6);
         mes	    = rfc.substring(6, 8);
         dia	    = rfc.substring(8, 10);
         homoclave = rfc.substring(10, 12);
         digitoVerificador	= rfc.substring(12, 13);
        }
        else{
         mes	 = rfc.substring(5, 7);
         dia	 = rfc.substring(7, 9);
         homoclave	= rfc.substring(9, 11);
         digitoVerificador	= rfc.substring(11, 12);
        }
        //alert('abreviatura='+abreviatura+' anio='+anio+' mes='+mes+' dia='+dia+' homoclave='+homoclave +' digitoVerificador='+digitoVerificador);
        //alert(validaAbreviatura(abreviatura)+'--'+validaAnio(anio)+'---'+validaMes(mes)+'---'+validaDia(dia,mes,anio)+'----'+validaDigitoVerificador(digitoVerificador));
        if(!validaAbreviatura(abreviatura)) return 1; //error en abreviatura
        if(!validaAnio(anio) || !validaMes(mes) || !validaDia(dia,mes,anio) || (validaFecha(anio,mes,dia)>0)) return 2; //error en fecha del RFC
        if(!validaHomoclave(homoclave) || !validaDigitoVerificador(digitoVerificador)) return 3; //error homoclave incompleta
        
    }    
  return 0;
}


/*
 Función :		Salir
 Descripción:	Arma el campo oculto para ser enviado y conservar los datos capturados
 autor:			RSP, 2 Enero 2004
*/
function Salir(obj,opc){
var Arrtmp1=new Array(),i;
var blnErrores=true;

 switch(opc){
  case 1: //deducciones, guarda los datos a enviar
   //Nota: si blnErrores =false, si hubo error,caso contrario no 
   if(blnChangeData ){
    if(Cambios(2)){
      if(Cambios(3))
      blnErrores=Agrega(document.frmDeducciones,1);
      }
    }   
   for(i=0;i<ArrDp[3].length;i++){
    Arrtmp1[i]=UnformatCurrency(ArrDp[3].options[i].value)+'+'+ArrDp[4].options[i].value;
   } 
   GuardaDatosHidden('frmDeducciones',Arrtmp1,'DedPers');
   switch(parseInt(obj.TipoRegimen.value)){
    case 0: //se trata de arrendamiento
     document.frmDeducciones.opc.value='Buscar';
     obj.action="c_AcPDxReg.cgi"; //se trata de arrendamiento, regresa a ese menu 
    break;
    case 1: //se trata de salarios
     obj.action="DECMenuSal.asp"; //se trata de salarios, regresa a ese menu 
    break;    
    case 2: //se trata de intereses
     obj.action="DECMenuIntereses.asp"; //se trata de intereses, regresa a ese menu
    break;
   }
   obj.method="post";
  break;
 }
 //if(ValidaDatosCapt() && blnErrores)  obj.submit();
 if(blnErrores)  obj.submit();
}

/*
 Función : 			SepArr 
 Descripción:		Función que separa x valor dependiendo el numero enviado que siginifica que posicion del numero de comas que se tenga
 Datos de entrada:	cadena
 Datos de salida:	Dato requerido
 Co-autor:			RSP, 2/02/2004
*/
function SepArr(strCad,numDato){
var tmp1, pos1,pos2,pos3,i,j=0;
 tmp1=strCad.split("+");
 return tmp1[numDato-1]
}

/*
 Función : 			GetValSel
 Descripción:		Función que obtiene el texto de un select dependiendo el valor de esa opción
 Datos de entrada:	objeto select, valor a buscar dentro del mismo
 Datos de salida:	Texto de esa opción de acuerdo al valor dado
 autor:				RSP, 2/01/2004
*/
function GetValSel(objeto,valor){
var i, strText;
 for(i=0;i<objeto.length;i++){
  if(objeto.options[i].value==valor) strText=objeto.options[i].text; 
 }
 return (strText);
}


/*
 Función : 			AsignaValores 
 Descripción:		Función para asignar valores a la forma requerida comparando nombre campo y asignando su valor
 Datos de entrada:	Objeto de la Forma,Arreglo de nombres de campos y Arreglo de Datos y opción de llenado especifico
 Co-autor:			RSP, 2/01/2004
*/
function AsignaValores(theForm,ArrNombres,ArrDatos,opc){
 var i; 
 switch (opc){
 
 case 1 : //se trata de deducciones personales, donde se llenan los combos
  if(ArrDatos.length>0){
  eval('theForm.'+ArrNombres[0]+'.length='+ArrDatos.length);
  eval('theForm.'+ArrNombres[1]+'.length='+ArrDatos.length);
  eval('theForm.'+ArrNombres[2]+'.length='+ArrDatos.length);
  for(i=0;i<ArrDatos.length;i++){
    eval('theForm.'+ArrNombres[0]+'.options[i]=new Option(formatCurrency(SepArr(ArrDatos[i],1)),formatCurrency(SepArr(ArrDatos[i],1)))');
    eval('theForm.'+ArrNombres[1]+'.options[i]=new Option( GetValSel(document.frmDeducciones.cmbConcepto,SepArr(ArrDatos[i],2)) ,SepArr(ArrDatos[i],2))');
    eval('theForm.'+ArrNombres[2]+'.options[i]=new Option(SepArr(ArrDatos[i],3),SepArr(ArrDatos[i],3))');
   } 
   
  }//fin if
 break; 
 }
}

/*
 Función		:	Cambios
 Descripcion	:	Levanta una bandera para detectar si hay cambios en algun campo de la forma, esto para
					enviar un mensaje de confirmación si se desean guardar los cambios o no
 Autor			:	RSP, 27 Ene 2004
*/
function Cambios(opc){
 var intCont=0;
 switch(opc){
  case 1:  //solo se levanta la bandera en el onchange
   blnChangeData=true; 
  break;
  case 2 : // se verifica si exite algun dato capturado para validarlos datos antes de salir
   if(document.frmDeducciones.cmbQna.value!='x' && document.frmDeducciones.cmbQna.value.length>0 ) intCont+=1;
   if(document.frmDeducciones.cmbTper.value!='x' && document.frmDeducciones.cmbTper.value.length>0 ) intCont+=1;
   if(intCont==0){  blnChangeData=false; return false;}
   else return true;
  break;
  case 3 :  //Se encontro la bandera en true y se muestra el mensaje de confirmación para salvar datos
   if(blnChangeData){
    if(confirm('No salvó los cambios,¿Desea hacerlo ahora?')) return true;
    else return false;
   }
  break;
 }//fin switch
}



