//*****************************************************************
//
// Libreria Javascript para Chequeo de forms          BWD 4-4-2001
//
//*****************************************************************

/*parametros: 	-elemento sobre el que se aplica el checkform
				-formato que ha de tomar el mensaje de error (0=sin formato, ventana javascript, 1=con formato, layer html)
				-clase CSS de los inputs en estado normal
				-clase CSS de los inputs en estado de error
*/
function checkForm(element,formato,classInput,classError)
{
	//propiedades de la clase
	if(classInput===undefined) 	//especifica la clase css a aplicar en los inputs cuando no hay error, por defecto "formInput"
		this.claseForm = "formInput";
	else
		this.claseForm = classInput;
	if(classInput===undefined)
		this.claseError = "formError";  //especifica la clase css a aplicar en los inputs cuando aparece un error, por defecto "formError"
	else
		this.claseError =  classError;
	this.controldeflujo = 0; //indicador sobre si ha habido error 
	this.element = element; //elemento(formulario) sobre el que se se aplica el checkform
	this.formato = formato; //formato en el que se mostraran los errores (0=javascript; 1 = layers)
	
	//funciones de la clase
	this.ponEstiloError = ponEstiloError;
	this.limpiarEstilos = limpiarEstilos;
	this.PonFocus = PonFocus;
	this.ChequeoVacio = ChequeoVacio;
	this.ChequeoVacioList = ChequeoVacioList;
	this.ChequeoMail = ChequeoMail;
	this.ChequeoPassword = ChequeoPassword;
	this.ChequeoNumeros = ChequeoNumeros;
	this.ChequeoCombos = ChequeoCombos;
	this.ChequeoLongitud = ChequeoLongitud;
	this.ChequeoCamposTexto = ChequeoCamposTexto;
	this.ChequeoFecha = ChequeoFecha;
	this.ChequeoCheckbox = ChequeoCheckbox;
	this.CalculaNIF = CalculaNIF;
	this.CalculaNIE = CalculaNIE;
	this.muestraError = muestraError;
	this.repiteContrasenya =repiteContrasenya;
	this.validarCIF = validarCIF;
	this.ChequeaMayorEdad = ChequeaMayorEdad;
	this.ChequeoCero = ChequeoCero;
	this.ChequeoMovil = ChequeoMovil;
	this.end = end;	
	
	//limpiamos los estilos de todos los imputs, para luego poner el estilo de error en el que contenga error (si se da el caso)
	this.limpiarEstilos(element);
	
}

//FUNCIONES PRIVADAS (utilizadas solo en la clase)

//crea dinamicamente la capa dónde se mostrara el mensaje de error
function creaCapa(mensaje,field)
{
	//ojo, en explorer si la capa está creada no modificará el texto de explicación del error. Hay que diferenciar si la capa ha sido creada o no
	//si ha sido creada, solo hay que modificar el HTML, en caso contrario se debe crear la capa tambien
	
	if(document.getElementById("errorLayer")==null) //la capa no existe, hay que crearla
	{
		newDiv = document.createElement("div");
		newDiv.setAttribute("id","errorLayer");
		newDiv.setAttribute("name","errorLayer");
	}
	field=field.id;
	codigo = '<p>&nbsp;</p>  <p>&nbsp;</p>  <table border="0" align="center" cellpadding="0" cellspacing="0">    <tr>      <td class="errSupIzq">&nbsp;</td>      <td class="errPixelSup">&nbsp;</td>      <td class="errSupDcha">&nbsp;</td>    </tr>    <tr>      <td class="errPixelIzq">&nbsp;</td>      <td class="errTexto"><p><img src="js/checkForm/images/errorIcon.png" align="middle" /><span class="errTitulo"> ERROR</span></p>        <p align="center" class="errTexto">'+mensaje+'</p>      <p onclick="document.getElementById(\'errorLayer\').style.visibility=\'hidden\';PonFocus2(\''+field+'\');"><a href="#" class="mensajeCerrar">Cerrar</a></p></td>      <td class="errPixelDcha">&nbsp;</td>    </tr>    <tr>      <td class="errInfIzq">&nbsp;</td>      <td class="errPixelInf">&nbsp;</td>      <td class="errInfDcha">&nbsp;</td>    </tr>  </table>  <p align="center" class="Estilo1">&nbsp;</p>';
	
	if(document.getElementById("errorLayer")==null) //la capa no existe
	{
		newDiv.innerHTML = codigo;
		document.body.appendChild(newDiv);
	}
	else //la capa existe, solo hay que modificar el codigo HTML de la capa
	{
		document.getElementById("errorLayer").innerHTML = codigo;	
	}
}

