// NOTA: Hace uso de funciones de 'cadenas.js'

// Variables utilizadas para generar las alertas
var HORA_FORMATO = "Debe introducir un formato válido de hora.  hh:mm";
var FECHA_FORMATO = "Debe introducir un formato válido de fecha. dd/mm/yyyy ";
var DEBE_SER_MAYOR = "debe ser mayor que";
var MAX_CAR = "demasiado largo";
var NUM_VALIDO = "Debe introducir un número válido";
var NUM_ENT_VALIDO = "Número incorrecto: Parte entera ha sido excedida";
var NUM_DEC_VALIDO = "Número incorrecto: Parte decimal ha sido excedida";
var HORA_VALIDA = "La hora no es válida";

/*** Comprueba los datos obligatorios de un formulario ***/
//sformulario: nombre del formulario
//sNombres: nombre de los campos obligatorios, separados por el caracter delimitador (asociado alert_1)
//sNumNombres: nombre de los campos obligatorios numericos (asociado alert_2)
//delimitador : caracters para separar los nombres de los campos
//Devuelve TRUE cuando todo es correcto
function CompruebaDatos(sFormulario,sNombres,raiz,alert_1,alert_2,delimitador)
{
	var obj;
	var dato;
	var nombre;
	var OK=true;
	if (sNombres!="" )
	{
		var aNombres=sNombres.split(delimitador);
		var aAlert=alert_2.split(delimitador);
		for (i=0; i < aNombres.length; i++)
		{
			obj=eval(raiz+"." + sFormulario + "." + aNombres[i]);
			dato=obj.value;
			nombre=obj.name;
			if(Trim(dato) == "")
			{
				alert(alert_1 + ": " + aAlert[i])
				obj.focus();
				i= aNombres.length;
				OK = false;
			}
		}
	}
	return OK;
}


// Validacion de cantidades enteras y decimales
var numero = /\D/gi
var caracter = /./
var espacios = /\S/

// Con esta variable identificamos en el caso de que llamemos a vNumero
// el error final que tiene que lanzar.
var numeroDeError = 0;

//window.onerror = new Function("return false")
function marca(obj)
{
if (obj.type!='hidden')
{
 if (obj.select)obj.select();
 if (obj.focus)obj.focus();
}
}

function es_vacio(s)
{
   return ((!s) || (s.length == 0)|| !espacios.test(s))
}


//Valida la hora
function Hora (cadena,formato)
{
 
    this.horas=''
    this.minutos=''
	this.segundos=''
	this.hora=''
	var separador=':'
	this.valido = false;
	this.horacorrecta = true
	var patronhora = "^\\d{2}\\D{0,1}\\d{2}$"
	var formathora = new RegExp(patronhora) ;
    var incremento=0
      
	   if (formathora.test(cadena))
        {
		   if(cadena.length<=4){
		   incremento=1
		   }
		
		 this.horas = cadena.substring(formato.indexOf('h'),formato.lastIndexOf('h')+1)
	     this.minutos = cadena.substring(formato.indexOf('m')-incremento,formato.lastIndexOf('m')+1-incremento)
		 if(this.horas < '0' || this.horas > '23' || this.minutos < '0' || this.minutos > '59')
		 {
		     this.horacorrecta=false;
		 }
		 this.hora = this.horas+separador+this.minutos;
         this.valido = true;
       }
}

function vHora(obj, formHor)
{
 var valor = obj.value;
 if (es_vacio(valor))
  return true;

 var objHora = new Hora(valor,formHor);
  
 if (objHora.valido)
 {
  obj.value=objHora.hora;
 }
 else
 {
  alert(HORA_FORMATO)
  marca(obj)
 }
 if (!objHora.horacorrecta)
 {
   alert(HORA_VALIDA);
  marca(obj)
 }
 return (objHora.valido && objHora.horacorrecta)
}

