var action;
var aCampo;
var aMens;
var aTipo_vacio;
var aTipo_valido;
var aCampo_op;
var aMens_op;
var aTipo_op;



/*****************************************************************************/
/* boolean Check_Form(Form)                                                  */
/*****************************************************************************/
/* Recibe el formulario y, despues de crear los arrays de comprobacion en la */
/* llamada a la funcion inicializa(), llama a las funciones de checkeo.      */
/*****************************************************************************/
/* Si hay error se muestra el mensaje generado por las funciones de check,   */
/* si no hay error, se le da un action al formulario y se fuerza el submit.  */
/*****************************************************************************/
function Check_Form(frm)
{

	inicializa(frm)


	// Comprobamos los campos obligatorios
	sMensaje = Check_Obligatorios(frm, aCampo, aMens, aTipo_vacio, aTipo_valido)


	if ((iCheckOk == -1) && (aCampo_op.length > 0)){ // En el caso de que los campos obligatorios sean correctos miramos la validez de los opcionales (si hay alguno)
		i=0; j=0;
		sMensaje = Check_Optativos(frm, aCampo_op, aMens_op, aTipo_op)
		aCampo = aCampo_op; // Hacemos esta asignacion para poder forzar el focus a los campos opcionales si añadir codigo.
	}

  if (iCheckOk!=-1) { // En el caso de que existe algún error en la comprobación.
		alert(sMensaje) // Mostramos el mensaje de error
		if (iCheckOk != -2) { // caso que haya error y no sea sobre un radioButton
			//alert(aCampo[iCheckOk]);
			eval("frm."+aCampo[iCheckOk]+".focus()")		// focus sobre el campo erroneo
		}
		return false;
		
	} else { // No hay error, procedemos a las comprobaciones propias de la pagina
		
		sMensaje = propias(frm)
		if (iCheckOk != -1) {
			alert(sMensaje)
			if (iCheckOk != -2) { // caso que haya error y no sea sobre un radioButton
				eval("frm.elements["+iCheckOk+"].focus()")		// focus sobre el campo erroneo
			}
			return false;
		} else {
			frm.action = action;
			frm.submit();
			return true;
		}
	}
}




/*****************************************************************************/
/* String Check_Obligatorios(Form, String, String, String, String)           */
/*****************************************************************************/
/* Recibe los arrays necesarios para la comprobacion y respuesta de posibles */
/* errores y devuelve una cadena con el mensaje de error.                    */
/* En caso de que haya un error se modifica la variable global iCheckOk de   */
/* manera que guarde la posicion del primer campo erroneo.                   */
/*****************************************************************************/
/* Se hacen dos comprovaciones, una para asegurarse que todos los campos que */
/* se han marcado como obligatorios han sido rellenados y otra en la que se  */
/* se comprueba que los campos han sido rellenados correctamente, segun sean */
/* textos, numeros, emails o fechas.                                         */
/*****************************************************************************/
function Check_Obligatorios(frm, aC, aM, aT_vacio, aT_valido) {
		
	sMensaje = "Se deben introducir los siguientes campos obligatorios:"
	sMensaje = checkVacio(frm, aC, aM, aT_vacio, sMensaje);
	
	if (iCheckOk == -1) { // En el caso de que esten todos rellenados, comprobamos la validez
		sMensaje = "Los siguientes campos no son validos:"
		sMensaje = checkValido(frm, aC, aM, aT_valido, sMensaje)
		
	}
	return sMensaje;
     
}

function Check_ObligatoriosOld(frm, aC, aM, aT_vacio, aT_valido) {
		
	sMensaje = "Se deben introducir los siguientes campos obligatorios:"
	sMensaje = checkVacio(frm, aC, aM, aT_vacio, sMensaje);
	
	if (iCheckOk == -1) { // En el caso de que esten todos rellenados, comprobamos la validez
		sMensaje = Check_Optativos(frm, aC, aM, aT_valido)
	}
	return sMensaje;
     
}


