var tletraonumero       = /^([a-zA-Z]|\d|[.\-_@])+$/
var tletraonumeroospace = /^([a-zA-Z]|\d| |[().,])+$/
var tnumero             = /^\d+$/
var tdecimal            = /^\d+\.\d+$/
var tmail               = /^.+\@.+\..+$/


var mensajesValidacion = new Array();
var numeroCamposValidar = 10;
var campos = new Array();
var mensajecampos = "Debe rellenar los datos obligatorios"
var obligmsg = new Array();
var emails = new Array();
var mensajeemails = "La dirección de correo eléctronico no es válida"
var emailmsg = new Array();
var tlfsmovil = new Array();
var mensajetlfmovil = "El número de telefono móvil es incorrecto"
var tlfmovilmsg = new Array();
var fechas = new Array();
var mensajefechas = "La fecha introducida es incorrecta"
var fechamsg = new Array();
var mensajefechasanno = "El año debe ser un número entre 1900 y 2100"
var mensajefechasmes = "El mes debe ser un número entre 1 y 12"
var mensajefechasdia = "El día es incorrecto"
var mensajefechasformato = "El formato de la fecha es dd/mm/aaaa ó dd/mm/aa"
var annosmenores = new Array();
var annosmenoresmsg = new Array();
var mensajeannosmenores = "El año introducido tiene que se igual o menor al actual";
var numeros = new Array();
var numerosmsg = new Array();
var mensajenumeros="El dato debe ser numérico";
var decimales = new Array();
var decimalesmsg = new Array();
var mensajedecimales="El dato debe ser numérico";
var campostamano = new Array();
var tamanos = new Array();
var campostamanomsg = new Array();
var mensajecampostamano = "El numero de caracteres en el campo supera la cantidad máxima";

function Validator()
{
	//Atributos
	this.mensajesValidacion = new Array();
	this.numeroCamposValidar = 10;
	this.campos = new Array();
	this.mensajecampos = "Debe rellenar los datos obligatorios"
	this.obligmsg = new Array();
	this.emails = new Array();
	this.mensajeemails = "La dirección de correo eléctronico no es válida"
	this.emailmsg = new Array();
	this.tlfsmovil = new Array();
	this.mensajetlfmovil = "El número de telefono móvil es incorrecto"
	this.tlfmovilmsg = new Array();
	this.fechas = new Array();
	this.mensajefechas = "La fecha introducida es incorrecta"
	this.fechamsg = new Array();
	this.mensajefechasanno = "El año debe ser un número entre 1900 y 2100"
	this.mensajefechasmes = "El mes debe ser un número entre 1 y 12"
	this.mensajefechasdia = "El día es incorrecto"
	this.mensajefechasformato = "El formato de la fecha es dd/mm/aaaa ó dd/mm/aa"
	this.annosmenores = new Array();
	this.annosmenoresmsg = new Array();
	this.mensajeannosmenores = "El año introducido tiene que se igual o menor al actual";
	this.numeros = new Array();
	this.numerosmsg = new Array();
	this.mensajenumeros="El dato debe ser numérico";
	this.decimales = new Array();
	this.decimalesmsg = new Array();
	this.mensajedecimales="El dato debe ser numérico";
	this.campostamano = new Array();
	this.tamanos = new Array();
	this.campostamanomsg = new Array();
	this.mensajecampostamano = "El numero de caracteres en el campo supera la cantidad máxima";
	//functiones
	this.ini_obligatorios = ini_obligatorios;
	this.add_obligatorios = add_obligatorios;
	this.remove_obligatorios = remove_obligatorios;
	this.addCampoTamano = addCampoTamano;
	this.addMsgCampoTamano = addMsgCampoTamano;
	this.addMsgObligatorio = addMsgObligatorio;
	this.ini_emails = ini_emails;
	this.addMsgEmail = addMsgEmail;
	this.ini_fechas = ini_fechas;
	this.addMsgFechas = addMsgFechas;
	this.ini_tlfsmovil = ini_tlfsmovil;
	this.addMsgTlfMovil = addMsgTlfMovil;
	this.ini_annosmenores = ini_annosmenores;
	this.addMsgAnnoMenor = addMsgAnnoMenor;
	this.ini_numeros = ini_numeros;
	this.addMsgNumero = addMsgNumero;
	this.ini_decimales = ini_decimales;
	this.addMsgDecimal = addMsgDecimal;
	this.enfocar = enfocar;
	this.enviar_formulario = enviar_formulario;
	this.addTxtValidacion = addTxtValidacion;
	this.validar_formulario = validar_formulario;
	this.borrar_formulario = borrar_formulario;
}

