/**************************************************************\
          Scripts de comprobación genéricos.
          ==================================

   El objetivo de esta biblioteca es aunar las comprobaciones
de javascript para que sean mas sencillas de mantener en un
futuro.

\**************************************************************/



/*
FUNCION es_email
================

Devuelve si el email introducido está bien formado o si no lo
está. Admite una lista de emails separados por comas.

Actualmente soporta los nombres de dominio:
   - Dos letras (para no poner todos los posibles paises)
   - .com
   - .net
   - .org
   - .mil
   - .int
   - .edu
   - .biz
   - .info
   - .name
   - .gov

FUNCION es_email
=================



*/

/*****************************************************************************************************************
funcion verifyEmail

Parámetros de entrada: 
	- s: String
	
Parámetros de salida: true o false
Es referenciada por: validateFields()
Descripción: Devuelve true si la cadena "s" es un nombre de email correcto y false en caso contrario.

Ejemplo: 	var str=document.regform.codigo.value;
	   		if (!verifyEmail(str)){
                strErrorMsg+='      * Email \n';
        		}
*********************************************************************************************************************/
function verifyEmail(s) {
        var chrs = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-@';
        var sLen = s.length; var i=0, c=0, cCnt=0, step=0;
        if (sLen < 6) return false;
        while (i < sLen){
                c=s.charAt(i);
                if (!(chrs.indexOf(c)>=0 || (c=='_' && step<1))) return false;
                if (c=='.') { if (cCnt<1) return false; cCnt=0; }
                if (c=='@') { if (step>0) return false; if (cCnt<1) return false; step++; cCnt=0; }
                cCnt=cCnt+1; i++;
        }       
        if (cCnt < 3 || cCnt > 5 || step==0 || (s.indexOf(".")<0) ) return false;
		
		var array = s.split('@');
		if (array[0].length < 3) return false;
		else{
			var array2 = array[1].split('.');
			if (array2[0].length < 3) return false;
			}
		
        return true;
}

function es_email(v){
   var limpio, a_emails, ok, idx_emails;
   idx_emails=0;
   a_emails=v.split(",");
   while((idx_emails<a_emails.length)&&(ok=_es_email(_trim(a_emails[idx_emails++]))));
   return ok;
}

function _es_email(v){
   var t=/^(\w|\~)(\w|\~|\.|\-)*@(\w|\~)(\w|\~|\.|\-)*\.(([A-Za-z]{2})|([bB][iI][zZ])|([Ii][Nn][Ff][Oo])|([Cc][Oo][Mm])|([Nn][Ee][Tt])|([Oo][Rr][Gg])|([Mm][Ii][Ll])|([Ii][Nn][Tt])|([Ee][Dd][Uu])|([nN][aA][mM][eE])|[gG][oO][vV])$/
   return t.test(v);
}

function _trim(v){
   return v.replace(/^( )*([^ ]*)( )*$/,"$2");
}

/*

FUNCION es_moneda
=================

Devuelve verdad si la cadena pasada es del estilo moneda.
Está limitado a cantidades menores de 1000 millones

*/

function es_moneda(v){
   var t=/^\d{1,9}(\.(\d{1,2})?)?$/
   return t.test(v);
}

/*

FUNCION es_telefono
=================

Devuelve verdad si el telefono es aparentemente válido para España

*/

function es_telefono(v){
   var t=/^(6|8|9)\d{8}$/
   return t.test(v);
}


/*

FUNCION es_cp
=================

Devuelve verdad si el código postal es aparentemente válido para España

*/

function es_cp(v){
   var t=/^(([0-4]\d{4})|(5[0-2]\d{3}))$/
   return t.test(v);
}

/*

FUNCION es_letra
=================

Devuelve verdad si se ha pasado una letra diferente a la ñ

*/

function es_letra(v){
   var t=/^([A-Z]|[a-z])$/
   return t.test(v);
}

/*

FUNCION es_entero
=================

Devuelve verdad si se ha pasado un entero mayor que cero

*/

