
	
	//Función Trim para javascript
	function Trim ( Cadena ){
		return(Cadena.replace(/^\s+/,'').replace(/\s+$/,''));
	}

	// Sustituye una cadena por otra dentro de una cadena :p
	function str_replace(sCadena, sCadenaBuscada, sCadenaSustituta) {
		return sCadena.split(sCadenaBuscada).join(sCadenaSustituta);
	}
	
	function EsNumero (Numero)
	{
		var Retorno=false;
		if ( /^([0-9])*$/.test(Numero) && Numero.length>0 ) Retorno=true;
		return Retorno;
	}	
	
	/*
	Esta función lo que hace es recibir un componente,y los caracteres permitidos que puede contener , 
	con una longitud máxima dada por el argumento máximo, y si este puede o no ir vacío, y por último el el nombre 
	del campo por si se requiere enviar mensajes a la pantalla.
	Decuelve true en caso de no haber errores y false en caso contrario
	*/
function Validador ( Componente, sPermitidos ,iMaxima, bVacio, sNombreDelComponente ){
	var sCadena;
	var bRetorno=true;
	var bPermitido=true;
	var bSigue=true;
	var i,j;
	var Letra;
	
	sCadena=Trim(Componente.value);
	
	
	//Comprobamos que la cadena no esté vacía en caso de que no se pueda
	if ( bVacio != true ){
		if (  sCadena.length == 0 )
		{
			bRetorno=false;
			alert("El campo "+sNombreDelComponente+" no puede estar vacío.");
		}
	}
	
	//Comprobamos que la longitud de la cadena no sea mayor a la longitud Maxima permitida
	if ( bRetorno != false ){
		if ( sCadena.length > iMaxima )
		{
			bRetorno=false;
			alert("El campo "+sNombreDelComponente+" no puede tener mas de " + iMaxima + " caracteres.");
		}
	}
	
	//Comprobamos que sólo contenga letras
	if ( bRetorno != false ){
		for ( i=0; i<sCadena.length && bPermitido==true; i++ ){
			Letra=sCadena.charAt( i );
			for ( j=0; j<sPermitidos.length && bSigue==true; j++){
				if ( Letra==sPermitidos.charAt( j ) ) bSigue=false;
			}
			if ( bSigue==true ) 
				bPermitido=false;
			else 
				bSigue=true;
		}

		if ( bPermitido==false )
		{
			bRetorno=false;
			alert("Se ha introducido el siguiente caracter no permitido: "+Letra + "\n\nEl campo "+sNombreDelComponente+" unicamente puede contener los siguientes caracteres: \n\n"+sPermitidos);
		}

	}
	
	return bRetorno;
}

	/*Esta funcion se encarga de revisar que únicamente en valor del componente contenga letras,  con una longitud máxima, si puede o no ir vacío, y
	recibe el nombre del campo para enviar los mensajes a pantalla*/
	function ValidaLetras ( Componente, iMaxima, bVacio, sNombreDelComponente ){
		var sPermitidos = "ABCDEFGHIJKLMNÑOPQRSTUVWXYZÁÉÍÓÚ" + "abcdefghijklmnñopqrstuvwxyzáéíóú .";
		return Validador (Componente, sPermitidos ,iMaxima, bVacio, sNombreDelComponente);
	}

	/*Esta funcion se encarga de revisar que únicamente en valor del componente contenga numeros,  con una longitud máxima, si puede o no ir vacío, y
	recibe el nombre del campo para enviar los mensajes a pantalla*/
	function ValidaNumeros ( Componente, iMaxima, bVacio, sNombreDelComponente ){
		var sPermitidos = "1234567890";
		return Validador (Componente, sPermitidos ,iMaxima, bVacio, sNombreDelComponente);
	}

	/*Esta funcion se encarga de revisar que únicamente en valor del componente contenga solo alfanumericos,  con una longitud máxima, si puede o no ir vacío, y
	recibe el nombre del campo para enviar los mensajes a pantalla*/
	function ValidaAlfanumericos ( Componente, iMaxima, bVacio, sNombreDelComponente ){
		var sPermitidos = "ABCDEFGHIJKLMNÑOPQRSTUVWXYZÁÉÍÓÚ" + "abcdefghijklmnñopqrstuvwxyzáéíóú " + "1234567890.";
		return Validador (Componente, sPermitidos ,iMaxima, bVacio, sNombreDelComponente);
	}

	function ValidaAlfaNumRFC ( Componente, iMaxima, bVacio, sNombreDelComponente ){
		var sPermitidos = "ABCDEFGHIJKLMNÑOPQRSTUVWXYZ" + "abcdefghijklmnñopqrstuvwxyz" + "1234567890";
		return Validador (Componente, sPermitidos ,iMaxima, bVacio, sNombreDelComponente);
	}
	
	function EsLetraRFC ( sCadena ){
		var bRetorno=true;
		var i,j;
		var Letra;		
		var bPermitido=true;
		var bSigue=true;
		var sPermitidos="ABCDEFGHIJKLMNÑOPQRSTUVWXYZabcdefghijklmnñopqrstuvwxyz";
		for ( i=0; i<sCadena.length && bPermitido==true; i++ ){
			Letra=sCadena.charAt( i );
			for ( j=0; j<sPermitidos.length && bSigue==true; j++){
				if ( Letra==sPermitidos.charAt( j ) ) bSigue=false;
			}
			if ( bSigue==true ) 
				bPermitido=false;
			else 
				bSigue=true;
		}
		
		if ( bPermitido==false ){
			bRetorno=false;
		}	
		return bRetorno;
	}	
	
	/*Esta función regresa true si la fecha es valida y false de lo contrario */
	function FechaValida ( Dia,Mes,Anio ){
		var fecha;
		var Retorno=false;
		fecha = new Date( Anio, Mes-1, Dia );		
		if ( Dia == fecha.getDate() && Mes == (fecha.getMonth()+1) && Anio == fecha.getFullYear() ){
			Retorno=true;
		}
		return Retorno;
	}
	
	//Función que revisa el formato del RFC
	function RevisarRFC ( Componente ){
		var Retorno=true;
		var Letras="";
		var Numeros="";
		Letras=Componente.value.substr(0,4);
		Numeros=Componente.value.substr(4);
		if ( !EsNumero( Numeros ) || !EsLetraRFC(Letras) ){
			alert("Formato de RFC Incorrecto");
			Retorno=false;
		}
		
		return Retorno;
	}	

	/*Devuelve la cadena llegada como parametro por una que no tiene acentos*/
	function SinAcentos ( sPalabra ){
		var Retorno = sPalabra;
		var aLetBus = "ÁÉÍÓÚáéíóúÄ";
		//ÁÀÄÂÉÈËÊÍÌÏÎÓÒÖÔÚÙÜÛáàäâéèëêíìïîóòöôúùüû
		//AAAAEEEEIIIIOOOOUUUUaaaaeeeeiiiioooouuuu
		var aLetSus = "AEIOUaeiou";  
		for ( i=0; i<aLetBus.length; i++ ){
			Retorno = str_replace ( Retorno, aLetBus.substr(i,1), aLetSus.substr(i,1) );
		}
		return Retorno;
	}
	
	/*Devuelve la primera vocal de una cadena indicándole desde dónde empezar a revisar con su parametro iInicio*/
	function PrimeraVocal ( sPalabra, iInicio ){
		var Vocales = "AEIOUaeiou";
		var cadChar = "";
		var Retorno = "";
		for ( i=iInicio; i<sPalabra.length; i++ ){
			cadChar = sPalabra.substr(i,1);
			for ( j=0; j<Vocales.length; j++ ){
				if ( cadChar == Vocales.substr(j,1) ){
					Retorno = Vocales.substr(j,1);
					j = Vocales.length;
					i = sPalabra.length;
				}
			}
		}
		return Retorno;
	}
	
	/*Quita las palabras sobrantes de los nombres y además quita los Nombres comunes si se trata de un nombre*/
	function QuitaComunes ( sNombre, bEsNombre ){
		var Retorno = Trim( sNombre );
		var Sobrantes = new Array(".", ",", "DE ", "DEL ", "LA ", "LOS ", "LAS ", "Y ", "MC ", "MAC ", "VON ", "VAN ");
		var Nombres = new Array("MA ","MARIA ","J ","JOSE ");
		for ( i=0; i<Sobrantes.length; i++ )	Retorno = str_replace( Retorno, Sobrantes[i], "" );
		if ( bEsNombre ){
			for ( i=0; i<Nombres.length; i++ )	Retorno = str_replace( Retorno, Nombres[i], "" );
		}
		return Trim( Retorno );
	}
	
	/*Sustituye las palabras ofensivas...*/
	function QuitaProhibidas ( sRfc ){
		var Retorno = sRfc;
		var sPalabras = "BUEI&BUEY&CACA&CACO&CAGA&CAGO&CAKA&CAKO&COGE&COJA&";
		sPalabras += "KOGE&KOJO&KAKA&KULO&MAME&MAMO&MEAR&";
		sPalabras += "MEAS&MEON&MION&COJE&COJI&COJO&CULO&";
		sPalabras += "FETO&GUEY&JOTO&KACA&KACO&KAGA&KAGO&";
		sPalabras += "MOCO&MULA&PEDA&PEDO&PENE&PUTA&PUTO&";
		sPalabras += "QULO&RATA&RUIN";
		aPalabras = sPalabras.split("&");
		for ( i=0; i<aPalabras.length; i++ ){
			Retorno = str_replace( Retorno, aPalabras[i], aPalabras[i].substr(0,3)+"X" );
		}
		return Retorno;
	}

	/*
		Función que devuelve el RFC, los datos enviados a esta función ya debieron haber sido validados.
	*/
	function consigueRFC ( sNombre, sApellidoPat, sApellidoMat, sDia, sMes, sAnio ){
	
		var Retorno = "";
		
		//Pasamos a mayúsculas el nombre
		sNombre = Trim ( sNombre.toUpperCase() );
		sApellidoPat = Trim( sApellidoPat.toUpperCase() );
		sApellidoMat = Trim( sApellidoMat.toUpperCase() );
		
		//Guardamos los nombres originales
		var sNombreOriginal = sNombre;
		var sApellidoPatOriginal = sApellidoPat;
		var sApellidoMatOriginal = sApellidoMat;		
		
		//Le sustituimos los acentos a los elementos
		sNombre = SinAcentos ( sNombre );
		sApellidoPat = SinAcentos ( sApellidoPat );
		sApellidoMat = SinAcentos ( sApellidoMat );
		
		//Le quitamos las U con dieresis.
		sNombre = str_replace(sNombre, "Ü", "U");
		sApellidoPat = str_replace(sApellidoPat, "Ü", "U");
		sApellidoMat = str_replace(sApellidoMat, "Ü", "U");
		
		//Quitamos las palabras sobrantes de los apellidos y los nombres comunes
		sNombre = QuitaComunes ( sNombre, true );
		sApellidoPat = QuitaComunes ( sApellidoPat, false );
		sApellidoMat = QuitaComunes ( sApellidoMat, false );
		
		//Empezamos a generar el RFC
		Retorno = sApellidoPat.substr(0,1);
		Retorno += PrimeraVocal ( sApellidoPat, 1 );
		if ( sApellidoMat=="" ) Retorno += "X";
		else Retorno += sApellidoMat.substr(0,1);
		Retorno += sNombre.substr(0,1);
		
		//Ahora acomodamos los caracteres numéricos
		sAnio = sAnio.substr( 2,4 );
		if ( sMes.length < 2 ) sMes = "0"+sMes;
		if ( sDia.length < 2 ) sDia = "0"+sDia;
		Retorno += sAnio+sMes+sDia;
		
		//Ahora solo modificamos las palabras prihibidas...
		Retorno = QuitaProhibidas ( Retorno );
		
		return Retorno;
	}

	/*Si están llenos todos los datos para generar el RFC lo genera, de lo contrario lo borra*/
	function GeneraRFC ( ComponenteRFC, Nombre, ApellidoPat, ApellidoMat, Dia, Mes, Anio ){
		Nombre.value = Trim ( Nombre.value.toUpperCase() );
		ApellidoPat.value = Trim ( ApellidoPat.value.toUpperCase() );
		ApellidoMat.value = Trim ( ApellidoMat.value.toUpperCase() );
		
		if ( Nombre.value!="" && ApellidoPat.value!="" &&
			Dia.value!="0" && Mes.value!="0" && Anio.value!="0"){
			ComponenteRFC.value = consigueRFC( Nombre.value, ApellidoPat.value, ApellidoMat.value, Dia.value, Mes.value, Anio.value );
		} else{
			ComponenteRFC.value = "";
		}
	}
	
	function CambioEmbarazo ( ){
		var Embarazo = document.getElementById( "Embarazo" );
		var Infertilidad = document.getElementById( "Infertilidad" );
		var Climaterio = document.getElementById( "Climaterio" );
		Infertilidad.value="";
		Climaterio.value="";
		Climaterio.disabled=true;
		if ( Embarazo.value=="0" ){
			Infertilidad.disabled=false;
		} else {
			Infertilidad.disabled=true;
		}
	}
	
	function CambioInfertilidad ( ){
		var Infertilidad = document.getElementById( "Infertilidad" );
		var Climaterio = document.getElementById( "Climaterio" );
		Climaterio.value="";
		if ( Infertilidad.value=="0" ){
			Climaterio.disabled=false;
		} else {
			Climaterio.disabled=true;
		}
	}
	
	function ValidaEntrada ( form ){
		var HayError=false;

		//Validaciones del nombre
		if(!ValidaLetras ( form.ApellidoPat, 30, false, "Primer apellido" )) {
			HayError=true;
			form.ApellidoPat.select();
		}
		
		if ( !HayError ){
			if(!ValidaLetras ( form.ApellidoMat, 30, true, "Segundo apellido" )) {
				HayError=true;
				form.ApellidoMat.select();
			}
		}
		
		if ( !HayError ){
			if(!ValidaLetras ( form.Nombre, 30, false, "Nombre" )) {
				HayError=true;
				form.Nombre.select();
			}
		}
		
		//Fecha
		if ( !HayError ){
			//Vemos si la fecha es valida
			if ( FechaValida(form.FechaDia.value,form.FechaMes.value,form.FechaAnio.value) ){
				//Aquí revisamos que la fecha introducida no sea mayor a la actual
				var FechaHoy=new Date();
				var FechaIntroducida = new Date( form.FechaAnio.value, form.FechaMes.value-1, form.FechaDia.value,0,0,0 );
				FechaHoy=new Date( FechaHoy.getFullYear(), FechaHoy.getMonth(), FechaHoy.getDate(),0,0,0 );
				if ( FechaIntroducida > FechaHoy ) {
					alert( "La fecha introducida debe ser menor a la fecha del día actual." );
					form.FechaDia.value=0;
					form.FechaMes.value=0;
					form.FechaAnio.value=0;
					form.FechaDia.focus();
					HayError=true;	
				}
			}
			else{
				alert("La fecha introducida es invalida, por favor Introduzca una fecha valida.");
				form.FechaDia.value=0;
				form.FechaMes.value=0;
				form.FechaAnio.value=0;
				form.FechaDia.focus();
				HayError=true;	
			}
		}
		
		if ( HayError ){
			form.Rfc.value="";
		}
		
		//Revisamos el RFC
		if ( !HayError ){
			if ( form.Rfc.value.length!=10 ){
				alert("El RFC introducido debe ser de 10 caracteres");
				HayError=true;
				form.Rfc.select();
			}
			else{
				if ( !ValidaAlfaNumRFC ( form.Rfc, 10, false, "RFC" ) ){
					HayError=true;
					form.Rfc.select();
				}
				else{
					if ( !RevisarRFC ( form.Rfc ) ){
						HayError=true;
						form.Rfc.select();
					}
				}
			}
		}
		
		// Institucuiones
		if ( !HayError ) {
			if ( !EsNumero (form.Instituciones.value ) || form.Instituciones.value=="0" ){
				HayError=true;
				alert("Error: Debe eligir alguna opción en el menú de las instituciones, o en caso de no contar " +
				"con ninguna afiliación a ninguna institución, elegir la opción correspondiente");
				form.Instituciones.focus();
			}
		}	


		//Tipo de paciente, verificamos que al menos una opción está seleccionada
		if ( !HayError ){
			HayError = true;
			for ( i=0; i<form.TipoDePaciente.length; i++ ){
				if ( form.TipoDePaciente[i].checked ){
					HayError = false;
					break
				}
			}
			if ( HayError ){
				alert("Debe elegir una opción en el menú correspondiente a su motivo por el cual solicita la cita en el Instituto.");
			}
		}
		
		//Revisamos si sólo tiene un apellido, si sólo escribió un apellido, le recordamos que si tiene ambios debe escribir ambos apellidos
		if ( form.ApellidoMat.value=="" ) {
			if ( !confirm("Usted sólo ha llenado uno de sus apellidos, si cuenta con ambos apellidos, por favor de click en el botón Cancelar y llene ambos apellidos.\n\nSi usted sólo cuenta con un apellido único, de click en el botón aceptar para continuar con el llenado de su solicitud de Cita de valoración.") ){
				HayError=true;
				form.ApellidoMat.select();
			} 
		}
		return !HayError;
	}
	
	function ValidaEmbarazadas ( form ){
		var HayError = false;
		
		//Meses de embarazo
		if(!ValidaNumeros ( form.TiempoEmb, 1, false, "Meses de embarazo" )) {
			HayError=true;
			form.TiempoEmb.select();
		}
		
		//validamos que hayan metido alfanumericos en otra
		if ( form.OtroPadEmb.checked == true ){
			if ( !ValidaAlfanumericos ( form.OtroPadEmbDes, 255, false, "Otra complicación" ) ){
				HayError=true;
				form.OtroPadEmbDes.select();
			}
		}
		
		return !HayError;
	}
	
	function ValidaInfertilidad ( form ){
		var HayError = false;
		
		//Primero validamos la edad del marido
		if(!ValidaNumeros ( form.EdadMarido, 2, false, "Edad del marido" )) {
			HayError=true;
			form.EdadMarido.select();
		}
		
		//
		if ( !HayError ){
			if ( form.TiempoSex.value!="1" && form.TiempoSex.value!="0" ){
				HayError=true;
				alert("Error: Debe elegir una opción válida a la pregunta ¿Ha mantenido vida sexual 2 o más años sin anticoncepción?");
				form.TiempoSex.focus();
			}
		}
		
		if ( !HayError ){
			if ( form.Azoospermia.value!="1" && form.Azoospermia.value!="0" ){
				HayError=true;
				alert("Error: Debe elegir una opción válida a la pregunta ¿Su marido padece de azoospermia?");
				form.Azoospermia.focus();
			}
		}
		
		return !HayError;
	}
	
	function SeleccionaOtraEmb (  ){
		var OtroPadEmb = document.getElementById( "OtroPadEmb" );
		var OtroPadEmbDes = document.getElementById( "OtroPadEmbDes" );
		OtroPadEmbDes.value="";
		if ( OtroPadEmb.checked == true ){
			OtroPadEmbDes.disabled = false;
		} else {
			OtroPadEmbDes.disabled = true;			
		}
	}
	
