// Public: initializa o calendário
function SetCalendar()
{
	//dd-mm-yyyy
	if (!getCont(document,"ifrmcalendar"))
	{
	
	        if (document.title != "Pagina Inicial")
		    {
			    document.write("<iframe id='ifrmcalendar' src='../scripts/calendar.htm' scrolling='No' frameborder='0' ");
			    document.write("style='position: absolute; left: 0; top: 0; width: 0; height: 0; visibility: hidden; z-index: 1000;'");
			    document.write("onmouseout = 'javascript: this.style.visibility = \"hidden\";' onpropertychange='javascript: propertyName(this);'></iframe>");
		    }
		    else
		    {
			    document.write("<iframe id='ifrmcalendar' src='./scripts/calendar.htm' scrolling='No' frameborder='0' ");
			    document.write("style='position: absolute; left: 0; top: 0; width: 0; height: 0; visibility: hidden; z-index: 1000;'");
			    document.write("onmouseout = 'javascript: this.style.visibility = \"hidden\";' onpropertychange='javascript: propertyName(this);'></iframe>");
		    }

				
	}
}

//Função para executar JScript qd o calendário fechar
function propertyName(Me)
{
	if (Me) {
		if (event.propertyName.indexOf('style.visibility') > -1){
			if (Me.style.visibility.indexOf('hidden') > -1) eval(this.eveClose);
		}
	}
}
// Public: mostra o calendário
function ShowCalendar(time,obj,eve,min,max,eveClose)
{
	var px = 0; py = 0;
	var cont = getCont(document,"ifrmcalendar");

	if (document.all){
		px = (eve.screenX - eve.offsetX - screenLeft + document.body.scrollLeft - 2);
		py = (eve.screenY - eve.offsetY - screenTop + document.body.scrollTop - 2);
	}
	else {
		px = (eve.layerX - screen.left + scrollX - 2);
		py = (eve.layerY - screen.top + scrollY - 2);
	}	
	
	//TMS
	if ((px)>700)
		px = px - 150;
	//END TMS
	
	if (cont){
		if (eveClose != null) this.eveClose = eveClose;
		GetActualValue(time,obj,document.frames("ifrmcalendar"),min,max,eveClose);	
		cont.style.left = px;
		cont.style.top = py;
		cont.style.width = 180;
		(time) ? cont.style.height = 191 : cont.style.height = 162;
		if (cont.style.visibility == "visible"){
			cont.style.visibility = "hidden";
		}
		else cont.style.visibility = "visible";
	}
}

// Retorna a data a partir da caixa de texto
function GetActualValue(time,obj,doc,min,max,eveClose)
{
	var objdt, newdate;
	this.obj = obj;
	
	//Datas max e min
	var dtMin, dtMax;

	//Se não existir data no objecto txt então abre com data nova
	if (obj.value == ""){
		objdt = new Date();
		//Data normalizada
		objdt.setHours(0,0,0);
	}
	else{
		//se não com a data que se encontra na txt.
		objdt = InitDate(time,obj);
	}

	//Se min e max forem datas válidas então temos min e max
	if (InitDate(time,null,min)) dtMin = idDate;
	if (InitDate(time,null,max)) dtMax = idDate;

	if (objdt != "" && (!isNaN(objdt))){
		if ((dtMin != undefined) && (dtMax != undefined)){
			doc.WriteCalendar(time,VerifyDate(objdt,dtMin,dtMax),objdt.getDate(),(objdt.getMonth()+1),getFixedYear(objdt),objdt.getHours(),objdt.getMinutes(),objdt.getSeconds(),
								   								 dtMin.getDate(),(dtMin.getMonth()+1),getFixedYear(dtMin),dtMin.getHours(),dtMin.getMinutes(),dtMin.getSeconds(),
								   								 dtMax.getDate(),(dtMax.getMonth()+1),getFixedYear(dtMax),dtMax.getHours(),dtMax.getMinutes(),dtMax.getSeconds());
		}
		else doc.WriteCalendar(time,-2,objdt.getDate(),(objdt.getMonth()+1),getFixedYear(objdt),objdt.getHours(),objdt.getMinutes(),objdt.getSeconds(),
									   -1,-1,-1,-1,-1,-1,
									   -1,-1,-1,-1,-1,-1);
	}
}

//Verifica se a Data está conpreendida entre a data min e max
function VerifyDate(dt,dtmin,dtmax)
{
	var mdt, mmin, mmax;
	
	//01-01-1970 -> 0 mils
	mdt = dt.getTime();
	mmin = dtmin.getTime();
	mmax = dtmax.getTime();
	
	if (((mmax >= mmin)) && (mdt >= mmin) && (mdt <= mmax)) return true;
	else return false;
}

