function UtilV() {};

function check(id,tipo,strAlert)
	{
		var result = false;
		var obj = UtilV.setCampoParaValidacion(id);
		var value = UtilV.getValueTrim(obj);
		if (value=='' && tipo!='nulo' && tipo!='checkbox') 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,","); break; }
			case 'decimal2': { result = UtilV.validarDecimal(value,",."); break; }
			case 'capital': { result = UtilV.validarCapital(value); 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); obj = obj[0]; break; }
			case 'nombre': { result = UtilV.validarNombre(value); break; }
			case 'descripcion': { result = UtilV.validarDescripcion(value); break; }
			case 'telefono': { result = UtilV.validarTelefono(value, true); break; }
			case 'telefonoOficina': { result = UtilV.validarExtension(value, true); break; }
			case 'movil': { result = UtilV.validarMovil(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);
				UtilV.setCampoConError(obj);
				obj.focus();
			}
		}
		return result;
	}

/*****************************/
function checkArray(arrayIds,tipo,strOperacion,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 'valores': { result = eval(UtilF.formatearCantidadParaInput(arrayValues[0],".") 
															+ strOperacion + UtilF.formatearCantidadParaInput(arrayValues[1],".")); break; }
				case 'cadenas': { var comilla = "'"; result = eval(comilla+arrayValues[0]+comilla+strOperacion+comilla+arrayValues[1]+comilla); break; }
				case 'edades': { result = eval(UtilV.getAge(arrayValues[0],2) + strOperacion + UtilV.getAge(arrayValues[1],2)); break; }
				case 'fechas': { result = eval(UtilV.parseDate(arrayValues[0],2) + strOperacion + UtilV.parseDate(arrayValues[1],2)); break; }
				case 'false': { result = false; break; }
			}	
		
		if (!result) 
		{
			if (strAlert!=null && strAlert!= '') {
				alert(strAlert, arrayCampos[0]);
				iter(arrayCampos,UtilV.setCampoConError);
				arrayCampos[0].focus();
			}
		}
		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 'valor': { result = eval(UtilF.formatearCantidadParaInput(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.setCampoConError(obj);
				obj.focus();
			}
		}
		return result;
	}
	
/*****************************/	
UtilV.setCampoConError = function(campo){
		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);
		
		var func = null;
		if (arrayIds) 
			func = function () 
				{ 
					for (var x=0;x<arrayIds.length;x++) {
						document.forms[0][arrayIds[x]].style.backgroundColor = ''; 
					}
				}; 
		else
			func = function () 
				{ 
					theFormtxtNombre.style.backgroundColor = ''; 
				};
				
		UtilV.addEvent("onblur",theFormtxtNombre,func);
		return theFormtxtNombre;
}	
UtilV.getValueTrim = function(obj) {
	obj.value = (""+obj.value).replace(/^[ \t\r\n]+|[ \t\r\n]+$/,'');
	return obj.value;
}
UtilV.addEvent = function(event, obj,newEvent) {
	if (!obj) return;
	var oldEvent = obj[event];
	if (typeof oldEvent == 'function') 
		obj[event] = function() {oldEvent();newEvent();}
	else obj[event] = newEvent;
}
/*****************************/
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) {
	return UtilV.validaRegExp("^[0-9]+(["+sep+"]?[0-9]+)?$",value);
}
UtilV.validarCapital = function(value) {
	return UtilV.validaRegExp("^((([0-9]{1,3})([.][0-9]{3})*)|([0-9]+))([,]?[0-9]{1,2})?$",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áéíóúÁÉÍÓÚñÑäëïöüÄËÏÖÜàèìòùÀÈÌÒÙ\s.]+(([- ])*[a-zA-ZáéíóúÁÉÍÓÚñÑäëïöüÄËÏÖÜàèìòùÀÈÌÒÙ\s.]+)*$",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.validarExtension = function(value, espaciado)	{
	var val = ( espaciado ) ? (""+value).replace(/ /gi,"") : ( value );
	return UtilV.validaRegExp("([0-9]{4}$)",val);
}
UtilV.validarMovil = function(value, espaciado)	{
	var val = ( espaciado ) ? (""+value).replace(/ /gi,"") : ( value );
	return UtilV.validaRegExp("^[6]{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.getYear());
	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 (!/^[ABCDEFGHJLPQRSUVNW]{1}[0-9]{7}[A-Z0-9]{1}$/.test(temp))	{
			return false;
		}
 
		//algoritmo para comprobacion de codigos tipo CIF
		var suma = parseFloat(documento.charAt(2))+parseFloat(documento.charAt(4))+parseFloat(documento.charAt(6));
		for (var i=1; i < 8; i += 2)
		{
				var n = 2 * parseFloat(documento.charAt(i));
				suma += Math.floor(n/10)+n%10;
		}

		var n = 10 - suma%10;

		//comprobacion de CIFs con codigo de control de tipo numerico
		if (/^[ABCDEFGHJLNUV]{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 (/^[ABCDEFGHJLPQRSUVNW]{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.getAge = function(dateString,dateType) 
{
		var myDate = UtilV.parseDate(dateString, dateType);
		if (!myDate) return -1;
		return UtilV.getAgeFromDate(myDate); 
}

UtilV.getAgeFromDate = function(myDate) 
{
		var now = new Date();
		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: str = str.replace(/-/g,"/");
								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()==parseFloat(day)) &&
					(d.getMonth()==parseFloat(mon)) &&
					(UtilV.y2k(d.getYear())==parseFloat(year))  ) 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;
}






























// -------------------------------------------------------------------------------------
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(id) {
		var objnif = document.forms[0][id];
		if (objnif.value.length==9)objnif.value='0'+objnif.value.toUpperCase();
}
UtilF.formatearFechaParaBaseDatos = function(id) {
		var obj = document.forms[0][id];

		if (obj.value && typeof obj.value == 'string') {
			var fecha = (obj.value.replace(/-/g,"/")).split("/");
			obj.value = (fecha[0].length==1?"0"+fecha[0]:fecha[0]) + "/" +
									(fecha[1].length==1?"0"+fecha[1]:fecha[1]) + "/" +
									fecha[2];
		}	
}






























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+(numDecimales?(","+numero[1]):"");
}
UtilF.formatearCantidadParaInput = function(valor,opt_separador) 
{
	var numero = (""+valor).split(",");
	if (numero.length==2) numero[0] = numero[0].replace(".",""); // el formato es ##.###,## o #####,## 
	else if (numero.length==1) numero = numero[0].split("."); // el formato es #####.## o #####
	
	var hayDecimal = numero.length==2 && parseFloat(numero[1])!=0;
	return numero[0] + (hayDecimal ? (opt_separador?opt_separador:",") + numero[1] : "");
}

								







