//Verifica se o objecto Calendar existe
function ValidObj(objID)
{
	return objID != null && objID != "" && objID != "undefined";
}

function ValidObjReplace(objID, newValue)
{
	if (ValidObj(objID))
		return objID;
	return newValue;
}

//Retorna uma data construida a partir dos campos com os valores default(de data) do objecto Calendar
//incrementada ou decrementada com o calor de inc(em dias)
function GetObjProperDate(calendarObj, inc)
{
	return new Date(calendarObj.year, calendarObj.month, Number(calendarObj.day) + Number(inc));
}

function GetDateWithRange(maxRange)
{
	var dateAux = new Date();
	
	return new Date(dateAux.getFullYear(), dateAux.getMonth(), Number(dateAux.getDate()) + Number(maxRange));
}


//Retorna uma data com os campos horas, minutos e segundos a zero
function CreateDateNoTime(calendarObj)
{
	var dateAux = new Date();
	return new Date(dateAux.getFullYear(), dateAux.getMonth(), dateAux.getDate());
}

function SetDefaultLowerLimit(obj, newValue)
{
	obj.lowerLimit = newValue;
}

function SetDefaultUpperLimit(obj, newValue)
{
	obj.upperLimit = newValue;
}

function SetDefaultLowerLimits(obj, obj2, newValue)
{
	SetDefaultLowerLimit(obj, newValue);
	SetDefaultLowerLimit(obj2, newValue);
}

function SetDefaultUpperLimits(obj, obj2, newValue)
{
	SetDefaultUpperLimit(obj, newValue);
	SetDefaultUpperLimit(obj2, newValue);
}

function ChangeDefaultLimits(objID, obj2ID, newValue, control)
{
	if (control == 0)
		SetDefaultLowerLimits(objID, obj2ID, newValue);
	else
		SetDefaultUpperLimits(objID, obj2ID, newValue);
	
	document.getElementById(objID.elem).innerHTML = DrawCalendar(objID, obj2ID);
	document.getElementById(obj2ID.elem).innerHTML = DrawCalendar(obj2ID, objID);
}

//Afecta os campos do objecto Calendar com uma nova data, assim como o elemento do form para o dia
//e volta a desenhar o calendário com o novo dia seleccionado	
function SetNewDate(objID, obj2ID, newDay)
{	
	SetFormElemValue(objID.elemMonth[objID.indexControl], objID.month + 1);
	SetFormElemValue(objID.elemYear[objID.indexControl], objID.year);
	objID.day = newDay;
	objID.showSelectedDays = true;	
		
	switch(Number(objID.type))
	{
		case 1: // POPUP	
			SetProperObjDates(objID, obj2ID);
			SetOpenerElems(objID);
			break;
		
		case 2: // DIV
			SetDefaultElems(objID);			
			
			if (ValidValue(String(objID.indexControl)))
				SetFormElemValueByIndex(objID, objID.elemDay, objID.day);
			else
				SetFormElemValue(objID.elemDay, objID.day);
			
			SetProperObjDates(objID, obj2ID);
			document.getElementById(objID.elem).innerHTML = DrawCalendar(objID, ValidObjReplace(obj2ID, ""));
			
			if (ValidObj(objID.elemMonthYear))
				SetRelatedFieldsValue(objID, obj2ID, objID.indexControl);
			HideDiv(objID);			
			break;
			
		default:
			SetDefaultElems(objID);	
			SetFormElemValue(objID.elemDay, objID.day);	
			SetProperObjDates(objID, obj2ID);
			document.getElementById(objID.elem).innerHTML = DrawCalendar(objID, ValidObjReplace(obj2ID, ""));
			
			break;
	}
	
	
	// Codigo especial para calendario composto de hotelaria
	if (document.getElementById('MotorHotel_fldPartidaHotelMesAno') != null)
	{
		//alert((objID.month + 1) + " " + objID.year);
		document.getElementById("MotorHotel_fldPartidaHotelMesAno").value = (Number(document.getElementById("MotorHotel_fldPartidaHotelMes").value) - 1) + " " + (Number(document.getElementById("MotorHotel_fldPartidaHotelAno").value));
		GetNights();
		//document.getElementById('MotorHotel_fldPartidaHotelMesAno').value = document.getElementById('MotorHotel_fldPartidaHotelMes').options.selectedIndex;
	}		
	if (document.getElementById('MotorHotel_fldRegressoHotelMesAno') != null)
	{
		//document.getElementById('MotorHotel_fldRegressoHotelMesAno').options.selectedIndex = document.getElementById('MotorHotel_fldRegressoHotelMes').options.selectedIndex;
		document.getElementById("MotorHotel_fldRegressoHotelMesAno").value = (Number(document.getElementById("MotorHotel_fldRegressoHotelMes").value) - 1) + " " + (Number(document.getElementById("MotorHotel_fldRegressoHotelAno").value));
		GetNights();
	}
	
	
	
}

