/*-----------------------------------------------------------------------------
  Valida un campo que contiene una fecha en formato : dd-mm-aaaa o dd/mm/aaaa.
  Los días y meses pueden ser de un dígito.
  - fMin: Opcional. fecha mínima. Se omite si es blanco o null.
  - fMax: Opcional. fecha máxima. Se omite si es blanco o null.
  Elimina los espacios laterales del contenido del campo.
-----------------------------------------------------------------------------*/
function vFecha (campo, desc, requerido, fMin, fMax)
{
	var msg='', err=false;
	campo.value = campo.value.trim();
	
	if (campo.value == '')
	{
	    if (requerido)
    	{
    		alert('El campo "'+ desc +'" no puede estar vacio.');
    		campo.focus();
    		return false;
    	}
    	else return true;
    }
    if (!esFechaValida(campo.value)) err=true;
    else if (fMin!=null && fMin!='' && strToDate(campo.value)<strToDate(fMin)) err = true;
    else if (fMax!=null && fMax!='' && strToDate(campo.value)>strToDate(fMax)) err = true;
    if (err)
    {
    	msg = 'El contenido del campo "'+ desc +'" no es una fecha válida.\n'+
    	      'Por favor, introduzca la fecha con el formato "dd-mm-aaaa" o "dd/mm/aaaa".';
		if (fMin != null && fMin!='') msg += '\nNo puede ser inferior a "'+ fMin +'".';
		if (fMax != null && fMax!='') msg += '\nNo puede ser mayor que "'+ fMax +'".';
		alert(msg);
		campo.focus();
		return false;		
    }
    return true;
}

/*-----------------------------------------------------------------------------
  Devuelve una cadena con una fecha en un formato determinado.
  - oDate: objeto Date que contiene la fecha.
  - formato: formato a aplicar a la fecha. Los carácteres para formater la 
    fecha son:
  	- d, dd, ddd, dddd, DDD,DDDD: día. Ej: 1, 01, Lun, Lunes, LUN, LUNES
  	- m, mm, mmm, mmmm, MMM, MMMM: mes. Ej: 1, 01, Ene, Enero, ENE, ENERO
  	- aa, aaaa: año. Ej: 02, 2002
  	- h, hh: hora. Ej: 1, 01
  	- n, nn: minutos. Ej: 1, 01
  	- s, ss: segundos. Ej: 1, 01 	
  	- Si se quiere añadir al resulado un carácter de los anterios se debe
  	  preceder con el car. '/'. Se usa '//' para mostrar una barra simple.
  	- Si se quiere que aparezca una '\' se debe poner dos veces.  
  	- Cualquier otro carácter se añade a la cadena directamente.
  Ej: 'dddd, dd /de mmmm /de aaaa' => Martes, 01 de Enero de 2002	
      'dd//mm//aaaa' => 01/01/2002
-----------------------------------------------------------------------------*/
function dateToStr(oDate, formato)
{
    var re, s='', pos, tmp;
	if (oDate==null) return '';
	
	var re = /((d+)|(m+)|(a+)|(h+)|(n+)|(s+)|([^\/dmahns])|(\/[\/dmahns]?))/i;
		
	pos = formato.search(re);

	while(pos!=-1)
	{
		switch(RegExp.$1)
		{
			case 'd': s += oDate.getDate(); break;
			case 'dd': s += ('0'+oDate.getDate()).right(2); break;
			case 'ddd': 
			case 'DDD': 
				tmp = ['Dom', 'Lun','Mar', 'Mie', 'Jue', 'Vie', 'Sab'][oDate.getDay()]; 
				if (RegExp.$1 == 'DDD') tmp = tmp.toUpperCase();
				s += tmp;
				break;
			case 'dddd': 
			case 'DDDD': 
				tmp = ['Domingo', 'Lunes','Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado'][oDate.getDay()];
				if (RegExp.$1 == 'DDDD') tmp = tmp.toUpperCase();
				s += tmp;
				break;		
			case 'm':  s += oDate.getMonth()+1; break;
			case 'mm': s += ('0'+(oDate.getMonth()+1)).right(2); break;
			case 'mmm': 
			case 'MMM':
				 tmp = ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'][oDate.getMonth()];
				 if (RegExp.$1 == 'MMM') tmp = tmp.toUpperCase();
				 s += tmp;
				 break;
			case 'mmmm':  
			case 'MMMM':  
				 tmp = ['Enero', 'Febrero', 'Marzo', 'Abrril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'][oDate.getMonth()]; 
				 if (RegExp.$1 == 'MMMM') tmp = tmp.toUpperCase();
				 s += tmp;
				 break;
			case 'aa':  s += (oDate.getFullYear()+'').right(2); break;
			case 'aaaa':  s += oDate.getFullYear(); break;
			case 'h': s += oDate.getHours(); break;
			case 'hh': s += ('0'+oDate.getHours()).right(2); break;
			case 'n': s += oDate.getMinutes(); break;
			case 'nn': s += ('0'+oDate.getMinutes()).right(2); break;
			case 's': s += oDate.getSeconds(); break;
			case 'ss': s += ('0'+oDate.getSeconds()).right(2); break;			
			default: 
				if (RegExp.$1.length>1 && RegExp.$1.substr(0,1) == '/') s += RegExp.$1.substr(1);
				else s += RegExp.$1;
		}

		pos = RegExp.rightContext.search(re);
	}
	return s;
}

