/////////////////////////////////////////////////////////////////////////////////////////////////////
//																								   //
// Sistema de validació de formularis                                                              //
// Autors: Alex Hernàndez, Noemí Morquecho                                                         //
// Data: 7 de Febrer de 2008                                                                       //
// Descripció: Sistema automàtic de validació, troba errors en els valors introduïts en camp de    //
// formularios d'una forma sencilla pel programador.                                               //
//                                                                                                 //
/////////////////////////////////////////////////////////////////////////////////////////////////////

function validate(form, lang)
{
	//En aquesta variable estarà la llista d'errors trobats
	
	var message = "";
	
	//Comprovem si s'ha posat un llenguatge, sinò es configura el català per defecte
	
	if (lang != 'esES' && lang != 'caES') lang = 'caES';
	
	//Recorrem tots els elements del formulari
	
	var radios = new Array();
	var num = 0;
	
	for(i = 0; i < form.elements.length; i++)
	{
		//Si class = required % vol dir que és un camp requerit

		if (form.elements[i].className.indexOf('required') == 0)
		{
		
			//n ens serveix per trobar el tipus de requeriment, treient 'red' si s'ha possat
		
			if(form.elements[i].className.substring(form.elements[i].className.length - 3) == 'red')
				var n = form.elements[i].className.length - 3;
			else
				var n = form.elements[i].className.length;

			//Comprovem si el camp és buit; si ho és, s'afegeix a message

			message += validateEmpty(form.elements[i], lang);
			
			//Comprovem totes les posibles validacions. Si alguna es incorrecta, s'afegeix a message

			if(form.elements[i].className.substring(9, n).replace(' ', '') == 'number')
				message += validateNumber(form.elements[i], lang);
			else if(form.elements[i].className.substring(9, n).replace(' ', '') == 'password')
				message += validatePassword(form.elements[i], lang);
			else if(form.elements[i].className.substring(9, n).replace(' ', '') == 'phone')
				message += validatePhone(form.elements[i], lang);
			else if(form.elements[i].className.substring(9, n).replace(' ', '') == 'postcode')
				message += validatePostCode(form.elements[i], lang);
			else if(form.elements[i].className.substring(9, n).replace(' ', '') == 'email')
				message += validateEmail(form.elements[i], lang);
			else if(form.elements[i].className.substring(9, n).replace(' ', '') == 'letter')
				message += validateLetter(form.elements[i], lang);
			else if(form.elements[i].className.substring(9, n).replace(' ', '') == 'nif')
				message += validateNIF(form.elements[i], lang);
			else if(form.elements[i].className.substring(9, n).replace(' ', '') == 'bankaccount')
				message += validateBankAccount(form.elements[i], lang);
			else if(form.elements[i].className == 'required')
				if(form.elements[i].type == 'checkbox')
						message += validateCheckBoxChecked(form.elements[i], lang);
			else if(form.elements[i].className == 'required')
			{
				if(form.elements[i].type == 'radio')
				{
					radios[num] = form.elements[i];
					num++;
				}
			}
		}
		
		//Si class = norequired % vol dir que és un camp no requerit
		
		else if (form.elements[i].className.indexOf('norequired') == 0)
		{
		
			//n ens serveix per trobar el tipus de requeriment, treient 'red' si s'ha possat
		
			if(form.elements[i].className.substring(form.elements[i].className.length - 3) == 'red')
				var n = form.elements[i].className.length - 3;
			else
				var n = form.elements[i].className.length;
			
			//En aquest cas no comprovem si el camp és buit, perque no és requerit
			//Comprovem totes les posibles validacions. Si alguna es incorrecta, s'afegeix a message
				
			if(form.elements[i].className.substring(11, n).replace(' ', '') == 'number')
				message += validateNumber(form.elements[i], lang);
			else if(form.elements[i].className.substring(11, n).replace(' ', '') == 'password')
				message += validatePassword(form.elements[i], lang);
			else if(form.elements[i].className.substring(11, n).replace(' ', '') == 'phone')
				message += validatePhone(form.elements[i], lang);
			else if(form.elements[i].className.substring(11, n).replace(' ', '') == 'postcode')
				message += validatePostCode(form.elements[i], lang);
			else if(form.elements[i].className.substring(11, n).replace(' ', '') == 'email')
				message += validateEmail(form.elements[i], lang);
			else if(form.elements[i].className.substring(11, n).replace(' ', '') == 'letter')
				message += validateLetter(form.elements[i], lang);
			else if(form.elements[i].className.substring(11, n).replace(' ', '') == 'nif')
				message += validateNIF(form.elements[i], lang);
			else if(form.elements[i].className.substring(11, n).replace(' ', '') == 'bankaccount')
				message += validateBankAccount(form.elements[i], lang);
		}
	}
	
	if(radios.length > 0)
	{
		var t = false;
		var rad = new Array();
		rad[0] = radios[0].name;

		for(m = 1; m < radios.length; m++)
		{
			t = false;
			for(l = 0; l < rad.length; l++)
			{
				if(rad[l] == radios[m].name)
				{
					t = true;
				}
			}
			if(!t)
				rad[rad.length] = radios[m].name;
		}
					
		for(m = 0; m < rad.length; m++)
		{
			t = false;
			for(l = 0; l < radios.length; l++)
			{
				if(radios[l].name == rad[m] && radios[l].checked)
					t = true;
			}
			if(!t)
			{
				for(r = 0; r < radios.length; r++)
				{
					if(radios[r].name == rad[m])
					{
						message += "<li>" + radios[r].title + ": Ha de marcar alguna opció.</li>";
						$(radios[r]).getPrevious().addClass('red');
						break;
					}
				}
			}
		}
	}
	
	//Si message != '' llavors hi ha errors i per tant els mostrem a 'missatge', en el idioma que correspongui

	form.onsubmit = function()
	{
		if(message != "")
		{
			document.getElementById('missatge').style.display='block';
			if (lang == 'esES') 
			{ 
			document.getElementById('missatge').innerHTML = '<div id="fade"></div><div id="validate" onclick= "document.getElementById(\'missatge\').style.display=\'none\';"><span>Se han producido los siguientes errores:</span><ul>' + message + '</ul></div>';
			}
			else if (lang == 'caES')
			{
			document.getElementById('missatge').innerHTML = '<div id="fade"></div><div id="validate" onclick= "document.getElementById(\'missatge\').style.display=\'none\';"><span>S\'han produït els següents errors:</span><ul>' + message + '</ul></div>';
			}
			else
			{
			document.getElementById('missatge').innerHTML = '<div id="fade"></div><div id="validate" onclick= "document.getElementById(\'missatge\').style.display=\'none\';"><span>S\'han produït els següents errors:</span><ul>' + message + '</ul></div>';
			}
		}
	
		//Si message == '' llavors no hi ha errors i enviem el formulari
	
		else
		{
			form.submit();
		}
		
		//Amb aquest return ens asegurem que no es recarrega la pàgina
		
		return false;
	}
}

