	function comprobarSiBisisesto(anio){
	if ( ( anio % 100 != 0) && ((anio % 4 == 0) || (anio % 400 == 0))) {
	    return true;
	    }
	else {
	    return false;
	    }
	}

	function isValidDate(fecha){
	    if (fecha != undefined && fecha.value != "" ){
	        if (!/^\d{2}\/\d{2}\/\d{4}$/.test(fecha.value)){
//	            alert("formato de fecha no válido (dd/mm/aaaa)");
	            return false;
	        }
	        var dia  =  parseInt(fecha.value.substring(0,2),10);
	        var mes  =  parseInt(fecha.value.substring(3,5),10);
	        var anio =  parseInt(fecha.value.substring(6),10);
	 
	    switch(mes){
	        case 1:
	        case 3:
	        case 5:
	        case 7:
	        case 8: 
	        case 10:
	        case 12:
	            numDias=31;
	            break;
	        case 4: case 6: case 9: case 11:
	            numDias=30;
	            break;
	        case 2:
	            if (comprobarSiBisisesto(anio)){ numDias=29 }else{ numDias=28};
	            break;
	        default:
//	            alert("Fecha introducida errónea");
	            return false;
	    }
	 
	        if (dia>numDias || dia==0){
//	            alert("Fecha introducida errónea");
	            return false;
	        }
	        return true;
	    }
	}

	function isAlfaNumeric(obj) {
		var ch = obj.value.substring(obj.value.length-1,obj.value.length);
		var auxValueTotal = obj.value.substring(0,obj.value.length-1);
		if (ch < "A" || (ch > "Z" && ch < "a") || (ch > "z")) {
			if((ch < "0" || ch > "9")) {
				if (ch != " ") {
					obj.value = auxValueTotal;
					return false;
				}
			}
		}
		return true;
	}
	
	function isAlfanumWildcard(obj) {
		var ch = obj.value.substring(obj.value.length-1,obj.value.length);
		var auxValueTotal = obj.value.substring(0,obj.value.length-1);
		if (ch < "A" || (ch > "Z" && ch < "a") || (ch > "z")) {
			if((ch < "0" || ch > "9")) {
				if (ch != "*" && ch!=" ") {
					obj.value = auxValueTotal;
					return false;
				}
			}
		}
		return true;
	}

	function isNumeric(obj) {
		var auxValue = obj.value.substring(obj.value.length-1,obj.value.length);
		var auxValueTotal = obj.value.substring(0,obj.value.length-1);
		if (auxValue == null || !auxValue.toString().match(/^[-]?\d*\.?\d*$/)){
			obj.value = auxValueTotal;
			return false;
		}
		return true;
	}

	function getChecked(obj) {
	  	var arr = new Array();
		if(obj.value==null && obj.length!=null){ for(var i=0; i<obj.length; i++){ if(obj[i].checked){arr[arr.length]=obj[i].value;}}  } 
		else  { if(obj.checked){arr[arr.length]=obj.value;} }  
		return arr;
	}
	
	function isChecked(obj, value, msg) {
	  	var ban=false;  	
		if(obj.value==null && obj.length!=null){ for(var i =0; i<obj.length; i++){ if(obj[i].checked){if((value=="*")||(value!="*" && obj[i].value==value)){ban=true;break;}}} } 
		else  { if(obj.checked && ((value=="*")||(value!="*" && obj.value==value))) ban=true; }
		if(!ban && msg.length!=0){alert(msg);}
		return ban;
	}

	function isSelected(objSel, value, ret, msg) {
		if(objSel.options[objSel.selectedIndex].value==value){
		  	if(msg.length!=0){
				alert(msg);
				objSel.focus();
			}
			return ret;
		} else {
			ret = !ret;
			return ret;
		}
	}

	function getSelected(objSel) {
		if(objSel!=null && objSel.selectedIndex>-1){return objSel.options[objSel.selectedIndex].value; }
		else  {return "";}
	}  
 
   function setSelected(objSel, value) {
  	var  i =0;	
	while(i<objSel.length && objSel.options[i].value!=value) i++;	
	if(i<objSel.length) { 
		objSel.selectedIndex=i;
		return true;
	}
	return false;
  }
  
    function isNotEmpty(obj, controlValue, nombre){
	  if(controlValue.length==0){
	  	  if(nombre.length!=0){	  
			  alert("El campo " + nombre + " no puede estar vacío.");	
			  obj.focus();
			  obj.select();
		  }
		  return false;
	  } else {return true; }
  }

 /*//////////////////////////////////////////
//// Rutinas genéricas
//////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////
//// Actualiza la propiedad Disabled de un objeto
////
//// @Param  obj  		Campo de la forma al que se hace referencia
//// @Param  valor 		True | False
////
////////////////////////////////////////////////////////////////////////////////////
  function setDisabled(obj, valor){
	if(obj.value==null && obj.length!=null){
		for(var i=0;i <obj.length; i++ ){ if(obj[i]){obj[i].disabled=valor; }}
	}else  {obj.disabled=valor; }
  }

////////////////////////////////////////////////////////////////////////////////////
//// Valida que un campo no sea null
////
//// @Param  obj  		Campo de la forma al que se hace referencia
//// @Param  msg		El mensaje desplegado si obj==null
////				 Si es "" no se lanza mensaje.
////
//// @Return boolean		true  -> obj != null
////				false -> obj == null
////////////////////////////////////////////////////////////////////////////////////
  function isNotNull(obj, msg){
	  if(obj==null){
	  	  if(msg.length!=0){ alert(msg); }
		  return false;
	  }else	 {return true;}
  }

////////////////////////////////////////////////////////////////////////////////////
//// Rellena un campo hasta alcanzar un tamaño específico
////
//// @Param  obj  		Campo de la forma al que se rellena su value.
//// @Param  size		Tamaño deseado. (MAX 999 caracteres)
//// @Param  align		{I | D} Rellena a la Izquierda o Derecha. 
//// @Param  charr		Caracter de relleno.
////
//// @Return boolean		true  -> Si se rellenó la cadena
////				false -> si size <= obj.value.length 
////////////////////////////////////////////////////////////////////////////////////
  function rellena(obj, size, align, charr){
	  if(obj!=null && obj.value!=null && size!=null && obj.value.length<size){
		var s = obj.value;
		var breaker = 1000;
		while (s.length<size && breaker>0){ s = (align=='D' || align=='d')?(s + "" + charr):(charr + "" + s); }
		if(s.length > size){ s = (align=='D' || align=='d')?(s.substring(0,size)):(s.substring(s.length-size)); }
		obj.value=s;
	  	return true;
	  } else	 {return false;}
  }

////////////////////////////////////////////////////////////////////////////////////
//// Valida el tamaño del valor de un campo
////
//// @Param  obj  		Campo de la forma al que se hace referencia
//// @Param  controlValue  	Valor del campo.
//// @Param  nombre		Nombre del campo. Utilizado para desplegar mensaje 
////					de alerta. Si es "" no se lanza mensaje.
//// @Param  size		Tamaño a comparar.
////
//// @Return boolean		true  -> size == controlValue.length
////				false -> size != controlValue.length
////////////////////////////////////////////////////////////////////////////////////
  function isSize(obj, controlValue, nombre, size){
	  if(controlValue.length!=size){
	  	  if(nombre.length!=0){
		  	  alert("El campo " + nombre + " debe contener " + size + " caracteres.");	
			  obj.focus();
			  obj.select();
		  }
		  return false;
	  }else	 {return true;}
  }

////////////////////////////////////////////////////////////////////////////////////
//// Valida si un campo está vacío
////
//// @Param  obj  		Campo de la forma al que se hace referencia
//// @Param  controlValue  	Valor del campo.
//// @Param  nombre		Nombre del campo. Utilizado para desplegar mensaje 
////					de alerta. Si es "" no se lanza mensaje.
////
//// @Return boolean		true  -> controlValue.length != 0
////				false -> controlValue.length == 0
////////////////////////////////////////////////////////////////////////////////////
  function isNotEmpty(obj, controlValue, nombre){
	  if(controlValue.length==0){
	  	  if(nombre.length!=0){	  
			  alert("El campo " + nombre + " no puede estar vacío.");	
			  obj.focus();
			  obj.select();
		  }
		  return false;
	  } else {return true; }
  }
  
////////////////////////////////////////////////////////////////////////////////////
//// Valida que el valor de un campo no sea 0
////
//// @Param  obj  		Campo de la forma al que se hace referencia
//// @Param  controlValue  	Valor del campo.
//// @Param  nombre		Nombre del campo. Utilizado para desplegar mensaje 
////					de alerta. Si es "" no se lanza mensaje.
////
//// @Return boolean		true  -> controlValue!= 0
////				false -> controlValue == 0
////////////////////////////////////////////////////////////////////////////////////  
  function isNotZero(obj, controlValue, nombre) {
  	if(parseFloat(controlValue)==parseFloat(0)){
	  	if(nombre.length!=0){
			alert("El campo "+nombre+" no puede valer 0.");
			obj.focus();
			obj.select();			
		}
		return false;
	}else  {return true; }
  }  

   ////////////////////////////////////////////////////////////////////////////////////////////////
   //// valida si dos valores son iguales
   ////
   //// @Param  obj  		Campo de la forma al que se hace referencia
   //// @Param  valueA  		Valor del campo A.
   //// @Param  valueB  		Valor del campo B.
   //// @Param  msg		Mensaje a desplegar. Si es "" no se lanza mensaje.
   ////
   //// @Return boolean		true  -> valueA==valueB
   ////				false -> valueA!=valueB
   //////////////////////////////////////////////////////////////////////////////////////////////// 
  function isEqual(obj, valueA, valueB, msg) {
	if(valueA!=valueB){
	  	if(msg.length!=0){
			alert(msg);
			obj.focus();
			obj.select();			
		}
		return false;
	}else  {return true;}
  }
  
   ////////////////////////////////////////////////////////////////////////////////////////////////
   //// valida si dos valores son iguales
   ////
   //// @Param  obj  		Campo de la forma al que se hace referencia
   //// @Param  valueA  	Valor del campo A.
   //// @Param  op  		Comparación lógica {<,>,=,<=,>=,!=}
   //// @Param  valueB  	Valor del campo B.
   //// @Param  msg		Mensaje a desplegar en caso false. Si es "" no se lanza mensaje.
   ////
   //// @Return boolean		true  -> valueA==valueB
   ////				false -> valueA!=valueB
   //////////////////////////////////////////////////////////////////////////////////////////////// 
  function compara(obj, valueA, op, valueB, msg) {
	if(!eval("" + valueA + op + valueB)){
	  	if(msg.length!=0){
			alert(msg);
			obj.focus();
			obj.select();			
		}
		return false;
	}else  {return true;}
  }  
  
////////////////////////////////////////////////////////////////////////////////////
//// Valida si el valor de un campo es numérico
////
//// @Param  obj  		Campo de la forma al que se hace referencia
//// @Param  controlValue  	Valor del campo.
//// @Param  nombre		Nombre del campo. Utilizado para desplegar mensaje 
////					de alerta. Si es "" no se lanza mensaje.
////
//// @Return boolean		true  -> controlValue E (0,1,2,3,4,5,6,7,8,9)*
////				false -> controlValue NE (0,1,2,3,4,5,6,7,8,9)*
////////////////////////////////////////////////////////////////////////////////////  
  function isNumber(obj, controlValue, nombre){
      var bandera = false;
      var ch;
      for (var i = 0; i < controlValue.length; i++) {
        ch = controlValue.substring(i, i + 1);
        if (ch < "0" || ch > "9") {
          bandera = true;
          i = controlValue.length;
        }
      }
      if (bandera) {
  	if(nombre.length!=0){	  
	  alert("El campo "+nombre+" debe ser numérico.");
	  obj.focus();
	  obj.select();
	}
	return false;
      } else { return true;}
  }

////////////////////////////////////////////////////////////////////////////////////
//// Valida si el valor contiene un email valido
////
//// @Param  obj  		Campo de la forma al que se hace referencia
//// @Param  controlValue  	Valor del campo.
//// @Param  nombre		Nombre del campo. Utilizado para desplegar mensaje 
////					de alerta. Si es "" no se lanza mensaje.
////
//// @Return boolean		true  -> controlValue E (cadena)+@(cadena)+ .(cadena)+  && size>5
////				false -> controlValue NE (cadena)+@(cadena)+ .(cadena)+ || size<5
////////////////////////////////////////////////////////////////////////////////////  */
  function isMail(obj) {
  	controlValue = obj.value;
    if ((controlValue.length <=5 || controlValue.indexOf('.', 0) == -1 || controlValue.indexOf('@', 0) == -1 || controlValue.indexOf('@', 0) == 0 || controlValue.indexOf('.', 0) == 0 || controlValue.indexOf('.', controlValue.length-1) == controlValue.length-1 || controlValue.indexOf('@', controlValue.length-1) == controlValue.length-1) && controlValue != "") {
/*	  	if(nombre.length!=0){
			alert("La dirección de correo del campo "+nombre+" es inválida.");
			obj.focus();
			obj.select();
		}*/
		return false;
    } else {	return true; }
  }