function SetNewDateSingle(objID, newDay)
{		
	objID.day = newDay;
	objID.showSelectedDays = true;
	
	SetFormElemValueByIndex(objID, objID.elemDay, objID.day);
	SetFormElemValueByIndex(objID, objID.elemMonth, objID.month + 1);
	SetFormElemValueByIndex(objID, objID.elemYear, objID.year);
	
	document.getElementById(objID.elem).innerHTML = DrawCalendarSingle(objID);
	
	if (ValidObj(objID.elemMonthYear))
		SetRelatedFieldsValueSingle(objID, objID.indexControl);
	HideDiv(objID);
}
		
function SetNewObjDate(objID, obj2ID)
{	
	obj2ID.day = objID.day;
	obj2ID.month = objID.month;
	obj2ID.year = objID.year;				
	
	if (!obj2ID.selectIndexOnly)
	{
		obj2ID.defaultDay = objID.day;
		obj2ID.defaultMonth = objID.month;
		obj2ID.defaultYear = objID.year;
	}
		
	document.getElementById(obj2ID.elem).innerHTML = DrawCalendar(obj2ID, ValidObjReplace(objID, ""));
	SetFormElemValue(obj2ID.elemDay, obj2ID.day);
	SetFormElemValue(obj2ID.elemMonth, obj2ID.month + 1);
	SetFormElemValue(obj2ID.elemYear, obj2ID.year);
}	
		
function GetControlIndex(ind1, ind2)
{
	if (ind1 > ind2)
		return 1;
	if (ind1 == ind2)
		return -1;
	return 0;
}
		
function SetProperObjDates(objID, obj2ID)
{
	if (ValidObj(obj2ID))
	{
		var date1 = new Date(objID.year, objID.month, objID.day);
		var date2 = new Date(obj2ID.year, obj2ID.month, obj2ID.day);
		var index1 = Number(objID.index);
		var index2 = Number(obj2ID.index);
		var index = GetControlIndex(index1, index2);		
				
		switch (index)
		{
			case 0:
				if (date1.valueOf() > date2.valueOf())
					SetNewObjDate(objID, obj2ID);
				break;
							
			case 1:
				if (date2.valueOf() > date1.valueOf())
					SetNewObjDate(objID, obj2ID);
				break;
							
			default:
				break;
		}	
	}	
}

function SetFormElemValue(formElem, newValue)
{
	for (var i = 0; i < document.getElementsByName(formElem).length; i++)
	{
		if (ValidObj(document.getElementsByName(formElem)[i]))
			document.getElementsByName(formElem)[i].value = newValue;
	}
}

function SetFormElemValueByIndex(objID, formElem, newValue)
{	
	if (ValidObj(document.getElementsByName(formElem)[objID.indexControl]))
			document.getElementsByName(formElem)[objID.indexControl].value = newValue;
}
		
function ChangeMonthAux(objID, obj2ID, newValue)
{	
	var inc = (Number(newValue) - 1) - Number(objID.month);
	ChangeMonth(objID, obj2ID, inc);
}

function ChangeMonthSingle(objID, control)
{
	var currentMonth = Number(objID.month);
	var currentYear = Number(objID.year);		
	var newMonth = Number(currentMonth) + Number(control);
	
	switch (newMonth)
	{
		case -1:
			objID.month = 11;
			objID.year = currentYear - 1;
			
			SetFormElemValueByIndex(objID, objID.elemMonth, 12);
			SetFormElemValueByIndex(objID, objID.elemYear, year);
			break;
							
		case 12:
			objID.month = 0;
			objID.year = currentYear + 1;
			
			SetFormElemValueByIndex(objID, objID.elemMonth, 1);
			SetFormElemValueByIndex(objID, objID.elemYear, year);
			break;
							
		default:				
			objID.month = newMonth;
			SetFormElemValueByIndex(objID, objID.elemMonth, objID.month + 1);
			break;
	}	
	
	document.getElementById(objID.elem).innerHTML = DrawCalendarSingle(objID);	
	return false;
}

