// L. López 
// Realiza la validación de formularios. Estas funciones están muy conectadas a lo programado en PHP para poder realizar una buen integración  

 // include("./javascript/validar_es.js", {dom:true});
 
 // Función utilizada para incluir ficheros mediante includes en el DOM actual.
 
 var formulario;
 
 function include(file,opt){
 
	if(file=="") return;
	//Genera una id para el archivo con el fin de evitar que se cargue 2 veces.
	idfile = file.replace(location.hostname,"");
	idfile = idfile.replace(location.protocol,"");
	idfile = idfile.replace("//","");
	if(document.getElementById(idfile)){return};
	if(typeof opt=="undefined") opt = {};
	if(typeof opt.cache=="undefined") opt.cache = true;
	if(typeof opt.dom=="undefined")  opt.dom = false;
	if(typeof opt.type=="undefined")  opt.type = "";
	ext = (opt.type!="") ? opt.type : file.substring(file.lastIndexOf('.')+1);
	if(!opt.cache){
	    var random = new Date().getTime().toString();
	        if(file.indexOf("?")!=-1) file = file+"&"+random;
	        else file = file+"?"+random;
	}
	if(opt.dom){
	        var head = document.getElementsByTagName("head").item(0)
	}
	switch(ext){
        case "css":
          if(!opt.dom)
                document.write('<link rel="stylesheet" href="'+file+'" id="'+idfile+'" type="text/css"><\/link>');
          else{
            css = document.createElement('link');
            css.rel  = 'stylesheet';
            css.href = file;
                css.type = 'text/css';
                css.id = idfile;
                  head.appendChild(css);
          }
        break;
        case "js":
        	
         if(!opt.dom){
         
                document.write('<script type="text/javascript" id="'+idfile+'" src="'+file+'"><\/script>');
         }
         else{
         
            script = document.createElement('script');
            script.src = file;
                script.type = 'text/javascript';
                script.id = idfile;
                head.appendChild(script);
                if(typeof opt.oncomplete!= 'undefined'){
                        //Para IE
                    script.onreadystatechange = function () {if (script.readyState == 'complete') {if(typeof opt.oncomplete == "function") {eval(opt.oncomplete());}}}
                        //Para Firefox
                    script.onload = function () {if(typeof opt.oncomplete == "function") {opt.oncomplete();}}
                }             
         }
        break;
	}
        
}

// Función que elimina los espacios de detrás o delante de la cadena que pasamos como parámetro.
function trimStr(stringToTrim) {
    //alert("PALABRA PARA TRIM :" + stringToTrim);
    /*if(stringToTrim.value == undefined) return "";
    cadena = stringToTrim.value;
    return cadena.replace(/^\s+|\s+$/g,"");
     var str = "  esto es una prueba  ";*/
    return stringToTrim.replace(/^\s*|\s*$/g,"");
}

// Función de validación de campos de un formulario.
// Parámetros:
//		obj: Formulario
//		Campos: Listado de campos y sus correspondientes "flags" para realizar validación