//devuelve a todos los inputs del elemento sobre el que se aplica el checkform su valor de clase css original
function limpiarEstilos(element)
{
	for(x=0;x<document.getElementById(element).length;x++)
	{
		document.getElementById(element).elements[x].className = this.claseForm;
	}
}

//impone al input que contiene el error el valor de la clase css que representa al error
function ponEstiloError(field)
{
	field.className = this.claseError;
}

//pone el focus en el campo donde se ha producido el error
function PonFocus(Objeto){
   Objeto.focus();
   Objeto.blur();
   Objeto.select();
}
function PonFocus2(Objeto){
	Objeto=document.getElementById(Objeto)
   Objeto.focus();
   Objeto.blur();
   Objeto.select();
}

//en modo de errores formateados(error mostrado en capa), crea la capa y posteriormente la muestra 
function muestraError(mensaje,field)
{
	creaCapa(mensaje,field);  //creamos la capa donde se mostrará el error, pasando el texto explicativo del error
	document.getElementById("errorLayer").style.visibility = "visible"; //mostramos la capa de error
}

//pasandole una fecha de nacimiento calcula la edad de una persona a dia de hoy
function calcular_edad(dia,mes,ano)
{
    //calculo la fecha de hoy
    hoy=new Date()

    //resto los años de las dos fechas
    edad=(hoy.getYear()+1900)- ano - 1; //-1 porque no se si ha cumplido años ya este año
	
	if(edad>1000) edad = edad-1900;  //parche para ie

    //si resto los meses y me da menor que 0 entonces no ha cumplido años. Si da mayor si ha cumplido
    if (hoy.getMonth() + 1 - mes < 0) //+ 1 porque los meses empiezan en 0
       return edad
    if (hoy.getMonth() + 1 - mes > 0)
       return edad+1

    //entonces es que eran iguales. miro los dias
    //si resto los dias y me da menor que 0 entonces no ha cumplido años. Si da mayor o igual si ha cumplido
    if (hoy.getUTCDate() - dia >= 0)
       return edad + 1

    return edad
}







//FUNCIONES PUBLICAS (METODOS DE LA CLASE)

//si no se han producido errores, hace un submit del formulario sobre el que se hace el checkform
function end(url,parametros,contenido,loader,tipo)
{
	if (this.controldeflujo==0)
	{
		llamarAjax(url,parametros,contenido,loader,tipo);
	}
	
}

function ChequeoVacio(field,bufalo)
{
  if (this.controldeflujo==0)
  {
    if (field.value == "") 
	{
		if(this.formato)
		{
			this.ponEstiloError(field);
			this.muestraError("El campo de "+bufalo+" est&aacute; vac&iacute;o por favor rell&eacute;nalo",field);
		}
		else
		{
			alert("El campo '"+bufalo+"' est&aacute; vac&iacute;o por favor rell&eacute;nalo");
       	PonFocus(field);
		}
		this.controldeflujo=1;
    }
  }
}

function ChequeoCheckbox(field,bufalo)
{
	if (this.controldeflujo==0)
	{
    	if (!field.checked) 
		{
			if(this.formato)
			{
				this.ponEstiloError(field);
				//this.muestraError("Debes de leer y aceptar las 'condiciones legales' para poder continuar",field);
			}
			else
			{
				alert("Debes de leer y aceptar las 'condiciones legales' para poder continuar");
       			PonFocus(field);
			}
		this.controldeflujo=1;
		}
    }	
}

function ChequeoVacioList(field,bufalo){
  if (this.controldeflujo==0){
    if (field.options.length == 0) 
	{
		if(this.formato)
		{
			this.ponEstiloError(field);
			this.muestraError("El campo de "+bufalo+" est&aacute; vac&iacute;o por favor rell&eacute;nalo",field);
		}
		else
		{
			alert("El campo '"+bufalo+"' est&aacute; vac&iacute;o por favor rell&eacute;nalo");
       		PonFocus(field);
		}
		this.controldeflujo=1;
    }
  }
}


function ChequeoMail(field,bufalo){
 if (this.controldeflujo==0){
   if ((field.value.indexOf("@") == -1)  || (field.value.indexOf(".") == -1 ))
   {
	   if(this.formato)
		{
			this.ponEstiloError(field);
			this.muestraError("El "+bufalo+" parece no ser correcto.\nPor favor rev&iacute;salo",field);
		}
		else
		{
			alert("El '"+bufalo+"' parece no ser correcto.\nPor favor rev&iacute;salo");
       		PonFocus(field);
		}
	this.controldeflujo=1;
   }
 }
}