// Valida se a data e hora passada pela caixa de texto 
function InitDate(time,obj,dval)
{
	var retval;
	var mspl, mtime, mdate;
	var newdate, mparse;
	var objdt;
	var objTxt;
	
	if (obj != undefined) dval = obj.value;
	if (time){
		// Expressão regular para a data e hora
		if (/^(\d\d?-\d\d?-\d{4}\s\d\d?:\d\d?(:\d\d?)?)$/.test(dval)){
			//Separar a data da hora
			mspl = dval.split(" ");
			//Separar os dias, meses e anos
			mdate = mspl[0].split("-");
			//Separar as horas, minutos e segundos
			mtime = mspl[1].split(":");
			//Parse da data e hora (JS mm/dd/yyyy hh:mm:ss)
			mparse = Date.parse(mdate[1] + "/" + mdate[0] + "/" + mdate[2] + " " + mtime[0] + ":" + mtime[1] + (isNaN(mtime[2]) ? ":00" : ":" + mtime[2]));
			//Data normalizada
			newdate = new Date(mparse);
			this.idDate = newdate;
			if (obj == undefined){
				//Return
				retval = true;
			}
			else{
				//Default Ret
				retval = newdate;
			}
			//Valida se a data e a hora são válidas
			if (isNaN(newdate) || newdate.getDate() != mdate[0] || (newdate.getMonth() + 1) != mdate[1] || newdate.getFullYear() != mdate[2]){
				if (obj == undefined){
					//Return
					retval = false;
				}
				else{
					obj.value = "";			
					objdt = new Date();
					//Data normalizada
					objdt.setHours(0,0,0);
					//Return
					retval = objdt;
				}
				this.idDate = undefined;
			}
		}else{
			if (obj == undefined){
				//Return
				retval = false;
			}
			else{
				obj.value = "";			
				objdt = new Date();
				//Data normalizada
				objdt.setHours(0,0,0);
				//Return
				retval = objdt;
			}
			this.idDate = undefined;
		}
	}else{
		// Expressão regular para a data
		if (/^(\d\d?-\d\d?-\d{4})$/.test(dval)){
			//Separar os dias, meses e anos
			mdate = dval.split("-");
			//Parse da data e hora (JS mm/dd/yyyy)
			mparse = Date.parse(mdate[1] + "/" + mdate[0] + "/" + mdate[2]);
			//Data normalizada
			newdate = new Date(mparse);
			this.idDate = newdate;
			if (obj == undefined){
				//Return
				retval = true;
			}
			else{
				//Default Ret
				retval = newdate;
			}
			//Valida se a data são válidas
			if (newdate.getDate() != mdate[0] || (newdate.getMonth() + 1) != mdate[1] || newdate.getFullYear() != mdate[2]){
				if (obj == undefined){
					//Return
					retval = false;
				}
				else{
					obj.value = "";			
					objdt = new Date();
					//Data normalizada
					objdt.setHours(0,0,0);
					//Return
					retval = objdt;
				}
				this.idDate = undefined;
			}
		}else{
			if (obj == undefined){
				//Return
				retval = false;
			}
			else{
				obj.value = "";			
				objdt = new Date();
				//Data normalizada
				objdt.setHours(0,0,0);
				//Return
				retval = objdt;
			}
			this.idDate = undefined;
		}	
	}
	return retval;
}

//Private: entre 1900 e 1999 o getYear() retorna [0,99]
function getFixedYear(dt)
{
	return ((dt.getYear() >= 0) && (dt.getYear() <= 99))? dt.getYear() + 1900: dt.getYear();
}