//Formula per comprovar la lletra del DNI

function validateNifNumber(value)
{
	var dni = value.substring(0, value.length -1);
	var lockup = 'TRWAGMYFPDXBNJZSQVHLCKE';
	return value.charAt(value.length -1).toUpperCase() == lockup.charAt(dni % 23);
}

//Formula per comprovar el codi de control d'un número de tarjeta corrent

function validateBankaccount(value)
{	
	var numero = value.replace(/-/g,"");

	var factores1 = new Array(4, 8, 5, 10, 9, 7, 3, 6);
	var factores2 = new Array(1, 2, 4, 8, 5, 10, 9, 7, 3, 6);

	var suma1 = 0;
	var suma2 = 0;

	for(j = 0; j < 8; j++)
		suma1 += parseInt(numero.charAt(j)) * parseInt(factores1[j]);
	for(j = 0; j < 10; j++)
		suma2 += parseInt(numero.charAt(10 + j)) * parseInt(factores2[j]);
		
	var resto1 = suma1 % 11;
	var resto2 = suma2 % 11;
	var clave1 = 0;
	var clave2 = 0;

	if(resto1 == 0 || resto1 == 1) clave1 = resto1; else clave1 = 11 - resto1;
	if(resto2 == 0 || resto2 == 1) clave2 = resto2; else clave2 = 11 - resto2;

	return numero.charAt(8) == clave1 && numero.charAt(9) == clave2;
}

