
// ********************************************************************************************************

function TrimLeft( str ) {
	var resultStr = "";
	var i = len = 0;

	// Return immediately if an invalid value was passed in
	if (str+"" == "undefined" || str == null)	
		return null;

	// Make sure the argument is a string
	str += "";

	if (str.length == 0) 
		resultStr = "";
	else {	
  		// Loop through string starting at the beginning as long as there
  		// are spaces.
//	  	len = str.length - 1;
		len = str.length;
		
  		while ((i <= len) && (str.charAt(i) == " "))
			i++;

   	// When the loop is done, we're sitting at the first non-space char,
 		// so return that char plus the remaining chars of the string.
  		resultStr = str.substring(i, len);
  	}

  	return resultStr;
}



// ********************************************************************************************************

function MM_findObj(n, d) { //v4.01
  var p,i,x;  
  
  if(!d) d=document; 
  if((p=n.indexOf("?"))> 0 && parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);
  }
  if(!(x=d[n])&&d.all) x=d.all[n]; 
  
  for(i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  
  //if(!x && document.getElementById) x=document.getElementById(n); return x;
  if(!x && d.getElementById) x=d.getElementById(n); return x;
  
}

// ********************************************************************************************************
// comprobar_nif
//
// funcion auxiliar de MM_validateForm que nos devuelve 1 si el nif es correcto y -1 si el nif es falso
// ********************************************************************************************************

function comprobar_nif (nif)
{
    // devuelve 1 si el nif es correcto.
	// devuelve -1 si el nif es incorrecto.
	re = new RegExp("^\\d+\\D$","i");
	if (!re.test(nif)) return -1;
	var l_ok = 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");
	
	dni = nif.substr(0,8);
	letra = nif.substr(8,1);
    letra = letra.toUpperCase();
	resto = (Number(dni)) % 23;
	
	if (l_ok[resto]==letra){retorno=1;}
	else {retorno=-1;}
	return (retorno);
}//function

///////////////////////////////////////////////////////
//
// Nombre de provincia como función del CPostal
//

function obtener_provincia_de_cp(codpos){
// A esta func. la llamamos directamente al perder el foco los campos
// cod. postal de cada sección.

  var nodefinido;        // Necesario para comparar con 'undefined'
  var tiponodefinido,tipoexc;
  var cod = new Array(); // Vector que asocia CP con Provincia
  var exc = new Vector();// Vector asociativo para las excepciones

  cod[1]="Alava";cod[2]="Albacete";cod[3]="Alicante";
  cod[4]="Almeria";cod[5]="Avila";cod[6]="Badajoz";
  cod[7]="Illes Balears";cod[8]="Barcelona";cod[9]="Burgos";
  cod[10]="Caceres";
  cod[11]="Cadiz";cod[12]="Castellon";cod[13]="Ciudad Real";
  cod[14]="Cordoba";cod[15]="A Coruña";cod[16]="Cuenca";
  cod[17]="Girona";cod[18]="Granada";cod[19]="Guadalajara";
  cod[20]="Guipuzcoa";
  cod[21]="Huelva";cod[22]="Huesca";cod[23]="Jaen";cod[24]="Leon";
  cod[25]="Lleida";cod[26]="La Rioja";cod[27]="Lugo";cod[28]="Madrid";
  cod[29]="Malaga";cod[30]="Murcia";
  cod[31]="Navarra";cod[32]="Ourense";cod[33]="Asturias";cod[34]="Palencia";
  cod[35]="Las Palmas";cod[36]="Pontevedra";cod[37]="Salamanca";
  cod[38]="S.C. Tenerife";cod[39]="Cantabria";cod[40]="Segovia";
  cod[41]="Sevilla";cod[42]="Soria";cod[43]="Tarragona";cod[44]="Teruel";
  cod[45]="Toledo";cod[46]="Valencia";cod[47]="Valladolid";cod[48]="Vizcaya";
  cod[49]="Zamora";cod[50]="Zaragoza";
  cod[51]="Ceuta";cod[52]="Melilla";

  if (!isNaN(codpos)){
    if (codpos > 999 && codpos < 53000 && codpos.length == 5){
      var Prov = codpos.substring(0,2);
      if (Prov < 10) Prov=codpos.substring(1,2);
      tiponodefinido= typeof nodefinido;
      tipoexc= typeof exc[codpos];
      if (tipoexc != tiponodefinido) // Si es una excepcion...
        Prov = exc[codpos];           // obtenemos el valor del vector
      else                           // si no lo es...
        Prov = cod[Prov];            // lo pillamos de la tabla cod
      Prov = Prov.toUpperCase();
      return Prov;
    }
  }
  return '';
}