//Valida la fecha
function Fecha (cadena,formato)
{
	this.dia="";
    this.mes="";
    this.anio="";
    this.fecha = "";
	this.valido = false;
    var diasmes = new Array(12);
    diasmes[1] = 31;
    diasmes[2] = 28; 
    diasmes[3] = 31;
    diasmes[4] = 30;
    diasmes[5] = 31;
    diasmes[6] = 30;
    diasmes[7] = 31;
    diasmes[8] = 31;
    diasmes[9] = 30;
    diasmes[10] = 31;
    diasmes[11] = 30;
    diasmes[12] = 31;
	
    
	var posDia = formato.indexOf('d')
	var posMes = formato.indexOf('m')
	var posAnio = formato.indexOf('y')
	var incDia = 0
	var incMes = 0
	var incAnio = 0		
	var indpos1	= 0
	var indpos2	= 0
	var indpos3	= 0

	//Nmero de caracteres en la primera posicion
	if((posDia<posMes && posDia<posAnio) )
	{
		indpos1 = 2
		pri = 'dia'
		incDia = 0
	}
	else if (posMes<posDia && posMes<posAnio)	
	{
		indpos1 = 2
		pri = 'mes'
		incMes = 0
	}
	else
	{
		indpos1 = 4
		pri = 'anio'
		incAnio = 0
	}
	//Nmero de caracteres en la segunda posicion
	if((posDia>posMes && posDia<posAnio) ||(posDia>posAnio && posDia<posMes) )
	{
		indpos2 = 2
		seg = 'dia'
		incDia = -1
	}
	else if ((posMes>posDia && posMes<posAnio) || (posMes>posAnio && posMes<posDia))
	{
		indpos2 = 2
		seg = 'mes'
		incMes = -1
	}
	else
	{
		indpos2 = 4
		seg = 'anio'
		incAnio = -1
	}
	//Nmero de caracteres en la tercera posicion
	if((posDia>posMes && posDia>posAnio) )
	{
		indpos3 = 2
		ter = 'dia'
		incDia = -2
	}
	else if (posMes>posDia && posMes>posAnio)
	{
		indpos3 = 2
		ter = 'mes'
		incMes = -2
	}
	else
	{
		indpos3 = 4
		ter = 'anio'
		incAnio = -2
	}
			
	var patron = "^\\d{"+indpos1+"}\\D{0,1}\\d{"+indpos2+"}\\D{0,1}\\d{"+indpos3+"}$"
	var format = new RegExp(patron) ;
    var aux = cadena;
    cadena = aux.replace(/\D/g,'/');

    if (format.test(cadena))
    {
		var fanio = formato.lastIndexOf('y')+1
		var fdia = formato.lastIndexOf('d')+1
		var fmes = formato.lastIndexOf('m')+1
		var comprueba = compruebaNumero(cadena);
		if (!comprueba)
		{
			fanio += incAnio 
			fdia += incDia
			fmes += incMes
			posAnio += incAnio 
			posDia += incDia
			posMes += incMes
		}
		this.anio = cadena.substring(posAnio,fanio)
        this.dia = cadena.substring(posDia,fdia)
        this.mes = cadena.substring(posMes,fmes)
        if ( esBisiesto(this.anio) )
        {
            diasmes[2]=29;
        }
    
		if ( (this.anio>='1900') && (this.mes>'0') && (this.mes<'13') && (this.dia<=diasmes[this.mes*1]) )
        {
            var sep1 
			var sep2
			for(i=0;i<formato.length;i++)
			{
			  	var car = formato.charAt(i)
				var issep = (car!='y' && car!='m' && car!='d')
				if ( issep && !sep1)
					sep1 = formato.charAt(i)
				if (issep && sep1)
					sep2 = formato.charAt(i)
			}
			
			this.fecha = this[pri]+sep1+this[seg]+sep2+this[ter];
            this.valido = true;
        }
    } 

}

function compruebaNumero(cadena)
{
	var numeroAux = /\D/gi
	var comprueba = numeroAux.test(cadena)
	return comprueba;
}

function esBisiesto(anyo_i)
{
	var anyo = parseInt(anyo_i);
	return(((anyo % 4 == 0) && (anyo % 100 != 0)) || (anyo % 400 == 0)) 
}

function vFecha(obj, formFec)
{
 var valor = obj.value;
 if (es_vacio(valor))
  return true;

 var objFecha = new Fecha(valor,formFec);
 if (objFecha.fecha == "") var objFecha = new Fecha(valor,formFec); // Hay que hacer esta comprobación porque el Firefox hay veces que no crea los objetos
  
 if (objFecha.valido)
 {
  obj.value=objFecha.fecha;
 }
 else
 {
  alert(FECHA_FORMATO)
  marca(obj)
 }
 return objFecha.valido
}