//Función para introducir los campos obligatorios del formulario
function ini_obligatorios(){
	for (i=0;i<ini_obligatorios.arguments.length;i++){
		campos[i]=ini_obligatorios.arguments[i];
		obligmsg[i] = mensajecampos;
	}
}

//Función para añadir campos obligatorios una vez inicializada la función
function add_obligatorios(){
	for (i=0;i<add_obligatorios.arguments.length;i++){
		campos[campos.length]=add_obligatorios.arguments[i];
		obligmsg[obligmsg.length] = mensajecampos;
	}	
}

//Función para eliminar campos obligatorios
function remove_obligatorios(){
	camposaux = new Array();
	mensajesaux = new Array();
	for (x=0;x<campos.length;x++){
		valido = true;
		for (i=0;i<remove_obligatorios.arguments.length;i++){		
			if (remove_obligatorios.arguments[i]==campos[x]){
				valido=false;
			}
		}
		if (valido){
			camposaux[camposaux.length] = campos[x];
			mensajesaux[mensajesaux.length] = obligmsg[x];
		}		
	}
	campos = camposaux;
	obligmsg = mensajesaux;	
}

//Funcion para añadir campos que tienen una longitud limitada
function addCampoTamano(campo,tamano){
	campostamano[campostamano.length] = campo;
	tamanos[tamanos.length] = tamano;
	campostamanomsg[campostamanomsg.length] = mensajecampostamano;
}

//Funcion para añadir mensajes cuando un campo sea obligatorio
function addMsgCampoTamano(campo,mensaje){
	encontrado=false;
	i=0;
	while (i<campostamanomsg.length){	
		if (campostamano[i]==campo){
			campostamanomsg[i]=mensaje;
			i=campostamanomsg.length;
		}		
		i++;
	}
}

//Funcion para añadir mensajes cuando un campo sea obligatorio
function addMsgObligatorio(campo,mensaje){
	encontrado=false;
	i=0;
	while (i<obligmsg.length){	
		if (campos[i]==campo){
			obligmsg[i]=mensaje;
			i=obligmsg.length;
		}		
		i++;
	}
}


//Función para introducir los campos de email que hay que validar
function ini_emails(){
	for (i=0;i<ini_emails.arguments.length;i++){
		emails[i]=ini_emails.arguments[i];
		emailmsg[i] = mensajeemails;
	}
}

//Funcion para personalizar el mensaje cuando un campo sea un email
function addMsgEmail(campo,mensaje){
	encontrado=false;
	i=0;
	while (i<emailmsg.length){	
		if (emails[i]==campo){
			emailmsg[i]=mensaje;
			i=emailmsg.length;
		}		
		i++;
	}
}

//Función para introducir los campos de email que hay que validar
function ini_tlfsmovil(){
	for (i=0;i<ini_tlfsmovil.arguments.length;i++){
		tlfsmovil[i]=ini_tlfsmovil.arguments[i];
		tlfmovilmsg[i] = mensajetlfmovil;
	}
}

//Funcion para personalizar el mensaje cuando un campo sea un telefono móvil
function addMsgTlfMovil(campo,mensaje){
	encontrado=false;
	i=0;
	while (i<tlfmovilmsg.length){	
		if (tlfsmovil[i]==campo){
			tlfmovilmsg[i]=mensaje;
			i=tlfmovilmsg.length;
		}		
		i++;
	}
}

//Función para introducir los campos de fecha que hay que validar
function ini_fechas(){
	for (i=0;i<ini_fechas.arguments.length;i++){
		fechas[i]=ini_fechas.arguments[i];
		fechamsg[i] = mensajefechas;
	}
}

//Funcion para añadir mensajes cuando un campo sea de tipo fecha
function addMsgFechas(campo,mensaje)
{
	encontrado=false;
	i=0;
	while (i<fechamsg.length)
	{	
		if (fechas[i]==campo)
		{
			fechamsg[i]=mensaje;
			i=fechamsg.length;
		}		
		i++;
	}
}

