function calendario (campo_destino, valor_campo, dia_minimo, dia_maximo, estilo)//EL PARAMETRO FINES_SEMANA, NOS SERVITRA PARA PINTAR O NO TODOS LOS FINES DE SEMANA
{
	var dias_siguientes=0;//Para controlar que no se enlacen los dias del mes siguiente	
	var pos=0;//Para conocer la posicion y número de elemnetos de los arrays de fechas	
	var entra=0;	
	var j=0;

	var diaminimo = fecha_cal (dia_minimo);			//Paso a fecha maquina el dia minimo
	var diamaximo = fecha_cal (dia_maximo);			//Paso a fecha maquina el dia maximo

	var meses = ["ENERO", "FEBRERO", "MARZO", "ABRIL", "MAYO", "JUNIO", "JULIO", "AGOSTO", "SEPTIEMBRE", "OCTUBRE", "NOVIEMBRE", "DICIEMBRE"];
	var dias_semana = ["D", "L", "M", "X", "J", "V", "S"];

	var inicio_semana = 1;		//Utilizo esta variable para iniciar la semana en Lunes

	var dia =(valor_campo == null || valor_campo =="" ? diaminimo : fecha_cal (valor_campo));  //Si el campo de la fecha del htm esta en blanco pongo la fecha de dia minimo, si no el que aparece en el campo fecha

	var mes_anterior = new Date(dia);							//Se establece la misma fecha del dia actual pero en el mes anterior
	mes_anterior.setMonth(dia.getMonth()-1);
	if (dia.getMonth()%12 != (mes_anterior.getMonth()+1)%12)
	{
		mes_anterior.setMonth(dia.getMonth());
		mes_anterior.setDate(0);
	}

	var mes_siguiente = new Date(dia);							//Se establece la misma fecha del dia actual pero en el mes siguiente
	mes_siguiente.setMonth(dia.getMonth()+1);
	if ((dia.getMonth() + 1)%12 != mes_siguiente.getMonth()%12)
		mes_siguiente.setDate(0);

	var primer_dia = new Date(dia);							//Muestra el primer dia que va a aparecer en cada pantallazo del calendario
	primer_dia.setDate(1);
	primer_dia.setDate(1-(7+primer_dia.getDay()-inicio_semana)%7);
	var ultimo_dia = new Date(mes_siguiente);					//Muestra el ultimo día que va a aparecer en cada pantallazo del calendario
	ultimo_dia.setDate(0);

	var cadena_htm = new String(								//Comienza la estructura de la tabla del calendario
	"<html>\n"+
	"<head>\n"+
	"<title>Calendario</title>\n"+
	"<LINK href=../elementos/" + estilo + ".css rel=stylesheet type='text/css'>"+
	"</head>\n"+
	"<body class='fondobody' topmargin=\"5\" leftmargin=\"5\" onLoad=\"self.name='calendario'\">\n"+
	"<table cellspacing=\"0\" border=\"0\" width=\"100%\">\n"+
	"<tr><td class='rebordeexteriortabla'>\n"+
	"<table cellspacing=\"1\" cellpadding=\"0\" border=\"0\" width=\"100%\" class='bordetabla'>\n"+
	"<tr>\n	<td class='fondoizq' align=\"center\" height=\"18\">");

//Se pinta la cabecera del calendario
	if (diaminimo.getMonth() != diamaximo.getMonth () || diaminimo.getYear() != diamaximo.getYear ())//Para controlar la navegacion del calendario
	{
	cadena_htm += "<a href=\"javascript:window.opener.calendario('" + campo_destino + "', '" + fecha_text (mes_anterior) + "','" + fecha_text (diaminimo) + "','" + fecha_text (diamaximo)  + "','" + estilo +"');\" style=\"text-decoration: none\" class='flechaizq'><<</a>";		//Pinta la flecha para acceder al mes anterior,IMPORTANTE, PASAR EL VALOR 1/O PARA PINTAR TODOS LOS FINES DE SEMANA
	cadena_htm += "</td>\n" + "<td class='fondotitulo' colspan=\"5\" align=\"center\">" + "<font class=\"titulo\">" + meses[dia.getMonth()] + " " + dia.getFullYear() + "</font></td>\n" + "<td class='fondoder' align=\"center\">";														//Pinta el mes y año en el que se encuentra el calendario
	cadena_htm += "<a href=\"javascript:window.opener.calendario('" + campo_destino + "', '" + fecha_text (mes_siguiente) + "','" + fecha_text (diaminimo) + "','" + fecha_text (diamaximo) + "','" + estilo +"');\" style=\"text-decoration: none\" class='flechader'>>></a>";	//Pinta la flecha para acceder al mes siguiente
	cadena_htm += "</td>\n</tr>\n";
	}
	else//Este condicional restringe el que se pueda navegar en el calendario si solo pintas dias sueltos del mismo mes
	{
	cadena_htm += "&nbsp;";		//Pinta la flecha para acceder al mes anterior,IMPORTANTE, PASAR EL VALOR 1/O PARA PINTAR TODOS LOS FINES DE SEMANA
	cadena_htm += "</td>\n" + "<td class='fondotitulo' colspan=\"5\" align=\"center\">" + "<font class=\"titulo\">" + meses[dia.getMonth()] + " " + dia.getFullYear() + "</font></td>\n" + "<td class='fondoder' align=\"center\">";														//Pinta el mes y año en el que se encuentra el calendario
	cadena_htm += "&nbsp;";	//Pinta la flecha para acceder al mes siguiente
	cadena_htm += "</td>\n</tr>\n";
	}
	var dia_actual = new Date(primer_dia);		//Segunda variable que almacena el primer día que va a aparecer en el calendario
	
// Imprime los dias de la semana (L,M,X,J,V,S,D)
	cadena_htm += "<tr>\n";
	for (var n=0; n<7; n++)
	{
		cadena_htm += "	<td class=\"fondodiassemana\" width=\"35\" height=\"16\" align=\"center\">";
		if (n == 6)
			cadena_htm += "<font class=\"domingocabecera\">"
		else
			cadena_htm += "<font class=\"diassemana\">"
		cadena_htm += dias_semana [(inicio_semana + n) % 7] + "</font></td>\n";
	}

	while (dia_actual.getMonth() == dia.getMonth() || dia_actual.getMonth() == primer_dia.getMonth())		//Controla que no pinte mas lineas de las que tiene el mes actual
	{
		cadena_htm += "<tr>\n";
		for (var contador_semana=0; contador_semana<7; contador_semana++)		// Controla que solo se pinten 7 dias por página
		{
			entra=0;
// Aqui se pintan los fondos de la tabla de dias
			if (dia_actual.getDay() == 0)
				cadena_htm += "<td class=\"fondodomingo\" align=\"center\" height=\"16\">";	// pinta color de fondo de los fines de semana
			else
				cadena_htm += "<td class=\"fondodias\" align=\"center\" height=\"16\">";     // pinta color de fondo de los dias laborables

// Aqui se pintan los dias
			if ((dia_actual >= diaminimo) && (dia_actual <= diamaximo))		//Controla que el dia actual sea superior al inicio del folleto e inferior al de fin de folleto
			{
				if (dia_actual.getMonth() == dia.getMonth())		// Prepara el enlace y el color del texto para pintar los dias del mes actual
				{
					if (dia_actual.getDay() == 0)	//Si es domingo
						cadena_htm += "<a class=\"domingo\" href=\"javascript:window.opener." + campo_destino + ".value='" + fecha_text (dia_actual)+"'; window.opener." + campo_destino + ".onchange();  window.close();\" style=\"text-decoration: none\">" + "";	
					else								
						cadena_htm += "<a class=\"dias\" href=\"javascript:window.opener." + campo_destino + ".value='" + fecha_text (dia_actual)+"'; window.opener." + campo_destino + ".onchange();  window.close();\" style=\"text-decoration: none\">" + "";
				}
				else 			
				{
					if(dias_siguientes==0) // Prepara el enlace y el color del texto para pintar los dias del mes siguiente
					{
						if (dia_actual.getDay() == 0)	//Si es domingo				
							cadena_htm += "<a class=\"diassenalados\" href=\"javascript:window.opener." + campo_destino + ".value='" + fecha_text (dia_actual) + "'; window.opener." + campo_destino + ".onchange(); window.close();\" style=\"text-decoration: none\">" + "";
						else
							cadena_htm += "<a  href=\"javascript:window.opener." + campo_destino + ".value='" + fecha_text (dia_actual)+"'; window.opener." + campo_destino + ".onchange();  window.close();\" style=\"text-decoration: none\"><font class=diasnosenalados>" + "";
					}						
				}
				cadena_htm += (dia_actual.getDate()) + "</font></a></td>\n";		// Pinta el día
			}
			else	// Pinta los dias del mes anterior o los dias del mes actual inferiores a la fecha actual, estos no tienen enlace
			{
				cadena_htm += "<font class=diasnosenalados>";
				cadena_htm += (dia_actual.getDate())+"</font></td>\n";
			}

			dia_actual.setDate(dia_actual.getDate() + 1);
		}
		cadena_htm += "</tr>\n";
	}
	cadena_htm += "</table>\n</td>\n</tr>\n<tr>\n<td align=\"center\">\n<a href=\"javascript:window.close();\" class=botoncerrar>&nbsp;cerrar&nbsp</a>\n</td>\n</tr>\n</table>\n</body>\n</html>\n";

// Abre la flotante del calendario	
		var vWinCal = window.open("", "Calendario", "width=210,height=170,status=yes,resizable=yes,top=200,left=200");
		vWinCal.opener = self;
		vWinCal.focus();
		var calc_doc = vWinCal.document;
		calc_doc.write (cadena_htm);
		calc_doc.close();
}

function fecha_cal (str_datetime)//Transforma una fecha comun a fechamaquina.
{
	var re_date = /^(\d+)\/(\d+)\/(\d+)$/;
	if (!re_date.exec(str_datetime))
		return alert("Invalid Datetime format: "+ str_datetime);
	return (new Date (RegExp.$3, RegExp.$2-1, RegExp.$1));
}

function fecha_text (dt_datetime)
{
	return (new String (dt_datetime.getDate()+"/"+(dt_datetime.getMonth()+1)+"/"+dt_datetime.getFullYear()));
}