//Aquesta funció comprova que el valor introduït sigui un número decimal amb entre 2 i 3 cifres decimals

function validateDec(field, lang)
{
	var regExp = /[0-9]+\.+([0-9]{1,3})$/;
	var error = "";

	// Si és requerit o no és buit i no cumpleix la condició, afegim l'error en el idioma corresponent

	if((field.className.indexOf('required') == 0 || field.value != "") && !field.value.match(regExp))
	{
		if(lang == 'esES')
			error = "<li>" + field.title + ": Este campo requiere un número con entre 2 y 3 decimales.</li>";
		else if(lang == 'caES')
			error = "<li>" + field.title + ": Aquest camp requereix un número d'entre 2 i 3 decimals.</li>";
		$(field).addClass('red');
		$(field).getPrevious().addClass('red');
	}
	else if((field.className.indexOf('norequired') == 0 && field.value == "") || field.value != '')
	{
		$(field).removeClass('red');
		$(field).getPrevious().removeClass('red');
	}
	return error;
}

//Aquesta funció comprova que un checkbox està marcat

function validateCheckBoxChecked(field, lang)
{
	var error = "";
	
	// Si és requerit o no és buit i no cumpleix la condició, afegim l'error en el idioma corresponent

	if(!field.checked)
	{
		if(lang == 'esES')
			error = "<li>" + field.title + ": Ha de aceptar la política de privacidad.</li>";
		else if(lang == 'caES')
			error = "<li>" + field.title + ": Ha d'acceptar la política de privacitat.</li>";
		$(field).addClass('red');
		$(field).getNext().addClass('red');
	}
	else
	{
		$(field).removeClass('red');
		$(field).getNext().removeClass('red');
	}
	return error;
}

//Aquesta funció comprova que un radio està marcat

function validateRadioChecked(field, lang)
{
	var error = "";

	// Si és requerit o no és buit i no cumpleix la condició, afegim l'error en el idioma corresponent

	if(!field.checked)
	{
		if(lang == 'esES')
			error = "<li>" + field.title + ": Has de marcar alguna opción.</li>";
		else if(lang == 'caES')
			error = "<li>" + field.title + ": Ha de marcar alguna opció.</li>";
	}
	return error;
}

//Aquesta funció comprova que el valor introduït és un número de compte corrent vàlid, tant per format com per codi de control

function validateBankAccount(field, lang)
{
	var regExp = /(^([0-9]{4,4})-([0-9]{4,4})-([0-9]{2,2})-([0-9]{10,10})$)/;
	var error = "";

	// Si és requerit o no és buit i no cumpleix la condició, afegim l'error en el idioma corresponent
	
	if((field.className.indexOf('required') == 0 || field.value != "") && !(field.value.match(regExp) && validateBankaccount(field.value) == true))
	{
		if(lang == 'esES')
			error = "<li>" + field.title + ": Este campo requiere un número de cuenta bancaria válido.</li>";
		else if(lang == 'caES')
			error = "<li>" + field.title + ": Aquest camp requereix un número de compte bancari vàlid.</li>";
			
		$(field).addClass('red');
		$(field).getPrevious().addClass('red');
	}
	else if((field.className.indexOf('norequired') == 0 && field.value == "") || field.value != '')
	{
		$(field).removeClass('red');
		$(field).getPrevious().removeClass('red');
	}
	return error;
}