function rFecha(valor1,ffec1,valor2,ffec2)
{
 var objFecha1 = new Fecha(valor1,ffec1);
 var objFecha2 = new Fecha(valor2,ffec2);
 if (objFecha1.valido&&objFecha2.valido)
 {
  var fValor1 = new Date(objFecha1.anio,objFecha1.mes-1,objFecha1.dia);
  var fValor2 = new Date(objFecha2.anio,objFecha2.mes-1,objFecha2.dia)
  var retorno = new Date(fValor1-fValor2);
  return (retorno);
 }
 else
 {
  return false;
 }
}

	function compararFechas (fecDesde, nombreFecDesde, fecHasta, nombreFecHasta)
	{

		if ((fecDesde !=null && fecDesde!="") && (fecHasta!=null && fecHasta!=""))
		{ 
			//Troceando la fecha desde
			var desde1 = fecDesde.indexOf('/');
			var desde2 = fecDesde.lastIndexOf('/');
			var desdeDD = fecDesde.substring(0,desde1);
			var desdeMM = fecDesde.substring(desde1+1,desde2);
			var desdeYY = fecDesde.substring(desde2+1,fecDesde.length);

			//Troceando la fecha hasta
			var hasta1 = fecHasta.indexOf('/');
			var hasta2 = fecHasta.lastIndexOf('/');
			var hastaDD = fecHasta.substring(0,hasta1);
			var hastaMM = fecHasta.substring(hasta1+1,hasta2);
			var hastaYY = fecHasta.substring(hasta2+1,fecHasta.length);

			fecDesde = desdeYY + desdeMM + desdeDD;
			fecHasta = hastaYY + hastaMM + hastaDD;	

			if (fecDesde > fecHasta)
			{ 
				alert(nombreFecHasta + " " + DEBE_SER_MAYOR + " " + nombreFecDesde)
				return(false);		
			}
		}
		return(true); 
	}

function ponptos(cadena,sepa)
{
 var retorno='';
 var lon = cadena.length;
 var c=0;
 var i=0;
 for (c=0;c<lon%3;c++)
 {
  retorno+=cadena.charAt(c);
 }
 if (lon>3&&lon%3!=0)retorno+=sepa;
 for (i=0;c<lon;i++,c++)
 {
  if (i==3)
  {
   retorno+=sepa;
   i=0;
  }
  retorno+=cadena.charAt(c);
 }
 return retorno;
}

function vNumero(obj,numEnteros,sepEnt,numDecimales,sepDec)
{
 var valor = obj.value
 if (valor.length==0)return;

  posDec = valor.indexOf(sepDec)
  if (posDec >- 1)
  {
	entera = vEntero (valor.substring( 0,posDec),numEnteros,sepEnt)
	decimal = vDecimal (valor.substr(posDec+1),numDecimales,sepDec)
	
    if (entera && decimal)
    {
     obj.value=entera+sepDec+decimal
	 return true
    }
    else
    {
	 alert("Numero incorrecto");
	 obj.focus();
	 obj.blur();
     obj.select();
	 return false;
	 
    }
  }
  else
  {
    entera = vEntero(valor,numEnteros,sepEnt)
	
	if (entera)
	{
		obj.value=entera;
		return true
	}
	else 
	{
     alert("Numero incorrecto");
	 obj.focus();
 	 obj.blur();
     obj.select();
	 return false;
	}
  }

}

function vEntero(cadena,lon,sep)
{
  var patron = "^\\d{1,3}("+sep+"\\d{3})*$"
  var entero2 = new RegExp(patron,"gi")
  var comprueba = compruebaNumero(cadena);
  if (comprueba) //numero.test(cadena)
  {
   var aux = cadena.replace(numero,'');
   var aux1 = cadena.replace(numero,sep);
   if (aux.length > lon)
    return false;
   else
    if (!entero2.test(aux1))
     return false;
    else
     return (aux1);
  }
  else // La cadena se pasa del tamaño establecido
  {
   if ((cadena.length) > lon)
	{
		numeroDeError = 1;
		return false;
	}
    
   else
    return (ponptos(cadena,sep));
  }
}

