var ERROR, ERRORlocal;
ERROR = ""
/******************* FUNCIONS AUXILIARS STANDARD PER VALIDAR FORMULARIS *********************

funcio 'validaCamp' per validar qualsevol camp de formulari

	arguments:
		'oblig': camp obligatori, es a dir si té un valor
		'radiooblig': validar que almenys un raodiobutton d'un conjunt de radiobut està checked
		'Xcharmax': llargada màxima d'un camp de text on X és el número màxim de caràcters
		'XminDigit': llargada mínima en digits del camp
		'interval/min-max': si el valor del camp numéric és entre el valor minim i màxim
		'intervalChar/min-max': si el camp de text te un nombre de caràcters entre min/max
		'nomesChar': el camp només accepta caràcters
		'nomesNum': el camp només accepta números
		'nomesNumYMas: el camp accepta números, espais i punts
		'email': el contingut es email correcte
		'ficherosaceptados/.doc-.pdf-.jpg-'

funcio 'validaData' per validar dates que tenen el dia mes i any separats en tres camps

	arguments: camp['dia'], camp['mes'], camp['any']
		
funcio	'nomcamp': retorna el nom del camp.
funcio	'tipuscamp': retorna el tipus de camp de formulari
funcio	'mostraError': mostra el missatge d'error

*******************************************************************************************/


function validaCamp(camp){
	//fa la validacio del camp ,segons els paràmetres passats com a argument
		//per cada argument passat crida a la funcio adient.

	//recompte de nombre d'arguments passats a la funcio
	args = validaCamp.arguments;
	//alert("Objecte tipus: " + tipusCamp(camp) + "\n num arguments de validació: " + args.length + "\n Nom del camp: " + nomCamp(camp) + "\n Valor de l'objecte:" + camp.value );

	//fer validacio de tots els arguments passats:
		// l'argument '0' és el propi camp, que es fix (hi ha de ser) i accessible a través de la variable 'camp' de la funcio
		//a partir de l'argument 1 (inclos) hi ha els tipus de validacio que s'han de fer
		//determinar funcio de validacio a partir de l'argument i cridar-la
if(camp){
	for(i = 1; i < args.length; i++ ){
 		//alert(camp.value + " | " + args[i]);

		//valida camp obligatori
		if(args[i] == 'oblig'){
			err = valorCamp(camp);}

		//valida conjunt de radiobuttons
		if(args[i] == 'radiooblig'){
			//es rep un array de RadioButtons
			err = unEsChecked(camp);
		}
			
		//valida camp de caràcters no supera el màxim permés
		else if(args[i].indexOf('charmax') > -1){
			err = correctLlarg(camp,0,parseInt(args[i]));
		}

		//valida q el camp té minim X digits
		else if(args[i].indexOf('minDigit') > -1){
			err = correctMinim(camp,parseInt(args[i]));
		}
		

		//valida valor numéric és entre un interval
		else if(args[i].indexOf('interval') > -1){
			//pender limits de valo de l'argument rebut
			k = args[i].indexOf('/'); j = args[i].indexOf('-');
			minim = args[i].slice(k+1,j);
			maxim = args[i].slice(j+1);
			//crida a funcio
			err = correctInterval(camp,minim,maxim);
		}
		//valida numero minim/maxim de caracters es entre un interval
		else if(args[i].indexOf('intervalChar') > -1){
			//pendre limits de valor de l'argument rebut
			k = args[i].indexOf('/'); j = args[i].indexOf('-');
			minim = args[i].slice(k+1,j);
			maxim = args[i].slice(j+1);
			//crida a funcio
			err = correctLlarg(camp,minim,maxim);
		}
		
		else if(args[i] == 'email'){
			err = isEmail(camp,'0');	//El 2do parametro indica si la funcion concatenará su error al ERROR general	
		}
		
		else if(args[i] == 'nomesChar'){
			err = onlyCharacters(camp);
		}
		
		else if(args[i] == 'nomesNum' ){
			err = onlyNumbers(camp);
		}
		
		else if(args[i].indexOf('ficherosaceptados') > -1){
			//alert(args[i] + " = " + args[i].indexOf('ficherosaceptados'));
			fichpos = args[i].substring(args[i].indexOf('/')+1,args[i].length);
			//alert("fichpos="+fichpos);
			err = ficherosAceptados(camp,fichpos)
			//alert("err="+err);
		}

		//TRACTAMENT D'ERRORS
		if (!err){
			//refrescar variable global d'error
			if (ERRORlocal != ""){	ERROR = ERROR + ERRORlocal ;}
			
			//traslladar focus a camp erroni
			if(camp.type) camp.focus();
			if(tipusCamp(camp) == 'text' || tipusCamp(camp) == 'textarea')
				camp.select();
			
			return ERRORlocal;	
		}
	}
	return err;
}
else
{ ERROR = "Error: no existe en el formulario un campo con este identificador"+camp;
  return false;
}
}




