/*---------------------------- valida_form() -------------------------------------------------------
	Descripcion: 	Evalua Un objeto Formulario de multiples caracteristicas 
	Recibe: 		objForm como objeto Formulario 
	Devuelve: 		true si todos los elementos del formulario estan correctos.
					false en caso existir alguno errorneo.
					En el caso de existir un error el Script localiza un elemento del document con
					id="ErrMsg" donde a�adir� el mensaje de error detectado.
					
	Uso: 			A�adir en los elementos del formulario el atributo "class" con [opcion] 
					para que el script 	reconozca que formato de requiere.
					
					[opcion] 		: 	Descripcion
					
					"txtobl" 		: 	Para inputs text obligatorios.
					"radobl"		:	Para inputs radio obligatorios.
					"chkobl"		:	Para inputs ckeckbox obligatorios.
					"selobl"		:	Para select no multiples obligatorios.
					"multobl"		:	Para select multiples obligatorios.
					"Email" 		:	Para inputs text con formato de Email.
					"IsNumber"		:	Para inputs text con formato numero entero.
					"IsOnlyChars" 	: 	Para inputs text con formato solo caracteres.
					"NIF"			:   Para inputs text con formato de NIF.
					
	
	Autor:			Alumnos del CIFO Violeta (cifoleta@gmail.com).
					Curso Admininstrador de Servidores y paginas Web.
	Fecha:			4 nov 2009
-----------------------------------------------------------------------------------------------------*/
function valida_form(objForm){
	ShowErrorMsg('');
	for(i=0;i<=objForm.length-1;i++){
		if(objForm.elements[i].className.indexOf('txtobl')!=-1){
			objForm.elements[i].value=EliminaEspacios(objForm.elements[i].value);
			if(objForm.elements[i].value==''){ // Cadena Vacia
				//tratamiento de Error
				objForm.elements[i].focus();
				objForm.elements[i].style.backgroundColor='#FE681C';
				ShowErrorMsg('All the fields are mandatory');
				return false;
			}
		}
		// proba de control de longitud para los digitos de la cuenta
		if(objForm.elements[i].className.indexOf('length')!=-1){
			var nbclass = objForm.elements[i].className;
			var lengthclass = nbclass.length;
			var longitud = nbclass.charAt(lengthclass-1);
			switch(longitud){
				case '4': var longitudFinal = '4'; break;
				case '2': var longitudFinal = '2'; break;
				case '0': var longitudFinal = '10'; break;
				}
			/*alert (longitudFinal);*/
			if(objForm.elements[i].value.length < longitudFinal){ // Cadena Vacia
				//tratamiento de Error
				objForm.elements[i].focus();
				objForm.elements[i].style.backgroundColor='#FE681C';
				ShowErrorMsg(' !OJO! Debe poner '+longitudFinal+' digitos');
				return false;
			}
		}
		// Si esta checkeado el checkbox de "Con una aportaci�n de" entonces se mira a ver si se ha rellenado el input text de importe
		if(objForm.elements[i].className.indexOf('aport_X')!=-1){
			var objId = document.getElementById('aport_X');
			if (objId.checked==true){
				objForm.elements[i].value=EliminaEspacios(objForm.elements[i].value);
				if(objForm.elements[i].value==''){ // Cadena Vacia
					//tratamiento de Error
					objForm.elements[i].focus();
					objForm.elements[i].style.backgroundColor='#FE681C';
					ShowErrorMsg(' !OJO! Debe especificar un importe');
					return false;
				}
			}
		}
		// Si esta checkeado el checkbox de "Con una donación de" entonces se mira a ver si se ha rellenado el input text de importe
		if(objForm.elements[i].className.indexOf('aport_donacion')!=-1){
			var objId = document.getElementById('aport_donacion');
			if (objId.checked==true){
				objForm.elements[i].value=EliminaEspacios(objForm.elements[i].value);
				if(objForm.elements[i].value==''){ // Cadena Vacia
					//tratamiento de Error
					objForm.elements[i].focus();
					objForm.elements[i].style.backgroundColor='#FE681C';
					ShowErrorMsg(' !OJO! Debe especificar un importe');
					return false;
				}
			}
		}
		if(objForm.elements[i].className.indexOf('Email')!=-1){
			objForm.elements[i].value=objForm.elements[i].value.toLowerCase(); //Conv. a caraceters min.
			if(!ParseEmail(objForm.elements[i].value)){ // Direccion de Correo
				//tratamiento de Error
				objForm.elements[i].focus();
				objForm.elements[i].style.backgroundColor='#FE681C';
				ShowErrorMsg('Your email address is not valid');
				return false;
			}
		}
		// nif
		if(objForm.elements[i].className.indexOf('nif')!=-1){
			if(!ParseNIF(objForm.elements[i].value)){ // campo solo caracteres normales
				//tratamiento de Error
				objForm.elements[i].focus();
				objForm.elements[i].style.backgroundColor='#FE681C';
				ShowErrorMsg(' !OJO! El documento nacional no es valido');
				return false;
			}
		}		
		if(objForm.elements[i].className.indexOf('IsNumber')!=-1){
			objForm.elements[i].value=EliminaEspacios(objForm.elements[i].value);//Elimina espacios
			if(!IsNumber(objForm.elements[i].value)){ // Campo numero
				//tratamiento de Error
				objForm.elements[i].focus();
				objForm.elements[i].style.backgroundColor='#FE681C';
				ShowErrorMsg('This field should be numeric');
				return false;
			}
		}
		if(objForm.elements[i].className.indexOf('IsOnlyChars')!=-1){
			objForm.elements[i].value=EliminaEspacios(objForm.elements[i].value);//Elimina espacios
			if(!IsOnlyChars(objForm.elements[i].value)){ // campo solo caracteres normales
				//tratamiento de Error
				objForm.elements[i].focus();
				objForm.elements[i].style.backgroundColor='#FE681C';
				ShowErrorMsg('This field is incorrect');
				return false;
			}
		}
		if(objForm.elements[i].className.indexOf('radobl')!=-1){
			if(!CheckRadio(objForm.elements[i])){ // objeto Radio
				//tratamiento de Error
				objForm.elements[i].focus();
				objForm.elements[i].style.backgroundColor='#FE681C';
				ShowErrorMsg(' !OJO! El campo no es correcto. Requiere una repuesta');
				return false;
			}
		}
		if(objForm.elements[i].className.indexOf('chkobl')!=-1){
			if(objForm.elements[i].checked!=true){ // objeto checkBox

				//tratamiento de Error
				objForm.elements[i].focus();
				objForm.elements[i].style.backgroundColor='#FE681C';
				ShowErrorMsg(' !OJO! El campo no es correcto. Requiere estar seleccionado');
				return false;
			}
		}
		if(objForm.elements[i].className.indexOf('selobl')!=-1){
			if(objForm.elements[i].options[0].selected==true){ // objeto select no multiple con 1� option nula
				//tratamiento de Error
				objForm.elements[i].focus();
				objForm.elements[i].style.backgroundColor='#FE681C';
				ShowErrorMsg(' !OJO! El campo no es correcto. Requiere una seleccion');
				return false;
			}
		}
		if(objForm.elements[i].className.indexOf('multobl')!=-1){
			if(!SelectedMultiple(objForm.elements[i])){ // objeto select  multiple 
				//tratamiento de Error
				objForm.elements[i].style.backgroundColor='#FE681C';
				ShowErrorMsg(' !OJO! El campo no es correcto. Requiere como minimo una seleccion');
				return false;
			}
		}	
	}
	return true;
}



