/* Validaciķ de formularis. (c) Inforber 2002
>> Conveni noms dels camps utilitzats en els formularis WEB: <<

Camps requerits: 				"r_" devant
_______________________________________________
Camp de cerca					camp_cerca
Tiups de cerca					tip_cerc
Apartats generals				id_gen
Agrupaciķ						agrupacio
Noms usuaris, entitats			nom
Sectors							sectors
CIF								c_i_f
NIF								n_i_f
Persona de contacte				contacte
Activitat						activitat
e-mail							e_mail
Adreįa WEB						adre_web
Telčfon							telefon
Fax								fax
Codi Postal						c_p
Poblaciķ						poblacio
Adreįa postal					adreca
Autoritzaciķ directori			aut_dir
Autoritzaciķ rebre dades		aut_inf
Ocupaciķ de l'usuari			ocupacio
Data							data
_______________________________________________
*/ 
function valida(formulari)
{
// Crea les variables amb els missatges de resposta per l'error
	 
	 var Err00 = "El camp és obligatori";
	 var Err01 = "Si us plau: \nentreu un valor vālid per al camp de text ";
	 var Err02 = "Si us plau: \nentreu un valor vālid per al e-mail";
	 var Err03 = "Si us plau: \nseleccioneu un valor del menú desplegable ";
	 var Err04 = "Si us plau: \nseleccioneu una casella del camp ";
	 var Err05 = "Si us plau: \nentreu un valor vālid per al NIF: \n8 números + lletra majúscula";
	 var Err06 = "Si us plau: \nentreu un valor vālid per al CIF: \nlletra majúscula + 8 números o \nlletra majúscula + 7 números + lletra";
	 var Err07 = "Si us plau: \nentreu un valor vālid per al telčfon";
  	 var Err08 = "Si us plau: \nentreu un valor vālid per al FAX";
	 var Err09 = "Si us plau: \nentreu un valor vālid per al Codi Postal";
	 var Err10 = "Si us plau: \nentreu un valor vālid per a l'adreįa WEB: \n http:// + direcciķ correcta"; 
	 var Err11 = "Si us plau: \nentreu un valor vālid per a l'edat";
	 var Err12 = "Si us plau: \nentreu un valor vālid per a la data";
	 
// Repassa la matriu dels elements de formulari
//	 alert(formulari.elements.length)
	 num_elem = formulari.elements.length;
	 elem_form = new Array(num_elem);
	 valor_form = new Array(num_elem);
	 for (x = 0; x < num_elem; x++)
	 {
	 	var nom = formulari.elements[x].name;
		// alert("Valor de la x:\n" + x);
		// alert("nom del control:\n" + nom);
		var tipus = formulari.elements[x].type;
		switch(tipus)
		{
		case "select-one" :
			var valor = formulari.elements[x].options[formulari.elements[x].selectedIndex].value;
			break;
		default :
			valor = formulari.elements[x].value;
		}
		//número de carācters inclosos
		var num_valor = valor.length;
		if (nom.charAt(0) == "r")
		{
	//		alert("Camp requerit");
	//		alert(tipus);
			switch(tipus)
			{
			case "select-one" :
			//	valor = formulari.elements[x].options[formulari.elements[x].selectedIndex].value;
				if ((valor == "") || (valor == null))
				{
					alert(Err00 + "\n" + Err03);
					errors(tipus, formulari, x);
					return false;
					break;
				}
				break;
			case "checkbox" : 
				if (valor == "")
				{
					alert(Err00 + "\n" + Err04);
					errors(tipus, formulari, x);
					return false;
					break;
				}
				break;
			default :
				if (valor == "")
				{
		//			alert("default");
					alert(Err00 + "\n" + Err01);
				// treu els dos carācters de control de requeriment
					errors(tipus, formulari, x);
					return false;
					break;
				}
				// break;
			}
			n_car = nom.length;
			nom = nom.substr(2,n_car);
		}
		if (valor != "")
		{
		//Treu espais devant i darrera en camp de text.
		valor = treu_espais(valor, num_valor, tipus);
		if ((tipus == "text") || (tipus == "password") || (tipus == "textarea") || (tipus == "file"))
		{
			switch(nom)
			{
				case "e_mail" :
					if (valor.indexOf("@") == -1 || valor.indexOf(".") == -1)
					{
						alert(Err02);
						errors(tipus, formulari, x);
						return false;
						break;
					}
					// alert("e-mail correcte");
					break;
				case "adre_web" :
					ini_web = valor.substring(0,7).toLowerCase();
					// alert("Inici de l'adreįa: " + ini_web)
					tot_car = eval(valor.length);
					// alert(tot_car);
					rest_web = valor.substring(7,tot_car).toLowerCase();
					// alert("Resta de l'adreįa: " + rest_web)
					if (ini_web == "http://")
					{
					// alert("Passa http");
						if (rest_web.indexOf(".") == -1)
						{
							alert(Err10);
							errors(tipus, formulari, x);
							return false;
							break;
						}
					}
					else
					{
						alert(Err10);
						errors(tipus, formulari, x);
						return false;
						break;
					}					
					break;
				case "edat" :
					var cadena_edat = /(^([0-9]{2,3})|^)$/;
					if(!cadena_edat.test(formulari.elements[x].value))
					{
						var es_valid = "no"
						alert(Err11);
						errors(tipus, formulari, x);
						return false;
						break;
					}
				break;
				case "n_i_f" :
					var cadena_dni = /(^([0-9]{8,8}[A-Z])|^)$/;
					if(!cadena_dni.test(formulari.elements[x].value))
					{
						var es_valid = "no"
						alert(Err05);
						errors(tipus, formulari, x);
						return false;
						break;
					}
					else
					{
						es_valid = valida_dni(formulari, valor, x, es_valid);
						if (es_valid == "no")
						{
							alert(Err05);
							errors(tipus, formulari, x);
							return false;
							break;
						}
					}
				break;
				case "c_i_f" :
					var cadena_cif = /(^([ABCDEFGHKLMPQSX][0-9]{7,7}[ABCDEFGHIJ0123456789])|^)$/;
					if(!cadena_cif.test(formulari.elements[x].value))
					{
						es_valid = "no"
						alert(Err06);
						errors(tipus, formulari, x);
						return false;
						break;
					}
					else
					{
						es_valid = valida_cif(formulari, valor, x, es_valid);
						if (es_valid == "no")
						{
							alert(Err06);
							errors(tipus, formulari, x);
							return false;
							break;
						}
					}
				break;
				case "telefon" :
					var cadena_tel = /(^([0-9\s\+\-]{9,})|^)$/
					if(!cadena_tel.test(formulari.elements[x].value))
					{
						alert(Err07);
						errors(tipus, formulari, x);
						return false;
						break;
					}
				break;
				case "fax" :
					var cadena_fax = /(^([0-9\s\+\-]{9,})|^)$/
					if(!cadena_fax.test(formulari.elements[x].value))
					{
						alert(Err08);
						errors(tipus, formulari, x);
						return false;
						break;
					}
				break;
				case "c_p" :
					var cadena_cp = /(^([0-9]{5,5})|^)$/
					if(!cadena_cp.test(formulari.elements[x].value))
					{
						alert(Err09);
						errors(tipus, formulari, x);
						return false;
						break;
					}
				break;
				case "data" :
					var cadena_data = /(^(([1-3][0-9])|([0][1-9])|[1-9])[\/](([1][0-9])|([0][1-9])|[1-9])[\/][0-9]{4,}|^)$/;					if(!cadena_data.test(formulari.elements[x].value))
					{
						alert(Err12);
						errors(tipus, formulari, x);
						return false;
						break;
					}
				break;
			}
		}
	/*	elem_form[x] = nom;
		// valor_form[x] = valor;
		if (valor != "")
		{
			valor_form[x] = valor;
		}
		else
		{
			valor_form[x] = "";
		} */

	  }
	  	
	}
	// Resssigna els noms correctes als elements de formulari.
	/* for (i = 0; i < num_elem; i++)
	{
		formulari.elements[i].name = elem_form[i];
		formulari.elements[i].value = valor_form[i];
		// alert("x: " + x);
		// alert("Nom: " + formulari.elements[x].name);
		// alert("Valor: " + formulari.elements[x].value);
	} */
}
// Retorna el focus al camp si hi ha error en les dades
function errors(tipus, formulari, x)
{
	if (tipus == "select-one")
	{
		formulari.elements[x].options[0].selected = "true";
	}
	else
	{
		formulari.elements[x].select();
		// formulari.elements[x].value = "";
	}
	formulari.elements[x].focus();
	//alert("Valor de la x en error:\n" + x);
	//alert("nom del control en error:\n" + nom);
}
function valida_dni(formulari, valor, x, es_valid)
{
	var num_caracters = valor.length;
	var dni_nums = valor.substring(0,8);
	dni_nums = parseInt(dni_nums);
	var dni_rest = (dni_nums % 23);
	// alert("Mōdul= " + dni_rest);
	var cod_ctrl = valor.substring(8,9);
	cod_ctrl = cod_ctrl.toUpperCase();
	// alert("Codi de control: " + cod_ctrl);
	var lletres;
	lletres = new Array(23);
	lletres[0] = "T";
	lletres[1] = "R";
	lletres[2] = "W";
	lletres[3] = "A";
	lletres[4] = "G";
	lletres[5] = "M";
	lletres[6] = "Y";
	lletres[7] = "F";
	lletres[8] = "P";
	lletres[9] = "D";
	lletres[10] = "X";
	lletres[11] = "B";
	lletres[12] = "N";
	lletres[13] = "J";
	lletres[14] = "Z";
	lletres[15] = "S";
	lletres[16] = "Q";
	lletres[17] = "V";
	lletres[18] = "H";
	lletres[19] = "L";
	lletres[20] = "C";
	lletres[21] = "K";
	lletres[22] = "E";
	lletres[23] = "T";
	for (i = 0; i < 24; i++)
	{
		if (cod_ctrl == lletres[dni_rest])
		{
			es_valid = "si";
		//	alert("Es vālid?= " + es_valid);
			return es_valid;
			break;
		}
		else
		{
		es_valid = "no";
	//	alert("Es vālid?= " + es_valid);
		return es_valid;
		}
	}
}

