/*----BLOQUE DE COMENTARIOS---------------------------------------------------------------------------------------------------
DESCRIPCIÓN: 	Evalúa un objeto formulario de múltiples características.
RECIBE: 		objForm como un objeto formulario del documento.
DEVUELVE: 		true, si todos los elementos del formulario son correctos. 
				false, en caso de existir un campo o más mal cumplimentado.
				En caso de existir un error, el script localiza un elemento del documento con id="ErrMsg" donde añade el 						         		mensaje de error detectado.
				
USO:			añadir en los elementos del formulario el atributo "class" con [opción] para indicar a la función qué formato 	 				se requiere:

					[opción]		:	Descripción
					"txtobl"		:	para input text obligatorio
					"chkobl"		:	para input checkbox obligatorio
					"rdbobl"		:	para input radio obligatorio
					"selobl"		:	para select no múltiples obligatorios
					"multobl"		:	para select múltiples obligatorios
					"IsNumber"		:	para confirmar caracteres numéricos enteros
					"isOnlyChars"	:	para confirmar que se ajusta a un patrón de caracteres
					"Email"			:	para confirmar que se trata de un e-mail
					"repeMail"		: 	para repetir el e-mail
					"NIF"			:	para confirmar que la cadena se ajusta al formato NIF
					"PassValid"		:	para contrastar el valor del password.
					"PassValid-Org" : 	para el original.
					"PassValid-Conf": 	para el de confirmación.
					"TamPwd"		:   para el tamaño del password.	
					"repePwd"		:	para confirmar el password.
					
AUTOR:			Alumnos CIFO La Violeta. byvioleta@gmail.com
FECHA:			Martes 13 de Abril de 2010.

----------------------------------------------------------------------------------------------------------------------------*/

var idObjErr;