//Función para introducir los campos numericos menores que el año actual
function ini_annosmenores(){
	for (i=0;i<ini_annosmenores.arguments.length;i++){
		annosmenores[i]=ini_annosmenores.arguments[i];
		annosmenoresmsg[i] = mensajeannosmenores;
	}
}

//Funcion para personalizar el mensaje cuando un campo sea un telefono móvil
function addMsgAnnoMenor(campo,mensaje){
	encontrado=false;
	i=0;
	while (i<annosmenoresmsg.length){	
		if (annosmenores[i]==campo){
			annosmenoresmsg[i]=mensaje;
			i=annosmenoresmsg.length;
		}		
		i++;
	}
}

//Función para introducir los campos numericos que hay que validar
function ini_numeros(){
	for (i=0;i<ini_numeros.arguments.length;i++){
		numeros[i]=ini_numeros.arguments[i];
		numerosmsg[i] = mensajenumeros;
	}
}

//Funcion para personalizar el mensaje cuando un campo sea un telefono móvil
function addMsgNumero(campo,mensaje){
	encontrado=false;
	i=0;
	while (i<numerosmsg.length){	
		if (numeros[i]==campo){
			numerosmsg[i]=mensaje;
			i=numerosmsg.length;
		}		
		i++;
	}
}

//Función para introducir los campos numericos decimales que hay que validar
function ini_decimales(){
	for (i=0;i<ini_decimales.arguments.length;i++){
		decimales[i]=ini_decimales.arguments[i];
		decimalesmsg[i] = mensajedecimales;
	}
}

//Funcion para personalizar el mensaje cuando un campo sea un telefono móvil
function addMsgDecimal(campo,mensaje){
	encontrado=false;
	i=0;
	while (i<decimalesmsg.length){	
		if (decimales[i]==campo){
			decimalesmsg[i]=mensaje;
			i=decimalesmsg.length;
		}		
		i++;
	}
}

// Mueve el foco al objeto que se le pasa si no está oculto
function enfocar(objeto){
	if (objeto.type!="hidden"){
		objeto.focus();
		if (objeto.type=="text"){			
			objeto.select();
		}		
	}	
}

/*Envío de los datos del formulario en caso de que todos los campos obligatorios sean correctos
*/
function enviar_formulario(formulario){
	if (validar_formulario(formulario)){
		formulario.submit();
	}
}

/* ---------------------------------------------------------------------------------
 * Elimina los blancos de la cadena que se pasa como parámetro.
 * Si la cadena es nula la función devuelve un carácter vacío.
 * --------------------------------------------------------------------------------- */
function trim(cadena) {
	var buffer = '';
	if (cadena != null) {
		var lenCad = cadena.length;
		for (idx=0; idx<lenCad; idx++) {
			var car = cadena.charAt(idx);
			if (car != ' ' && car!='\n' && car!='\r' && car!='\t') {
				buffer += car;
			}
		}
	}
	return buffer;
}

/* ---------------------------------------------------------------------------------
 * Función que permite validar si en un campo de texto se ha introducido algún valor
 * --------------------------------------------------------------------------------- */
function isVacio(campo) {
	var ret = false;
	if (campo == null || trim(campo) == '') {
		ret = true;
	}
	return ret;
}

/*Comprobación de que un campo obligatorio de un formulario tiene un valor*/
function campo_valido(formulario,campo){
	var valido=false;
	if (campo.type)
	{
		switch (campo.type){
			case "select-one":
				valido=(campo.selectedIndex>0);
				break;
			case "checkbox":
				valido=campo.checked;
				break;
			default:
		   		valido=!isVacio(campo.value);
				break;
		}
	}
	else
	{
		for(x=0;campo.length && x<campo.length;x++)
		{
			if (campo[x].checked)
			{
				return true;
			}
		}
	}
   return (valido);
}  

function addTxtValidacion(msj)
{
	if (mensajesValidacion.length<=numeroCamposValidar-1)
	{
		mensajesValidacion[mensajesValidacion.length] = msj;
		return true
	}
	else
	{
		msj = '.........';
		mensajesValidacion[mensajesValidacion.length] = msj;
	}
	return false;
}