// Private: escreve o calendário
function WriteCalendar(time,show,dd,dm,dy,th,tm,ts,mindd,mindm,mindy,minth,mintm,mints,maxdd,maxdm,maxdy,maxth,maxtm,maxts)
{
	// variáveis locais
	var n,l,c;
	var cl = 0, cr = 0;
	var strcont;
	
	var weekdays = new Array("Domingo","Segunda-feira","Ter&ccedil;a-feira","Quarta-feira","Quinta-feira","Sexta-feira","S&aacute;bado");
	var months = new Array("Janeiro","Fevereiro","Mar&ccedil;o","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro");
	
	//Cria o DIV(calendário) se não existir
	var cont = getCont(document,"calendar");
	if (!cont){
		document.writeln("<DIV ID='calendar' style='visibility: visible; z-index: 1;'></DIV>");
		cont = getCont(document,"calendar");
	
	}
	
	if (cont){
		//Data actual
		var d_date = new Date();
		//Se (-1 calendário pela primeira vez) toma a data actual
		var d_y = (dy <= -1)? getFixedYear(d_date): dy;
		var d_m = (dm <= -1)? d_date.getMonth() + 1: dm;
		var d_d = (dd <= -1)? d_date.getDate(): dd;
		//Se (-1 calendário pela primeira vez) toma a hora actual
		var t_h = (th <= -1)? 0: th;
		var t_m = (tm <= -1)? 0: tm;
		var t_s = (ts <= -1)? 0: ts;
		//Para uma próxima amostra do calendário [data]
		var d_yn = d_y + 1;		
		var d_yp = d_y - 1;
		var d_mn;
			if (d_m >= 12){
				d_mn = 1;
				cr++;
			}
			else
				d_mn = d_m + 1;
		var d_mp;
			if (d_m <= 1){
				d_mp = 12;
				cl--;
			}
			else
				d_mp = d_m - 1;
		//Para uma próxima amostra do calendário [hora]	
		var t_hn = (t_h >= 23)? 0 : t_h + 1;
		var t_hp = (t_h <= 0)? 23: t_h - 1;
		var t_mn = (t_m >= 59)? 0 : t_m + 1;
		var t_mp = (t_m <= 0)? 59: t_m - 1;
		var t_sn = (t_s >= 59)? 0 : t_s + 1;
		var t_sp = (t_s <= 0)? 59: t_s - 1;
		
		//Cabeçalho do calendário
		strcont = "<DIV id='divcalendar' STYLE='position: absolute; z-index: 1; left: 0; top: 0; width: 180; height: 160;'>";
		strcont += "	<table class='clscalendar' width='100%' height='100%' cellpadding='1' cellspacing='1' border='0'>";
		strcont += "	<tr valign='middle'>";
		strcont += "		<td colspan='7'>";
		strcont += "			<table align='center' cellspacing=0 cellpadding=0 width='100%' border=0>";
		strcont += "			<tr>";
		strcont += "				<td rowspan=2 class='clsbutmonths'>"; // Mês 'left'
		strcont += "					<a href='Javascript: void(0);' onclick='Javascript: WriteCalendar(" + time + "," + show + "," + d_d + "," + d_mp + "," + (d_y + cl) + "," + t_h + "," + t_m + "," + t_s + "," + mindd + "," + mindm + "," + mindy + "," + minth + "," + mintm + "," + mints + "," + maxdd + "," + maxdm + "," + maxdy + "," + maxth + "," + maxtm + "," + maxts + ")' title='" + months[d_mp - 1] + "' onmouseover='javascript: ChangeImg(\"butprev\",\"In\");' onmouseout='javascript: ChangeImg(\"butprev\",\"Out\");'><img id='butprev' name='butprev' src='../Images/butprev.gif' lowsrc='../Images/butprevH.gif' border=0></a>";
		strcont += "				</td>";
		strcont += "				<td rowspan=2 colspan=4 height='22' class='clsmonths' width='100%'>" + months[d_m - 1] + " de " + d_y + "</td>";
		strcont += "				<td class='clsbutmonths'>"; // Ano 'up'
		strcont += "					<a href='Javascript: void(0);' onclick='Javascript: WriteCalendar(" + time + "," + show + "," + d_d + "," + d_m + "," + d_yn + "," + t_h + "," + t_m + "," + t_s + "," + mindd + "," + mindm + "," + mindy + "," + minth + "," + mintm + "," + mints + "," + maxdd + "," + maxdm + "," + maxdy + "," + maxth + "," + maxtm + "," + maxts + ")' title='" + d_yn + "' onmouseover='javascript: ChangeImg(\"dyup\",\"In\");' onmouseout='javascript: ChangeImg(\"dyup\",\"Out\");'><img id='dyup' name='dyup' src='../Images/up.gif' lowsrc='../Images/upH.gif' border=0></a>";		
		strcont += "				</td>";
		strcont += "				<td rowspan=2 class='clsbutmonths'>"; // Mês 'right'
		strcont += "					<a href='Javascript: void(0);' onclick='Javascript: WriteCalendar(" + time + "," + show + "," + d_d + "," + d_mn + "," + (d_y + cr) + "," + t_h + "," + t_m + "," + t_s + "," + mindd + "," + mindm + "," + mindy + "," + minth + "," + mintm + "," + mints + "," + maxdd + "," + maxdm + "," + maxdy + "," + maxth + "," + maxtm + "," + maxts + ")' title='" + months[d_mn - 1] + "' onmouseover='javascript: ChangeImg(\"butnext\",\"In\");' onmouseout='javascript: ChangeImg(\"butnext\",\"Out\");'><img id='butnext' name='butnext' src='../Images/butnext.gif' lowsrc='../Images/butnextH.gif' border=0></a>";
		strcont += "				</td>";
		strcont += "			</tr>";
		strcont += "			<tr>";
		strcont += "				<td class='clsbutmonths'>"; // Ano 'down'
		strcont += "					<a href='Javascript: void(0);' onclick='Javascript: WriteCalendar(" + time + "," + show + "," + d_d + "," + d_m + "," + d_yp + "," + t_h + "," + t_m + "," + t_s + "," + mindd + "," + mindm + "," + mindy + "," + minth + "," + mintm + "," + mints + "," + maxdd + "," + maxdm + "," + maxdy + "," + maxth + "," + maxtm + "," + maxts + ")' title='" + d_yp + "' onmouseover='javascript: ChangeImg(\"dydown\",\"In\");' onmouseout='javascript: ChangeImg(\"dydown\",\"Out\");'><img id='dydown' name='dydown' src='../Images/down.gif' lowsrc='../Images/downH.gif' border=0></a>";		
		strcont += "				</td>";
		strcont += "			</tr>";
		strcont += "			</table>";
		strcont += "		</td>";
		strcont += "	</tr>";
		
		// Escreve os dias da semana (D,S,T,Q,Q,S,S)
		strcont += "	<tr>";
		strcont += "		<td colspan='7'>";
		strcont += "			<table align='center' width='100%' height='100%' cellspacing=0 cellpadding=0 border=0>";
		strcont += "			<tr>";
		for (n = 0; n < 7; n++){
			strcont += "		<td class='clsweekdays' height='18'><span title='" + weekdays[n] + "'>" + weekdays[n].substr(0,1) + "</span></td>";
		}		
		strcont += "			</tr>";
		
		//Array com os Feriados Nacionais
		var nArr = getFN(new Date(d_y,(d_m - 1),d_d));
		
		// Escreve as datas
		strcont += "			<tr>";
		strcont += getCDay(time,show,nArr,d_y,d_m,d_d,t_h,t_m,t_s,mindd,mindm,mindy,minth,mintm,mints,maxdd,maxdm,maxdy,maxth,maxtm,maxts);
		strcont += "			</tr>";
		strcont += "			</table>";
		strcont += "		</td>";
		strcont += "	</tr>";	
					
		if (time){
			//Inicializar a hora
			strcont += "		<tr valign='bottom'>";
			strcont += "			<td colspan='7'>";
			strcont += "				<table class='clstime' align='center' cellspacing=0 cellpadding=0 width='100%' border=0>";
			strcont += "					<tr>";
			strcont += "					    <td rowspan=2>&nbsp;</td>";
			strcont += "					    <td class='time' rowspan=2>" + FormatDate(t_h,2,"") + "&nbsp;h</td>";
			strcont += "					    <td class='clsbutmonths'>"; // Hora 'up'
			strcont += "							<a href='Javascript: void(0);' onclick='Javascript: WriteCalendar(" + time + "," + show + "," + d_d + "," + d_m + "," + d_y + "," + t_hn + "," + t_m + "," + t_s + "," + mindd + "," + mindm + "," + mindy + "," + minth + "," + mintm + "," + mints + "," + maxdd + "," + maxdm + "," + maxdy + "," + maxth + "," + maxtm + "," + maxts + ")' title='" + t_hn + " hora(s)' onmouseover='javascript: ChangeImg(\"thup\",\"In\");' onmouseout='javascript: ChangeImg(\"thup\",\"Out\");'><img id='thup' name='thup' src='../Images/up.gif' lowsrc='../Images/upH.gif' border=0></a>";
			strcont += "						</td>";		
			strcont += "					    <td class='time' rowspan=2>" + FormatDate(t_m,2,"") + "&nbsp;m</td>";
			strcont += "					    <td class='clsbutmonths'>"; // Minuto 'up'
			strcont += "							<a href='Javascript: void(0);' onclick='Javascript: WriteCalendar(" + time + "," + show + "," + d_d + "," + d_m + "," + d_y + "," + t_h + "," + t_mn + "," + t_s + "," + mindd + "," + mindm + "," + mindy + "," + minth + "," + mintm + "," + mints + "," + maxdd + "," + maxdm + "," + maxdy + "," + maxth + "," + maxtm + "," + maxts + ")' title='" + t_mn + " minuto(s)' onmouseover='javascript: ChangeImg(\"tmup\",\"In\");' onmouseout='javascript: ChangeImg(\"tmup\",\"Out\");'><img id='tmup' name='tmup' src='../Images/up.gif' lowsrc='../Images/upH.gif' border=0></a>";
			strcont += "						</td>";
			strcont += "					    <td class='time' rowspan=2>" + FormatDate(t_s,2,"") + "&nbsp;s</td>";
			strcont += "					    <td class='clsbutmonths'>"; // Segundo 'up'
			strcont += "							<a href='Javascript: void(0);' onclick='Javascript: WriteCalendar(" + time + "," + show + "," + d_d + "," + d_m + "," + d_y + "," + t_h + "," + t_m + "," + t_sn + "," + mindd + "," + mindm + "," + mindy + "," + minth + "," + mintm + "," + mints + "," + maxdd + "," + maxdm + "," + maxdy + "," + maxth + "," + maxtm + "," + maxts + ")' title='" + t_sn + " segundo(s)' onmouseover='javascript: ChangeImg(\"tsup\",\"In\");' onmouseout='javascript: ChangeImg(\"tsup\",\"Out\");'><img id='tsup' name='tsup' src='../Images/up.gif' lowsrc='../Images/upH.gif' border=0></a>";
			strcont += "						</td>";
			strcont += "					    <td rowspan=2>&nbsp;</td>";
			strcont += "					</tr>";
			strcont += "					<tr>";
			strcont += "					    <td class='clsbutmonths'>"; // Hora 'down'
			strcont += "							<a href='Javascript: void(0);' onclick='Javascript: WriteCalendar(" + time + "," + show + "," + d_d + "," + d_m + "," + d_y + "," + t_hp + "," + t_m + "," + t_s + "," + mindd + "," + mindm + "," + mindy + "," + minth + "," + mintm + "," + mints + "," + maxdd + "," + maxdm + "," + maxdy + "," + maxth + "," + maxtm + "," + maxts + ")' title='" + t_hp + " hora(s)' onmouseover='javascript: ChangeImg(\"thdown\",\"In\");' onmouseout='javascript: ChangeImg(\"thdown\",\"Out\");'><img id='thdown' name='thdown' src='../Images/down.gif' lowsrc='../Images/downH.gif' border=0></a>";
			strcont += "						</td>";		
			strcont += "					    <td class='clsbutmonths'>"; // Minuto 'down'
			strcont += "							<a href='Javascript: void(0);' onclick='Javascript: WriteCalendar(" + time + "," + show + "," + d_d + "," + d_m + "," + d_y + "," + t_h + "," + t_mp + "," + t_s + "," + mindd + "," + mindm + "," + mindy + "," + minth + "," + mintm + "," + mints + "," + maxdd + "," + maxdm + "," + maxdy + "," + maxth + "," + maxtm + "," + maxts + ")' title='" + t_mp + " minuto(s)' onmouseover='javascript: ChangeImg(\"tmdown\",\"In\");' onmouseout='javascript: ChangeImg(\"tmdown\",\"Out\");'><img id='tmdown' name='tmdown' src='../Images/down.gif' lowsrc='../Images/downH.gif' border=0></a>";
			strcont += "						</td>";
			strcont += "					    <td class='clsbutmonths'>"; // Segundo 'down'
			strcont += "							<a href='Javascript: void(0);' onclick='Javascript: WriteCalendar(" + time + "," + show + "," + d_d + "," + d_m + "," + d_y + "," + t_h + "," + t_m + "," + t_sp + "," + mindd + "," + mindm + "," + mindy + "," + minth + "," + mintm + "," + mints + "," + maxdd + "," + maxdm + "," + maxdy + "," + maxth + "," + maxtm + "," + maxts + ")' title='" + t_sp + " segundo(s)' onmouseover='javascript: ChangeImg(\"tsdown\",\"In\");' onmouseout='javascript: ChangeImg(\"tsdown\",\"Out\");'><img id='tsdown' name='tsdown' src='../Images/down.gif' lowsrc='../Images/downH.gif' border=0></a>";
			strcont += "						</td>";
			strcont += "					</tr>";
			strcont += "				</table>";
			strcont += "			</td>";		
			strcont += "		</tr>";
			//Fechar a hora
		}
		// terminar tabela e div
		strcont += "	</table>";
		strcont += "</DIV>";
	
		// Escrever o calendário
		cont.innerHTML = strcont;
	}
}