function valida_form (objForm, idObj) {
	idObjErr=idObj;
	ShowErrorMsg (idObjErr,'');
	ResetStyle(objForm);
	for (i=0; i<=objForm.length-1; i++) { //recorre todos los elementos del formulario
		//--------------------txtobl---------------------------------------------------------------
		if (objForm.elements[i].className.indexOf('txtobl')!=-1) { //filtro para evaluar el input text
			objForm.elements[i].value = EliminaEspacios (objForm.elements[i].value); //asignamos al valor del elemento de i de  			la variable ojbForm la función EliminaEspacios para que elimine los espacios en blanco antes de escribir ningún  		 			valor.
			if (objForm.elements[i].value=='') {
				ShowErrorMsg (idObjErr,'Campo obligatorio');
				objForm.elements[i].focus();
				objForm.elements[i].style.backgroundColor='#ffff00';
				return false;
			}
		}
		//---------------------chkobl--------------------------------------------------------------
		if (objForm.elements[i].className.indexOf('chkobl')!=-1) {  //filtro para evaluar el input checkbox
			if (objForm.elements[i].checked!==true) {
				ShowErrorMsg (idObjErr, 'Debe aceptar las condiciones');
				objForm.elements[i].focus();
				objForm.elements[i].style.border='1px solid #ffff77';
				return false;
			}
		}
		//---------------------rdbobl---------------------------------------------------------------
		if (objForm.elements[i].className.indexOf('rdbobl')!=-1) {  //filtro para evaluar el input radio
			if (!checkRadio(objForm.elements[i])) {	//si NO checkRadio de los elementos [i] de objForms
				ShowErrorMsg (idObjErr,'Campo radio obligatorio');
				objForm.elements[i].focus();
				objForm.elements[i].style.border='1px solid #ffff77';
				return false;
			}
		}
		//--------------------selobl (select no múltiples obligatorios)-----------------------------
		if (objForm.elements[i].className.indexOf('selobl')!=-1) {
			if (objForm.elements[i].selectedIndex==0) {
				ShowErrorMsg (idObjErr, 'Campo select obligatorio');
				objForm.elements[i].focus();
				objForm.elements[i].style.backgroundColor='#FFFF77';
				objForm.elements[i].style.border='1px solid #ffff77';
				return false;
			}
		}
		//-------------------multobl (select múltiples obligatorios)--------------------------------
		if (objForm.elements[i].className.indexOf('multobl')!=-1) {
			if (objForm.elements[i].selectedindex==-1) { //-1 indica que no hay selección efectuada.
				ShowErrorMsg (idObjErr, 'Campo select múltiple obligatorio');
				objForm.elements[i].focus();
				objForm.elements[i].style.backgroundColor='#FFFF77';
				objForm.elements[i].style.border='1px solid #ffff77';
				return false;
			}
		}
		//--------------------- IsNumber----------------------------
		if(objForm.elements[i].className.indexOf('IsNumber')!=-1){
			//Elimina espacios
			objForm.elements[i].value=EliminaEspacios(objForm.elements[i].value);
			if(!IsNumber(objForm.elements[i].value)){ // Campo número
			 //tratamiento de Error
			  ShowErrorMsg(idObjErr,'El dato no es correcto. Requiere un numero');
			  objForm.elements[i].focus();
			  objForm.elements[i].style.backgroundColor='#FFFF77';
			  return false;
			}
		}
		//------------------isOnlyChars-------------------------------------------------------------
		if (objForm.elements[i].className.indexOf('isOnlyChars')!=-1) {
			//Elimina espacios
			objForm.elements[i].value=EliminaEspacios(objForm.elements[i].value);
			if (!isOnlyChars (objForm.elements[i].value)) {
			// campo solo caracteres normales
				//tratamiento de Error
				objForm.elements[i].focus();
				objForm.elements[i].style.backgroundColor='#FFFF77';
				ShowErrorMsg(idObjErr,'El campo no es correcto. Requiere sólo caracteres');
				return false;
			}
		}
		//---------------------Email---------------------------------------------------------------
		if (objForm.elements[i].className.indexOf('Email')!=-1) {
			//Eliminar espacios:
			objForm.elements[i].value = EliminaEspacios (objForm.elements[i].value);
			if (!ParseEmail (objForm.elements[i].value)) {
				//tratamiento del error:
				ShowErrorMsg (idObjErr, 'Se requiere una dirección de correo');
				objForm.elements[i].focus();
				objForm.elements[i].style.backgroundColor='#ffff00';
				return false;
			}
		}
		//--------------------repeMail-------------------------------------------------------------
		if (objForm.elements[i].className.indexOf('repeMail')!=-1) {
			var email_orig = document.getElementById("email");
            var email_repe = document.getElementById("email_conf");
			if (email_orig.value != email_repe.value){
				ShowErrorMsg (idObjErr, 'El e-mail no coincide');
				objForm.elements[i].focus();
				objForm.elements[i].style.backgroundColor='#ffff00';
				return false;		
			}
		}
		//--------------------NIF------------------------------------------------------------------
		if (objForm.elements[i].className.indexOf('NIF')!=-1) {
			//Eliminar espacios:
			objForm.elements[i].value = EliminaEspacios (objForm.elements[i].value);
			if (!ParseNIF(objForm.elements[i].value)==false) {
				//tratamiento del error:
				ShowErrorMsg (idObjErr, 'El dato no es correcto. Se requiere un NIF');
				objForm.elements[i].focus();
				objForm.elements[i].style.backgroundColor='#ffff00';
				return false;
			}
		}
		//--------------------PassValid------------------------------------------------------------
		if (objForm.elements[i].className.indexOf('PassValid')!=-1) { //si está presente la cadena PassValid en el class del input...
			var arrPasswords = new Array();
			for (k=0; k<=objForm.length-1; k++) {
				if (objForm.elements[k].className.indexOf('PassValid')!=-1) {  //¿puede que sea PassValid-Org?
					arrPasswords.push(objForm.elements[k].value);
				}
			}
			var iguales = true;
			for (k=0; k<=arrPasswords.length-1; k++) {
				if (arrPasswords[0] !=arrPasswords[j]) {iguales = false;}
			}
			if (!iguales) {
				for(k=0;k<=objForm.length-1;k++){
					if(objForm.elements[k].className.indexOf('PassValid-Conf')!=-1){
						objForm.elements[k].focus();
						objForm.elements[k].value='';
						objForm.elements[k].style.backgroundColor='#FFFF00';					
					}
				}
				ShowErrorMsg(idObjErr,'Contraseñas no coinciden');
				return false;
			}
		}
		// --------------- Fin PassValid ---------------------
		
		// --------------- TamPwd ----------------------------
		if (objForm.elements[i].className.indexOf('TamPwd')!=-1) {
			if(objForm.elements[i].value.length<6){
				ShowErrorMsg (idObjErr, 'Al menos 6 caracteres');
				objForm.elements[i].focus();
				objForm.elements[i].value='';
				objForm.elements[i].style.backgroundColor='#ffff00';
				return false;	
			}
			if(objForm.elements[i].value.length>20){
				ShowErrorMsg (idObjErr, 'Máximo de 20 caracteres');
				objForm.elements[i].focus();
				objForm.elements[i].value='';
				objForm.elements[i].style.backgroundColor='#ffff00';
				return false;	
			}		
		}
		// -------------fin TamPwd----------------------------
		
		//------------------- repePwd-----------------------
		if (objForm.elements[i].className.indexOf('repePwd')!=-1) {
			var pwd_orig = document.getElementById("contrasena");
            var pwd_repe = document.getElementById("conf_password");
			if (pwd_orig.value != pwd_repe.value){
				ShowErrorMsg (idObjErr, 'La contraseña no coincide');
				objForm.elements[i].focus();
				objForm.elements[i].value='';
				objForm.elements[i].style.backgroundColor='#ffff00';
				return false;	
			}
			//Eliminar espacios:
			//objForm.elements[i].value = EliminaEspacios(objForm.elements[i].value);	
		}
		//----------------fin repePwd-----------------------
		
		//------------------- repePwd_bis-----------------------
		if (objForm.elements[i].className.indexOf('repePwd_bis')!=-1) {
			var pwd_orig_bis = document.getElementById("new_contrasena");
            var pwd_repe_bis = document.getElementById("conf_new_contrasena");
			if (pwd_orig_bis.value != pwd_repe_bis.value){
				ShowErrorMsg (idObjErr, 'La contraseña no coincide');
				objForm.elements[i].focus();
				objForm.elements[i].value='';
				objForm.elements[i].style.backgroundColor='#ffff00';
				return false;	
			}
		}
		//----------------fin repePwd_bis-----------------------
	} 
	
	//ShowErrorMsg(idObjErr,'Todo Ok');
	return true; 			// todo bien, sigue adelante el evento Submit*/
	//return false; 		// en modo test, no interesa que siga con el Submit
}