function es_entero(v){
   var t=/^[1-9]\d*$/
   return t.test(v);
}

/*

FUNCION es_dni
==============

Devuelve verdad si se ha pasado una cadena con forma de dni (nif) español

*/

function es_dni(dni){
   var forma_dni = /^\d{1,8}[a-zA-Z]$/
   var letras = 'TRWAGMYFPDXBNJZSQVHLCKE';

   if(!forma_dni.test(dni)){
      return es_nie(dni);
   }

   var numero = dni.substring(0,dni.length-1);
   var letra  = dni.substring(dni.length-1);

   return (letra.toUpperCase() == letras.substr(numero%23,1));
}

function es_nie(dni){
   var forma_nie = /^[xX]\d{1,8}[a-zA-Z]$/
   var letras = 'TRWAGMYFPDXBNJZSQVHLCKE';

   if(!forma_nie.test(dni)){
      return false;
   }

   var numero = dni.substring(1,dni.length-1);
   var letra  = dni.substring(dni.length-1);

   return (letra.toUpperCase() == letras.substr(numero%23,1));
}

/*
FUNCION es_texto
================

Devuelve verdad si una cadena es de texto

*/

function es_texto(texto){
   var t = /^([àèìòùÀÈÌÒÙáéíóúÁÉÍÓÚäëïöüÄËÏÖÜçÇa-zA-ZñÑ]|\s)*[àèìòùÀÈÌÒÙáéíóúÁÉÍÓÚäëïöüÄËÏÖÜçÇa-zA-ZñÑ]([àèìòùÀÈÌÒÙáéíóúÁÉÍÓÚäëïöüÄËÏÖÜçÇa-zA-ZñÑ]|\s)*$/
   return t.test(texto);
}

/*
FUNCTION es_fecha
=================

Devuelve verdad si la combinación de día, mes y año son correctas

*/

/** Funcion auxiliar. Si hacemos un parseInt de 08 o 09 no funciona porque evalua que son octales y devuelve 0!!!!! */
function _to_int(str){
   var t=/^(0)*(\d+)$/
   if(!t.test(str)) return 0;
   a_v=t.exec(str);
   return parseInt(a_v[2]);
}

function es_fecha(dia, mes, ano){
   var idia=_to_int(dia), imes=_to_int(mes), iano=_to_int(ano);

   if(!idia||!imes||!iano) return false;

   switch(imes){
      case 1:
      case 3:
      case 5:
      case 7:
      case 8:
      case 10:
      case 12:
         return (idia<=31);
      case 4:
      case 6:
      case 9:
      case 11:
         return (idia<=30);
      case 2:
         return (idia<=(28+((((!(iano%4))&&(iano%100))||!(iano%400))?1:0)));
   }
   return false;
}