function ChequeoPassword(password,repassword)
{
 if (this.controldeflujo==0)
 {
   if (password!=repassword)
   {
	   if(this.formato)
		{
			this.ponEstiloError(field);
			this.muestraError("Por favor aseg&uacute;rate de que has repetido correctamente la contrase&ntilde;a",field);
		}
		else
		{
			alert("Por favor aseg&uacute;rate de que has repetido correctamente la contrase&ntilde;a");
       		PonFocus(field);
		}
	 this.controldeflujo=1;
   }
 }
}

function ChequeoNumeros(field,bufalo){
 if (this.controldeflujo==0){
    var ok;
    var c1;
    estado = "inicio"; 
    c1 = 0;
    var str1;
    str1 = field.value;
    while (estado=="inicio"){
        if (str1.substring(c1,c1+1)!='1' &&
            str1.substring(c1,c1+1)!='2' &&
            str1.substring(c1,c1+1)!='3' &&
            str1.substring(c1,c1+1)!='4' &&
            str1.substring(c1,c1+1)!='5' &&
            str1.substring(c1,c1+1)!='6' &&
            str1.substring(c1,c1+1)!='7' &&
            str1.substring(c1,c1+1)!='8' &&
            str1.substring(c1,c1+1)!='9' &&
            str1.substring(c1,c1+1)!='0')
                {estado="kaka";};
      	c1++;
	if (c1>str1.length) {
	   estado="final";
      return(true);
	   this.controldeflujo=1;
	}
    }
    if (estado=="kaka") {
		if(this.formato)
		{
			this.ponEstiloError(field);
			this.muestraError("El campo "+bufalo+" debe ser un n&uacute;mero",field);
		}
		else
		{
			alert("El campo "+bufalo+" debe ser un n&uacute;mero");
       		PonFocus(field);
		}
        
		  this.controldeflujo=1;
        return(false);
    }
 }
}

function ChequeoCombos(field,bufalo){
 if (this.controldeflujo==0){
 if (field.value=="-" ) 
 	{
		if(this.formato)
		{
			this.ponEstiloError(field);
			this.muestraError("Debes seleccionar una opci&oacute;n del desplegable en " + bufalo,field);
		}
		else
		{
			alert("Debes seleccionar una opci&oacute;n del desplegable en " + bufalo);
       		PonFocus(field);
		}
	this.controldeflujo=1;
	}
 }
}

function ChequeoMovil(field,bufalo){ 
if (this.controldeflujo==0){
	if(field.value.length!=9 || !/^([0-9])*$/.test(field.value) || field.value.substring(0,1)!=6){ 
		this.ponEstiloError(field);
		this.muestraError("El campo "+bufalo+" debe ser un n&uacute;mero correcto<br>(No dejes espacio entre los n&uacute;meros)",field);
		this.controldeflujo=1;
	}
}
	
}
function ChequeoCero(field){
 if (this.controldeflujo==0){
	 if (field.value<=0 ){	
			if(this.formato)
			{
				this.ponEstiloError(field);
				this.muestraError("La apuesta m&iacute;nima es de 1 punto",field);
			}
			else
			{
				alert("La apuesta m&iacute;nima es de 1 punto");
				PonFocus(field);
			}
	this.controldeflujo=1;
	}
 }
}

function ChequeoLongitud(field,bufalo,longitud) 
{
	if (this.controldeflujo==0)
	{ 	
		if (field.value.length<longitud) 
  		{
			if(this.formato)
			{
				this.ponEstiloError(field);
				this.muestraError("El campo '" + bufalo + "' debe de tener como m&iacute;nimo "+longitud+" caracteres",field);
			}
			else
			{
				alert("El campo '" + bufalo + "' debe de tener como m&iacute;nimo "+longitud+" caracteres");
    	   		PonFocus(field);
			} 
			this.controldeflujo=1;
  		}	
  	}
}
 
 function ChequeoCamposTexto(field,bufalo){
 if (this.controldeflujo==0){ 
  if (field.value.length>1000 && controldeflujo==0) 
 	{
		if(this.formato)
		{
			this.ponEstiloError(field);
			this.muestraError("Has excedido el n&uacute;mero m&aacute;ximo de caracteres disponibles para el campo" + bufalo,field);
		}
		else
		{
			alert("Has excedido el n&uacute;mero m&aacute;ximo de caracteres disponibles para el campo" + bufalo);
       		PonFocus(field);
		}
	this.controldeflujo=1;
 }	}
}