/* ------------ ResetStyle(objForm) ---------------------------------------
Descripcion:  Aplica una llamada a la funcion SetClass a todos los elementos del formulario
			  Para los eventos onKeyPress y evento onChange.	
Recibe: 	  Objeto formulario que se esta validando
Devuelve: 	  añade llamada a la funcion SetClass sobre los eventos.	
---------------------------------------------------------------------------*/
function ResetStyle(objFormulario){
	for(e=0;e<=objFormulario.length-1;e++){
		objFormulario.elements[e].onkeypress=SetClass;
		objFormulario.elements[e].onchange=SetClass;
	}
}

function SetClass(){
	switch(this.tagName){
		case 'INPUT' :
			this.style.backgroundColor='#FFFFFF';
			break;
		case 'SELECT' :
			this.style.backgroundColor='#FFFFFF';
			this.style.border='1px solid #000000';
			break;
		case 'TEXTAREA' :
			this.style.backgroundColor='#FFFFFF';
			break;
	}
	ShowErrorMsg(idObjErr,'');
}
/*------------- AddErrIcon() ----------------------------------------------
Descripcion: 	Añade un Elemento img con el atributo src al contenedor 	
				inmediatamente a continuacion al elemento de formulario
Recibe: 		objeto inmediatamente hermano del input String con el src
				de la imagen
Devuelve: 		Interactua en el document directamente sobre el elemento 
---------------------------------------------------------------------------*/

function AddErrIcon(obj,src){
	if(src!=''){
		var objImg= document.createElement('img');
		objImg.setAttribute('src',src);
		obj.appendChild(objImg); 
	}else{
		while(obj.firstChild){
			obj.removeChild(obj.firstChild);
		}
	}
}