/*****************************************************************************************************************
funcion checkCharEspeciales

Parámetros de entrada: 
	- strInput: String
	
Parámetros de salida: Cadena sin caracteres ";"
Es referenciada por: checkElementos()
Descripción: Devuelve la cadena de entrada "strInput" después de eliminar los caracteres ";!|"·#$%&¬\?¿¡[]*{}".

Ejemplo: 	var strpostcode=checkCharEspeciales(document.regform.codigo.value);
*********************************************************************************************************************/
function checkCharEspeciales(strInput){
	aux = strInput.replace(/;/g, ' ');
	strInput = aux.replace(/[!|"·#$%&¬\?¿¡*{}\[\]\\\/]/g, '');
	return strInput;
	}

/*****************************************************************************************************************
funcion checkElementos

Parámetros de entrada: nada
Es referenciada por: submitForm()	
Parámetros de salida: nada

Descripción: Chequea todos los elementos del documento para que no incluyan caracteres alfanuméricos

Ejemplo: 	checkElementos();
*********************************************************************************************************************/
function checkElementos(){
	var formularios = document.forms.length;

	for (var i=0;i<formularios;i++){
		var elementos = document.forms[i].elements.length;
		for (var j=0;j<elementos;j++){
			 if (document.forms[i].elements[j].value != null)
				 document.forms[i].elements[j].value = checkCharEspeciales(document.forms[i].elements[j].value);
			}
		}
	}


function compruebaCpProvinciaEspanola(p, cp){
   var cps      = new Array("","15","01","02","03","04","33","05","06","07","08","09","10","11","39","12","13","14","16","17","18","19","20","21","22","23","26","24","25","27","28","29","30","31","32","34","36","37","40","41","42","43","44","45","46","47","48","49","50");

   if(cp.substr(0,2)!=cps[p]) return false;
   return true;
}

function compruebaTelefonoProvinciaEspanola(p, tel){
   var prefijos = new Array("","981","945","967","96","950","98","920","924","971","93","947","927","956","942","964","926","957","969","972","958","949","943","959","974","953","941","987","973","982","91","95","968","948","988","979","986","923","921","95","975","977","978","925","96","983","94","980","976");
   var primero  = tel.substr(0,1);

   if(primero  == "6") return true;
   if(primero  == "8") return true;
   if((primero == "9")&&(tel.substr(0,prefijos[p].length) != prefijos[p])) return false;
   return true;
}

function disable_keyboard(form){
   if(form.sn.checked){
      form.numero.blur();
   }
}

function sn_click(form){
   if(form.sn.checked){
      form.numero.value="S/N";
   }
}

function comprobarUno(form){
		checkElementos();

	    var strnombre=form.nombre.value;
		strnombre = strnombre.replace(/^\s+/, '');
        if (((strnombre.length < 3) || (strnombre.length > 50)) || (strnombre=="Nombre")) {
           alert("Por favor, introduce tu nombre.");
           form.nombre.focus();
       	   return false;
        }
		
	    var strapellidos=form.apellido1.value;
		strapellidos = strapellidos.replace(/^\s+/, '');
        if (((strapellidos.length < 3) || (strapellidos.length > 50)) || (strapellidos=="1er apellido")) {
           alert("Por favor, introduce primer apellido.");
           form.apellido1.focus();
           return false;
        }

	  strapellidos=form.apellido2.value;
	  strapellidos = strapellidos.replace(/^\s+/, '');
      if (((strapellidos.length < 3) || (strapellidos.length > 50)) || (strapellidos=="2º apellido")) {
           alert("Por favor, introduce segundo apellido.");
           form.apellido2.focus();
           return false;
        }
     
	  var stremail=form.email.value;
      if (!verifyEmail(stremail)) {
         alert("El email introducido no es un email válido.");
         form.email.focus();
         return false;
      }
   return true;
}

function comprobarDos(form){  
	 checkElementos();

	  if (document.coForm.tipo.value == "" || document.coForm.tipo.value == "") {
		 alert("Por favor, seleccione el tipo de vía.");
         form.tipo.focus();
         return false;
      }
	  
	  if(!form.direccion.value || form.direccion.value == "Calle, Nª y Piso"){
	    alert("Por favor, indique su dirección.");
	    form.direccion.focus();
	    return false;
	 }
	 
	 if(!form.poblacion.value){
	    alert("Por favor, indique la población.");
	    form.poblacion.focus();
	    return false;
	 }
	 
	  if (!form.provincia.selectedIndex){
         alert("Por favor, selecciona tu provincia.");
         form.provincia.focus();
         return false;
      }
	  if (!es_cp(form.codigo.value)){
         if(form.codigo.value.length==5){
            msgErr="El código postal no coincide con la provincia.";
         }
         else{
            msgErr="El código postal debe de ser un número de cinco cifras";
         }
         alert(msgErr);
         form.codigo.focus();
         return false;
      }
      else if(!compruebaCpProvinciaEspanola(form.provincia.selectedIndex, form.codigo.value)){
         alert("El código postal introducido no coincide con la provincia seleccionada.");
         form.codigo.focus();
         return false;
      }
      if (!es_telefono(form.telefono.value)){
            alert("El teléfono fijo no es un número de teléfono válido.\nIntroduce solamente números (sin espacios).");
            form.telefono.focus();
            return false;
         }
         else if(!compruebaTelefonoProvinciaEspanola(form.provincia.selectedIndex, form.telefono.value)){
            alert("El teléfono fijo introducido no coincide con la provincia seleccionada.")
            form.telefono.focus();
            return false;
         }
     
	if (form.dia.value == "") {
	    alert("Introduce el día de nacimiento.");
	    form.dia.focus();
	    return false;
	}

	if (form.mes.value == "") {
		alert("Introduce el mes de nacimiento.");
	    form.mes.focus();
	    return false;
	}

	if (form.ano.value == "") {
		alert("Introduce el año de nacimiento.");
	    form.ano.focus();
	    return false;
	}
   return true;
}


function comprobar(form){  
	 checkElementos();

	  var strnombre=form.nombre.value;
		strnombre = strnombre.replace(/^\s+/, '');
        if (((strnombre.length < 3) || (strnombre.length > 50)) || (strnombre=="Nombre")) {
           alert("Por favor, introduce tu nombre.");
           form.nombre.focus();
       	   return false;
        }
		
	    var strapellidos=form.apellido1.value;
		strapellidos = strapellidos.replace(/^\s+/, '');
        if (((strapellidos.length < 3) || (strapellidos.length > 50)) || (strapellidos=="1er apellido")) {
           alert("Por favor, introduce primer apellido.");
           form.apellido1.focus();
           return false;
        }

	  strapellidos=form.apellido2.value;
	  strapellidos = strapellidos.replace(/^\s+/, '');
      if (((strapellidos.length < 3) || (strapellidos.length > 50)) || (strapellidos=="2º apellido")) {
           alert("Por favor, introduce segundo apellido.");
           form.apellido2.focus();
           return false;
        }
     
	  var stremail=form.email.value;
      if (!verifyEmail(stremail)) {
         alert("El email introducido no es un email válido.");
         form.email.focus();
         return false;
      }

	  if (document.coForm.tipo.value == "" || document.coForm.tipo.value == "") {
		 alert("Por favor, seleccione el tipo de vía.");
         form.tipo.focus();
         return false;
      }
	  
	  if(!form.direccion.value || form.direccion.value == "Calle, Nº y Piso"){
	    alert("Por favor, indique su dirección.");
	    form.direccion.focus();
	    return false;
	 }
	 
	 if(!form.poblacion.value){
	    alert("Por favor, indique la población.");
	    form.poblacion.focus();
	    return false;
	 }
	 
	  if (!form.provincia.selectedIndex){
         alert("Por favor, selecciona tu provincia.");
         form.provincia.focus();
         return false;
      }
	  if (!es_cp(form.codigo.value)){
         if(form.codigo.value.length==5){
            msgErr="El código postal no coincide con la provincia.";
         }
         else{
            msgErr="El código postal debe de ser un número de cinco cifras";
         }
         alert(msgErr);
         form.codigo.focus();
         return false;
      }
      else if(!compruebaCpProvinciaEspanola(form.provincia.selectedIndex, form.codigo.value)){
         alert("El código postal introducido no coincide con la provincia seleccionada.");
         form.codigo.focus();
         return false;
      }
      if (!es_telefono(form.telefono.value)){
            alert("El teléfono fijo no es un número de teléfono válido.\nIntroduce solamente números (sin espacios).");
            form.telefono.focus();
            return false;
         }
         else if(!compruebaTelefonoProvinciaEspanola(form.provincia.selectedIndex, form.telefono.value)){
            alert("El teléfono fijo introducido no coincide con la provincia seleccionada.")
            form.telefono.focus();
            return false;
         }
     
	if (form.dia.value == "") {
	    alert("Introduce el día de nacimiento.");
	    form.dia.focus();
	    return false;
	}

	if (form.mes.value == "") {
		alert("Introduce el mes de nacimiento.");
	    form.mes.focus();
	    return false;
	}

	if (form.ano.value == "") {
		alert("Introduce el año de nacimiento.");
	    form.ano.focus();
	    return false;
	}
   return true;
}