function validar(obj, campos){
	
	var devuelve = true;	// Variable que realizará la devolución final del resultado de ejecución de la actual validación sobre los campos determinados.			
	var devuelve_aux = true;// Resultado parcial de la validación del campo actual. Es utilizada por la variable anterior para mantener la posición correcta.
	var valor = "";			// Valor del campo que se vaya a validar.
	var campo = "";			// Nombre del  campo en el formulario que está siendo validado
	var comprobaciones;		// Funciones de validación que ejecutaremos para un campo determinado
	var parametro = "";		// Puede ser que la función de validación requiera un parámetro. Por ejemplo: cadena.maxlength(5). El 5 sería el parámetro extraido del array inicial. 
	var llamada_funcion = "";// Almacena la cadena que ejecutaremos con eval para obtener el resultado de la llamada a la función de validación extraida de la variable comprobaciones.

	var funcion = "";
        var es_requerido = false;
	var error_campo = false;
	//var campo_anterior = false;
	var nombre_campo_anterior = "";  //Cuando vamos a mostrar un error dentro de un DIV, nos quedamos con el nombre que está escrito en innerHTML para
									// posteriormente usarlo dentro de los mensajes de error.
	//var nuevo_campo;
	
	formulario = obj;
	
	for(campo in campos) {
            //alert("comprobamos campo " + campo);
                es_requerido = false;
		valor = campos[campo]["validation"];
                //alert("El valor del campo :"+campo+" es :" +valor);
		comprobaciones = valor.split('|');
		nombre_campo_anterior = "";
		//nuevo_campo = true;
		error_campo = false;
                valor_campo = trimStr(eval('obj.' + campo + '.value'));
		for(i in comprobaciones) {
                    //alert("valor del campo " + valor_campo);
                    if(valor_campo != '' || comprobaciones[i].indexOf('required') >= 0) {
                        //alert("El campo "+campo+ " en "+ comprobaciones[i] + " es requerido");
                        es_requerido = true;
                    }
                }
                if(es_requerido == true) {
                    for(i in comprobaciones) {
                            // Dependiendo de la funcion que vayamos a llamar, es posible que se le deban pasar parámetros, por lo
                            // que a continuación vamos a extraerlos de la cadena.
                            inicioCorchete = comprobaciones[i].indexOf('[');
                            finCorchete = comprobaciones[i].indexOf(']');

                            if(inicioCorchete >=0  && finCorchete>=0 ) {
                                    parametro = comprobaciones[i].substring(inicioCorchete + 1,finCorchete);
                                    funcion = comprobaciones[i].substring(0,inicioCorchete);
                            } else {
                                    funcion = comprobaciones[i];
                            }
                            /*if( eval("window." + funcion) ) alert("TIPO DE :");
                            else alert("PREMIIO ");*/
                            //if(typeof eval(funcion) == 'function') {
                            if( eval("window." + funcion) ) {
                                //alert('La funcion '+funcion+ ' existe');
                                llamada_funcion = funcion + '(obj.'+ campo;
                                if(parametro.length > 0) llamada_funcion += ', \'' + parametro + '\'';
                                else parametro = "";
                                llamada_funcion += ')';
                                //alert('Comprobamos campo: '+campo+' y funcion :' + funcion+ ", datos :" + document.getElementById(campo).value);
                                devuelve_aux = eval(llamada_funcion);
                                devuelve = devuelve && devuelve_aux;

                                if(!devuelve_aux) {
                                        error_campo = true;
                                        nombre_campo_anterior = mostrarError(campo, funcion, nombre_campo_anterior, parametro, campos[campo]["fieldname"]);
                                } else {
                                        if(!error_campo) ocultarError(campo);
                                }
                            }/* else {
                                alert('La funcion '+funcion+ ' no existe');
                            }*/
                            //nuevo_campo = false;
                    }
                }
                //alert("comprobamos campo " +campo);
	}
	return devuelve;
}

// Funcion mostrarError
// --------------------
// Devuelve: 
//		Último campo sobre el cual se ha mostrado un error.
// Parámetros:
// 		campo: Nombre del campo sobre el cual vamos a mostrar el error
// 		funcion: Nombre de la funcion que ha dado error para el campo especificado
// 		nombre_campo_anterior: Nombre del campo anterior sobre el cual hemos dado error
// 		parametro: En el caso de que el error deba mostrar un paraámetro secundario lo pasamos aqui.

function mostrarError(campo, funcion, nombre_campo_anterior, parametro, titulo_campo) {
	
	var nombre_campo_aux = "";
	var parametro_aux = "";
	//alert(campo+'_error');
	if(document.getElementById(campo+'_error'))
		document.getElementById(campo+'_error').style.visibility = "visible";
	else
		alert('El campo ' + campo+'_error' + ' para mostrar el error no ha sido definido');
	
	if(nombre_campo_anterior == "") 
	{
		/*if(document.getElementById(campo+'_fieldName'))
			nombre_campo_aux = document.getElementById(campo+'_fieldName').value;
		else {
			alert('El campo :' + campo+'_fieldName, no ha sido definido');
			nombre_campo_aux = document.getElementById(campo+'_fieldName').value;
		}*/
                if(document.getElementById(campo))
			nombre_campo_aux = titulo_campo; //campo;//document.getElementById(campo);
		else {
			alert('El campo :' + campo+', no ha sido definido');
			//nombre_campo_aux = document.getElementById(campo+'_fieldName').value;
		}
			
		error = "error" + funcion + ".replace(/#campo#/, '" + nombre_campo_aux + "')";		
		
		if(parametro != "") {
			// En caso de ser la función exacto sobre la cual vamos a mostrar el error, debemos extraer el nombre del campo en lugar del 'name' del input.
			if(funcion == "match") {
				//parametro_aux = eval("document.getElementById('" + parametro + "_fieldName').value");
                                parametro_aux = eval("document.getElementById('" + parametro + ").value");
			} else parametro_aux = parametro;
			
			error_aux = eval(error);
			//alert('evaluamos :' +error_aux + 'parametro aux :'+ parametro_aux);
			error = "error_aux.replace(/#parametro#/, '" + parametro_aux + "')";
			//alert(eval(error));
		}	
		document.getElementById(campo+'_error').innerHTML = eval(error);
	}		
	else 
	{
		nombre_campo_aux = nombre_campo_anterior;
		error = "error" + funcion + ".replace(/#campo#/, '" + nombre_campo_aux + "')";
		if(parametro != "") {
			error_aux = eval(error);
			error = "error_aux.replace(/#parametro#/, '" + parametro + "')";
		}		
		document.getElementById(campo+'_error').innerHTML += eval(error);
	} 
	
	return nombre_campo_aux;
}