function ChequeoFecha(ob_dia,ob_mes,ob_anyo,bufalo)
{
	b=new Date();
	a=b.getYear();
	if (a>100 && a<110)
	{
		a=(a-100)+2000;
	}
	
	if(this.ChequeoNumeros(ob_anyo,bufalo) && this.ChequeoNumeros(ob_mes,bufalo) && this.ChequeoNumeros(ob_dia,bufalo))
	{		
		//comprobamos que el año es correcto
		Anyo1 = ob_anyo.value;
		if (Anyo1 != "" && this.controldeflujo==0)
		{
			if (this.controldeflujo == 0)
			{
				if ((Anyo1 < 1900) || (Anyo1 > a))
				{
						if(this.formato)
						{
							this.ponEstiloError(ob_anyo);
							this.muestraError("El a&ntilde;o debe ser entre 1900 y "+a+" en "+bufalo,ob_anyo);
						}
						else
						{
							alert("El a&ntilde;o debe ser entre 1900 y "+a+" en "+bufalo);
							PonFocus(ob_anyo);
						}
						this.controldeflujo=1;
				}
			}
		}
		
		dia=ob_dia.value;
		mes=ob_mes.value;
		anyo=ob_anyo.value;
		
		if (this.controldeflujo==0 && anyo!="")
		{
			//comprobacion que el año es menor que 12
			if(mes > 12)
			{
				if(this.formato)
				{
					this.ponEstiloError(ob_mes);
					this.muestraError("El mes debe ser entre 1 y 12",ob_mes);
				}
				else
				{
					alert("El mes debe ser entre 1 y 12"); 
					PonFocus(ob_mes);
				}
				this.controldeflujo=1;
			}
			else
			{
				if(dia > 31)
				{
					if(this.formato)
					{
						this.ponEstiloError(ob_dia);
						this.muestraError("El d&iacute;a debe ser entre 1 y 31",ob_dia);
					}
					else
					{
						alert("El d&iacute;a debe ser entre 1 y 31"); 
						PonFocus(ob_mes);
					}
					this.controldeflujo=1;
				}	
				if ((dia>=31 && mes==4) || (dia>=31 && mes==2) || (dia>=31 && mes==6) || (dia>=31 && mes==9) || (dia>=31 && mes==11))
				{
					if(this.formato)
					{
						this.ponEstiloError(ob_dia);
						this.muestraError("El d&iacute;a est&aacute; mal con el mes "+mes+" en "+bufalo,ob_dia);
					}
					else
					{
						alert("El d&iacute;a est&aacute; mal con el mes "+mes+" en "+bufalo); 
						PonFocus(ob_dia);
					}
					this.controldeflujo=1;
				}
				if (dia>=30 && mes==2)
				{
					if(this.formato)
					{
						this.ponEstiloError(ob_dia);
						this.muestraError("El d&iacute;a est&aacute; mal con el mes "+mes+" en "+bufalo,ob_dia);
					}
					else
					{
						alert("El d&iacute;a est&aacute; mal con el mes "+mes+" en "+bufalo); 
						PonFocus(ob_dia);
					}
					this.controldeflujo=1;
				}
				if (dia>=29 && mes==2 && (anyo%4)!=0)
				{
					if(this.formato)
					{
						this.ponEstiloError(ob_dia);
						this.muestraError("El d&iacute;a est&aacute; mal con el mes "+mes+" y el a&ntilde;o "+anyo+" en "+bufalo,ob_dia);
					}
					else
					{
						alert("El d&iacute;a est&aacute; mal con el mes "+mes+" y el a&ntilde;o "+anyo+" en "+bufalo); 
						PonFocus(ob_dia);
					}
					this.controldeflujo=1;
				}
			}
		}
	}
}

function ChequeaMayorEdad(ob_dia,ob_mes,ob_anyo,bufalo)
{
	if((calcular_edad(ob_dia.value,ob_mes.value,ob_anyo.value)<18) && this.controldeflujo==0)
	{
		if(this.formato)
		{
			this.ponEstiloError(ob_dia);
			this.muestraError("Debes ser mayor de edad",ob_dia);
		}
		else
		{
			PonFocus(ob_dia);
		}
		this.controldeflujo=1;
	}
}

