/******************************************************************/
/******************************************************************/
/* FUNCIONES.JS:
	@Descripcion: Documento con funciones JavaScript genéricas para los 
	formularios web.
	@Version: 1.0
	@Autor: David Suárez da Sliva.
	@Fecha de ultima modificacion: 24/06/2009.*/
/******************************************************************/
/******************************************************************/

// ------------- FUNCIONES PARA COMPROBACIONES ----------------//
//Expresiones Regulares.
var reAlgo=/\S+/;//Para comprobar si el campo está vacío.
var reNum=/^(\d)*$/;//Para comprobar si un campo es númerico.
var rePrecio=/^((\d+)|(\d+).(\d){1,2})$/;//Para comprobar un precio(hasta 2 decimales con coma de separador decimal).
var reTfno=/^((\d{6,12}))*$/;//Para comprobar si un campo es un teléfono.
var reEmail=//;//Para comprobar si un campo tiene la sintaxis correcta de un email.

// Compara 2 fechas. 
// Si String1>String2 entonces devuelve false.
// Si tipoFecha es true las fechas vienen en formato americano.
function Comparar_Fecha(String1,String2,tipoFecha) {
	sFecha1 = new String(String1);
	sFecha2 = new String(String2);
	if (!tipoFecha) {
		ArrayFecha1=sFecha1.split("/");
		ArrayFecha2=sFecha2.split("/");
		sFecha1=ArrayFecha1[1]+"/"+ArrayFecha1[0]+"/"+ArrayFecha1[2];
		sFecha2=ArrayFecha2[1]+"/"+ArrayFecha2[0]+"/"+ArrayFecha2[2];
	} else {
		sFecha1 = String1;
		sFecha2 = String2;
	}
	//date.parse lo que hace es devolverte un numero entero, con lo cual la comparacion es asi de simple
	numFecha1=Date.parse(sFecha1);
	numFecha2=Date.parse(sFecha2);

	if (numFecha1>numFecha2) return false 
	return true;
}
// ------------- FIN DE FUNCIONES PARA COMPROBACIONES ----------------//

// ------------- FUNCIONES PARA FORMATOS ----------------//

/* Esta función es una función auxiliar para validarFecha que comprueba si un año es bisiesto.
 * false si no es correcto el formato(dd/mm/aaaa) o (dd/mm/aa).
 * - Parámetros:
 * @ anyo> anho a comprobar.
 */
function esBisiesto(anyo) {
	//si el año introducido es de dos cifras lo pasamos al periodo de 1900. Ejemplo: 25 > 1925
	if (anyo < 100) var fin = anyo + 1900;
    else var fin = anyo ;
    /** primera condicion: si el resto de dividir el año entre 4 no es cero > el año no es bisiesto
     * es decir, obtenemos año modulo 4, teniendo que cumplirse anyo mod(4)=0 para bisiesto
     */
 	if (fin % 4 != 0) return false;
    else {
    	if (fin % 100 == 0) {
        	//si el año es divisible por 4 y por 100 y divisible por 400 > es bisiesto
            if (fin % 400 == 0) return true;
            //si es divisible por 4 y por 100 pero no lo es por 400 > no es bisiesto
            else return false;
        }//si es divisible por 4 y no es divisible por 100 > el año es bisiesto
        else return true;
    }
}

/* Esta funcion valida la fecha que se pasa por parametro. Retorna true si hay éxito y
 * false si no es correcto el formato(dd/mm/aaaa) o (dd/mm/aa).
 * - Parámetros:
 * @ Cadena-> cadena que contiene la fecha a validar.
 */
