function UtilV() {};

function check(id,tipo,strAlert)
	{
		var result = false;
		var obj = UtilV.setCampoParaValidacion(id);
		var value = UtilV.getValueTrim(obj);
		if (value=='' && tipo!='nulo') return true;
		if (typeof tipo == 'function') 
			result = tipo(value);
		else 
		switch (tipo)
		{
			case 'nulo': { result = (value!='') ; break; }
			
			case 'numero': { result = UtilV.validarNumero(value); break; }
			case 'decimal': { result = UtilV.validarDecimal(value,",",2); break; }
			case 'alfanumerico': { result = UtilV.validarAlfanumerico(value); break; }
			case 'email': { result = UtilV.validarEmail(value); break; }			
			case 'nif': { result = UtilV.validarNIF(value); break; }
			case 'cif': { result = UtilV.validarCIF(value); break; }
			case 'nie': { result = UtilV.validarNIE(value); break; }
			case 'nifnie': { result = UtilV.validarDocumento(value); result = (result==1 || result==3); break; }
			case 'nifcifnie': { result = UtilV.validarDocumento(value)>0; break; }
			case 'checkbox': { result = obj.checked; break; }
			case 'radio': { result = UtilV.getRadioValue(obj); break; }
			case 'nombre': { result = UtilV.validarNombre(value); break; }
			case 'descripcion': { result = UtilV.validarDescripcion(value); break; }
			case 'telefono': { result = UtilV.validarTelefono(value, true); break; }
			case 'año': { result = UtilV.validarAnio(value); break; }
			case 'porcentaje': { result = UtilV.validarPorcentaje(value); break; }
			case 'fecha': { result = UtilV.parseDate(value,2)!=false; break; }
			case 'fechanac': { result = UtilV.getAge(value,2)>=0; break; }
			case 'mayordeedad': { result = UtilV.getAge(value,2)>17; break; }
			case 'cp': {result = UtilV.validarCodigoPostal(value); break; }
			
			case 'false': { result = false; break; }
		}	
		
		if (!result) 
		{
			if (strAlert!=null && strAlert!= '') {
				alert(strAlert, obj);
				if (tipo != 'radio')
					//no se puede hacer un focus sobre un radio button a no ser que sepamos su valor
					UtilV.fijarAtencion(obj);
			}
		}
		return result;
	}

/*****************************/
function checkArray(arrayIds,tipo,strAlert)
	{
		var result = false;
		var arrayCampos = [];
		var arrayValues = [];
 		var vacios = true;
 
		var f = function(id) {
				var obj = UtilV.setCampoParaValidacion(id, arrayIds);
				var value = UtilV.getValueTrim(obj);
				if (value!='') vacios = false;
				arrayCampos.push(obj);
				arrayValues.push(value);
		}
		iter(arrayIds,f);
		if (vacios) return true;

		if (typeof tipo == 'function') 
			result = tipo(arrayValues);
		else 
			switch (tipo)
			{
				case 'ccc': { result = UtilV.validarCCC(arrayValues[0],arrayValues[1],arrayValues[2],arrayValues[3]); break; }
				case 'mayor': { result = UtilV.validarMayor(arrayValues[0],arrayValues[1]); break; }
				case 'mayorfecha': { result = UtilV.validarMayorFecha(arrayValues[0],arrayValues[1]); break; }
				case 'false': { result = false; break; }
			}	
		
		if (!result) 
		{
			if (strAlert!=null && strAlert!= '') {
				alert(strAlert, arrayCampos[0]);
				iter(arrayCampos,UtilV.fijarAtencion);
			}
		}
		return result;
	}
	
	function iter(arr,func) {
			for (var i=0,l=arr.length;i<l;i++) {
					func(arr[i],i);
			}
	}
/*****************************/
	function checkOperacion(id,tipo,strOperacion,strAlert)
	{
		var result = false;
		var obj = UtilV.setCampoParaValidacion(id);
		var value = UtilV.getValueTrim(obj);
		if (value=='' && tipo!='nulo') return true;		
		switch (tipo)
		{
			case 'value': { result = eval(value+strOperacion); break; }
			case 'edad': { result = eval(UtilV.getAge(value,2)+strOperacion); break; }
			case 'fecha': { result = eval(UtilV.parseDate(value,2)+strOperacion); break; }
		}

		if (!result) 
		{
			if (strAlert!=null && strAlert!= '') {
				alert(strAlert, obj);
				UtilV.fijarAtencion(obj);
			}
		}
		return result;
	}
	