function ocultarError(campo) {
	document.getElementById(campo+'_error').style.visibility = "hidden";
}


// ------------------------------------------------------------------------------------
// Funciones de validación
// Todas pueden recibir dos parámetros: campo, parametro para realizar las validaciones
// Y deben devolver true o false únicamente.
// Las funciones de validación deben llamarse con el mismo nombre que aparece en el archivo de idioma
// las constantes. Por ejempl, existirá una variable dentro de usuaris.conf que en la parte error que se llame: errorrequired o errorurl, etc... 
// ------------------------------------------------------------------------------------
function required(campo) {
	
	if(campo) {
                devuelve = trimStr(campo.value);
		if(devuelve == '') return false;
		else return true;
	} else {
		alert('Campo no definido');
	}
        return false;
}
/*
function xss_clean() {
    
}*/
function valid_url(campo) {
    //var RegExPattern = /^(ht|f)tp(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)( [a-zA-Z0-9\-\.\?\,\'\/\\\+&%\$#_]*)?$/;
    var RegExPattern = /^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?$/;
    //var errorMessage = 'Password Incorrecta.';
    if ((campo.value.match(RegExPattern)) && (campo.value!='')) {
        return true;
    } else {
       return false;
    }
}
/*function valid_url(campo) {
    alert("vamos a validar una url "+campo.value);
	var v = new RegExp();
    //v.compile("^[A-Za-z]+://[A-Za-z0-9-_]+\\.[A-Za-z0-9-_%&\?\/.=]+$");


    v.compile("^(ht|f)tp(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)( [a-zA-Z0-9\-\.\?\,\'\/\\\+&%\$#_]*)?$");
    if (!v.test(campo.value)) {
        return false;
    }
    return true;
}*/

function valid_email(campo)
{	
	if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(campo.value)) return true;
	else return false;
}

function filerequired(campo) {
// La dejamos por si tenemos que hacer que un archivo sea requerido.
}


function extensiones(campo) {

   archivo = campo.value;
   
   extensiones_permitidas = new Array(".gif", ".jpg", ".doc", ".pdf");
   
   mierror = "";
   if (!archivo) {
      //Si no tengo archivo, es que no se ha seleccionado un archivo en el formulario
       return false;
   }else{
      //recupero la extensión de este nombre de archivo
      extension = (archivo.substring(archivo.lastIndexOf("."))).toLowerCase();
      //alert (extension);
      //compruebo si la extensión está entre las permitidas
      permitida = false;
      for (var i = 0; i < extensiones_permitidas.length; i++) {
         if (extensiones_permitidas[i] == extension) {
         permitida = true;
         break;
         }
      }
      if (!permitida) {
         //mierror = "Comprueba la extensión de los archivos a subir. \nSólo se pueden subir archivos con extensiones: " + extensiones_permitidas.join();
         return false;
       }else{
          //submito!
         return true;
       }
   }
   //si estoy aqui es que no se ha podido enviar el forum
   return false;
}

function max_length(campo, parametro) {
	var v = campo.value;
	if(v.length > parseInt(parametro)) return false;
	return true;
}