function validarFecha(Cadena){
	var Fecha= new String(Cadena)	// Crea un string
	var RealFecha= new Date()	// Para sacar la fecha de hoy
	var Ano= new String(Fecha.substring(Fecha.lastIndexOf("/")+1,Fecha.length))
	var Mes= new String(Fecha.substring(Fecha.indexOf("/")+1,Fecha.lastIndexOf("/")))
	var Dia= new String(Fecha.substring(0,Fecha.indexOf("/")))
	
	if (isNaN(Ano) || Ano.length<4 || parseFloat(Ano)<1900 || Ano.length>4)	return false;
	
	//comprobamos q el año no sea inferior a 1900 ni tenga solo 3 cifras, ya q sino da problemas de formato.
	if(Ano.length==4)
		if (Ano<1900) return false;
	
	if (Ano.length==3) return false;
	
	//fin comprobar año
	if (isNaN(Mes) || Mes.length>2 || Mes.length<1 || parseFloat(Mes)<1 || parseFloat(Mes)>12) return false;
	
	if (isNaN(Dia) || Dia.length<1 || Dia.length>2 || parseFloat(Dia)<1 || parseFloat(Dia)>31) return false;
	
	var bisiesto=esBisiesto(Ano)
	if (Mes==4 || Mes==6 || Mes==9 || Mes==11 || Mes==2) 
		if ( ((Mes==2) && (Dia > 28) && !(bisiesto) ) || (Dia>30) || ((bisiesto) && (Mes==2) && (Dia>29))) return false;
	
 	return true	
}

/* Esta función valida una dirección de email.
 * false si no es correcto el formato(dd/mm/aaaa) o (dd/mm/aa).
 * - Parámetros:
 * @ email> email a comprobar.
 */
function validarEmail(email) {
	caracNoValidos = " /:,;";
	if(email == "") return false; 							// debe rellenarse
	for(i = 0; i < caracNoValidos.length; i++) {			// ¿hay algún carácter no válido?
		caracMal = caracNoValidos.charAt(i);
		if(email.indexOf(caracMal,0) > -1) return false;
	}
	posArroba = email.indexOf("@",1); 						// debe haber una @
	if(posArroba == -1) return false;
	if(email.indexOf("@",posArroba+1) != -1) return false;	// y sólo una
	posPunto = email.indexOf(".",posArroba);
	if(posPunto == -1) return false;  						// y al menos un . después de la @
	if(posPunto+3 > email.length) return false; 			// debe haber al menos 2 caracteres tras el .
	return true;
}

/* Esta funcion valida la hora que se pasa por parametro. Retorna un 0 si hay éxito y
 * -1 si no es correcto el formato(dd:dd:dd) o los rangos(24horas).
 * - Parámetros:
 * @ hora_a_validar-> cadena que contiene la hora a validar.
 */
function ComprobarFormatoHora24(hora_a_validar) {
	var ExpReg=/^\d{2}:\d{2}:\d{2}$/;//formato de la hora en Expresion Regular
	
	if (ExpReg.test(hora_a_validar)) {
		var hora_array = hora_a_validar.split(":");
		var hora = parseInt(hora_array[0]);
		var minutos = parseInt(hora_array[1]);
		var segundos = parseInt(hora_array[2]);
		
		if ( (hora<0) || (hora>23) ) return (-1);
		if ( (minutos<0) || (minutos>59) ) return(-1);
		if ( (segundos<0) || (segundos>59) ) return(-1);
	} else { return (-1); }
	
	//Todo correcto...
	return (0);
}

/* Esta funcion valida la hora que se pasa por parametro. Retorna un 0 si hay éxito y
 * -1 si no es correcto el formato(dd:dd) o los rangos(24horas).
 * - Parámetros:
 * @ hora_a_validar-> cadena que contiene la hora a validar.
 */
function ComprobarFormatoHoraMinutos24(hora_a_validar) {
	var ExpReg=/^\d{2}:\d{2}$/;//formato de la hora en Expresion Regular
	
	if (ExpReg.test(hora_a_validar)) {
		var hora_array = hora_a_validar.split(":");
		var hora = parseInt(hora_array[0]);
		var minutos = parseInt(hora_array[1]);
		
		if ( (hora<0) || (hora>23) ) return (-1);
		if ( (minutos<0) || (minutos>59) ) return(-1);
	} else { return (-1); }
	
	//Todo correcto...
	return (0);
}

/* Esta funcion comprueba el formato del numero de documento que se pasa por parámetro
 * Si es un nif comprueba si son 8 dígitos y una letra y si es un cif comprueba que sea
 * una letra y ocho digitos. Luego comprueba si la letra y el numero son correctos.
 * Retorna -1 si es incorrecto y 0 si es correcto y -2 si está vacío.
 * Parámetros:
 * @ documento-> cadena que contiene el número de documento a validar.
 */