// Private: Altera as imagens dos 'buttons'
function ChangeImg(item, eve)
{
	if (eve != 'In'){
		document[item].src = document[item].imgRolln;
	}
	else {
		document[item].imgRolln = document[item].src;
		document[item].src = document[item].lowsrc;
	}
}

// Private: retorna um objecto pelo seu id
function getCont(doc,item)
{
	if (doc.all) return doc.all[item];
	if (doc.getElementById) return doc.getElementById(item); 
	return false;
}

// Private: retorna o total de dias do mês (verifica os anos bissextos)
function getTotDays(dy,dm)
{ 
	var mntdays = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
	if ((dm) == 2 && (((dy % 4 == 0) && (dy % 100 != 0)) || (dy % 400 == 0))) 
		return 29;
	else 
		return mntdays[dm - 1];
}

// Private: retorna o feriado nacional do dia
function getCFN(nArr,dd,dm)
{
	var ret = -1;
	for(n = 0; n < nArr.length; n++)
		if (nArr[n][0] == dd && nArr[n][1] == dm){
			//retorna a posição do nArr[n]
			ret = n;
			break;
		}
	return ret;
}

// Private: retorna a data
function getCDay(time,show,nArr,dy,dm,dd,th,tm,ts,mindd,mindm,mindy,minth,mintm,mints,maxdd,maxdm,maxdy,maxth,maxtm,maxts)
{
	var n, d_t;
  	var col = 0; lin = 0;
	var str = new String();
	var backgr = "white";
	var dt,dtmin,dtmax,dtVery;
	
	//Primeiro dia da semana
	var nowdt = new Date(dy,(dm - 1),1);
	var wek = nowdt.getDay();	
		
	//Mês e  Ano anterior
	var prevdt = new Date(dy,(dm - 1),1);
	prevdt.setMonth(nowdt.getMonth() - 1);
	var dyp = getFixedYear(prevdt);
	var dmp = prevdt.getMonth() + 1;
	
	//Mês e  Ano seguinte
	var nextdt = new Date(dy,(dm - 1),1);
	nextdt.setMonth(nowdt.getMonth() + 1);
	var dyn = getFixedYear(nextdt);
	var dmn = nextdt.getMonth() + 1;

	//Datas de min e max
	if (show != -2){
		dtmin = new Date(mindy,mindm - 1,mindd,minth,mintm,mints);
		dtmax = new Date(maxdy,maxdm - 1,maxdd,maxth,maxtm,maxts);
	}
		
	//Mês anterior
  	for (n = 0; n < wek; n++) {
		d_t = getTotDays(dyp,dmp) - wek + n + 1;
		if (show != -2){
			dt = new Date(dyp,dmp - 1,d_t,th,tm,ts);
			if (VerifyDate(dt,dtmin,dtmax)){
				backgr = 'white';
				dtVery = false;
			}
			else{
				backgr = '#FFF7E7';
				dtVery = true;
			}
		}
		str += PrintTD(time,col,show,dtVery,nArr,dd,dm,d_t,dmp,dyp,th,tm,ts,((col == 0 || col == 6) ? 'white' : 'silver'),((col == 0 || col == 6) ? "silver" : backgr),mindd,mindm,mindy,minth,mintm,mints,maxdd,maxdm,maxdy,maxth,maxtm,maxts);
    	col++;
  	}
	//Mês actual
  	for (n = 1; n <= getTotDays(dy,dm); n++) {
		if (show != -2){
			dt = new Date(dy,dm - 1,n,th,tm,ts);
			if (VerifyDate(dt,dtmin,dtmax)){
				backgr = 'white';
				dtVery = false;
			}
			else{
				backgr = '#FFF7E7';
				dtVery = true;
			}
		}
		str += PrintTD(time,col,show,dtVery,nArr,dd,dm,n,dm,dy,th,tm,ts,((col == 0) ? 'red' : ((col == 6) ? 'white' : 'black')),((col == 0 || col == 6) ? "silver" : backgr),mindd,mindm,mindy,minth,mintm,mints,maxdd,maxdm,maxdy,maxth,maxtm,maxts);
    	col++;
    	if (col == 7){
			str += "</tr><tr>";
      		col = 0;
			lin++;
    	}
  	}
	//Mês próximo
	for (n = 1; col < ((lin != 5) ? 14 : 7); n++) {
		if (show != -2){
			dt = new Date(dyn,dmn - 1,n,th,tm,ts);
			if (VerifyDate(dt,dtmin,dtmax)){
				backgr = 'white';
				dtVery = false;
			}
			else{
				backgr = '#FFF7E7';
				dtVery = true;
			}
		}
		str += PrintTD(time,col,show,dtVery,nArr,dd,dm,n,dmn,dyn,th,tm,ts,(((col % 7) == 0 || (col % 7) == 6) ? 'white' : 'silver'),(((col % 7) == 0 || (col % 7) == 6) ? "silver" : backgr),mindd,mindm,mindy,minth,mintm,mints,maxdd,maxdm,maxdy,maxth,maxtm,maxts);
    	col++;
		if ((col % 7) == 0){
			str += "</tr><tr>";
		}
  	}
	return str;
}