/*---------------------------- ShowErrorMsg() ---------------------------------------------
	Descripcion: A�ade un Elemento label con el texto "Msg" al contenedor con id=ErrorMsg 
	Recibe: String con el mensaje de Error a mostar
	Devuelve: Interactua en el document directamente sobre el elemento .
-----------------------------------------------------------------------------------------*/
function ShowErrorMsg(Msg){
	//version W3C especifications
	var obj=document.getElementById('ErrorMsg');
	obj.style.color='#FE681C';
	obj.style.fontSize='12px';
	obj.style.fontWeight='bold';
	while(obj.firstChild){
		obj.removeChild(obj.firstChild);
	}
	var objText= document.createTextNode(Msg);
	var objLabel= document.createElement('label');
	objLabel.appendChild(objText);
	obj.appendChild(objLabel); 
}
/*---------------------------- EliminaEspacios() ---------------------------------------
	Descripcion: Elimina caracteres espacios de delante , detras 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...
			var parteA=Cadena.substring(0,pos); //Cortamos de pos=0 de Cadena hasta caracter en posicion 'pos' sin incluir este
			var parteB=Cadena.substring(pos+1); // Cortamos des de caractes en pos+1 hasta el final de cadena.
			Cadena=parteA+parteB; // Unimos las dos partes en una y volvemos a ponerlo en variable Cadena.
		}
	}
	return Cadena;
}
/*---------------------------- 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 @
	if(   Cadena.indexOf('@')!=Cadena.lastIndexOf('@') ) {return false; } // si no coincide es que hay mas de un @
	if(Cadena.indexOf('@')==-1) { return false; } // si no hay ningun @
	//Detectar Sufijo DNS valido
	var sufijo= Cadena.substr(Cadena.lastIndexOf('.')+1); // Extraer Sufijo DNS de Cadena.
	var Encontrado=false; // Variable temporal para discernir despues si se ha encontrado el sufijo
	var arraySufijos= new Array('es','com','org','cat','net'); // Lista de sufijos aceptados....a ampliar.
	for(k=0;k<=arraySufijos.length-1;k++){ // REcorremos el Array de sufijo que creamos anteriormente
		if(arraySufijos[k]==sufijo){Encontrado=true; } // si el sufijo esta en el Array entonces... si que es bueno
	}
	if(!Encontrado){ return false;} // Si al final resulta que NO ha sido encontrado mal!!!
	//Detectar caracteres no validos.
	var Caracteres='abcdefghijklmnopqrstuvwxyz0123456789@_-.'; //Preparamos un String de caracteres validos
	for(j=0;j<=Cadena.length-1;j++){ // recorremos cadena i buscamos caracter por caracter si se encuentra dentro del String.
		if(Caracteres.indexOf(Cadena.charAt(j))==-1){ // si no esta es que sera un caracter no valido
			return false;
		}
	}
	return true;
}
/* -------------------------- 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 solo hay numeros
}
/* ---- -------------------- IsOnlyChars ----------------------------------------------
** Descripcion: Detecta en una cadena los caracteres que no esten 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 loa caracteres que consideramos normales 
	// OJO!!!! tiene que  contener un ESPACIO en BLANCO sino tb los elimina!!!!!!!
	var Caracter="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\u00C1\u00E1\u00C9\u00E9\u00CD\u00ED\u00D3\u00F3\u00DA\u00FA\u00DC\u00FC\u00D1\u00F1 ";
	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
}
/*--------------- CheckRadio -----------------------------------------------------------
** Descripcion: Validar preguntas obligatorias con radio
** Recibe: objeto radio de un formulario
	 por ejemplo un campo de radio de formulario que pida el sexo.
** Devuelve: true si hay alguno que se encuentra checked, sino false. 
---------------------------------------------------------------------------------------*/
function CheckRadio(objRadio){
	var arrayObj=document.getElementsByName(objRadio.name);
	for(pos=0;pos<=arrayObj.length-1;pos++){
		if(arrayObj[pos].checked==true){
			return true; 
		}
	}
	return false;
}
/*--------------- SelectedMultiple -----------------------------------------------------
** Descripcion: Validar un select multiple si tiene alguna option selected
** Recibe: objeto select de un formulario.
** Devuelve: true si hay alguno que se encuentra selected, sino false. 
----------------------------------------------------------------------------------------*/
function SelectedMultiple(objSelectM){
	for(pos=0;pos<=objSelectM.length-1;pos++){
		if(objSelectM.options[pos].selected==true){
			return true;
		}
	}
	return false;
}
/*--------------- MaxCaracteres -----------------------------------------------------
** Descripcion: Limita el numero maximo de caracteres de un textarea o input.
** Recibe: objeto de un formulario como input o textarea en objHTML.
** Devuelve: true si no se ha superadoel limite de caracteres, sino false. 
----------------------------------------------------------------------------------------*/
function MaxCaracteres(objEvent,objHTML){
	if(objHTML.value.length>160){
		if(objEvent.keyCode==8 || objEvent.keyCode==46 ){
			return true;
		}else{
			return false;
		}
	}
	if(objEvent.ctrlKey) {
		return false;
	}
	
	if(objEvent.button==2){
		alert(objEvent.button);
		return false;
	}
	return true;
}
/*---------------------------- anabled() ---------------------------------------
	Descripcion:  anabled - disabled input que recibe NIF o NIE
	Recibe: value del select
	Devuelve: 	
----------------------------------------------------------------------------------------*/
function anabled(selectNIF){
	// ACTIVAR DESCATIVAR INPUT RECIBIENDO LA CADENA DEL DOCUMENTO DE IDENTIDAD
	if (document.getElementById('selectNIF').value=='...'){
		document.getElementById('documentoNacional').disabled=true;
	} else {
		document.getElementById('documentoNacional').disabled=false;
		document.getElementById('documentoNacional').focus() ;
	}
}
/*---------------------------- ParseNIF() ---------------------------------------
	Descripcion:  valida si NIF o NIE
	Recibe: cadena NIF o NIE
	Devuelve: True si formato correcto - false si no	
----------------------------------------------------------------------------------------*/
function ParseNIF(nif){
ShowErrorMsg('');
// /////////////////////////////////////////////
//  CALCULAR NIF
/////////////////////////////////////////////////
if (document.getElementById('selectNIF').value=='nif'){
	// VALIDAR FORMATO 8 NUM + LETRA
	// RECORRER LA CADERNA HASTA LA OCTAVA POSICI�N (nif.length-2) PARA VER SI SON NUMEROS
	for(pos=0;pos<=nif.length-2;pos++){ //Recorer cadena desde pos=0 hasta pos=length-2
		if(isNaN(nif.charAt(pos)) || nif.charAt(pos)==" "){// si isNaN nos devuelve false (es un numero) y lo negamos tenemos true
			return false;
		}
	}
	// CORROBORAR QUE LA ULTIMA POSICI�N SEA UN CARACTER
	var pos = nif.length;
	var letra = nif.charAt(pos-1);	
	if(isNaN(letra)==false){
		return false;
	}
	// CALCULAR LA LETRA DEL NIF
	var cadenaNum = nif.slice(0,8);
	var resultUno = cadenaNum/23;
	var resultUnoStr = resultUno.toString();
	//alert(resultUno);
	var corteDecimal = resultUnoStr.indexOf('.');
	var entero = resultUnoStr.slice(0,corteDecimal);
	var resultDos = entero*23;
	var resultFinal = cadenaNum - resultDos;
	var LetrasNIE ='TRWAGMYFPDXBNJZSQVHLCKE';
	var letraFinal = LetrasNIE.charAt(resultFinal);
	if (letraFinal != letra){
		return false;
	}
	return true;
} //fin if (document.getElementById('selectNIF').value=='nif'){ 
// /////////////////////////////////////////////
//  CALCULAR NIE
/////////////////////////////////////////////////
else if (document.getElementById('selectNIF').value=='nie'){
	// VALIDAR FORMATO LETRA + 7 NUM + LETRA
	// CORROBORAR QUE LA PRIMERA POSICI�N SEA LETRA Y QUE ADEM�S SEA DEL TIPO "X" O "Y"
	var primeraLetra = nif.charAt(0);
	if ((primeraLetra != 'X') && (primeraLetra != 'Y')){		
		return false;
	}
	// RECORRER LA CADERNA DESDE LA SEGUNDA POSICION HASTA LA PENULTIMA (nif.length-2) PARA VER SI SON NUMEROS
	for(pos=1;pos<=nif.length-2;pos++){ //Recorer cadena desde pos=0 hasta pos=length-2
		if(isNaN(nif.charAt(pos)) || nif.charAt(pos)==" "){// si isNaN nos devuelve false (es un numero) y lo negamos tenemos true
			return false;
		}
	}
// CORROBORAR QUE LA ULTIMA POSICI�N SEA UN CARACTER
	var pos = nif.length;
	var letra = nif.charAt(pos-1);	
	if(isNaN(letra)==false){
		return false;
	}
	// CALCULAR LA LETRA DEL NIE
	var cadenaNum = nif.slice(1,8);
	var resultUno = cadenaNum/23;
	var resultUnoStr = resultUno.toString();
	var corteDecimal = resultUnoStr.indexOf('.');
	var entero = resultUnoStr.slice(0,corteDecimal);
	var resultDos = entero*23;
	var resultFinal = cadenaNum - resultDos;
	var LetrasNIE ='TRWAGMYFPDXBNJZSQVHLCKE';
	var letraFinal = LetrasNIE.charAt(resultFinal);
	if (letraFinal != letra){
		return false;
	}			
	return true;
} // fin else if
return true;
} // fin function