function iValidarNifCif(documento) {
	var Vacio=/\S+/;
	var resultado;
	if (!Vacio.test(documento)) return (-2);

	if (documento.length!=9) return (-1);
	documento = documento.toUpperCase(documento);
	if ( !isNaN(documento.charAt(0)) ) {//se trata de un nif.
		resultado = nifValido(documento);
		return (resultado);
	} else {//se trata de un cif o un nie.
		
		if (documento.charAt(0)=="X") {//es un nie.
			documento = "0"+ documento.substring(1);
			resultado = nifValido(documento);
			return (resultado);
		} else {// es un cif.
			resultado = cifValido(documento);
			return (resultado);
		}
	}
}

/* Esta función valida un dni. Devuelve un 0 si es correcto y un -1 en caso contrario
 */
function nifValido(num_doc) {
	//cojo la letra.
	var letraIntroducida = num_doc.toUpperCase().substring(8);
	var letras = "TRWAGMYFPDXBNJZSQVHLCKET"
	var numero = parseInt(num_doc);
	numero = numero % 23;
	
	if ( letraIntroducida == letras.charAt(numero) ) return (0);
		else return (-1);
}

/* Esta función valida un cif. Devuelve un 0 si es correcto y un -1 en caso contrario
 */
function cifValido(numero_doc) {
	var v1 = new Array(0,2,4,6,8,1,3,5,7,9); 
    var temp = 0;
	var num = numero_doc.toUpperCase();
	var letra="";

    for( i = 2; i <= 6; i += 2 ) 
    {
      temp = temp + v1[ parseInt(num.substr(i-1,1)) ];
      temp = temp + parseInt(num.substr(i,1));
    };

    temp = temp + v1[ parseInt(num.substr(7,1)) ];
    temp = (10 - ( temp % 10));
	
	//si es una clave de caracter
	if ( (num.charAt(0)=="P") || (num.charAt(0)=="Q") || (num.charAt(0)=="S") ){
		temp+=40;
	 	letra = unescape("%"+temp);
		if ( letra == num.charAt(8))  return (0);
		else return (-1);
	} 
	//si es una clave numerica
	if (temp ==10) temp =0;
	if ( temp == num.charAt(8))  return (0);
	else return (-1);
}
// ---------------- FIN DE FUNCIONES PARA FORMATOS ----------------//


// ------------- FUNCIONES DE PROPOSITO GENERAL ----------------//
// Crea una ventana flotante(puede modificar tamaño).
function wVentana(URL,id,x,y) {
	return window.open(URL,id, "toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width="+x+",height="+y+",left=0,top=0");
}

// Crea una ventana flotante(puede modificar tamaño). Tiene activado las barras de scroll.
function wVentanaConScroll(URL,id,x,y) {
	return window.open(URL,id, "toolbar=0,scrollbars=1,location=0,statusbar=0,menubar=0,resizable=0,width="+x+",height="+y+",left=0,top=0");
}

// Centra una ventana (según su tamaño) en la pantalla.
function vCentrarVentana(objVentana, width, height) {
	x = (screen.width - width) / 2;
    y = (screen.height - height) / 2;
    objVentana.moveTo(x, y);
}

// Función para dar el foco a un campo de un formulario.
function vDarFoco(IdElemento) {
	document.getElementById(IdElemento).focus();
}
// ------------- FIN DE FUNCIONES DE PROPOSITO GENERAL ----------------//

// ------------- FUNCIONES PARA AJAX ----------------//

/** funcion: nuevoAjax()
 * Funcion que devuelve un objeto preparado para enviar peticiones Ajax
 */
function nuevoAjax(){
	var xmlhttp=false;

	if (window.XMLHttpRequest) {//Netscape,
        xmlhttp = new XMLHttpRequest();
    } else if (window.ActiveXObject) {//IE
        try {xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");} 
		catch (e) {
			try {xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");} 
			catch (E) {xmlhttp = false;}
		}
    }
	return xmlhttp;
}

// ------------- FIN DE FUNCIONES PARA AJAX ----------------//