// Private: Imprime o dia ou o feriado no calendário
function PrintTD(time,col,show,dtVery,nArr,dnow,mnow,dd,dm,dy,th,tm,ts,cor,backgr,mindd,mindm,mindy,minth,mintm,mints,maxdd,maxdm,maxdy,maxth,maxtm,maxts)
{
	var rt = getCFN(nArr,dd,dm);
	var title = "";
	var print = "";
	var bld = 0;
	//Dia actual
	var d_date = new Date();
	var d_y = getFixedYear(d_date);
	var d_m = d_date.getMonth() + 1;
	var d_d = d_date.getDate();
	var t_h = d_date.getHours();
	var t_m = d_date.getMinutes();
	var t_s = d_date.getSeconds();
	var weekdays = new Array("Domingo","Segunda-feira","Ter&ccedil;a-feira","Quarta-feira","Quinta-feira","Sexta-feira","S&aacute;bado");
	var months = new Array("Janeiro","Fevereiro","Mar&ccedil;o","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro");
	var week = "", titleMN = "";
	var crlf = String.fromCharCode(13,10);
	
	//Formatação para o link
	var flink = FormatDate(dd,2,"") + "-" + FormatDate(dm,2,"") + "-" + FormatDate(dy,4,"");
	if (time) flink += " " + FormatDate(th,2,"") + ":" + FormatDate(tm,2,"") + ":" + FormatDate(ts,2,"");
	
	//Retorna o dia ou letra do feriado
	print = (rt > -1) ? nArr[rt][2]: dd;
	//Titulo do tooltype
	title = weekdays[(col % 7)] + ", dia " + dd + " de " + months[dm - 1] + " de " + dy;
	title += ((rt > -1) ? crlf + nArr[rt][3]: "");
	
	if (!dtVery && (show != -2)){
		var titleMin = 'Data entre [' + FormatDate(mindd,2,"") + "-" + FormatDate(mindm,2,"") + "-" + FormatDate(mindy,4,"");
		var titleMax = ', ' + FormatDate(maxdd,2,"") + "-" + FormatDate(maxdm,2,"") + "-" + FormatDate(maxdy,4,"");
		if (time) titleMN = crlf + titleMin + ' ' + FormatDate(minth,2,"") + ":" + FormatDate(mintm,2,"") + ":" + FormatDate(mints,2,"") + 
				  titleMax + ' ' + FormatDate(maxth,2,"") + ":" + FormatDate(maxtm,2,"") + ":" + FormatDate(maxts,2,"") +  ']';
		else titleMN = crlf + titleMin + titleMax + ']';
	}
	
	if (rt > -1 && cor == "black"){
		cor = "red"; // Feriados
		backgr = "silver";
	}
	if ((dy == d_y) && (dm == d_m) && (dd == d_d) && (cor != "silver")){
		cor = "blue"; // Dia actual
		bld = 1;
		title += crlf + "Hoje [" + FormatDate(t_h,2,"") + ":" + FormatDate(t_m,2,"") + ":" + FormatDate(t_s,2,"") + "]";
	}
	if (dnow == dd && mnow == dm){
		cor = "white"; // Data da caixa de texto
		backgr = "maroon";
		bld = 1;
		if (time) 
			title += crlf + "Data Presente " + FormatDate(th,2,"") + ":" + FormatDate(tm,2,"") + ":" + FormatDate(ts,2,"");	
		else
			title += crlf + "Data a registar ou registada";
	}
	d_date = null;
	title += titleMN;
	
	if (dtVery)
		return("<td class='clsDay' style='cursor: default; background-color: " + backgr + 
			   "; color: " + cor + ";' align='center' title='" + title + "'>" + ((bld == 1) ? "<B>" : "") + print + ((bld == 1) ? "</B>" : "") + "</td>");
	else
		return("<td class='clsDay' style='background-color: " + backgr + 
			   ";' align='center' title='" + title + "'><a class='clsdays' style='background-color: " + backgr + 
		   	   "; color: " + cor + ";' href='javascript: void(0);' onclick='javascript: SetValue(" + time + ",&quot;" + flink + "&quot;); return(0);'>" + ((bld == 1) ? "<B>" : "") + 
	  	   	   print + ((bld == 1) ? "</B>" : "") + "</a></td>");
}