function validaData(dia,mes,any,oblig,titulo){
	//validar que hi ha dades, son números
	if(oblig){
//		validaCamp(dia,'oblig','nomesNum','interval/1-31');
//		validaCamp(mes,'oblig','nomesNum','interval/1-12');
//		validaCamp(any,'oblig','nomesNum','interval/0-9999'); //els tres camps tenen valor numéric
		if(dia.value != ""){
			validaCamp(dia,'nomesNum','interval/1-31');
		}
		if(mes.value != ""){
			validaCamp(mes,'nomesNum','interval/1-12');
		}
		if(any.value != ""){
			validaCamp(any,'nomesNum','interval/0-9999'); //els tres camps tenen valor numéric
		}
		//
		if(check_date(dia,mes,any))// validar que la data és real			
			return true;
		else{
			ERROR = ERROR + "\n" + "Error de FECHA en "+titulo+", los datos no corresponden a una fecha correcta";
			//ERRORlocal = "\n" + "Error de FECHA, los datos no corresponden a una fecha correcta";
			//return false;
			return ERROR;
		}
		
	}
	else{
		if(dia.value != "" || mes.value != "" || any.value != ""){
			if(validaCamp(dia,'nomesNum','interval/0-31'))
				if(validaCamp(mes,'nomesNum','interval/0-12'))
					if(validaCamp(any,'nomesNum','interval/0-9999')) //els tres camps tenen valor numéric
						if(check_date(dia,mes,any) || ( Math.ceil(dia.value) == 0 && Math.ceil(mes.value) == 0 && Math.ceil(any.value) == 0)) // validar que la data és real
							return true;
	
			else{
				ERROR = "\n" + "Error de FECHA en "+titulo+", los datos no corresponden a una fecha correcta";				
				return ERROR;				
			}
		}	//if(dia != "" || mes != "" || any != "")
	}
}

function validaData2(dia,mes,any,oblig){
	//validar que hi ha dades, son números
	if(oblig){
		validaCamp(dia,'oblig','nomesNum','interval/1-31');
		validaCamp(mes,'oblig','nomesNum','interval/1-12');
		validaCamp(any,'oblig','nomesNum','interval/0-9999'); //els tres camps tenen valor numéric
		if(check_date(dia,mes,any))// validar que la data és real			
			return true;
		else{
			ERROR = ERROR + "\n" + "Error de FECHA, los datos no corresponden a una fecha correcta";
			return false;
		}
		
	}
	else{
		if(dia != "" || mes != "" || any != ""){
			if(validaCamp(dia,'nomesNum','interval/0-31'))
				if(validaCamp(mes,'nomesNum','interval/0-12'))
					if(validaCamp(any,'nomesNum','interval/0-9999')) //els tres camps tenen valor numéric
						if(check_date(dia,mes,any) || ( Math.ceil(dia.value) == 0 && Math.ceil(mes.value) == 0 && Math.ceil(any.value) == 0)) // validar que la data és real
							return true;
	
			else{
				ERROR = ERROR + "\n" + "Error de FECHA, los datos no corresponden a una fecha correcta";
				return false;
			}
		}	//if(dia != "" || mes != "" || any != "")
	}
}