/*------------- ShowErrorMsg() ---------------------------------
Descripcion: Añade un Elemento label con el texto "Msg" al contenedor con		
			id=ErrMsg 
Recibe: 	String con el mensaje de Error a mostar
Devuelve: 	Interactua en el document directamente sobre el elemento .
------------------------------------------------------------------*/
function ShowErrorMsg(idObjErr,Msg){
	/*//versión 1ª, NO W3C especifications
	var obje = document.getElementById ('ErrMsg');
	obj.innerHTML = msg; 
	*/
	//versión 2ª, W3C especifications
	var obj = document.getElementById (idObjErr);
	obj.style.color = 'red'; 	//añadir cuantas opciones de estilo queramos para personalizarlo.
	while (obj.firstChild) {  	//eliminar todos los hijos.
		obj.removeChild (obj.firstChild); //borrar contenido del primer hijo (primer subelemento del elemento)
	}
	var objText = document.createTextNode(Msg);  //método createTextNode permite crear texto.
	var objLabel = document.createElement('label');
	objLabel.appendChild (objText);
	obj.appendChild (objLabel);
}

/*---------------------------- EliminaEspacios() ----------------------------	
Descripcion: Elimina caracteres espacios de delante , detrás y los 
			repetidos dentro de una cadena String. 
Recibe: 	Cadena como un String c.
Devuelve: 	Cadena como un String sin los caracteres en blanco .
-----------------------------------------------------------------------------*/
function EliminaEspacios(Cadena){
	while(Cadena.charAt(0)==' '){
	 // Eliminar los Caracteres del principio
		Cadena=Cadena.substring(1,Cadena.length);
	}
	while(Cadena.charAt(Cadena.length-1)==' '){ 
	// Eleminar caracteres del final
		Cadena=Cadena.substring(0,Cadena.length-1);
	}
	for(pos=0;pos<=Cadena.length-1;pos++){
	 //Recorer cadena desde pos=0 hasta pos=length-1 
		while(Cadena.charAt(pos)==" " && Cadena.charAt(pos+1)==" "){ 
		// mientras posicion actual y la siguiente son espacio en blanco pues...
			//Cortamos de pos=0 de Cadena hasta caracter en posicion 'pos' sin incluir este
			var parteA=Cadena.substring(0,pos); 
			// Cortamos des de caractes en pos+1 hasta el final de cadena.
			var parteB=Cadena.substring(pos+1);
			// Unimos las dos partes en una y volvemos a ponerlo en variable Cadena.
			Cadena=parteA+parteB;
		}
	}
	return Cadena;
}

//----------------------------------------------Check Radio-------------------------------------------------
//DESCRIPCIÓN: 	valida que al menos un radio esté validado.
//RECIBE: 		un objeto radio del formulario.
//DEVUELVE: 	true si hay alguno checked, si no false.
//----------------------------------------------------------------------------------------------------------

function checkRadio (objRadio){
	var arrayObj = document.getElementsByName (objRadio.name); //localizamos todos los objetos con el name objRadio y lo 		 	cargamos en una array.
	for (pos=0; pos<=arrayObj.length-1; pos++){ //el bucle for recorre las posiciones (pos) de la array
		if (arrayObj[pos].checked==true) {
			return true;
		}
	}
	return false;
}

/* ----------------- IsNumber--------------------------
Descripcion: Detecta de una cadena los caracteres del 0 al 9
Recibe: 	Un String en la variables local Cadena.
Devuelve: 	true si detecta solo numeros sino false
------------------------------------------------------------*/
function IsNumber(Cadena){
	for(pos=0;pos<=Cadena.length-1;pos++){ 
	//Recorer cadena desde pos=0 hasta pos=length-1 
		if(isNaN(Cadena.charAt(pos)) || Cadena.charAt(pos)==" "){
		// si isNaN nos devuelve false (es un numero) 
		//y lo negamos tenemos true
			return false;
		}
	}
	return true; //Devolvemos true si sólo hay números
}