function ChangeMonth(objID, obj2ID, control)
{
	var currentMonth = Number(objID.month);
	var currentYear = Number(objID.year);		
	var newMonth = Number(currentMonth) + Number(control);
	objID.showSelectedDays = false;
			
	switch (newMonth)
	{
		case -1:
			objID.month = 11;
			objID.year = currentYear - 1;
			
			SetFormElemValue(objID.elemMonth, 12);
			SetFormElemValue(objID.elemYear, objID.year);
			break;
							
		case 12:
			objID.month = 0;
			objID.year = currentYear + 1;
			
			SetFormElemValue(objID.elemMonth, 1);
			SetFormElemValue(objID.elemYear, objID.year);
			break;
							
		default:				
			objID.month = newMonth;
			SetFormElemValue(objID.elemMonth, objID.month + 1);
			break;
	}
	document.getElementById(objID.elem).innerHTML = DrawCalendar(objID, ValidObjReplace(obj2ID, ""));
	
	if (objID.type == 1) //Redimensiona a window
		GetWindowSize(objID.windowMainTable, objID.defaultWindowWidthInc, objID.defaultWindowHeightInc);
	return false;
}

function ChangeYearAux(objID, obj2ID, newValue)
{	
	var inc = Number(newValue) - Number(objID.year);
	ChangeYear(objID, obj2ID, inc);
}

function ChangeYear(objID, obj2ID, control)
{	
	var currentYear = Number(objID.year);
	var newYear = Number(currentYear) + Number(control);
	
	objID.year = newYear;
	
	document.getElementById(objID.elemYear).value = objID.year;
	ChangeMonth(objID, obj2ID, 0);
}

function ValidLowerDate(calendarObj, lowerDate, currentDate, defaultValue)
{
	if (calendarObj.lowerLimit > 0)
		return currentDate.valueOf() >= lowerDate.valueOf();
	return defaultValue;
}

function ValidUpperDate(calendarObj, upperDate, currentDate, defaultValue)
{
	if (calendarObj.upperLimit > 0)
		return upperDate.valueOf() >= currentDate.valueOf();
	return defaultValue;
}

function GetDayType(calendarObj, currentDate)
{
	var selectedDate = new Date(calendarObj.year, calendarObj.month, calendarObj.day);
	var lowerDate = GetObjProperDate(calendarObj, Number(Number(calendarObj.lowerLimit) * -1));
	var upperDate = GetObjProperDate(calendarObj, Number(calendarObj.upperLimit));
			
	var today = CreateDateNoTime(calendarObj);
	var delayedDate = GetDateWithRange(calendarObj.searchMinDelay);
	var maxRangedDate = GetDateWithRange(Number(calendarObj.maxRange) - 1);
			
	
	//if (currentDate.valueOf() != selectedDate.valueOf() && currentDate.valueOf() >= lowerDate.valueOf() && currentDate.valueOf() <= upperDate.valueOf() && currentDate.valueOf() >= today.valueOf() && currentDate.valueOf() <= maxRangedDate.valueOf() && currentDate.valueOf() >= delayedDate.valueOf())
	if (currentDate.valueOf() != selectedDate.valueOf() && ValidLowerDate(calendarObj, lowerDate, currentDate, false) && ValidUpperDate(calendarObj, upperDate, currentDate, false) && currentDate.valueOf() >= today.valueOf() && currentDate.valueOf() <= maxRangedDate.valueOf() && calendarObj.showSelectedDays)
		return 0; // Dentro do intervalo	
		
	//if (currentDate.valueOf() >= lowerDate.valueOf() && currentDate.valueOf() <= upperDate.valueOf() && currentDate.valueOf() >= today.valueOf() && currentDate.valueOf() <= maxRangedDate.valueOf() && currentDate.valueOf() >= delayedDate.valueOf())
	if (currentDate.valueOf() == selectedDate.valueOf() && ValidLowerDate(calendarObj, lowerDate, currentDate, true) && ValidUpperDate(calendarObj, upperDate, currentDate, true) && calendarObj.showSelectedDays)
		return 1; // Data seleccionada
			
	//if ((currentDate.valueOf() < today.valueOf() || calendarObj.selectIndexOnly) || currentDate.valueOf() > maxRangedDate.valueOf() || currentDate.valueOf() < delayedDate.valueOf())
	if (currentDate.valueOf() < today.valueOf() || currentDate.valueOf() > maxRangedDate.valueOf())
		return 2; // Menor que a data corrente
	
	
	return -1; // Maior ou entre data actual e data seleccionada
}