/*****************************************************************************/
/* String Check_Optativos(Form, String, String, String)                      */
/*****************************************************************************/
/* Recibe los arrays necesarios para la comprobacion y respuesta de posibles */
/* errores y devuelve una cadena con el mensaje de error.                    */
/* En caso de que haya un error se modifica la variable global iCheckOk de   */
/* manera que guarde la posicion del primer campo erroneo.                   */
/*****************************************************************************/
/* Se realiza una unica comprovacion, debido a que los campos que se chequea */
/* pueden aparecer vacios. Solo miraremos que, en el caso de que hayan sido  */
/* rellenados, se hayan introducido datos validos.                           */
/*****************************************************************************/
function Check_Optativos(frm, aC, aM, aT_valido) {
		
	sMensaje = "Los siguientes campos no son correctos:"
	for(ii=0;ii<aC.length;ii++) {
		if (aT_valido[ii] == 0) {
			if (eval("frm." + aC[ii] + ".value").length <= 0 && eval("frm." + aC[ii] + ".value").length > 0) {
				if ((iCheckOk == -1) || (iCheckOk == -2)) iCheckOk = ii
					sMensaje = sMensaje+"\n" + aM[ii]
			}
		}
	}
	sMensaje = checkValido(frm, aC, aM, aT_valido, sMensaje)

	return sMensaje;

}

function Check_OptativosOld(frm, aC, aM, aT_valido) {
		
	sMensaje = "Los siguientes campos no son correctos:"
	sMensaje = checkValido(frm, aC, aM, aT_valido, sMensaje)

	return sMensaje;

}



/*****************************************************************************/
/* String checkVacio(Form, String, String, String, String)                   */
/*****************************************************************************/
/* Recibe los arrays necesarios para la comprobacion y respuesta de posibles */
/* errores y devuelve una cadena con el mensaje de error.                    */
/* En caso de que haya un error se modifica la variable global iCheckOk de   */
/* manera que guarde la posicion del primer campo erroneo.                   */
/*****************************************************************************/
/* Comprueba unicamente que los campos obligatorios no esten vacios. Ahora   */
/* miramos que el valor introducido sea valido.                              */
/* Mira los inputs:                                                          */
/*    Text:        comprueba que la longitud del valor sea mayor que 0       */
/*    Select:      comprueba que se haya seleccionado algo.                  */
/*    TextArea:    comprueba que la longitud del valor sea mayor que 0.      */
/*    RadioButton: comprueba que se haya seleccionado algun radioButton.     */
/*    CheckBox:    comprueba que se haya marcado el checkBox.                */
/*    Hidden:      comprueba que el campo hidden tenga valor.                */
/*****************************************************************************/
function checkVacio(frm, aC, aM, aT, sMensaje){

	for(ii=0;ii<aC.length;ii++) {
		//Miramos si el campo a analizar es un campo select o input
		
		switch (aT[ii]){
		
			case 0: //campo tipo text

			  if (eval("frm." + aC[ii] + ".value").length <= 0) {
					if ((iCheckOk == -1) || (iCheckOk == -2)) iCheckOk = ii
				  eval("frm." + aC[ii] + ".value = ''")
					sMensaje = sMensaje+"\n" + aM[ii]
				}

				break;

			case 1: //campo tipo select

				if (eval("frm."+aC[ii]+".selectedIndex==0")) {
					if ((iCheckOk == -1) || (iCheckOk == -2)) iCheckOk = ii
					sMensaje = sMensaje+"\n" + aM[ii]
				}

				break;

			case 2:	//campo tipo textarea

				if (eval("frm." + aC[ii] + ".value").length <= 0) {
					if ((iCheckOk == -1) || (iCheckOk == -2)) iCheckOk = ii
					eval("frm." + aC[ii] + ".value = ''")
					sMensaje = sMensaje+"\n"+aM[ii]
				}

				break;

			case 3: //campo tipo RadioButton

				rdbOk = 0;

				for (rdb = 0; rdb < eval("frm." + aC[ii] + ".length"); rdb++){

					if (eval("frm." + aC[ii] + "[" + rdb + "]" + ".checked")) {
						rdbOk = 1;
					}

				}

				if (rdbOk == 0) {

					if (iCheckOk == -1) iCheckOk = -2
					sMensaje = sMensaje+"\n" + aM[ii]

				}
				break;

			case 4: //campo tipo CheckBox

				chbxOk = 0;

				if (eval("frm." + aC[ii] + ".checked")) {
						chbxOk = 1;
					}

				if (chbxOk == 0) {

					if (iCheckOk == -1) iCheckOk = -2
					sMensaje = sMensaje+"\n" + aM[ii]

				}

				break;

			case 5: //campo tipo hidden

				chbxOk = 0;

				if (eval("frm." + aC[ii] + ".value").length > 0) {
						chbxOk = 1;
					}

				if (chbxOk == 0) {

					if (iCheckOk == -1) iCheckOk = -2
					sMensaje = sMensaje+"\n" + aM[ii]

				}

				break;

		}	

	}	

//alert(sMensaje)
	return (sMensaje)

}