// Private: esconde o calendário
function HideCalendar(obj)
{
	if (opener)
		close();
	else 
	{
		var cont = getCont(parent.document,"ifrmcalendar");
		if (cont) cont.style.visibility = "hidden";
	}
}

// Private: coloca a data escolhida na caixa de texto
function SetValue(time,flink)
{
	var obj;
		
	if (parent) obj = parent.obj;
	if (opener) obj = opener.obj;
	
	// Pass a data para o objecto
	if (obj) obj.value = flink;
	HideCalendar(obj);
}

// Private: Formata a data com o número de digitos pretendidos
function FormatDate(date,ndig,stipo)
{
	var sdate = new String(date);
	
	if (stipo.toUpperCase() != "Y") ndig = (ndig < sdate.length)? sdate.length: ndig;
	sdate = "0" + date;
	
	return sdate.substr(sdate.length-ndig,ndig);
}

//Pascoa Oudin's Algorithm
function getEaster(day)
{
    var c = 0;
    var g = 0;
    var k = 0;
    var i = 0;
    var j = 0;
    var l = 0;
	var mt, dt;
    
	yr = getFixedYear(day);

    // implementation of Oudin's algorithm
    c = Math.floor(yr / 100);
    g = yr % 19;
    k = Math.floor((c - 17) / 25);
    i = c - Math.floor(c / 4) - Math.floor((c - k) / 3) + 19 * g + 15;
    i = i % 30;
    i = i - Math.floor(i / 28) * (1 - Math.floor(i / 28) * Math.floor(29 / (i + 1)) * Math.floor((21 - g) / 11 ));
    j = yr + Math.floor(yr / 4) + i + 2 - c + Math.floor(c / 4);
    j = j % 7;
    l = i - j;
    mt = 3 + Math.floor((l + 40) / 44);
    dt = l + 28 - 31 * Math.floor(mt / 4);
	
	return new Date(day.getYear(),mt - 1,dt,0,0,0);
}