function valorCamp(camp){
	ERRORlocal = "";
//	if(tipusCamp(camp) == 'file' || tipusCamp(camp) == 'select-multiple' || tipusCamp(camp) == 'submit' || tipusCamp(camp) == 'reset') return true;	
	if(tipusCamp(camp) == 'select-multiple' || tipusCamp(camp) == 'submit' || tipusCamp(camp) == 'reset') return true;
	else if(camp.value != '') return true;
	else {
		ERRORlocal = "\n" + "Error en el campo " + camp.title.toUpperCase() + ", es obligatorio.";
		return false;
	}
}
function unEsChecked(radioArr){
	ERRORlocal = "";
// si un d'els radiobuttons de l'array rebut està marcat(cheked=true) retornar true
	ok=false;

	for( i = 0; i < radioArr.length; i++){
		nomRadio = radioArr[i].title.toUpperCase();
		ERRORlocal = "\n" + "Error en el campo: " + nomRadio + ", no hay ningún control seleccionado.";
		if(radioArr[i].checked == true){ ok = true; i = radioArr.length;}
	}
	return ok;
}

function nomCamp(camp){
	return camp.name;
}

function tipusCamp(camp){
	return (camp.type);
}

function correctLlarg(inputString,minLlarg,maxLlarg){
	ERRORlocal = "";
	if(inputString.value.length < minLlarg){
		ERRORlocal = "\n" + "Error en el campo: " + inputString.title.toUpperCase() + ", la cadena de texto es demasiado corta. El mínimo número de caracteres es " + minLlarg + ".";
		return false
	}
	if(inputString.value.length > maxLlarg){
		ERRORlocal = "\n" + "Error en el campo: " + inputString.title.toUpperCase() + ", la cadena de texto es demasiado larga. El máximo número de caracteres es "+ maxLlarg + ".";
		return false
	}
	else return true;
}  
function correctMinim(inputString,minLlarg){
	ERRORlocal = "";
	if(inputString.value.length < minLlarg){
		ERRORlocal = "\n" + "Error en el campo: " + inputString.title.toUpperCase() + ", el mínimo número de digitos es " + minLlarg + ".";
		return false
	}
	else return true;
}  


function correctInterval(camp,minim,maxim){
	ERRORlocal = "";
	valor = Math.ceil(camp.value);
	if(valor < minim){
		ERRORlocal = "\n" + "Error en el campo: " + camp.title.toUpperCase() + ", el valor es demasiado pequeño, el intervalo válido es: " + minim + "-" + maxim;
		return false
	}
	else if(valor > maxim){
		ERRORlocal = "\n" + "Error en el campo: " + camp.title.toUpperCase() + ", el valor es demasiado grande, el intervalo válido es: " + minim + "-" + maxim;
		return false
	}
	else return true;
}

function ficherosAceptados(camp,fichpos){
	ERRORlocal = "";
	if(camp.value != ""){
		extensionFichero = camp.value.substring(camp.value.lastIndexOf('.'),camp.value.length);
		if(fichpos.indexOf(extensionFichero) > -1){
			return true;
		}else{
			ERRORlocal = "\n" + "Error en el campo: " + camp.title.toUpperCase() + ", el tipo de archivo no está admitido. Los tipos de archivo valido son: " + fichpos;
			return false;
		}
	}
}	

function onlyNumbers(inputString){
	ERRORlocal = "";
	//l'expresio cerca no números, si els troba retorna false pq ha de testejar que NOMÉS hi hagi caràcters tipus NÚMERO
	//var reNodigit = /\D+/; //Version estricta de que solo se desean numeros
	var reNodigit = /^\d+([\.\s]?\d+)*$/;
	
	if(!reNodigit.test(inputString.value)){
	  	ERRORlocal = "\n" + "Error en el campo: " + inputString.title.toUpperCase() + ", este campo sólo acepta números, espacios y puntos.";
		return false;
	}
	else return true;
}