function vDecimal(cadena,lon,sep)
{
 var retorno='';
 var aux='';
 if (numero.test(cadena))
 {
   return false
 }
 else // la cadena decimal excede de tamaño
 {
   if ((cadena.length) > lon)
	{
		numeroDeError = 2;
		return false;
	}
    
   else
    return (cadena);
 }
}

function tresDecimales(cadena)
{
	posic=cadena.indexOf(".");

	if (posic>0 && cadena.length >= posic + 5)
	{
		// Pillo la cadena con 4 decimales
		cadena = cadena.substring(0, posic + 5);
		
		// Cogemos la posición del 4 decimal
		posicion = posic*1 + 4;
	
		// Si el 4 decimal es >= 5, redondeamos
		if (cadena.substring(posicion, posicion + 1) >= 5)
		{
			cadena = cadena*1 + 0.001*1;
			cadena = cadena + "";
			cadena = cadena.substring(0, posic + 4);

			// Convertimos cadena a número para quitarnos los ceros
			// de más, e.d., que devuelva 1.1 en lugar de 1.100
			cadena = cadena*1;

			// Volvemos a convertirlo a String
			cadena = cadena + "";
			
			return cadena;
		}

		else 
		{
			cadena = cadena.substring(0, posic + 4);
			return cadena;
		}
	}
	else
	{
		return cadena;
	}
}

	function puntoPorComa(numero, sepDecimal)
	{
		var punto = /\./gi;
		var coma = /\,/gi;
		var cadena = "";
		if (sepDecimal==".")
		{
			cadena = numero.replace(punto,",");
		}
		else
		{
			cadena = numero.replace(coma,".");
		}
		return cadena;
	}
	
	function desformateaStringANum(numero, sepMiles, sepDecimal)
	{
		var punto = /\./gi;
		var coma = /\,/gi;
		var cadena = "";
		if (sepMiles==".")
		{
			cadena = numero.replace(punto,"");
		}
		else
		{
			cadena = numero.replace(coma,"");
		}
		numero = cadena;
		if (sepDecimal==",")
		{
		cadena = numero.replace(coma,".");
		}
		return cadena;
	}

	function formateaNumAStr(numero, sepMiles, sepDecimal, numEnteros, numDecimal)
	{
		vNumero(numero,numEnteros,sepMiles,numDecimal,sepDecimal);
		return numero.value;
	}

/*Clase CCampoFormulario*/
function validarCampoFormulario()
{   
	var obj = this.objeto
	if (this.tipo!='select')
	{
		if(cadenaVacia(this.objeto.value))
		{  
		    if(this.obligatorio)
			    {
				alert(this.descripcion+" es un campo obligatorio");
		        return this.error();
				}
				if (obj.value)obj.value=""
				return true;
		}
	}
	else 
	{
		if (this.objeto)
		{
		
		if (this.objeto.type=='hidden')
			selval = this.objeto.value
		else
			selval = this.objeto.options[this.objeto.selectedIndex].value
		}
		if(cadenaVacia(selval))
		{  
		    if(this.obligatorio)
		    {
				alert(this.descripcion+" es un campo obligatorio");
		        return this.error();
			}
				return true;
		}
	}
	
	if (this.tipo != "numeroDec" && this.tipo!="select")
	{
		if (this.objeto.value.length > this.longitud )
		{
			alert(this.descripcion+ " " + MAX_CAR);
	        return this.error();
		}
	}
    if(this.tipo == "fecha")
	{
		fecha = this.objeto.value
		
		var fechaObj = new Fecha(fecha,this.sepEntero)
		
		if (!fechaObj.valido)
		{
		 alert(FECHA_FORMATO);
		 return this.error();
		}
		this.objeto.value = fechaObj.fecha
    }
    else if(this.tipo == "numero")
	{
       if(!isNumber(this.objeto.value))
	    {
          alert(NUM_VALIDO);
          return this.error();
        }
	}
	else if (this.tipo == "numeroDec")
	{
		var resultado = vNumero(this.objeto,this.longitud,this.sepEntero,this.lonDecimal,this.sepDecimal)
		if (!resultado)
		{
			if (numeroDeError == 1) // Lanzamos error en parte entera
			{
				alert(NUM_ENT_VALIDO)
				numeroDeError = 0;
				return this.error();
			}
			if (numeroDeError == 2) // Lanzamos error en parte Decimal
			{
				alert(NUM_DEC_VALIDO)
				numeroDeError = 0;
				return this.error();
			}
			else
			{
				alert(NUM_VALIDO)// Lanzamos error genérico 'Número Incorrecto'
				return this.error();
			}
		}
		
	}
	 else if (this.tipo == "hora")
	{
		hora = this.objeto.value
		
		var horaObj = new Hora(hora,this.sepEntero)
		
		if(!horaObj.horacorrecta)
		{
		 alert(HORA_VALIDA);
		 return this.error();
		}
		
		if (!horaObj.valido)
		{
		 alert(HORA_FORMATO);
		 return this.error();
		}
		this.objeto.value = horaObj.hora
    }
	
	return true;
}