/* Función para validación de los campos obligatorios de un formulario.
	Para ello habra que definir en un script dentro de la página del formulario
	la lista de campos que deben ser comunes. Esta lista debe llamarse "campos".
*/
function validar_formulario(formulario) 
{
	mensajesValidacion = new Array();
	formValido = true;
	//Validación de los campos obligatorios
	for (i=0;i<campos.length && formValido;i++) 
	{
		campoOblig = formulario.elements[campos[i]];
		if (campoOblig && (campoOblig.type || campoOblig.length) && !campo_valido(formulario,campoOblig))
		{   
			formValido = addTxtValidacion(obligmsg[i]);
		}
	}	
	//Validación de los campos de e-mail
	for (i=0;i<emails.length && formValido;i++) {
		
   	if (formulario.elements[emails[i]] && !isEmail(formulario.elements[emails[i]].value))
   		{
			formValido = addTxtValidacion(emailmsg[i]);

		}
	}
	//Validación de los campos de teléfono móvil
	for (i=0;i<tlfsmovil.length && formValido;i++) {
   	if (formulario.elements[tlfsmovil[i]] && !isTlfMovil(formulario.elements[tlfsmovil[i]].value)){
			formValido = addTxtValidacion(tlfmovilmsg[i]);
		}
	}
	//Validación de los campos fecha
	for (i=0;i<fechas.length && formValido;i++) {
   	if (formulario.elements[fechas[i]] && !isFecha(formulario.elements[fechas[i]].value)){
			formValido = addTxtValidacion(fechamsg[i]);
		}
	}
	
	//Validación de los campos de años menores al actual
	fechaActual = new Date();
	for (i=0;i<annosmenores.length && formValido;i++) {
   		if ((formulario.elements[annosmenores[i]] && !isNumber(formulario.elements[annosmenores[i]].value)) || (formulario.elements[annosmenores[i]] && isNumber(formulario.elements[annosmenores[i]].value) && formulario.elements[annosmenores[i]].value>fechaActual.getYear())){
			formValido = addTxtValidacion(annosmenoresmsg[i]);
		}
	}
	
	//Validación de los campos numericos
	for (i=0;i<numeros.length && formValido;i++) {
   	if (formulario.elements[numeros[i]] && !isNumber(formulario.elements[numeros[i]].value)){
			formValido = addTxtValidacion(numerosmsg[i]);
		}
	}

	//Validación de los campos numericos decimales
	for (i=0;i<decimales.length && formValido;i++) {
   	if (formulario.elements[decimales[i]] && !isDecimal(formulario.elements[decimales[i]].value)){
			formValido = addTxtValidacion(decimalesmsg[i]);
		}
	}

	//Validación de los campos con longitud fija
	for (i=0;i<campostamano.length && formValido;i++) {
   	if (formulario.elements[campostamano[i]] && formulario.elements[campostamano[i]].value.length>tamanos[i]){
			formValido = addTxtValidacion(campostamanomsg[i]);
		}
	}
	if (mensajesValidacion.length>0)
	{
		msjSalida = "";
		for (i=0;i<mensajesValidacion.length;i++)
		{
			msjSalida +=  mensajesValidacion[i] + '\r\n';
		}
		alert(msjSalida);
		return false;
	}
	return true;
}

function borrar_formulario(formulario)
{
	for (i=0;i<formulario.elements.length;i++)
	{
		campo = formulario.elements[i];
		switch (campo.type){
			case "radio":
				for (r=0;i<campo.length;r++)
					campo[r].checked = false;
				break;
			case "select-one":
				campo.selectedIndex = -1;
				break;
			case "select-multiple":
				campo.selectedIndex = -1;
				break;
			case "checkbox":
				campo.checked=false;
				break;
			case "text":
				campo.value='';
				break;
			default:
				break;
		}
	}
}

function isNumber(c){
	return (c==null || c=="" || tnumero.test(c))
}

function isEmail(c) {
	return (c==null || c=="" || (tletraonumero.test(c) && tmail.test(c)))
}

function isTlfMovil(c) {
	return (c==null || c=="" || (tnumero.test(c) && c.length==9 && c.substring(0,1)=="6"))
}

function isDecimal(c)
{
	return (c==null || c=="" || isNumber(c) || tdecimal.test(c))	
}