/*  ////////////////////////////////////////////////////////////////////////////////////////////////
  //// Valida si el valor contiene caracteres alfabéticos
  ////
  //// @Param  obj  		Campo de la forma al que se hace referencia
  //// @Param  controlValue  	Valor del campo.
  //// @Param  nombre		Nombre del campo. Utilizado para desplegar mensaje 
  ////					de alerta. Si es "" no se lanza mensaje.
  ////
  //// @Return boolean		true  -> controlValue E (a-z, A-Z, Á-ü)*
  ////				false -> controlValue NE (a-z, A-Z, Á-ü)*
  ////////////////////////////////////////////////////////////////////////////////////////////////
  function isString(obj, controlValue, nombre) {
    var bandera = false;
    var ch;
    for (var i = 0; i < controlValue.length; i++) {
      ch = controlValue.substring(i, i + 1);
      if (ch < "A" || (ch > "Z" && ch < "a") || (ch > "z" && ch < "À") || ch > "ü") {
        if(ch != " ") {
	  bandera = true;
          i = controlValue.length;
        }
      }
    }
    if (bandera) {
  	  if(nombre.length!=0) {	
		  alert("El campo "+nombre+" contiene caracteres inválidos.");
		  obj.focus();
		  obj.select();
	  }
	  return false;
    } else {  return true;}
  }

  
  ////////////////////////////////////////////////////////////////////////////////////////////////
  //// Valida si el valor contiene caracteres alfanuméricos
  ////
  //// @Param  obj  		Campo de la forma al que se hace referencia
  //// @Param  controlValue  	Valor del campo.
  //// @Param  nombre		Nombre del campo. Utilizado para desplegar mensaje 
  ////					de alerta. Si es "" no se lanza mensaje.
  ////
  //// @Return boolean		true  -> controlValue E (a-z, A-Z, Á-ü, 0-9)*
  ////				false -> controlValue NE (a-z, A-Z, Á-ü, 0-9)*
  ////////////////////////////////////////////////////////////////////////////////////////////////
  function isStringNumber(obj, controlValue, nombre) {
    var bandera = false;
    var ch;
    for (var i = 0; i < controlValue.length; i++) {
      ch = controlValue.substring(i, i + 1);
      if (ch < "A" || (ch > "Z" && ch < "a") || (ch > "z" && ch < "À") || ch > "ü" ) {
        if(ch != " " && !(ch >= "0" && ch <= "9")) {
	  bandera = true;
          i = controlValue.length;
        }
      }
     }
     if (bandera) {
	if(nombre.length!=0) {	
	  alert("El campo "+nombre+" debe contener caracteres alfanuméricos.");
	  obj.focus();
	  obj.select();
	}
	return false;
    } else { return true; }
  }

  ////////////////////////////////////////////////////////////////////////////////////////////////
  //// Valida si el valor contiene caracteres alfanuméricos sin caracteres especiales.
  ////
  //// @Param  obj  		Campo de la forma al que se hace referencia
  //// @Param  controlValue  	Valor del campo.
  //// @Param  nombre		Nombre del campo. Utilizado para desplegar mensaje 
  ////					de alerta. Si es "" no se lanza mensaje.
  ////
  //// @Return boolean		true  -> controlValue E (a-z, A-Z, 0-9)*
  ////				false -> controlValue NE (a-z, A-Z, 0-9)*
  ////////////////////////////////////////////////////////////////////////////////////////////////
  function isAlfanumeric(obj, controlValue, nombre) {
    var bandera = false;
    var ch;
    for (var i = 0; i < controlValue.length; i++) {
      ch = controlValue.substring(i, i + 1);
      if (ch < "A" || (ch > "Z" && ch < "a") || (ch > "z")) {
        if((ch < "0" || ch > "9")) {
	  bandera = true;
          i = controlValue.length;
        }
      }
    }
     if (bandera) {
	if(nombre.length!=0) {	
	  alert("El campo "+nombre+" debe contener solo letras y/o números, sin caracteres especiales.");
	  obj.focus();
	  obj.select();
	}
	return false;
    } else { return true; }
  }


   ////////////////////////////////////////////////////////////////////////////////////////////////
   //// Valida si el valor contiene caracteres numéricos, positivos, sin decimales
   ////		y sin caracteres de formato
   ////
   //// @Param  obj  		Campo de la forma al que se hace referencia
   //// @Param  controlValue  	Valor del campo.
   //// @Param  nombre		Nombre del campo. Utilizado para desplegar mensaje 
   ////					de alerta. Si es "" no se lanza mensaje.
   //// @Param  separator	Separador de decimales
   //// @Param  numDecimales	Número máximo de decimales.
   ////
   //// @Return boolean		true  -> controlValue E (0-9)* separator (0-9)numDecimales
   ////				false -> controlValue NE (0-9)* separator (0-9)numDecimales
   ////////////////////////////////////////////////////////////////////////////////////////////////
  function isMonto(obj, controlValue, nombre, separator, numDecimales){
      var bandera = true;
      var enteros="", decimales="";
      if(controlValue.indexOf(separator)>0){      
	enteros = controlValue.substring(0, controlValue.indexOf(separator));
	decimales = controlValue.substring(controlValue.indexOf(separator)+1);
	if(isNumber(obj, enteros, "") && isNumber(obj, decimales, "") && (decimales.length==numDecimales)) { bandera=false; }
      }
      if (bandera) {
		if(nombre.length!=0){	  
			alert("El campo "+nombre+" debe ser numérico, positivo, con " + numDecimales + " decimales separados por '" + separator +"'");
			obj.focus();
			obj.select();
		}
		return false;
      }else{  	return true; }
  }
  
  ////////////////////////////////////////////////////////////////////////////////////////////////
  //// Valida el valor que una cadena no contenga carateres contenidos en un array <select>
  ////
  //// @Param  obj  		Campo de la forma al que se hace referencia
  //// @Param  value  		Cadena a parsear.
  //// @Param  nombre  		Nombre del campo al que se hace referencia. 
  ////					Si es "" no se imprimer el mensaje<br>
  //// @Param  arr		Array que contiene los caracteres inválidos.
  ////
  //// @Return boolean		@Param  True si value no contiene carateres de arr. 
  ////					False si value contiene carateres de arr.  
  //////////////////////////////////////////////////////////////////////////////////////////////// 
  function hasNoChars(obj, value, nombre, arr)
  {
	var tam = value.length;
	var tamArr = arr.length;
	var ban = true;
	var charSel;

	for(i=0; i<tam && ban; i++){
	 charSel = value.substring(i, i+1);
	 for(j=0; j< tamArr && ban; j++){
	   if(charSel==arr[j]) ban=false;
 	 }
	}

  	if(nombre.length!=0 && !ban) {
		var msg = "El campo " + nombre + " contiene caracteres invalidos: ";
		for(j=0; j< tamArr; j++){ msg = msg + "'" + arr[j]+"'  "}
		alert(msg);
		objSel.focus();
		objSel.select();			
	}
	return ban;
  }

  ////////////////////////////////////////////////////////////////////////////////////////////////
  //// Valida el valor que tiene seleccionado un <select>
  ////
  //// @Param  obj  		Campo de la forma al que se hace referencia
  //// @Param  value  		Valor buscado en el combo. <option value="value">
  //// @Param  ret  		VAlor que se espera de retorno True | false.
  //// @Param  msg		Mensaje a desplegar. Si es "" no se lanza mensaje.
  ////
  //// @Return boolean		@Param  ret
  //////////////////////////////////////////////////////////////////////////////////////////////// 
  function isSelected(objSel, value, ret, msg) {
	if(objSel.options[objSel.selectedIndex].value==value){
	  	if(msg.length!=0){
			alert(msg);
			objSel.focus();
		}
		return ret;
	} else {
		ret = !ret;
		return ret;
	}
  }
  
  ////////////////////////////////////////////////////////////////////////////////////////////////
  //// Regresa el valor que tiene seleccionado un <select>
  ////
  //// @Return string		objSel.options[objSel.selectedIndex].value o "" si no hay selected value
  //////////////////////////////////////////////////////////////////////////////////////////////// 
  function getSelected(objSel) {
	if(objSel!=null && objSel.selectedIndex>-1){return objSel.options[objSel.selectedIndex].value; }
	else  {return "";}
  }  
  
  ////////////////////////////////////////////////////////////////////////////////////////////////
  //// Regresa el Texto que tiene seleccionado un <select>
  ////
  //// @Return String	objSel.options[objSel.selectedIndex].text o "" si no hay selected value
  //////////////////////////////////////////////////////////////////////////////////////////////// 
  function getSelectedText(objSel) {
	if(objSel!=null && objSel.selectedIndex>-1){return objSel.options[objSel.selectedIndex].text; }
	else  {return "";}
  }  

    ////////////////////////////////////////////////////////////////////////////////////////////////
    //// Selecciona el valor de un <select>
    ////
    //// @Param  obj  		Campo de la forma al que se hace referencia
    //// @Param  value		Valor deseado a seleccionar. <option value="value">
    ////
    //// @Return boolean	true  -> valor selecionado
    ////					false -> valor no encontrado
    ////////////////////////////////////////////////////////////////////////////////////////////////
   function setSelected(objSel, value) {
  	var  i =0;	
	while(i<objSel.length && objSel.options[i].value!=value) i++;	
	if(i<objSel.length) { 
		objSel.selectedIndex=i;
		return true;
	}
	return false;
  }
  
  ////////////////////////////////////////////////////////////////////////////////////////////////
  //// Valida que haya al menos un valor seleccionado en Radio Button y CheckBox
  ////
  //// @Param  obj  		Object Collection de los controles a los que se hace referencia
  //// @Param  value  		Valor que se espera seleccionado. Si se envía * se validará que al menos 
  ////							haya uno seleccionado, sin importar su valor.
  //// @Param  msg			Mensaje a desplegar en caso de "Return false". Si es "" no se lanza mensaje.
  ////
  //// @Return boolean	 	True | False
  //////////////////////////////////////////////////////////////////////////////////////////////// 
  function isChecked(obj, value, msg) {
  	var ban=false;  	
	if(obj.value==null && obj.length!=null){ for(var i =0; i<obj.length; i++){ if(obj[i].checked){if((value=="*")||(value!="*" && obj[i].value==value)){ban=true;break;}}} } 
	else  { if(obj.checked && ((value=="*")||(value!="*" && obj.value==value))) ban=true; }
	if(!ban && msg.length!=0){alert(msg);}
	return ban;
  }
  
    ////////////////////////////////////////////////////////////////////////////////////////////////
    //// Selecciona el valor de un radio o un checkbox
    ////
    //// @Param  obj  		Object Collection de los controles a los que se hace referencia
    //// @Param  value		Valor deseado a seleccionar. CHECKED=true
    ////
    //// @Return boolean	true  -> valor selecionado
    ////			false -> valor no encontrado
    ////////////////////////////////////////////////////////////////////////////////////////////////
  function setChecked(obj, value) {
  	var ban=false;
	if(obj.value==null && obj.length!=null){ for(var i=0; i<obj.length; i++){ if(obj[i].value==value) {obj[i].checked=true;ban=true;} } } 
	else  { if(obj.value==value) {obj.checked=true;ban=true;} }
	return ban;
  }

    ////////////////////////////////////////////////////////////////////////////////////////////////
    //// Des selecciona el valor de un radio o un checkbox
    ////
    //// @Param  obj  		Object Collection de los controles a los que se hace referencia
    //// @Param  value		Valor deseado a seleccionar. CHECKED=false
    ////
    //// @Return boolean	true  -> valor selecionado
    ////			false -> valor no encontrado
    ////////////////////////////////////////////////////////////////////////////////////////////////
  function setUnChecked(obj, value) {
  	var ban=false;
	if(obj.value==null && obj.length!=null){ for(var i=0; i<obj.length; i++){ if(obj[i].value==value) {obj[i].checked=false;ban=true;} } } 
	else  { if(obj.value==value) {obj.checked=false;ban=true;} }
	return ban;
  }
  
    ////////////////////////////////////////////////////////////////////////////////////////////////
    //// Resetea todos los checkboxes y radios del object collection
    ////
    //// @Param  obj  		Object Collection de los controles a los que se hace referencia
    ////
    ////////////////////////////////////////////////////////////////////////////////////////////////
  function resetChecked(obj) {
	if(obj.value==null && obj.length!=null){ for(var i =0; i<obj.length; i++){ obj[i].checked=false;}  } 
	else  { obj.checked=false; }  
  }

  ////////////////////////////////////////////////////////////////////////////////////////////////
  //// Regresa un array con los "values" que estén seleccionados en el object Collection
  //// @Param  obj  		Object Collection de los controles a los que se hace referencia
  ////
  //// @Return boolean	 	array con los "values" que están en estado Checked 
  //////////////////////////////////////////////////////////////////////////////////////////////// 
  function getChecked(obj) {
  	var arr = new Array();
	if(obj.value==null && obj.length!=null){ for(var i=0; i<obj.length; i++){ if(obj[i].checked){arr[arr.length]=obj[i].value;}}  } 
	else  { if(obj.checked){arr[arr.length]=obj.value;} }  
	return arr;
  }

  ////////////////////////////////////////////////////////////////////////////////////////////////
  //// Elimina los valores &nbsp; de una cadena
  //// @Param  str  		La cadena a parsear
  ////
  //// @Return str	 	La cadena sin los &nbsp;
  //////////////////////////////////////////////////////////////////////////////////////////////// 
  function eliminaEspaciosHTML(str){
	if(str!=null && str.length){ 
		var nbsp = String.fromCharCode(160);
		while (str.indexOf("&nbsp;")!=-1) str = str.replace("&nbsp;", " ");
		while (str.indexOf(nbsp)!=-1) str = str.replace(nbsp, " ");
		while (str.substring(0,1) == ' ') str = str.substring(1,str.length); 
  		while (str.substring(str.length-1,str.length) == ' ') str = str.substring(0,str.length-1); 
	}
	return str;
  }

  ////////////////////////////////////////////////////////////////////////////////////////////////
  //// Elimina un caracter dentro de una cadena
  //// @Param  str  		La cadena a parsear
  ////
  //// @Return str	 	La cadena sin los caracteres;
  //////////////////////////////////////////////////////////////////////////////////////////////// 
  function eliminaChar(str, ch){
	if(str!=null && str.length && ch!=null){ 
		while (str.indexOf(ch)!=-1) str = str.replace(ch, "");
	}
	return str;
  }

   
   ////////////////////////////////////////////////////////////////////////////////////////////////
   //// Valida si el valor contiene caracteres numéricos, positivos, sin decimales
   ////		y sin caracteres de formato
   ////
   //// @Param  obj  		Campo de la forma al que se hace referencia
   //// @Param  controlValue  	Valor del campo.
   //// @Param  nombre		Nombre del campo. Utilizado para desplegar mensaje 
   ////					de alerta. Si es "" no se lanza mensaje.
   ////
   //// @Return boolean		true  -> controlValue E (0-9)*
   ////				false -> controlValue NE (0-9)*
   ////////////////////////////////////////////////////////////////////////////////////////////////
  function isNumberMonto(obj, controlValue, nombre){
      var bandera = false;
      var ch;
      for (var i = 0; i < controlValue.length; i++) {
        ch = controlValue.substring(i, i + 1);
        if (ch < "0" || ch > "9") {
          bandera = true;
          i = controlValue.length;
        }
      }
      if (bandera) {
   	    if(nombre.length!=0) {	  
			alert("El campo "+nombre+" debe ser numérico, positivo,  sin decimales y sin caracteres de formato (' , ',' . ')");
			obj.focus();
			obj.select();
		}
		return false;
      } else  { return true; }
  }
 
     ////////////////////////////////////////////////////////////////////////////////////////////////
     //// Recibe una cadena numerica tipo monto y la formatea en con miles, decimales, signo y moneda.  
     ////
     //// @Param  cadena 	cadena a formatear.
     //// @Param  numDeci	Número de decimales a mostrar.
     //// @Param  idDeci 	Identificador de decimales. '.'|','|etc. por default toma '.'
     //// @Param  idMil	 	Identificador de miles    . ','|'.'|etc
     //// @Param  idSigPos	Identificador de signo positivo. '+'| ''| etc 
     ////				por default no toma en cuenta 
     //// @Param  idSigNeg	Identificador de signo negativo. '-'|'('| etc 
     ////				por default toma '-'. '(' => (num).
     //// @Param  idMon		Identificador del tipo de moneda '$'|'USD'|etc. 
     ////				por defualt no toma en cuenta
     ////
     //// @Return res		cadena en formato (moneda)+ (signo)+ #(sep miles)*##0(sep deci)0##,# 
     ////////////////////////////////////////////////////////////////////////////////////////////////
 	function formateaMonto(cadena, numDeci, idDeci, idMil, idSigPos, idSigNeg, idMon){
		var banSign = false;
		var res ="";
		cadena= "" + cadena;
		res = cadena;
		if(cadena!=null && cadena.length>0){
			cadena = eliminaEspaciosHTML(cadena);

			try { numDeci = parseInt(numDeci); } 
			catch (parseEx) { numDeci=2; }
			idDeci = (idDeci!=null && idDeci!="")?idDeci:".";
			idMil = (idMil!=null && idMil!="")?idMil:"";
			idSigPos = (idSigPos!=null && idSigPos!="")?idSigPos:"";
			idSigNeg = (idSigNeg!=null && idSigNeg!="")?idSigNeg:"-";
			idMon = (idMon!=null && idMon!="")?idMon:"";
			
			while(idSigPos!= "" && cadena.indexOf(idSigPos)!=-1) { banSign=false; cadena=cadena.replace(idSigPos, '');}
			if(idSigNeg=='('){  while(cadena.indexOf(idSigNeg)!=-1) { banSign=true; cadena=cadena.substring(cadena.indexOf("(")+1, cadena.indexOf(")")); } }
			else { while(cadena.indexOf(idSigNeg)!=-1) { banSign=true; cadena=cadena.replace(idSigNeg, '');}} 
			while(idMon!= "" && cadena.indexOf(idMon)!=-1) { cadena=cadena.replace(idMon, '');}
			while(idMil!="" && cadena.indexOf(idMil)!=-1) { cadena=cadena.replace(idMil, '');}
			while(idDeci!= "." && cadena.indexOf(idDeci)!=-1) { cadena=cadena.replace(idDeci, '.');}
			cadena = eliminaEspaciosHTML(cadena);					

			res = "";
			var ent="";
			var dec="";			
			var i=0;
			ent = (cadena.indexOf(".")!=-1)?cadena.substring(0, cadena.indexOf(".")):cadena;
			dec = (cadena.indexOf(".")!=-1)?cadena.substring(cadena.indexOf(".")+1):"";
			
			while(ent.length>3){
				res = "" + idMil + ent.substring((ent.length)-3, ent.length) + res;
				ent = ent.substring(0, (ent.length)-3);
			}
			res = "" + ent + res;	
			res = res + "" + idDeci;			
			while(dec.length<numDeci) dec = dec + "0";
			if(dec.length > numDeci) dec = dec.substring(0, numDeci);
			res = "" + res + dec;
			if(idSigPos!="" && !banSign) res = "" + idSigPos + res;
			if(idSigNeg!="" && banSign && idSigNeg!="(") res = "" + idSigNeg + res;
			if(idSigNeg!="" && banSign && idSigNeg=="(") res = "(" + res + ")";
			if(idMon!="") res = idMon + " " + res;					
		}
		return res;		
	}
	
    ////////////////////////////////////////////////////////////////////////////////////////////////
    //// Recibe una cadena formateada con miles, decimales, signo y moneda y la convierte a un 
    ////		float del tipo ###0.#
    ////
    //// @Param  cadena 	cadena a desformatear.
    //// @Param  idDeci 	Identificador de decimales. '.'|','|etc. por default toma '.'
    //// @Param  idMil	 	Identificador de miles    . ','|'.'|etc. por default toma ','
    //// @Param  idSigPos	Identificador de signo positivo. '+'| ''| etc 
    ////				por default no toma en cuenta 
    //// @Param  idSigNeg	Identificador de signo negativo. '-'|'('| etc 
    ////				por default toma '-'. '(' => (num).
    //// @Param  idMon		Identificador del tipo de moneda '$'|'USD'|etc. 
    ////				por defualt no toma en cuenta
    ////
    //// @Return res		Nuevo float en formato ###0.#
    ////////////////////////////////////////////////////////////////////////////////////////////////
   function desformateaMonto(cadena, idDeci, idMil, idSigPos, idSigNeg, idMon){
	var banSign = false;
	if(cadena!=null && cadena.length>0){
		cadena = eliminaEspaciosHTML(cadena);
		
		idDeci = (idDeci!=null && idDeci!="")?idDeci:".";
		idMil = (idMil!=null && idMil!="")?idMil:",";
		idSigPos = (idSigPos!=null && idSigPos!="")?idSigPos:"";
		idSigNeg = (idSigNeg!=null && idSigNeg!="")?idSigNeg:"-";
		idMon = (idMon!=null && idMon!="")?idMon:"";
		while(idSigPos!= "" && cadena.indexOf(idSigPos)!=-1) { banSign=false; cadena=cadena.replace(idSigPos, '');}
		if(idSigNeg=='('){  while(cadena.indexOf(idSigNeg)!=-1) { banSign=true; cadena=cadena.substring(cadena.indexOf("(")+1, cadena.indexOf(")")); } }
		else { while(cadena.indexOf(idSigNeg)!=-1) { banSign=true; cadena=cadena.replace(idSigNeg, '');}} 
		while(idMon!= "" && cadena.indexOf(idMon)!=-1) { cadena=cadena.replace(idMon, '');}
		while(cadena.indexOf(idMil)!=-1) { cadena=cadena.replace(idMil, '');}
		while(idDeci!= "." && cadena.indexOf(idDeci)!=-1) { cadena=cadena.replace(idDeci, '.');}
		cadena = eliminaEspaciosHTML(cadena);					
		var res = 0.00;
		try { res = parseFloat(cadena); if(banSign) res *=-1; }
		catch (ex) { res = cadena;} 
	}
	return res;
  }
 
   ////////////////////////////////////////////////////////////////////////////////////////////////
   //// Valida si la fecha es válida. Formato aaaa-mm-dd
   ////
   //// @Param  objDate 		Campo de la forma al que se hace referencia
   //// @Param  dtStr		Valor de la fecha. Formato aaaa-mm-dd
   //// @Param  nombre		Nombre del campo. Utilizado para desplegar mensaje 
   ////					de alerta. Si es "" no se lanza mensaje.
   ////
   //// @Return boolean		true  -> dtStr fecha válida
   ////				false -> dtStr fecha inválida
   ////////////////////////////////////////////////////////////////////////////////////////////////
function isDate(objDate, dtStr, nombre)
{
	var dtCh = "-";
	var minYear=1900;
	var maxYear=2100;
	var daysInMonth = DaysArray(12);
	var pos1=dtStr.indexOf(dtCh);
	var pos2=dtStr.indexOf(dtCh,pos1+1);
	var strYear=dtStr.substring(0,pos1);
	var strMonth=dtStr.substring(pos1+1,pos2);
	var strDay=dtStr.substring(pos2+1);
	var bandera = true;
	
	strYr=strYear;
	if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1);
	if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1);
	for (var i = 1; i <= 3; i++) {
		if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1);
	}
	month=parseInt(strMonth);
	day=parseInt(strDay);
	year=parseInt(strYr);
	if (pos1==-1 || pos2==-1 || pos1!=4 || pos2!=7){
		bandera=false;
	}
	if (strMonth.length<1 || month<1 || month>12){
		bandera=false;
	}
	if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
		bandera=false;
	}
	if (strYear.length != 4 || year==0 || year<minYear || year>maxYear){
		bandera=false;
	}
	if (dtStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dtStr, dtCh))==false){
		bandera=false;
	}
	
	if(!bandera)
	{
   	  if(nombre.length!=0)
	  {	
		  alert("El campo "+nombre+" contiene una fecha inválida.");
		  objDate.focus();
		  try { objDate.select(); }
		  catch(ex) { }
		  
	  }
	}
	return bandera;
}
  
function daysInFebruary (year){
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}

function DaysArray(n) {
	var array = new Array(n);
	for (var i = 1; i <= n; i++) {
		array[i] = 31;
		if (i==4 || i==6 || i==9 || i==11) {array[i] = 30;}
		if (i==2) {array[i] = 29;}
   } 
   return array;
}  

function isInteger(s){
	var i;
    for (i = 0; i < s.length; i++){   
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    return true;
}  
function stripCharsInBag(s, bag){
	var i;
    var returnString = "";
    for (i = 0; i < s.length; i++){   
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

 
 
   ////////////////////////////////////////////////////////////////////////////////////////////////
   //// Devuelve el número de días de diferencia entre la fechaA y fechaB. Formato 
   //// 		fecha aaaa-mm-dd
   ////
   //// @Param  strFechaA 	Fecha A. Formato fecha aaaa-mm-dd
   //// @Param  strFechaB	Fecha B. Formato fecha aaaa-mm-dd
   ////
   //// @Return signed int	dias fechaA - días FechaB
   ////////////////////////////////////////////////////////////////////////////////////////////////
function comparaDiasFechas(strFechaA, strFechaB){	
	var daysDifference,sdif;
	var fechaA = toDate(strFechaA);	
	var fechaB = toDate(strFechaB);

	sdif = new String((fechaA - fechaB)/86400000);
	
	if(sdif.indexOf(".")>0)
		sdif = sdif.substring(0,sdif.indexOf("."));
	
	daysDifference = new Number(sdif);
	
	return daysDifference;
}

function toDate(stringDate){
	var yr, mo, dy;
	var i;
	var stringFechaIngresada;
	
	stringFechaIngresada = new String(stringDate);

	yr = -1;
	mo = -1;
	dy = -1;
	
	if(stringFechaIngresada.length==10){
		i = stringFechaIngresada.indexOf("-");
		if(i>0){
			yr = new Number(stringFechaIngresada.substring(0,i));
			stringFechaIngresada = stringFechaIngresada.substring(i+1);

			i = stringFechaIngresada.indexOf("-");
			mo = new Number(stringFechaIngresada.substring(0,i)) - 1;
			stringFechaIngresada = stringFechaIngresada.substring(i+1);

			dy = new Number(stringFechaIngresada);
		}
	}
	
	var fechaIngresada;
	if((yr>0) && (mo>=0) && (dy>0))
		fechaIngresada = new Date(yr, mo, dy);
	else
		fecha =  null;
		
	return fechaIngresada;
}

   ////////////////////////////////////////////////////////////////////////////////////////////////
   //// Rutina que devuelve un arreglo JS inicializado en 0 con los días del mes para el año dado
   ////
   //// @Param  year 		Año que se desea mostrar; En caso de no proporcionarlo se tomara
   //// 			        el año actual.
   ////
   //// @Return array		arr[0-11] con los días del mes.
   ////////////////////////////////////////////////////////////////////////////////////////////////
function daysOfMonth(year){

	if(!year){
		var fecha = new Date();
		year = fecha.getFullYear();
	}
	var array = new Array(12);
	for (var i = 0; i < 12; i++) {
		array[i] = 31;
		if (i==3 || i==5 || i==8 || i==10) {array[i] = 30;}
		if (i==1) {array[i] = daysInFebruary(year);}
  	 } 
  	 return array;
}

////////////////////////////////////////////////////////////////////////////////////
//// Valida la estructura de la Clave Especial
////
//// @Param  obj  		Campo de la forma al que se hace referencia
////
//// @Return boolean		true  -> Estructura correcta
////						false -> Estructura incorrecta
////////////////////////////////////////////////////////////////////////////////////

function isClaveEspecial(obj){

	var cla = obj;
	if(isNotEmpty(cla, cla.value, "Clave Especial") && isSize(cla, cla.value, "Clave Especial", 8) && isAlfanumeric(cla, cla.value, "Clave Especial")){
		return true;
	}
	else return false;
	
}

   ////////////////////////////////////////////////////////////////////////////////////////////////
   //// Evalua una expresion, incluyendo funciones JS, y devuelve un mensaje especial. 
   ////
   //// @Param  obj  		Campo de la forma al que se hace referencia
   //// @Param  expr	  	Expresion a evaluar en "eval(expr)"
   //// @Param  msg		Mensaje a desplegar en caso false. Si es "" no se lanza mensaje.
   ////
   //// @Return boolean		true  -> eval(expr)==true
   ////				false -> eval(expr)==false
   //////////////////////////////////////////////////////////////////////////////////////////////// 
  function specialMessage(obj, expr, msg) {
	if(!eval("" + expr)){
	  	if(msg.length!=0){
			alert(msg);
			try {
				obj.focus();
				obj.select();			
			} catch(ex) {}
		}
		return false;
	} else  { return true; }
  }  

//////////////////////////////////////////
//// Terminan Rutinas genéricas
//////////////////////////////////////////

*/