/* ---------------- isOnlyChars -----------------------------
Descripcion: Detecta en una cadena los caracteres que no estén en el 
			alfabeto tradicional
Recibe: 	Un String en la variables local Cadena.
Devuelve: 	true si solo hay caracteres normales sino false.
---------------------------------------------------------------*/
function isOnlyChars(Cadena){
//Esta variable contiene todos los caracteres que consideramos normales 
// OJO!!!! tiene que  contener un ESPACIO en BLANCO sino tb los elimina!!
	var Caracter="aáàbcdeéèfghiíìïjklmnoóòpqrstuúùüvwxyzñçª- ";
	Cadena=Cadena.toLowerCase();
	for(pos=0;pos<=Cadena.length-1;pos++){ 
	//Recorer cadena desde pos=0 hasta pos=length-1 
		if(Caracter.indexOf(Cadena.charAt(pos))==-1){ 
		//Si indexOf devuelve -1 es que no esta el caracter 
		//dentro de 'CaracterNormal' por tanto...
			return false;
		}
	}
	return true; //Devolvemos  true
}

/*---------------------------- ParseEmail() -------------------
Descripcion: Evalua el formato de una cadena String en cuanto 
			a si es una Dir. Correo. 
Recibe: 	Cadena como un String 
Devuelve: 	true si Cadena es direccion de Correo.
			false en caso de no tener formato adecuado.
--------------------------------------------------------------*/
function ParseEmail(Cadena){
	if(Cadena=='') return true;
	//Detectar un solo @
	 // si no coincide es que hay mas de un @
	if(Cadena.indexOf('@')!=Cadena.lastIndexOf('@') ) {return false; }
	// si no hay ningun @
	if(Cadena.indexOf('@')==-1) { return false; } 
	//Detectar caracter @ al principio
	if(Cadena.indexOf('@')==0) return false;
	//Detectar carac. @ y punto seguidos
	var posArroba=Cadena.indexOf('@');
	var caracterSiguiente=Cadena.charAt(posArroba+1);
	if(caracterSiguiente=='.') return false;
	//Detectar Sufijo DNS valido
		// Extraer Sufijo DNS de Cadena.
	var sufijo= Cadena.substr(Cadena.lastIndexOf('.')+1); 
	var Encontrado=false; 
	// Lista de sufijos aceptados....a ampliar.
	var arraySufijos= new Array('es','com','org','cat','net', 'tv', 'fr', 'it', 'eu');
	for(k=0;k<=arraySufijos.length-1;k++){ 
		// Recorremos el Array de sufijo que creamos anteriormente
		// si el sufijo esta en el Array entonces... si que es bueno
		if(arraySufijos[k]==sufijo){Encontrado=true; } 
	}
	// Si al final resulta que NO ha sido encontrado mal!!!
	if(!Encontrado){ return false;} 
	//Detectar caracteres no validos.
	var CaracteresValidos='abcdefghijklmnopqrstuvwxyz0123456789@_-.'; 		
	//Preparamos un String de caracteres validos
	for(j=0;j<=Cadena.length-1;j++){ 
		// recorremos cadena y buscamos caracter por 
		//caracter si se encuentra dentro del String.
		if(CaracteresValidos.indexOf(Cadena.charAt(j))==-1){ 
			// si no esta es que sera un caracter no valido
			return false;
		}
	}
	return true;
}

/*--------------- ParseNIF --------------------------------------
Nombre: ParseNIF.
Recibe: cadena texto. por ejemplo un campo de texto de formulario.
Devuelve: true si cadena es un NIF valido, sino false. 
---------------------------------------------------------------*/
function ParseNIF(cadena){
	var Clave=new Array("T","R","W","A","G","M","Y","F","P","D","X","B"
			 ,"N","J","Z","S","Q","V","H","L","C","K","E","T");
	var PrimerDigito=cadena.substr(0,1).toUpperCase();
	var UltimoDigito=cadena.substr(cadena.length-1).toUpperCase();
	if (!isNaN(PrimerDigito)){
		Numeros=cadena.substr(0,8).toUpperCase();
	}else{
		switch (PrimerDigito) { 
			case "K": case "L": case "M": case "X":	case "Y": 
				Numeros=cadena.substr(1,7);
				break;
			default: return false;
		}
    }
	if (isNaN(Numeros)){
		return false;
	}else{
		Letra=Clave[Numeros%23];
		if(Letra==UltimoDigito){
			return true;
		}else{
			return false;
		}
	}
}