//Aquesta funció comprova que el valor introduït sigui un NIF vàlid o una tarjeta de residència vàlida

function validateNIF(field, lang)
{
	var regNif = /^[0-9]{8,8}[a-zA-Z]{1,1}$/;
	var regRes = /^(X|x)[0-9]{7,7}[a-zA-Z]{1,1}$/;
	var error = "";

	// Si és requerit o no és buit i no cumpleix la condició, afegim l'error en el idioma corresponent

	if((field.className.indexOf('required') == 0 || field.value != "") && !(field.value.match(regRes) || (field.value.match(regNif) && validateNifNumber(field.value.toUpperCase()) == true)))
	{
		if(lang == 'esES')
			error = "<li>" + field.title + ": Este campo requiere un número de NIF, DNI o Tarjeta de residencia válido.</li>";
		else if(lang == 'caES')
			error = "<li>" + field.title + ": Aquest camp requereix un número de NIF, DNI o Targeta de residència vàlid.</li>";
		$(field).addClass('red');
		$(field).getPrevious().addClass('red');
	}
	else if((field.className.indexOf('norequired') == 0 && field.value == "") || field.value != '')
	{
		$(field).removeClass('red');
		$(field).getPrevious().removeClass('red');
	}
	return error;
}

//Aquesta funció comprova que el valor introduït sigui un número

function validateNumber(field, lang)
{
	var regExp = /^[0-9]/;
	var error = "";

	// Si és requerit o no és buit i no cumpleix la condició, afegim l'error en el idioma corresponent

	if((field.className.indexOf('required') == 0 || field.value != "") && !field.value.match(regExp))
	{
		if(lang == 'esES')
			error = "<li>" + field.title + ": Este campo requiere un número.</li>";
		else if(lang == 'caES')
			error = "<li>" + field.title + ": Aquest camp requereix un número.</li>";
		$(field).addClass('red');
		$(field).getPrevious().addClass('red');
	}
	else if((field.className.indexOf('norequired') == 0 && field.value == "") || field.value != '')
	{
		$(field).removeClass('red');
		$(field).getPrevious().removeClass('red');
	}
	return error;
}

//Aquesta funció comprova que el valor introduït sigui una lletra vàlida

function validateLetter(field, lang)
{
	var regExp = /^(?:\+|-)?[A-Za-záéíóúàèìòù ]+$/;
	var error = "";

	// Si és requerit o no és buit i no cumpleix la condició, afegim l'error en el idioma corresponent

	if((field.className.indexOf('required') == 0 || field.value != "") && !field.value.match(regExp))
	{
		if(lang == 'esES')
			error = "<li>" + field.title + ": Este campo requiere letras.</li>";
		else if(lang == 'caES')
			error = "<li>" + field.title + ": Aquest camp requereix lletres.</li>";
		$(field).addClass('red');
		$(field).getPrevious().addClass('red');
	}
	else if((field.className.indexOf('norequired') == 0 && field.value == "") || field.value != '')
	{
		$(field).removeClass('red');
		$(field).getPrevious().removeClass('red');
	}
	return error;
}

//Aquesta funció comprova que el valor introduït sigui un caràcter alfanuméric amb entre 6 i 10 caracters

function validatePassword(field, lang)
{
	var regExp = /[0-9A-Za-z\*]{6,10}$/;
	var error = "";

	// Si és requerit o no és buit i no cumpleix la condició, afegim l'error en el idioma corresponent

	if((field.className.indexOf('required') == 0 || field.value != "") && !field.value.match(regExp))
	{
		if(lang == 'esES')
			error = "<li>" + field.title + ": Este campo requiere entre 6 y 10 caracteres alfanuméricos.</li>";
		else if(lang == 'caES')
			error = "<li>" + field.title + ": Aquest camp requereix entre 6 i 10 caracters alfanumèrics.</li>";
		$(field).addClass('red');
		$(field).getPrevious().addClass('red');
	}
	else if((field.className.indexOf('norequired') == 0 && field.value == "") || field.value != '')
	{
		$(field).removeClass('red');
		$(field).getPrevious().removeClass('red');
	}
	return error;
}