/*****************************/	
UtilV.fijarAtencion = function(campo){
	campo.focus();
	campo.style.backgroundColor = 'lightsteelblue';
	                        
}
UtilV.setCampoParaValidacion = function(id, arrayIds) 
{
		var theFormtxtNombre = document.forms[0][id];
		if (!theFormtxtNombre) theFormtxtNombre = document.getElementById(id);
		if (!theFormtxtNombre) alert("Error: no existe el campo "+id);
		
		if (arrayIds) 
			theFormtxtNombre.onblur = function () 
				{ 
					for (var x=0;x<arrayIds.length;x++) {
						document.forms[0][arrayIds[x]].style.backgroundColor = ''; 
					}
				} 
		else
			theFormtxtNombre.onblur = function () { this.style.backgroundColor = ''; }
				
	return theFormtxtNombre;
}	
UtilV.getValueTrim = function(obj) {
	obj.value = (""+obj.value).replace(/^[ \t\r\n]+|[ \t\r\n]+$/,'');
	return obj.value;
}
/*****************************/
UtilV.validaRegExp = function(exp,value) 
{
	var reg = new RegExp(exp);
	var result = reg.test(value);
	return result;
}



/*****************************/
UtilV.validarAlfanumerico = function(value) {
	return UtilV.validaRegExp("^[a-zA-Z0-9]+$",value);
}
UtilV.validarNumero = function(value) {
	return UtilV.validaRegExp("^[0-9]+$",value);
}	
UtilV.validarPorcentaje = function(value) {
	if (!UtilV.validarNumero(value)) return false;
	return (value >-1 && value <101);
}
UtilV.validarDecimal = function(value, sep, decs) {
	return UtilV.validaRegExp("^[0-9]+["+sep+"]?[0-9]{0,"+decs+"}$",value);
}
UtilV.validarEmail = function(value) {
	return UtilV.validaRegExp(/\b[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+(?:[A-Z]{2,3}|info|mobi|name|aero|asia|coop|jobs|post|travel|museum)\b/i,value);
}
UtilV.validarNombre = function(value) {
	return UtilV.validaRegExp("^[a-zA-ZáéíóúÁÉÍÓÚñÑäëïöüÄËÏÖÜàèìòùÀÈÌÒÙª]+(([- ])*[a-zA-ZáéíóúÁÉÍÓÚñÑäëïöüÄËÏÖÜàèìòùÀÈÌÒÙª]+)*$",value);
}
UtilV.validarDescripcion = function(value) {
	return UtilV.validaRegExp(/^[0-9a-záéíóúñäëïöüàèìòù\t\r\n\f\s.,_ºª&{}%@#()¿?¡!:\-\[\<\>\]]*$/i,value);  
}
UtilV.validarTelefono = function(value, espaciado)	{
	var val = ( espaciado ) ? (""+value).replace(/ /gi,"") : ( value );
	return UtilV.validaRegExp("^[69]{1}[0-9]{8}$",val);
}
UtilV.validarAnio = function(value) {
	if (!UtilV.validaRegExp("^[12]{1}[0-9]{3}$",value)) return false;
	var now = new Date();
	var anioIni = 1500;
	var anioFin = UtilV.y2k(now.getFullYear());
	return (value<=anioFin && value > anioIni);
}
UtilV.y2k = function(dateYear) { return (dateYear < 1000) ? dateYear + 1900 : dateYear; }

/*****************************/
UtilV.validarCodigoPostal = function (value)
{
	value+='';
	if (!UtilV.validaRegExp("^[0-9]{5}$",value)) return false;
	var codProvincia = parseFloat(value.substring(0,2));
	return ((codProvincia>0)  && (codProvincia<53));
}

/*****************************/
UtilV.validarCIF = function(documento){
 	var temp=documento.toUpperCase();
	if (temp!==''){
		//si no tiene un formato valido devuelve error
		if (!/^[ABCDEFGHJPQRSUVNW]{1}[0-9]{7}[A-Z0-9]{1}$/.test(temp))	{
			return false;
		}
 
		//algoritmo para comprobacion de codigos tipo CIF
		var suma = parseInt(documento.charAt(2), 10)+parseInt(documento.charAt(4), 10)+parseInt(documento.charAt(6), 10);
		for (var i=1; i < 8; i += 2)
		{
				var n = 2 * parseInt(documento.charAt(i), 10);
				suma += Math.floor(n/10)+n%10;
		}

		var n = 10 - suma%10;

		//comprobacion de CIFs con codigo de control de tipo numerico
		if (/^[ABCDEFGHJNUV]{1}/.test(temp)){
			return(documento.charAt(8) == n%10);
		}
		
		//comprobacion de CIFs con codigo de control de tipo letra
		if (/^[PQRSNW]{1}/.test(temp)){
			return (documento.charAt(8) == String.fromCharCode(64 + n));
		}		
	}
	return false;
}

UtilV.validarNIF = function(documento){

 	var temp=documento.toUpperCase();
	if (temp!==''){
		//si no tiene un formato valido devuelve error
		if (!/^[KLM0-9]{1}[0-9]{7}[A-Z]{1}$/.test(temp))	{
			return false;
		}
	var cadenadni="TRWAGMYFPDXBNJZSQVHLCKE";
 
		//NIF especiales
		if (/^[KLM]{1}/.test(temp))
		{
			temp = temp.replace(/\S/,"0");
		}
 		var posicion = temp.substring(0,8) % 23;

		return (temp.charAt(8) == cadenadni.charAt(posicion));
	}

}

UtilV.validarNIE = function(documento){

 	var temp=documento.toUpperCase();
	if (temp!==''){
		//si no tiene un formato valido devuelve error
		if (!/^[XYZ]{1}[0-9]{7}[A-Z]{1}$/.test(temp))	{
			return false;
		}
		var cadenadni="TRWAGMYFPDXBNJZSQVHLCKE";
	 
		var ch = "0";
		switch (temp.charAt(0)) {
				case "Y": ch = "1"; break;
				case "Z": ch = "2"; break;
		}
		temp = temp.replace(/\S/,ch);

 		var posicion = temp.substring(0,8) % 23;

		return (temp.charAt(8) == cadenadni.charAt(posicion));
	}

}


UtilV.getTipoNIF = function(documento)
{
		if (/^[KLM0-9]{1}[0-9]{7}[A-Z]{1}$/i.test(documento))	return 1;
		if (/^[ABCDEFGHJPQRSUVNW]{1}[0-9]{7}[A-Z0-9]{1}$/i.test(documento))	return 2;
		if (/^[XYZ]{1}[0-9]{7}[A-Z]{1}$/i.test(documento))	return 3;

		return 0;
}

UtilV.validarDocumento = function(documento) {
		var tipo = UtilV.getTipoNIF(documento);
		var res = false;
		switch(tipo) {
				case 1: res = UtilV.validarNIF(documento);break;
				case 2: res = UtilV.validarCIF(documento);break;
				case 3: res = UtilV.validarNIE(documento);break;
		}
		return tipo * (res?1:-1);
}

/*****************************/
UtilV.validarCCC = function(entidad,sucursal,dc,cuenta) {
	if (!entidad || !sucursal || !dc || !cuenta) return false;
	return (UtilV.digitoControlCCC(entidad+sucursal) == dc.charAt(0) &&
					UtilV.digitoControlCCC(cuenta) == dc.charAt(1));
}
UtilV.digitoControlCCC = function(cadena) {
	   	
		var pesos = new Array(6,3,7,9,10,5,8,4,2,1);
   	var res = 0;	
   	var cadenaint = 1*cadena;
		for (var i=0, l=pesos.length; i < l; i++){
			var r = cadenaint%10;
			res += r * pesos[i];
			cadenaint = (cadenaint-r)/10;
		}
		res = 11 - (res % 11);
		if (res == 11) {res = 0;}
		else if (res == 10) {res = 1;}
		return res;
}
/*****************************/

UtilV.validarMayor = function(valorComparar,valorRef) {
	if (valorComparar=='') return true;
	return valorComparar>valorRef;
}	
UtilV.validarMayorFecha = function(strFechaComparar,strFechaRef) {
	if (strFechaComparar=='') return true;
	return UtilV.parseDate(strFechaComparar,2)>UtilV.parseDate(strFechaRef,2);
}	

/*****************************/

UtilV.getAge = function(dateString,dateType) 
{
		var now = new Date();
		var myDate = UtilV.parseDate(dateString, dateType);
		if (!myDate) return -1;
		
		var millisDate = myDate.getTime();
		var millisToday = now.getTime(); 
		  
		var minutes = 1000 * 60;
		var hours = minutes * 60;
		var days = hours * 24;
		var years = days * 365.256363;
		
		return Math.floor((millisToday-millisDate)/years); 
}
UtilV.parseDate = function(str, type) {
		var year,mon,day;
		switch(type) {
				case 1: day = str.substring(6,8);
								mon = str.substring(4,6)-1; 
				case 3: year = str.substring(0,4); break;
				case 2: var campos = str.split("/");
								day = campos[0];
								mon = campos[1]-1;
								year = campos[2]; break;
				case 4: str = replaceAll(str, '-', '/');
								 var campos = str.split("/");
								day = campos[0];
								mon = campos[1]-1;
								year = campos[2]; break;
		}
		
		var d = new Date(year,mon,day);
		if ( 	(d.getDate()==parseInt(day, 10)) &&
					(d.getMonth()==parseInt(mon, 10)) &&
					(UtilV.y2k(d.getFullYear())==parseInt(year, 10))  ) return d;
		else return false;
}
	
/*****************************/
UtilV.getRadioValue = function(radioObject) { 
	if (radioObject+"" == "undefined" || radioObject == null)
		return null;

	for (var i=0; i < radioObject.length; i++) { 
		if (radioObject[i].checked) return radioObject[i].value;
	} // end for loop 
	
	return null;
}


UtilV.getSelectText = function( selectObject ) 
{
    if (selectObject == null)
            return null;
		var index = selectObject.selectedIndex;
    if (index+"" == "undefined" || index == null || index < 0) return null;

    return selectObject.options[index].text;
}

UtilV.validadorLuhn = function(codigo) {
	//El siguiente algoritmo sirve para validar una tarjeta Iberia Plus
	var suma = 0;

	var alternancia = false;
	for (var i = codigo.length - 1; i >= 0; i--) {
		var n = parseInt(codigo.substring(i, i + 1), 10);
		if (alternancia) {
			n *= 2;
			if (n > 9) {
				n = (n % 10) + 1;
			}
		}
		suma += n;
		alternancia = !alternancia;
	}
	return (suma % 10 == 0);
}

UtilV.validarTarjetaIP = function(codigo){
	//El siguiente algoritmo sirve para validar una tarjeta Iberia Plus
	//Utilizando el validador luhn con 8 posiciones
	var resultado = false;
	if (codigo.length == 8 && UtilV.validadorLuhn(codigo)){
		resultado = true;
	}
	return resultado;
}

// -------------------------------------------------------------------------------------
function UtilF(){}	

UtilF.formatearNIFparaValidacion = function(value) {
		while (value.length<9) value = '0'+value;				
		if (value.length==10 && value.charAt(0)=='0')value = value.substring(1,value.length);
		return value;
	}
UtilF.formatearNIFparaBaseDatos = function(objnif) {
		if (objnif.value.length==9)objnif.value='0'+objnif.value.toUpperCase();
}

UtilF.formatearNIE_CIFparaValidacion = function(value){
	var F = value;
	var len = F.length;
	if (len==10){
		F = F.substr(1,10);
	} else {
		//lo rellenamos con 0 a la izquierda a partir de la letra
		var cadena = F.substr(1);
		
		while (len < 9){
			cadena = "0"+cadena;
			len++;
		}
		F = F.substr(0,1)+cadena;
	}
	return F;
}

UtilF.formatearIdentificacion = function(identificacion){
	identificacion = identificacion.toUpperCase();
	if (UtilV.validarNumero(identificacion.substr(0,1))){ // es un NIF
		identificacion = UtilF.formatearNIFparaValidacion(identificacion);
	} else {//es un CIF o NIE
		identificacion = UtilF.formatearNIE_CIFparaValidacion(identificacion);
	}
	return identificacion;
}

UtilF.formatearCantidadParaVisualizacion = function(valor,numDecimales) 
{
	var valor = new Number(valor).toFixed(numDecimales);
	if (isNaN(valor)) return false;
	var numero = (valor+'').split(".");
	var entera = numero[0];
	var result = '';
	var i= entera.length-1;
	for (;i>2;i=i-3) {
			result = "."+entera.charAt(i-2) + entera.charAt(i-1) + entera.charAt(i) + result;
	}
	return entera.substring(0,i+1)+result+","+numero[1];
}

UtilF.formatearFecha = function(fecha){
	var cadena = fecha.split("/",3);	
	var resultado;
	if ( (cadena[1]== null) && (cadena[2]== null)  ) {
		cadena = fecha.split("-",3);
	}
	if ( (cadena[1]!= null) && (cadena[2]!= null) &&  (cadena[1]!="") && (cadena[2]!="") && (cadena[2].length>=4) && (cadena[0].length>=1) && (cadena[1].length>=1)) {
		var day = cadena[0].replace(/\s/g,'');
		var month = cadena[1].replace(/\s/g,'');
		var year = cadena[2].replace(/\s/g,'');
	
		if (day.length<2){
			day="0"+day;
		}
		if (month.length<2){
			month="0"+month;
		}
		resultado = day+"/"+month+"/"+year;			
	} else {
		resultado = fecha;
	}
	return resultado;
}
								
UtilF.formatearTarjetaIP = function(value){
	while (value.length<8) value = '0'+value;					
	return value;
}
								