/*****************************************************************************/
/* String checkValido(Form, String, String, String, String)                  */
/*****************************************************************************/
/* Recibe los arrays necesarios para la comprobacion y respuesta de posibles */
/* errores y devuelve una cadena con el mensaje de error.                    */
/* En caso de que haya un error se modifica la variable global iCheckOk de   */
/* manera que guarde la posicion del primer campo erroneo. Tambien vacia los */
/* campos en los que se ha detectado error.                                  */
/*****************************************************************************/
/* Los tipos de comprovaciones que se realizan son sobre:                    */
/*    Texto:  comprueba que no se ha rellenado con espacios vacios           */
/*    Numero: comprueba que el valor este formado por digitos.               */
/*    Email:  comprueba que el valor sea un Email valido                     */
/*    Fecha:  comprueba que el valor sea una fecha valida (por hacer)        */
/*    No comprobacion: para casos muy especiales ("a|b", ...)                */
/*****************************************************************************/

function checkValido(frm, aC, aM, aT, sMensaje){
  for(j=0;j<aC.length;j++) {


		switch (aT[j]){

			case 0: //mirar que no introduzca caracteres erroneos
				if ( ( !(isAlphaNum (eval ("frm." + aC[j] + ".value") ) )) && (eval("frm." + aC[j] + ".value.length > 0")) ) {
					if ((iCheckOk == -1) || (iCheckOk == -2)) iCheckOk = j
					sMensaje = sMensaje+"\n" + aM[j]
				}
				break;

			case 1: //mirar que el valor del campo sea un numero
				if ( (eval("(!(isNum(frm." + aC[j] + ".value)))")) && (eval("frm." + aC[j] + ".value.length > 0")) ) {
					if ((iCheckOk == -1) || (iCheckOk == -2)) iCheckOk = j
					sMensaje = sMensaje+"\n" + aM[j]
				}
				break;

			case 2:	//mirar que el valor del campo sea un email valido
				if ( (eval("(!(isMail(frm." + aC[j] + ".value)))")) && (eval("frm." + aC[j] + ".value.length > 0")) ) {
					if ((iCheckOk == -1) || (iCheckOk == -2)) iCheckOk = j
					sMensaje = sMensaje + "\n" + aM[j]
				}
				break;

			case 3:	//mirar que el valor del campo sea una fecha valida. No se trasforma el valor a un objeto Date.
				if ( (eval("(!(isDate(frm." + aC[j] + ".value)))")) && (eval("frm." + aC[j] + ".value.length > 0")) ) {
					if ((iCheckOk == -1) || (iCheckOk == -2)) iCheckOk = j
					sMensaje = sMensaje + "\n" + aM[j]
				}
				break;
      
      case 9: //no hacemos comprobacion de validez. Aparece por si acaso.
         break;      
		}	
	}	
	
	return (sMensaje)
}