function DrawCalendarTop(calendarObj, calendar2Obj, imageBack, imageNext)
{
	return '<table cellpadding="0" cellspacing="0" border="0" class="calendar_top"><tr><td align="right" class="pesquisaTblCalendarioMonth"><input style="border:0px solid white;color:#FFFFFF" type="image" src="' + imageBack + '" onClick="javascript: return ChangeMonth(' + calendarObj.id + ', ' + calendar2Obj.id + ', -1);"></td><td width="*" align="center" class="pesquisaTblCalendarioMonth">' + months[Number(calendarObj.month)] + ' ' + calendarObj.year  + '</td><td align="left" class="pesquisaTblCalendarioMonth"><input style="border:0px solid white;color:#FFFFFF" type="image" src="' + imageNext + '" onClick="javascript: return ChangeMonth(' + calendarObj.id + ', ' + calendar2Obj.id + ', 1);"></td></tr></table>';
}

function DrawCalendarTopSingle(calendarObj, imageBack, imageNext)
{
	return '<table cellpadding="0" cellspacing="0" border="0" class="calendar_top"><tr><td width="20" class="pesquisaTblCalendarioMonth"><input style="border:0px solid white;color:#FFFFFF" type="image" src="' + imageBack + '" onClick="javascript: return ChangeMonthSingle(' + calendarObj.id + ', -1);"></td><td width="*" align="center" class="pesquisaTblCalendarioMonth">' + months[Number(calendarObj.month)] + ' ' + calendarObj.year  + '</td><td width="20" class="pesquisaTblCalendarioMonth"><input style="border:0px solid white;color:#FFFFFF" type="image" src="' + imageNext + '" onClick="javascript: return ChangeMonthSingle(' + calendarObj.id + ', 1);"></td></tr></table>';
}
	
function DrawWeekDays()
{		
	var out = "<table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\"><tr>";
			
	for (var i = 0; i < weekDays.length; i++)
		out += '<td class="weekdays">' + weekDays[i] + '</td>';
			
	return out + "</tr></table>";
}

function DrawMonthDays(calendarObj, calendar2Obj)
{
	var counter = 0;
	var dateAux = new Date(calendarObj.year, calendarObj.month, 1);				
	var out = "<table cellspacing='2' cellpadding='0' width='100%'>";
	
	var elemDay = String(calendarObj.elemDay);
	var inc = Number(dateAux.getDay());
	
	while (counter < (31 + inc))
	{	
		out += (counter % 7 == 0) ? "<tr>" : "";
				
		if (calendarObj.month == dateAux.getMonth() && counter >= dateAux.getDay())
		{
			switch (GetDayType(calendarObj, dateAux))
			{		
				case 0: // Dentro do limite
					out += '<td class="weekdays_ranged_' + calendarObj.index + '"><a class="weekdays_ranged_' + calendarObj.index + '" href="javascript: void(0);" onclick="javascript: SetNewDate(' + calendarObj.id + ', ' + calendar2Obj.id + ', this.id);" + id="' + dateAux.getDate() + '">' + dateAux.getDate() + '</a></td>';
					break;
							
				case 1: // Data seleccionada
					out += '<td class="weekdays_selected_' + calendarObj.index + '">' + dateAux.getDate() + '</td>';
					break;
						
				case 2: // Menor
					out += '<td class="weekdays_unselected">' + dateAux.getDate() + '</td>';
					break;
						
				default: // Maior
					out += '<td align="center" class="Weekdays_selectable"><a class="Weekdays_selectable" href="javascript: void(0);" onclick="javascript: SetNewDate(' + calendarObj.id + ', ' + calendar2Obj.id + ', this.id);" + id="' + dateAux.getDate() + '">' + dateAux.getDate() + '</a></td>';
					break;
			}
			dateAux.setDate(dateAux.getDate() + 1);
			dateAux = new Date(dateAux);
		}
		else
			out += '<td align="center">&#32;</td>';			
		counter++;
		out += (counter % 7 == 0) ? "</tr>" : "";			
	}
			
	return out + "</table>";
}