function onlyCharacters(inputString){
	ERRORlocal = "";
	//l'expresio cerca números, si els troba retorna false pq ha de testejar que NOMÉS hi hagi caràcters NO NÚMERO
  var reNumbers = /\d+/;
  if(reNumbers.test(inputString.value)){
	ERRORlocal = "\n" + "Error en el campo: " + inputString.title.toUpperCase() + ", este campo sólo acepta letras.";
	return false;
   }
	else return true;
}

function isEmail(inputString,concatenaERROR){
	//Esta funcion concatena su ERRORlocal a ERROR solo si el parametro concatenaERROR es distinto de 0. En la 
	//funcion validaCamp ese valor es 0 para que no concatene. Si se ejecuta la funcion desde el programa, se puede
	//poner cualquier cosa diferente de 0 para que nos devuelva la variable ERROR con este error.
	ERRORlocal = "";
	//l'expresio comprova que existeixin, text + l'arroba + el punt + 2 o 3 o 4 lletres, i no hi hagi caracters prohibits,
//CAMP POT SER BUIT
	//var reEmail = /^\w+([\.-]?w+)*@\w+([\.-]?\w+)*(\.\w{2,4})+$/;
	var reEmail = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,4})+$/;
	if(valorCamp(inputString) && !reEmail.test(inputString.value)){
		//*//ERROR = inputString.id + "'\nNo es una direcci&oacute;n de e-mail correcta";
		ERRORlocal = "\n" + "Error en el campo: " + inputString.title.toUpperCase() + ", no es una dirección de e-mail correcta.";
		if (concatenaERROR != 0){
			if (ERRORlocal != ""){	ERROR = ERROR + ERRORlocal ;}
		}
		return false;
	}
	else  return true;
}

function check_isEmail(inputString){	
	ERRORlocal = "";
	//l'expresio comprova que existeixin, text + l'arroba + el punt + 2 o 3 o 4 lletres, i no hi hagi caracters prohibits,
//CAMP POT SER BUIT
	var reEmail = /^\w+([\.-]?w+)*@\w+([\.-]?\w+)*(\.\w{2,4})+$/;
	if(valorCamp(inputString) && !reEmail.test(inputString.value)){
		//*//ERROR = inputString.id + "'\nNo es una dirección de e-mail correcta";
		ERRORlocal = "\n" + "Error en el campo: " + inputString.title.toUpperCase() + ", no es una dirección de e-mail correcta.";
		if (ERRORlocal != ""){	ERROR = ERROR + ERRORlocal ;}		
		return false;
	}
	else  return true;
}




function check_date(dia,mes,any){
//codi Original d'aquesta funció de Torsten Frey (tf@tfrey.de)
//ja està validat l'interval de valors de dia mes i any, només cal validar si és una data correcta,
// 31-02-1995 //
var checkstr = "0123456789";
var DateField = dia;
var Datevalue = "";
var DateTemp = "";
var separator = "-";
var day;
var month;
var year;
var leap = 0;
var err = 0;
var i;

ERRORlocal = "";

   /* Always change date to 8 digits - string*/
//passar dia a dues xifres sempre, posar 0 al davant
   if (dia.value.length == 1) {
      dia.value = '0' + dia.value; 
   }
//passar mes a dues xifres sempre, posar 0 al davant   
   if (mes.value.length == 1) {
      mes.value = '0' + mes.value; 
   }
//passar any a 4 xifres sempre, posar '0' al davant
   if (any.value.length == 1) {
      any.value = '000' + any.value; 
   }
   if (any.value.length == 2) {
      any.value = '00' + any.value; 
   }
   if (any.value.length == 3) {
      any.value = '0' + any.value; 
   }
  

   DateValue = dia.value+"/"+mes.value+"/"+any.value;

   /* Delete all chars except 0..9 */
   for (i = 0; i < DateValue.length; i++) {
	  if (checkstr.indexOf(DateValue.substr(i,1)) >= 0) {
	     DateTemp = DateTemp + DateValue.substr(i,1);
	  }
   }
   DateValue = DateTemp;

   if (DateValue.length != 8) {
      err = 19;}

   year = DateValue.substr(4,4);
   month = DateValue.substr(2,2);
   day = DateValue.substr(0,2);

   /* Validation leap-year / february / day */
   	cond1 = (year % 4 == 0) && !(year % 100 == 0);
	cond2 = (year % 400 == 0);
	cond3 = cond1 || cond2;
   if (cond3) {
      leap = 1;
   }
   if ((month == 2) && (leap == 1) && (day > 29)) {
      err = 23;
   }
   if ((month == 2) && (leap != 1) && (day > 28)) {
      err = 24;
   }
   /* Validation of other months */
   if ((day > 31) && ((month == "01") || (month == "03") || (month == "05") || (month == "07") || (month == "08") || (month == "10") || (month == "12"))) {
      err = 25;
   }
   if ((day > 30) && ((month == "04") || (month == "06") || (month == "09") || (month == "11"))) {
      err = 26;
   }

   /* if no error, */
   if (err == 0) {
      //DateField.value = day + separator + month + separator + year;
	  return true
   }
   /* Error-message if err != 0 */
   else {
	 DateField.focus();
	 return false;
   }
}