function CalculaNIF(Dni,letra,field){
 if (this.controldeflujo==0){ 	
	var clave=new Array("T","R","W","A","G","M","Y","F","P","D","X"
			   ,"B","N","J","Z","S","Q","V","H","L","C",
			    "K","E");
	if (isNaN(Dni)){
		
		if(this.formato)
		{
			this.ponEstiloError(field);
			this.muestraError("El DNI debe estar formado exclusivamente por n&uacute;meros",field);
		}
		else
		{
			alert("El DNI debe estar formado exclusivamente por n&uacute;meros");
			PonFocus(field);
		}
		this.controldeflujo=1;
	}
	else{
		if (clave[Dni%23]!=letra.toUpperCase()){
			
			if(this.formato)
			{
				this.ponEstiloError(field);
				this.muestraError("El DNI o NIF no parece ser v&aacute;lido.\nRepasa la entrada de n&uacute;meros y la letra.",field);
			}
			else
			{
				alert("El DNI o NIF no parece ser v&aacute;lido.\nRepasa la entrada de n&uacute;meros y la letra.");
				PonFocus(field);
			}
			this.controldeflujo=1;
		}
       }
  }
}

function CalculaNIE(Dni,letra,field){
 if (this.controldeflujo==0){ 
	nie=Dni.substr(1);
	var clave=new Array("T","R","W","A","G","M","Y","F","P","D","X"
			   ,"B","N","J","Z","S","Q","V","H","L","C",
			    "K","E");
	if (isNaN(nie)){
		
		if(this.formato)
			{
				this.ponEstiloError(field);
				this.muestraError("El NIE debe empezar por 'X' y seguidamente estar formado exclusivamente por n&uacute;meros",field);
			}
			else
			{
				alert("El NIE debe empezar por 'X' y seguidamente estar formado exclusivamente por n&uacute;meros");
				PonFocus(field);
			}
		this.controldeflujo=1;
	}
	else{
		if (clave[nie%23]!=letra.toUpperCase()){
			if(this.formato)
			{
				this.ponEstiloError(field);
				this.muestraError("El NIE no parece ser v&aacute;lido.\nRepasa la entrada de n&uacute;meros y la letra.",field);
			}
			else
			{
				alert("El NIE no parece ser v&aacute;lido.\nRepasa la entrada de n&uacute;meros y la letra.");
				PonFocus(field);
			}
			this.controldeflujo=1;
		}
	}
 }
}

function repiteContrasenya(field,field2){
 if (this.controldeflujo==0){ 
  if (field.value!=field2.value){
		if(this.formato){
			this.ponEstiloError(field);
			this.ponEstiloError(field2);
			this.muestraError("El campo de contrase&ntilde;a es diferente al de Repite-contrase&ntilde;a",field);
		}else{
			alert("El campo de contrase&ntilde;a es diferente al de Repite-contrase&ntilde;a");
       	PonFocus(field);
		}
	this.controldeflujo=1;
  }	
 }
}

 function validarCIF(texto,bufalo,field){
	 if (this.controldeflujo==0){        
        var pares = 0;
        var impares = 0;
        var suma;
        var ultima;
        var unumero;
        var uletra = new Array("J", "A", "B", "C", "D", "E", "F", "G", "H", "I");
        var xxx;
        
        texto = texto.toUpperCase();
        
        var regular = new RegExp(/^[ABCDEFGHKLMNPQS]\d\d\d\d\d\d\d[0-9,A-J]$/g);
         if (!regular.exec(texto))
			{
				
				if(this.formato){
					this.ponEstiloError(field);
					this.muestraError("El "+bufalo+" parece no ser correcto",field);
				}else{
					alert("El "+bufalo+" parece no ser correcta");
					PonFocus(field);
				}
				this.controldeflujo=1;
			}
             
         ultima = texto.substr(8,1);

         for (var cont = 1 ; cont < 7 ; cont ++){
             xxx = (2 * parseInt(texto.substr(cont++,1))).toString() + "0";
             impares += parseInt(xxx.substr(0,1)) + parseInt(xxx.substr(1,1));
             pares += parseInt(texto.substr(cont,1));
         }
         xxx = (2 * parseInt(texto.substr(cont,1))).toString() + "0";
         impares += parseInt(xxx.substr(0,1)) + parseInt(xxx.substr(1,1));
         
         suma = (pares + impares).toString();
         unumero = parseInt(suma.substr(suma.length - 1, 1));
         unumero = (10 - unumero).toString();
         if(unumero == 10) unumero = 0;
         
         if ((ultima == unumero) || (ultima == uletra[unumero])){
             this.controldeflujo=0;
			}else{          
				if(this.formato){
					this.ponEstiloError(field);
					this.muestraError("El "+bufalo+" parece no ser correcto",field);
				}else{
					alert("El "+bufalo+" parece no ser correcto");
					PonFocus(field);
				}
				this.controldeflujo=1;
			}
	 }
} 