/*-----------------------------------------------------------------------------
  Devuelve true si la cadena contiene una fecha en formato: dd-mm-aaaa o 
  dd/mm/aaaa. El dia y el mes pueden tener un solo dígito.
-----------------------------------------------------------------------------*/
function esFecha(fecha)
{
    var ar;
    var re = /^((\d{1,2})[\/-](\d{1,2})[\/-](\d{4}))$/;
    if (re.test(fecha)) return true;	
    return false;
}

/*-----------------------------------------------------------------------------
  Devuelve true si la cadena contiene una fecha en formato: dd-mm-aaaa o 
  dd/mm/aaaa y además comprueba que sea válida.
  El dia y el mes pueden tener un solo dígito.
-----------------------------------------------------------------------------*/
function esFechaValida(fecha)
{
	var mat, dia, mes, ano;
    var re = /^((\d{1,2})[\/-](\d{1,2})[\/-](\d{4}))$/;
    if (!re.test(fecha)) return false;
    mat = re.exec(fecha);

	dia = mat[2];
	mes = mat[3]++;
	ano = mat[4];

    if (dia==0 || dia > diasMes(mes, ano)) return false;
    if (mes==0 || mes > 12) return false;
    return true;
}

/*-----------------------------------------------------------------------------
  Devuelve los días que tiene un mes de un año en concreto.
-----------------------------------------------------------------------------*/
function diasMes(m, a)
{
    if ((m==4)||(m==6)||(m==9)||(m==11)) return 30;

    if (m==2)
    {
        if (esBisiesto(a)) return 29;
        else return 28;
    }
    return 31;
}

/*-----------------------------------------------------------------------------
  Devuelve true si una año es bisiesto.
-----------------------------------------------------------------------------*/
function esBisiesto(a)
{
    if (((a%4)==0 && (a%100)!=0) || (a%400==0)) return true;
    else return false;
}

//-----------------------------------------------------------------------------
function obtenerDia(fecha)
{
    var ar;
    var re = /^((\d{1,2})[\/-](\d{1,2})[\/-](\d{4}))$/;

    if (!re.test(fecha)) return '';
    ar = re.exec(fecha);
    return ar[2];
}

//-----------------------------------------------------------------------------
function obtenerMes(fecha)
{
    var ar;
    var re = /^((\d{1,2})[\/-](\d{1,2})[\/-](\d{4}))$/;

    if (!re.test(fecha)) return '';
    ar = re.exec(fecha);
    return ar[3];
}

//-----------------------------------------------------------------------------
function obtenerAno(fecha)
{
    var ar;
    var re = /^((\d{1,2})[\/-](\d{1,2})[\/-](\d{4}))$/;

    if (!re.test(fecha)) return '';
    ar = re.exec(fecha);
    return ar[4];
}


/*-----------------------------------------------------------------------------
  Convierte una cadena a una fecha (objeto Date). Si la cadena no tiene una 
  fecha válida un nulo.
-----------------------------------------------------------------------------*/
function strToDate(fecha)
{
    var mat;
    var re = /^((\d{1,2})[\/-](\d{1,2})[\/-](\d{4}))$/;
    if (!re.test(fecha)) return null;
    mat = re.exec(fecha);

    return new Date(mat[4], mat[3]-1, mat[2]);
}