function mostraError(nom,estil,crea,top,ample){
var insert
	//si al document hi ha un element amb id -nom- insertarà el missatge d'error allà, sinó
	//el mostra en un alert
	if (document.getElementById? nodeError = document.getElementById(nom) : document.all? nodeError = document.all[nom] : false){
		insert = liniesError(ERROR);
		nodeError.replaceChild(insert,nodeError.firstChild);
		nodeError.style.display = "block";
	}
	else{
		if(crea){
			nodeError = creaBloc(nom,estil,top,ample);
			insert = liniesError(ERROR);
			nodeError.replaceChild(insert,nodeError.firstChild);
			nodeError.style.display = "block";
			document.getElementsByTagName("BODY")[0].appendChild(nodeError);
		}
		else{alert(ERROR);}		
	}

	ERROR = "";

}

function creaBloc(id,estil,top,ample){
	d = document.createElement("DIV");
	d.appendChild(document.createTextNode(" "));
	d.id = id;

	//estil per defecte
	d.style.position = "absolute";
	if (!document.all)d.style.position = "fixed";
	d.style.top = "50px";
	d.style.left = "30%";
	d.style.width = "250px";
	d.style.backgroundColor = "white";
	d.style.fontSize = "10px";
	d.style.border = "black solid 1px";
	d.style.padding = "4px";
	
	//opcions segons els arguments rebuts
	if (estil) d.className = estil;
	if (top) d.style.top = top;
	if (ample){
		d.style.width = ample;
		d.style.left = (screen.availWidth/2) - (ample/2) + "px";	
	}

	d.title = "clicar para quitar este aviso";
	//assignar clic
	d.onclick = amaga;
	
	return d;
}
function amaga(){
	this.style.display = "none";
}
function liniesError(inputString){
	var p,t;
	p = document.createElement("DIV");
	p.appendChild(document.createTextNode("ATENCIÓN: "))
	//convertir cada linia de la var ERROR en una linia html
	tmp = ERROR.split("\n");
	for( var i = 0; i < tmp.length ; i++){
		t = document.createTextNode(tmp[i]);
		p.appendChild(t);
		p.appendChild(document.createElement("BR"))
	}
	return p;
	
}
/********************************************************************************
 en tal objeto del formulario, cuando se alcanza el maxnum de caracteres
 se muestra un error y se corta la cadena en el ultimo caracter valido

 ob --> objeto
 maxnum --> maximo numero de caracteres
 msg --> mensaje
 */
function maxcaract(ob, maxnum, msg)
{
	if (ob.value.length > maxnum)
	{
		alert(msg);
		ob.value = ob.value.substring(0,maxnum);
	}
}

function intro()
{
	if (document.layers) document.captureEvents(Event.KEYPRESS);
	window.onkeypress = keyhandler;
	function keyhandler(e) {
	   var event = e ? e : window.event;
	   if (event.keyCode == 13) return false;
	}
}