function DrawMonthDaysSingle(calendarObj)
{
	var counter = 0;
	var dateAux = new Date(calendarObj.year, calendarObj.month, 1);				
	var out = "<table cellspacing='2' cellpadding='0' width='100%'>";
	
	var elemDay = String(calendarObj.elemDay);
	var inc = Number(dateAux.getDay());
	
	while (counter < (31 + inc))
	{	
		out += (counter % 7 == 0) ? "<tr>" : "";
				
		if (calendarObj.month == dateAux.getMonth() && counter >= dateAux.getDay())
		{	
			switch (GetDayType(calendarObj, dateAux))
			{		
				case 0: // Dentro do limite
					out += '<td class="weekdays_ranged_1"><a class="weekdays_ranged_1" href="javascript: void(0);" onclick="javascript: SetNewDateSingle(' + calendarObj.id + ', this.id);" + id="' + dateAux.getDate() + '">' + dateAux.getDate() + '</a></td>';
					break;
							
				case 1: // Data seleccionada
					out += '<td class="weekdays_selected_1">' + dateAux.getDate() + '</td>';
					break;
						
				case 2: // Menor
					out += '<td class="weekdays_unselected">' + dateAux.getDate() + '</td>';
					break;
						
				default: // Maior
					out += '<td align="center" class="Weekdays_selectable"><a class="Weekdays_selectable" href="javascript: void(0);" onclick="javascript: SetNewDateSingle(' + calendarObj.id + ', this.id);" + id="' + dateAux.getDate() + '">' + dateAux.getDate() + '</a></td>';
					break;
			}
			dateAux.setDate(dateAux.getDate() + 1);
			dateAux = new Date(dateAux);
		}
		else
			out += '<td align="center">&#32;</td>';			
		counter++;
		out += (counter % 7 == 0) ? "</tr>" : "";			
	}
			
	return out + "</table>";
}
		
function DrawCalendar(calendarObj, calendar2Obj)
{	
	var out = "<table width='100%%' cellspacing='0' cellpadding='0' bgcolor='#FFFFFF' border='0'>";
	out += "<tr><td class='calendar_top_month'>" + DrawCalendarTop(calendarObj, calendar2Obj, "/Structure/img/pt/cal_month_arrow_left.gif", "/Structure/img/pt/cal_month_arrow_right.gif") + "</td></tr>";
	out += "<tr><td class='calendar_weekDays'>" + DrawWeekDays() + "</td></tr>";
	out += "<tr><td>" + DrawMonthDays(calendarObj, calendar2Obj) + "</td></tr>";
	return out + "</table>";
}


function DrawCalendarSingle(calendarObj)
{	
	try
	{
		var index = calendarObj.indexControl;
		calendarObj.day = document.getElementsByName("fldPartidaDia")[index].value;
		calendarObj.month = document.getElementsByName("fldPartidaMes")[index].value - 1;
		calendarObj.year = document.getElementsByName("fldPartidaAno")[index].value;
	}
	catch(exception)
	{}
	
	var out = "<table width='100%%' cellspacing='0' cellpadding='0' bgcolor='#FFFFFF' border='0'>";
	out += "<tr><td class='calendar_top_month'>" + DrawCalendarTopSingle(calendarObj, "/Structure/img/pt/cal_month_arrow_left.gif", "/Structure/img/pt/cal_month_arrow_right.gif") + "</td></tr>";
	out += "<tr><td class='calendar_weekDays'>" + DrawWeekDays() + "</td></tr>";
	out += "<tr><td>" + DrawMonthDaysSingle(calendarObj) + "</td></tr>";
	return out + "</table>";
}