//Feriados Nacionais
function getFN(day)
{
	var dat;
	var nArr = new Array(Array(1, 1, "F", "Ano Novo"),
						 Array(0, 0, "E", "Entrudo"),
						 Array(0, 0, "F", "Sexta-feira Santa"),
						 Array(0, 0, "P", "Páscoa"),
						 Array(25, 4, "F", "Dia da Liberdade"),
						 Array(1, 5, "F", "Dia do Trabalhador"),
						 Array(0, 0, "F", "Corpo de Deus"),
						 Array(10, 6, "F", "Dia de Portugal"),
						 Array(15, 8, "F", "Assunção de Nossa Senhora"),
						 Array(5, 10, "F", "Implantação da República"),
						 Array(1, 11, "F", "Dia de Todos-os-Santos"),
						 Array(1, 12, "F", "Restauração da Independência"),
						 Array(8, 12, "F", "Imaculada Conceição"),
						 Array(25, 12, "N", "Natal"));
	//Dia da Páscoa
	var easter = getEaster(day);
	nArr[3][0] = easter.getDate();
	nArr[3][1] = easter.getMonth() + 1;

	//P - 47   Entrudo
	dat = new Date(easter);
	dat.setDate(easter.getDate() - 47);
	dat = new Date(dat);
	nArr[1][0] = dat.getDate();
	nArr[1][1] = dat.getMonth() + 1;

    //P - 2    Sexta-feira Santa
	dat = new Date(easter);
    dat.setDate(easter.getDate() - 2);
	dat = new Date(dat);
	nArr[2][0] = dat.getDate();
	nArr[2][1] = dat.getMonth() + 1;

    //P + 60   Corpo de Deus
	dat = new Date(easter);
    dat.setDate(easter.getDate() + 60);
	dat = new Date(dat);
	nArr[6][0] = dat.getDate();
	nArr[6][1] = dat.getMonth() + 1;

	return(nArr);
}