function valida_cif(formulari, valor, x, es_valid)
{
	var num_caracters = valor.length;
	var cif_nums = valor.substring(1,8);
	// Sumem les posicions parells.
	var parells;
	parells = new Array();
	var senars;
	senars = new Array();
	var suma_parells = 0;
	var suma_senars = 0;
	for (i=0; i < 7; i++)
	{
		modul = (i % 2);
		if (modul == 1)
		{
			parells[i] = cif_nums.charAt(i);
			suma_parells = suma_parells + eval(parells[i]);
		}
		else
		{
			senars[i] = eval(cif_nums.charAt(i) * 2);
			var senars_tot = senars[i].toString();
			senars_des = senars_tot.charAt(1);
			if (senars_des != "")
			{
				senars[i] = eval(senars_tot.charAt(0)) + eval(senars_des);
			}
			suma_senars = suma_senars + senars[i];
			
		}
	}
	var suma_total = (suma_parells + suma_senars).toString();
	var unit_suma = suma_total.charAt(1);
	var resta_deu = eval(10 - unit_suma);
	if (resta_deu == 10)
	{
		resta_deu = 0;
	}
	var lletra_in = valor.substring(0,1);
	lletra_in = lletra_in.toUpperCase();

	var cod_ctrl = valor.substring(8,9);
	var cadena_cc = /(^([A-Z]{1,1})|^)$/;
	if (cadena_cc.test(cod_ctrl) == true)
	{
		cod_ctrl = cod_ctrl.toUpperCase();
		// alert("Codi de control: " + cod_ctrl);
		var lletres;
		lletres = new Array();
		lletres[0] = "J";
		lletres[1] = "A";
		lletres[2] = "B";
		lletres[3] = "C";
		lletres[4] = "D";
		lletres[5] = "E";
		lletres[6] = "F";
		lletres[7] = "G";
		lletres[8] = "H";
		lletres[9] = "I";
		for (i = 0; i < 10; i++)
		{
			if (cod_ctrl == lletres[resta_deu])
			{
				es_valid = "si";
			//	alert("Es vālid?= " + es_valid);
				return es_valid;
				//break;
			}
			else
			{
			es_valid = "no";
			//	alert("Es vālid?= " + es_valid);
			return es_valid;
			}
		}
	}
	else
	{
		if (eval(cod_ctrl) == resta_deu)
		{
			es_valid = "si";
			//	alert("Es vālid?= " + es_valid);
			return es_valid;
			//break;
		}
		else
		{
			es_valid = "no";
			return es_valid;
		}
	}
}

function treu_espais(valor, num_valor, tipus)
{
	if (tipus != "submit")
	{
		var num_blancs_inici = 0;
		for (i = 0; i < num_valor; i++)
		{
			var caract = escape(valor.charAt(i));
			if (caract == "%20")
			{
				num_blancs_inici++;
			}
			else
			{
				break;
			}
		}
		valor = valor.substring(num_blancs_inici, num_valor);
		num_valor = valor.length
		var num_blancs_final = 0;
		for (i = 1; i <= num_valor; i++)
		{
			var pos_fin = num_valor - i
			caract = escape(valor.charAt(pos_fin));
			if (caract == "%20")
			{
				num_blancs_final++;
			}
			else
			{
				break;
			}
		}
		nou_valor = valor.substring(0, num_valor - num_blancs_final);
		num_nou_valor = nou_valor.length;
		//Canvia els espais per valors d'"escape"
		valor = "";
		for (i = 0; i < num_nou_valor; i++)
		{
			caract = "";
			caract = escape(nou_valor.charAt(i));
			if (caract != "%20")
			{
				caract = nou_valor.charAt(i);
			}
			valor = valor + caract;
		}
	}
	return valor;
}