function vNumerosCompradores(obj,numEnteros,sepEnt,numDecimales,sepDec)
{
	var valor = obj.value
	if (valor.length==0)return;
       
	if(!isNumber(valor))
	{
		 alert(NUM_VALIDO);
    }
	return true;
}


function errorValidar()
{
/*if (this.tipo == "select"){
}
else {*/
marca(this.objeto)
//}
return false
}

function CCampoFormulario(objeto,descripcion,obligatorio,tipo,longitud,sepEntero,lonDecimal,sepDecimal)
{
this.tipo = tipo;
this.objeto = objeto;
this.longitud = longitud;//en el caso de un num&eacute;rico con decimales es la lon de la parte entera
this.obligatorio = obligatorio;
this.descripcion = descripcion;
this.sepEntero = sepEntero //en el caso de tipo fecha contiene el formato de la misma
this.lonDecimal = lonDecimal
this.sepDecimal = sepDecimal
this.validar = validarCampoFormulario;
this.error=errorValidar;
}

/*Clase CFormulario*/

function addCampoFormulario(objeto,descripcion,obligatorio,tipo,longitud,sepEntero,lonDecimal,sepDecimal)
{
this.campos[this.campos.length]=new CCampoFormulario(objeto,descripcion,obligatorio,tipo,longitud,sepEntero,lonDecimal,sepDecimal)
}

function validarFormulario()
{
  var i = 0
	for (i=0;i<this.campos.length;i++)
	{
	   var valido = this.campos[i].validar()
		if (!valido)
			return false;
	}
	return true;
}

function CFormulario()
{
	this.campos=new Array();
	this.add=addCampoFormulario;
	this.validar=validarFormulario;
}

var oFormulario=new CFormulario();

function vNumeroNoMensaje(obj,numEnteros,sepEnt,numDecimales,sepDec)
{
 var valor = obj.value
 if (valor.length==0)return;

  var posDec = valor.indexOf(sepDec)
  if (posDec >- 1)
  {
	var entera = vEntero (valor.substring( 0,posDec),numEnteros,sepEnt)
	var decimal = vDecimal (valor.substr(posDec+1),numDecimales,sepDec)
	
    if (entera && decimal)
    {
     obj.value=entera+sepDec+decimal
	 return true
    }
    else
    {
	 //alert("Numero incorrecto");
	 obj.focus();
	 obj.blur();
     obj.select();
	 return false;
	 
    }
  }
  else
  {
    var entera = vEntero(valor,numEnteros,sepEnt)
	
	if (entera)
	{
		obj.value=entera;
		return true
	}
	else 
	{
     //alert("Numero incorrecto");
	 obj.focus();
 	 obj.blur();
     obj.select();
	 return false;
	}
  }

}

function validarNumeroDec(obj, longitud, sepEntero, lonDecimal, sepDecimal)
{
	var resultado = vNumeroNoMensaje(obj, longitud, sepEntero, lonDecimal, sepDecimal)
	if (!resultado)
	{
		if (numeroDeError == 1) // Lanzamos error en parte entera
		{
			alert(NUM_ENT_VALIDO)
			numeroDeError = 0;
			return false;
		}
		if (numeroDeError == 2) // Lanzamos error en parte Decimal
		{
			alert(NUM_DEC_VALIDO)
			numeroDeError = 0;
			return false;
		}
		else
		{
			alert(NUM_VALIDO)// Lanzamos error genérico 'Número Incorrecto'
			return false;
		}
	}

	return true;
}