//Aquesta funció comprova que el valor introduït sigui un teléfon vàlid

function validatePhone(field, lang)
{
	var regExp = /(^([0-9]{9,9})|^)$/;
	var error = "";

	// Si és requerit o no és buit i no cumpleix la condició, afegim l'error en el idioma corresponent
	
	if((field.className.indexOf('required') == 0 || field.value != "") && !field.value.match(regExp))
	{
		if(lang == 'esES')
			error = "<li>" + field.title + ": Este campo requiere un número de teléfono válido.</li>";
		else if(lang == 'caES')
			error = "<li>" + field.title + ": Aquest camp requereix un número telefònic vàlid.</li>";
		$(field).addClass('red');
		$(field).getPrevious().addClass('red');
	}
	else if((field.className.indexOf('norequired') == 0 && field.value == "") || field.value != "")
	{	
		$(field).removeClass('red');
		$(field).getPrevious().removeClass('red');
	}
	return error;
}

//Aquesta funció comprova que el valor introduït sigui un codi postal válid

function validatePostCode(field, lang)
{
	var regExp = /^(5[0-2]|[0-4][0-9])[0-9]{3}$/;
	var error = "";

	// Si és requerit o no és buit i no cumpleix la condició, afegim l'error en el idioma corresponent

	if((field.className.indexOf('required') == 0 || field.value != "") && !field.value.match(regExp))
	{
		if(lang == 'esES')
			error = "<li>" + field.title + ": Este campo requiere un código postal válido.</li>";
		else if(lang == 'caES')
			error = "<li>" + field.title + ": Aquest camp requereix un codi postal vàlid.</li>";
		$(field).addClass('red');
		$(field).getPrevious().addClass('red');
	}
	else if((field.className.indexOf('norequired') == 0 && field.value == "") || field.value != '')
	{
		$(field).removeClass('red');
		$(field).getPrevious().removeClass('red');
	}
	return error;
}

//Aquesta funció comprova que el valor introduït sigui una adreça de correu vàlida

function validateEmail(field, lang)
{
	var regExp = /^[A-Za-z0-9._%-]+@+[A-Za-z0-9.-]+\.+([A-Za-z]{2,4})$/;
	var error = "";

	// Si és requerit o no és buit i no cumpleix la condició, afegim l'error en el idioma corresponent

	if((field.className.indexOf('required') == 0 || field.value != "") && !field.value.match(regExp))
	{
		if(lang == 'esES')
			error = "<li>" + field.title + ": Este campo requiere una dirección de correo válida.</li>";
		else if(lang == 'caES')
			error = "<li>" + field.title + ": Aquest camp requereix una direcció de correu vàlida.</li>";
		$(field).addClass('red');
		$(field).getPrevious().addClass('red');
	}
	else if((field.className.indexOf('norequired') == 0 && field.value == "") || field.value != '')
	{
		$(field).removeClass('red');
		$(field).getPrevious().removeClass('red');
	}
	return error;
}

//Aquesta funció comprova que s'hagi introduït algun valor

function validateEmpty(field, lang)
{

	/*Comprueba si el campo está vacío. Si lo está, agrega un error a message */

	var error = "";
	
	if(field.type != 'checkbox' & field.type != 'radio' & field.value == "")
	{
		if(lang == 'esES')
			error = "<li>" + field.title + ": Este campo no puede estar vacío.</li>";
		else if(lang == 'caES')
			error = "<li>" + field.title + ": Aquest camp no pot estar buit.</li>";
		$(field).addClass('red');
		$(field).getPrevious().addClass('red');
	}
	else if(field.type == 'checkbox')
	{
		$(field).removeClass('red');
		$(field).getNext().removeClass('red');
	}
	else
	{
		$(field).removeClass('red');
		$(field).getPrevious().removeClass('red');
	}
	
	return error;
}