function esFechaValida(fecha){

		if (!/^\d{2}-\d{2}-\d{4}$/.test(fecha)){      
			//alert("formato de fecha no válido (dd-mm-aaaa)");
			return -1;
		}
		var dia  =  parseInt(fecha.value.substring(0,2),10);
		var mes  =  parseInt(fecha.value.substring(3,5),10);
		var anio =  parseInt(fecha.value.substring(6),10);

		switch(mes){
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			numDias=31;
			break;
		case 4: case 6: case 9: case 11:
			numDias=30;
			break;
		case 2:
			if (comprobarSiBisisesto(anio)){ numDias=29 }else{ numDias=28};
			break;
		default:
			//alert("Fecha introducida errónea");
			return -1;
		}
		if (dia>numDias || dia==0){
			//alert("Fecha introducida errónea");
			return -1;
		}
		return 1;

}

function comprobarSiBisisesto(anio){
if ( ( anio % 100 != 0) && ((anio % 4 == 0) || (anio % 400 == 0))) {
	return true;
	}
else {
	return false;
	}
}


// ********************************************************************************************************
// MM_validateForm
//
// Comprueba que los datos de un formulario sean correctos. Se añade 3 argumentos por cada campo:
// 1er argumento: Nombre del campo 
// 2º  argumento: Nombre del campo que se utiliza para generar la cadena de salida. Si este argumento está
//                vacío se utiliza el 1er argumento para generar la cadena de salida.
// 3er argumento: R si el campo es requerido, isEmail para los correos electrónicos, isNum para los número,
//                inRange valor1:valor2 para los campos cuyo valores deban estar en un rango.
// ********************************************************************************************************

function MM_validateForm() { //v4.1
  
  var i,p,q,nm,test,num,min,max,errors='', args=MM_validateForm.arguments;
    
  for (i=0; i<(args.length-2); i+=3){
    test=args[i+2];

    val=MM_findObj(args[i]); // nos devuelve el objeto referenciado por el nombre

	if (val) {
	  if (args[i+1] != '') nm=args[i+1] 
	  else nm=val.name;
	  val=val.value;
      if (TrimLeft(val)!="") {
	      // Comprueba el contenido en los casos que el input no esté vacio.
		  // Casos: isEmail, Nif, inRange
		  if (test.indexOf('isEmail')!=-1) { // Comprueba que sea una dirección de correo.
		  
			  if (!/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(val))  errors+='\t- '+nm+' debe ser una dirección de correo válida.\n'; 		  		  
			 // p=val.indexOf('@');
	          //if (p<1 || p==(val.length-1)) errors+='- '+nm+' debe contener una dirección de correo válida.\n'; 	
		  } else if (test.indexOf('isDate') != -1 ) {// Comprueba si es una fecha válida
			  if (esFechaValida(val) == -1) errors+='\t- '+nm+' debe ser una fecha válida.\n\t Formato de fecha correcto (dd-mm-aaaa)\n';		  
		  } else if (test!='R') {
			  if (test.indexOf('Nif') != -1) {
			  	 if (comprobar_nif(val)==-1) errors+='\t- '+nm+' es erroneo.\n';
			  }else if (isNaN(val)){ 
			  	 errors+='\t- '+nm+' debe ser un número.\n';			 
			  }
	          if (test.indexOf('inRange') != -1) {
    		  	 p=test.indexOf(':');
      		     min=test.substring(8,p); max=test.substring(p+1);
	      	     if (val<min || max<val) errors+='\t- '+nm+' debe ser un número entre '+min+' y'+max+'.\n';
	   		  }
	      } 
      }else if (test.charAt(0) == 'R') errors += '\t- '+nm+' es obligatorio.\n'; // Los R indica obligatoriedad.
    } //if
	
 } // for 
 // Muestra una alerta en el caso que se produzcan errores
 if (errors) alert('Los siguientes campos son incorrectos:\n'+errors);
 document.MM_returnValue = (errors == '');
   
}

// ********************************************************************************************************