//Funciones de validación de fechas
function isFecha(fecha) {	
	var expr = /^(\d|\d{2})\/(\d|\d{2})\/(\d{4})$/;
	var expr2 = /^(\d|\d{2})\/(\d|\d{2})\/(\d{2})$/;
	if (fecha==null || fecha=="" || expr.test(fecha) || expr2.test(fecha)) {
		if (fecha!=null && fecha!=""){
			var aDiasMes = new Array(31,29,31,30,31,30,31,31,30,31,30,31);
			var meses = new Array("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre");
			var aFecha = fecha.split('/');
			var dia = aFecha[0];
			var mes = aFecha[1];
			var ano = aFecha[2];
			var diasFebrero = (ano % 4 == 0 && (!(ano % 100 == 0) || (ano % 400 == 0)) ? 29 : 28);
		
			if (ano.length==4 && (ano < 1900 || ano > 2100)){
				mensajefechas=mensajefechasanno;
		    	return false;		   
			}
			if (mes < 1 || mes > 12){
				mensajefechas=mensajefechasmes;
				return false;
			}
			if	(dia < 1 || dia > aDiasMes[mes-1] || (mes == 2 && dia > diasFebrero)){
				mensajefechas= mensajefechasdia
				return false;
			}
		} 
	}
	else {
		mensajefechas=mensajefechasformato
		return false;
	}

	return true;
}

function formatearDecimal(numero,numeroDecimales)
{
	numDec = 2;
	if (numeroDecimales)
		numDec = numeroDecimales
	totalstr=numero + "";
	coma = totalstr.indexOf(".")
	if (coma!=-1){
		if ((coma+numDec+1) < totalstr.length){
			totalstr = totalstr.substring(0,coma+3);
		}			
	}
	return (totalstr);
}


function inicializarFechaActual(fechasActual) {
   	if (formulario.elements[fechasActual]) {
   		formulario.elements[fechasActual].value=getFechaActual();
	}
}

function getFechaActual()
{
	fecha = new Date();
	return addZero(fecha.getDate()) + "/" + addZero(fecha.getMonth()+ 1) + "/" + addZero(fecha.getYear());
}		

function addZero(vNumber){ 
	return ((vNumber < 10) ? "0" : "") + vNumber 
} 


function compareNumbers()
{
	numero = compareNumbers.arguments[0];
	for (i=1;i<compareNumbers.arguments.length;i++)
	{
		if (compareNumbers.arguments[i]<numero)
		{
			return false;
		}
		numero = compareNumbers.arguments[i];
	}
	return true;
}

function compareDates()
{
	fecha = compareDates.arguments[0];
	for (i=1;i<compareDates.arguments.length;i++)
	{
		//alert(convertirFecha(compareDates.arguments[i]) + ' < ' + convertirFecha(fecha));
		if (convertirFecha(compareDates.arguments[i])<convertirFecha(fecha))
		{
			return false;
		}
		fecha = compareDates.arguments[i];
	}
	return true;
}

function convertirFecha(fecha) {
	if (fecha.indexOf('/')==-1) {
		return "";	
	} else {
		aux = fecha.split('/');
		
		if (aux.length==2) {
			return aux[1] + convertirMes(aux[0]);
		} else if (aux.length==3) {		
			return aux[2] + convertirMes(aux[1]) + aux[0];	
		} else {
			return "";
		}
	}
}

function convertirMes(mes) {	
	mesConvert = mes;
	if (isNaN(mesConvert)) {		
		switch (mesConvert) {
			case 'ENE':
				mesConvert='01';
				break;
			case 'FEB':
				mesConvert='02';
				break;
			case 'MAR':
				mesConvert='03';
				break;
			case 'ABR':
				mesConvert='04';
				break;
			case 'MAY':
				mesConvert='05';
				break;
			case 'JUN':
				mesConvert='06';
				break;
			case 'JUL':
				mesConvert='07';
				break;
			case 'AGO':
				mesConvert='08';
				break;
			case 'SEP':
				mesConvert='09';
				break;
			case 'OCT':
				mesConvert='10';
				break;
			case 'NOV':
				mesConvert='11';
				break;
			case 'DIC':
				mesConvert='12';
				break;
		}
	}
	return mesConvert;
}
	