function min_length(campo, parametro) {
	var v = campo.value;
	if(v.length < parseInt(parametro)) return false;
	return true;
}

function match(campo, campo_igual) {
	//alert("El formulario es : " +formulario);
	var c = formulario[campo_igual];	
	if(campo.value == c.value) return true;
	else return false;
}

/**
 * VALIDAR FECHA 
 **/
 
var dtCh= "-";
var minYear=1900;
var maxYear=2100;

/*function isInteger(s){
	var i;
    for (i = 0; i < s.length; i++){   
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    // All characters are numbers.
    return true;
}*/

function integer(s){
    var i;
        //alert("Comprobamos func " +s);
        valor1 = s.value;
    if(valor1 != '') {
        for (i = 0; i < valor1.length; i++){
            // Check that current character is number.
            var c = valor1.charAt(i);
            if (((c < "0") || (c > "9"))) return false;
        }
        // All characters are numbers.
        return true;
    } else {
        return false;
    }
}

function is_natural_no_zero(s){
	var i;
        valor2 = s.value;
//alert("miramos "+ valor);
    if(valor2 != '' && parseInt(valor2) > 0) {
    /*if(parseInt(valor2)!=0 && s != '') {
        for (i = 0; i < valor2.length; i++){
    
            var c = valor2.charAt(i);
            if (((c < "1") || (c > "9"))) return false;
        }*/
    
        return true;
    } else {
        return false;
    }
}

/*function alpha_numeric(s){
    var i;
    valor3 = s.value;

    if(valor3 != '') {

        for (i = 0; i < valor3.length; i++){
            // Check that current character is number.
            var c = valor3.charAt(i);
            if (!( ((c >= "A") || (c <= "Z")) || ((c >= "a") || (c <= "z")) || ((c >= "1") || (c <= "9")) )) return false;
        }
        return true;
    } else {
        return false;
    }
}*/
function alpha_numeric(campo){
    var RegExPattern = /^[a-z0-9]+$/;
    //var errorMessage = 'Password Incorrecta.';
    if ((campo.value.match(RegExPattern)) && (campo.value!='')) {
        return true;
    } else {
       return false;
    }
}

function stripCharsInBag(s, bag){
	var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < s.length; i++){   
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

function daysInFebruary (year){
	// February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}
function DaysArray(n) {
	for (var i = 1; i <= n; i++) {
		this[i] = 31
		if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
		if (i==2) {this[i] = 29}
   } 
   return this
}

function fecha(campo){
	var dtStr= campo.value;
	var daysInMonth = DaysArray(12);
	var pos1 = dtStr.indexOf(dtCh);
	var pos2 = dtStr.indexOf(dtCh,pos1+1);
	var strMonth = dtStr.substring(pos1+1,pos2);
	var strDay = dtStr.substring(pos2+1);
	var strYear = dtStr.substring(0,pos1);
	
	strYr = strYear;
	if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1);
	if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1);
	for (var i = 1; i <= 3; i++) {
		if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1);
	}
	month=parseInt(strMonth);
	day=parseInt(strDay);
	year=parseInt(strYr);
	if (pos1==-1 || pos2==-1){
		//alert("The date format should be : mm/dd/yyyy")
		return false;
	}
	if (strMonth.length<1 || month<1 || month>12){
		//alert("Please enter a valid month")
		return false;
	}
	if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
		//alert("Please enter a valid day")
		return false;
	}
	if (strYear.length != 4 || year==0 || year<minYear || year>maxYear){
		//alert("Please enter a valid 4 digit year between "+minYear+" and "+maxYear)
		return false;
	}
	if (dtStr.indexOf(dtCh,pos2+1)!=-1 || integer(stripCharsInBag(dtStr, dtCh))==false){
		//alert("Please enter a valid date")
		return false;
	}
	return true;
}

/**
 * FIN VALIDAR FECHA 
 **/


/*********** INICI RESULTATS *********/

function oculta_resultats()
{
	for (var i=0; i<10; i++) 
	{
		document.getElementById('cons'+i).style.display = "none";
		
		//alert('cons'+i);
		//alert(i);
	}
}

function mostra_resultat(id_resultat)
{
	var valor;
	valor = id_resultat-1;
	//alert(valor);
	document.getElementById('cons'+valor).style.display = "block";
}

/*********** FI RESULTATS *********/


