var numMaxMonthsInAdvance = 12;

/************* GENERIC FUNCTIONS *****************/
function getElement(strId)
{
	var obj = document.getElementById(strId)
	
	if (!obj)
	{
		alert("Could not find element: " + strId);
		return null;
	}
	
	return obj;
}

function clearOptions(cboDropDown)
{
	if (!cboDropDown)
	{
		return;
	}

	var iCount = cboDropDown.options.length;
	for (iCount = iCount; iCount >= 0; iCount--)
	{
		cboDropDown.options[iCount] = null;
	}
}

function addOptionRO(cboDropDown, strValue, strText)
{
	var objOption = new Option();

	objOption.value = strValue;
	objOption.text = strText;

	cboDropDown.options[cboDropDown.options.length] = objOption;
}

function getSelectedValue(cboDropDown)
{
	if (cboDropDown.selectedIndex == -1) return "";
	
	return cboDropDown.options[cboDropDown.selectedIndex].value;
}

function setSelectedValue(cboDropDown, strValue)
{
	var numIndex = contains(cboDropDown, strValue);
	
	if (numIndex > -1)
	{
		cboDropDown.options.selectedIndex = numIndex;
		return true;
	}
	
	return false;
}

function contains(cboDropDown, strValue)
{
	var numIndex = 0;
	
	for (numIndex = 0; numIndex < cboDropDown.options.length; numIndex++)
	{
		if (cboDropDown.options[numIndex].value == strValue)
		{
			return numIndex;
		}
	}
	
	return -1;
}

function show(strId)
{
	var ctlElement = getElement(strId);
	ctlElement.style.display = "block";
}

function hide(strId)
{
	var ctlElement = getElement(strId);
	ctlElement.style.display = "none";
}

function toggle(strId)
{
	var ctlElement = getElement(strId);

	if (ctlElement.style.display == "block")
	{
		hide(strId);
	}
	else
	{
		show(strId)
	}
}

/************************************************/

/* VSICalendar event handler */
function arriveDateChanged(calSettings_Arrive, strDate, blnSelected)
{
	try
	{
		var cboArriveDay = getElement(strArriveDay);
		var cboArriveMonth = getElement(strArriveMonth);
		var cboDepartDay = getElement(strDepartDay);
		var cboDepartMonth = getElement(strDepartMonth);

		var arrParts = strDate.split("/");

		if (contains(cboArriveMonth, eval(arrParts[1]) + "/" + arrParts[2]) > -1)
		{

			setSelectedValue(cboArriveMonth, eval(arrParts[1]) + "/" + arrParts[2]);
			arrive_change(true);

			if (contains(cboArriveDay, eval(arrParts[0])) > -1)
			{
				setSelectedValue(cboArriveDay, eval(arrParts[0]));

				arrive_change();

				hide("arriveCalendar");
			}
			else
			{
				alert("Sorry, you cannot arrive on this date!");
				arrive_change();
			}
		}
		else
		{
			alert("Could not find selected month/year: " + eval(arrParts[1]) + "/" + arrParts[2]);	
			arrive_change();
		}
	}
	catch (exc)
	{
		showError(exc)
	}
}

/* VSICalendar event handler */
function departDateChanged(calSettings_Depart, strDate, blnSelected)
{
	try
	{
		var cboArriveDay = getElement(strArriveDay);
		var cboArriveMonth = getElement(strArriveMonth);
		var cboDepartDay = getElement(strDepartDay);
		var cboDepartMonth = getElement(strDepartMonth);

		var arrParts = strDate.split("/");

		if (contains(cboDepartMonth, eval(arrParts[1]) + "/" + arrParts[2]) > -1)
		{

			setSelectedValue(cboDepartMonth, eval(arrParts[1]) + "/" + arrParts[2]);
			depart_change(true);

			if (contains(cboDepartDay, eval(arrParts[0])) > -1)
			{
				setSelectedValue(cboDepartDay, eval(arrParts[0]));

				depart_change(true);

				hide("departCalendar");
			}
			else
			{
				alert("Sorry, you cannot depart on this date!");
				depart_change();
			}
		}
		else
		{
			alert("Could not find selected month/year: " + eval(arrParts[1]) + "/" + arrParts[2]);
			depart_change();
		}
	}
	catch (exc)
	{
		showError(exc)
	}
}

/* Drop down list event handler */
function arrive_change(blnDontUpdateCalendar)
{
	try
	{
		var cboArriveDay = getElement(strArriveDay);
		var cboArriveMonth = getElement(strArriveMonth);
		var cboDepartDay = getElement(strDepartDay);
		var cboDepartMonth = getElement(strDepartMonth);
		var arriveDayOfWeek = getElement("arriveDayOfWeek");
		var departDayOfWeek = getElement("departDayOfWeek");
		var dtmToday = new Date();
		var dtmArrive = new Date();

		dtmArrive.setDate(getSelectedValue(cboArriveDay));
		var strMonthYear = getSelectedValue(cboArriveMonth);

		var arrParts = strMonthYear.split("/");

		dtmArrive.setMonth(arrParts[0] - 1);
		dtmArrive.setYear(arrParts[1]);

		if (dtmArrive.getMonth() != eval(arrParts[0] - 1))
		{
			dtmArrive.setDate(1);
			dtmArrive.setMonth(arrParts[0] - 1);
			dtmArrive.setYear(arrParts[1]);
		}

		showDaysInMonth(cboArriveDay, dtmArrive.getMonth(), dtmArrive.getFullYear(), -1);

		var numOffset = dtmArrive.getDate();

		if (getSelectedValue(cboArriveMonth) != getSelectedValue(cboDepartMonth) && getSelectedValue(cboDepartMonth) != "")
		{
			if (getSelectedValue(cboArriveMonth) == eval(dtmArrive.getMonth() + 1) + "/" + dtmArrive.getFullYear())
			{
				numOffset = dtmArrive.getDate();
			}
			else
			{
				numOffset = -1;
			}
		}
		else
		{
			numOffset = eval(getSelectedValue(cboArriveDay));
		}

		if (showDaysInMonth(cboDepartDay, dtmArrive.getMonth(), dtmArrive.getFullYear(), numOffset) == 1)
		{
			//move to the next month (and year)
			dtmArrive.setDate(1);	//first day this month;
			dtmArrive.setMonth(dtmArrive.getMonth() + 1);
		}
		else
		{
			dtmArrive.setDate(eval(getSelectedValue(cboArriveDay)));
		}

		showMonths(cboDepartMonth, dtmArrive.getMonth(), dtmArrive.getFullYear());

		if (numOffset == -1)
		{
			//why would we enter here?
			showDaysInMonth(cboDepartDay, dtmArrive.getMonth(), dtmArrive.getFullYear(), dtmArrive.getDate());
			
			/*reshow the available months for departure - bug fix*/
		}

		if (!blnDontUpdateCalendar) {VSICalendar_setSelectedDate(calDepart_Settings, leadingZero(getSelectedValue(cboDepartDay)) + "/" + leadingZero(eval(dtmArrive.getMonth() + 1)) + "/" + dtmArrive.getFullYear());}

		dtmArrive.setDate(dtmArrive.getDate() + 1);

		departDayOfWeek.innerHTML = getDay(dtmArrive);

		strMonthYear = getSelectedValue(cboArriveMonth);

		arrParts = strMonthYear.split("/");

		dtmArrive.setMonth(arrParts[0] - 1);
		dtmArrive.setYear(arrParts[1]);
		dtmArrive.setDate(getSelectedValue(cboArriveDay));

		arriveDayOfWeek.innerHTML = getDay(dtmArrive);

		var strDisableBefore = leadingZero(eval(dtmArrive.getMonth() + 1)) + "/" + leadingZero(eval(dtmArrive.getDate() + 1)) + "/" + dtmArrive.getFullYear();

		if (!blnDontUpdateCalendar || calDepart_Settings.DisableBefore != strDisableBefore)
		{
			calDepart_Settings.DisableBefore = strDisableBefore;

			displayDates(calDepart_Settings);

			VSICalendar_setSelectedDate(calArrive_Settings, leadingZero(dtmArrive.getDate()) + "/" + leadingZero(eval(dtmArrive.getMonth() + 1)) + "/" + dtmArrive.getFullYear());
		}

		hide("arriveCalendar");
	}
	catch (exc)
	{
		showError(exc)
	}
}

/* Drop down list event handler */
function depart_change(blnDontUpdateCalendar)
{
	try
	{
		var cboArriveDay = getElement(strArriveDay);
		var cboArriveMonth = getElement(strArriveMonth);
		var cboDepartDay = getElement(strDepartDay);
		var cboDepartMonth = getElement(strDepartMonth);
		var arriveDayOfWeek = getElement("arriveDayOfWeek");
		var departDayOfWeek = getElement("departDayOfWeek");
		var dtmDepart = new Date();
		var dtmArrive = new Date();

		dtmDepart.setDate(getSelectedValue(cboDepartDay));
		var strMonthYear = getSelectedValue(cboDepartMonth);

		var arrParts = strMonthYear.split("/");

		dtmDepart.setMonth(arrParts[0] - 1);
		dtmDepart.setYear(arrParts[1]);

		dtmArrive.setDate(getSelectedValue(cboArriveDay));
		strMonthYear = getSelectedValue(cboArriveMonth);

		var arrParts = strMonthYear.split("/");

		dtmArrive.setMonth(arrParts[0] - 1);
		dtmArrive.setYear(arrParts[1]);

		var numOffset = dtmArrive.getDate();
		if (getSelectedValue(cboArriveMonth) != getSelectedValue(cboDepartMonth))
		{
			numOffset = -1;
		}

		if (showDaysInMonth(cboDepartDay, dtmDepart.getMonth(), dtmDepart.getFullYear(), numOffset) == 1)
		{
			//move to the next month (and year)
			dtmDepart.setDate(1);	//first day this month;
			dtmDepart.setMonth(dtmDepart.getMonth() + 1);
		}

		if (dtmDepart < dtmArrive)
		{
			arrive_change(blnDontUpdateCalendar);
		}
		else
		{
			departDayOfWeek.innerHTML = getDay(dtmDepart);
		}

		VSICalendar_setSelectedDate(calDepart_Settings, leadingZero(dtmDepart.getDate()) + "/" + leadingZero(eval(dtmDepart.getMonth() + 1)) + "/" + dtmDepart.getFullYear());

		hide("departCalendar");
	}
	catch (exc)
	{
		showError(exc)
	}
}

function setup()
{
	try
	{
		var cboArriveDay = getElement(strArriveDay);
		var cboArriveMonth = getElement(strArriveMonth);
		var cboDepartDay = getElement(strDepartDay);
		var cboDepartMonth = getElement(strDepartMonth);
		var arriveDayOfWeek = getElement("arriveDayOfWeek");
		var departDayOfWeek = getElement("departDayOfWeek");
		var dtmToday = new Date();

		showDaysInMonth(cboArriveDay, dtmToday.getMonth(), dtmToday.getFullYear(), dtmToday.getDate() - 1);
		showMonths(cboArriveMonth, 0, dtmToday.getFullYear());
		dtmToday.setDate(dtmToday.getDate() + 1)
		arriveDayOfWeek.innerHTML = getDay(dtmToday);

		arrive_change();

		changeRooms(getElement(strRooms));

		dtmToday = new Date();
		
		if (strArrivalDate != "" && strArrivalDate != leadingZero(dtmToday.getDate()) + "/" + leadingZero(dtmToday.getMonth() + 1) + "/" + dtmToday.getFullYear())
		{
			VSICalendar_setSelectedDate(calArrive_Settings, strArrivalDate);
			arriveDateChanged(calArrive_Settings, strArrivalDate, true);
		}
		
		dtmToday.setDate(dtmToday.getDate() + 1);

		if (strDepartureDate != "" && strDepartureDate != leadingZero(dtmToday.getDate()) + "/" + leadingZero(dtmToday.getMonth() + 1) + "/" + dtmToday.getFullYear())
		{
			VSICalendar_setSelectedDate(calDepart_Settings, strDepartureDate);
			departDateChanged(calDepart_Settings, strDepartureDate, true);
		}
	}
	catch (exc)
	{
		showError(exc)
	}
}

function getDay(dtmDate)
{
	var weekday=new Array(7);
	weekday[0]="Sunday";
	weekday[1]="Monday";
	weekday[2]="Tuesday";
	weekday[3]="Wednesday";
	weekday[4]="Thursday";
	weekday[5]="Friday";
	weekday[6]="Saturday";

	return weekday[dtmDate.getDay()];
}

function showDaysInMonth(cboDays, numMonth, numYear, numStartFrom)
{
	var dtmToday = new Date();
	var numOffset = 0;
	var numDaysInMonth = 0;
	var numResult = 0;
	var numSelection = getSelectedValue(cboDays);
	
	if (numStartFrom == 0)
	{
		numOffset = dtmToday.getDate() - 1;
	}
	else
	{
		numOffset = numStartFrom;
	}
	
	if (numOffset < 0)
	{
		if (numMonth == dtmToday.getMonth() && numYear == dtmToday.getFullYear())
		{
			numOffset = dtmToday.getDate() - 1;
		}
		else
		{
			numOffset = 0;
		}
	}
	
	numDaysInMonth = getDaysInMonth(numMonth, numYear);
	
	if (numOffset >= numDaysInMonth)
	{
		if (numMonth == 11)
		{
			numYear++;
			numMonth = 0;
		}
		else
		{
			numMonth++;
		}
		
		numDaysInMonth = getDaysInMonth(numMonth, numYear);
		numOffset = 0;
		numResult = 1;
		numSelection = 1;
	}
	
	clearOptions(cboDays);
	
	var dtmLastDate = new Date();
	dtmLastDate.setMonth(dtmLastDate.getMonth() + numMaxMonthsInAdvance);

	var numIndex = 0;
	for (numIndex = numOffset + 1; numIndex <= numDaysInMonth; numIndex++)
	{
		var dtmNow = new Date();
		dtmNow.setYear(numYear);
		dtmNow.setMonth(numMonth);
		dtmNow.setDate(numIndex);
		
		if (dtmNow.getMonth() == dtmLastDate.getMonth() && dtmNow.getFullYear() == dtmLastDate.getFullYear())
		{
			if (dtmNow.getDate() >= dtmLastDate.getDate() && cboDays.id == strArriveDay)
			{
				break;
			} else if (dtmNow.getDate() >= dtmLastDate.getDate() + 1 && cboDays.id == strDepartDay)
			{
				break;
			}
		}
		
		addOptionRO(cboDays, numIndex, numIndex);
	}
	
	setSelectedValue(cboDays, numSelection);
	
	return numResult;
}

function showMonths(cboMonths, numStartFrom, numYear)
{
	var dtmToday = new Date();
	var dtmRef = new Date();
	var month=new Array(12);
	month[0]="Jan";
	month[1]="Feb";
	month[2]="Mar";
	month[3]="Apr";
	month[4]="May";
	month[5]="Jun";
	month[6]="Jul";
	month[7]="Aug";
	month[8]="Sep";
	month[9]="Oct";
	month[10]="Nov";
	month[11]="Dec";
	
	dtmRef.setFullYear(numYear);
	dtmRef.setDate(1);
	dtmToday.setDate(1);
	
	if (cboMonths.id == strArriveMonth)
	{
		//arrive
		clearOptions(cboMonths);	
	}
	else
	{
		//depart
		clearOptions(cboMonths);
	}
	
	clearOptions(cboMonths);
	
	var numMonthsAhead = numMaxMonthsInAdvance;
	
	while (numMonthsAhead >= 0)
	{
		numMonthsAhead--;

		if ((numStartFrom <= dtmToday.getMonth() && dtmToday.getFullYear() >= dtmRef.getFullYear()) || (numStartFrom == 0 && dtmToday.getFullYear() >= dtmRef.getFullYear()) || dtmToday.getFullYear() > dtmRef.getFullYear())
		{
			addOptionRO(cboMonths, eval(dtmToday.getMonth() + 1) + "/" + dtmToday.getFullYear(), month[dtmToday.getMonth()] + " 0" + eval(dtmToday.getFullYear() - 2000));
		}

		dtmToday.setMonth(dtmToday.getMonth() + 1);
	}
}

function getDaysInMonth(numMonth, numYear)
{
	var numDaysInMonth = 0;
	
	var daysInMonth=new Array(12);
	daysInMonth[0]=31;
	daysInMonth[1]=28;
	daysInMonth[2]=31;
	daysInMonth[3]=30;
	daysInMonth[4]=31;
	daysInMonth[5]=30;
	daysInMonth[6]=31;
	daysInMonth[7]=31;
	daysInMonth[8]=30;
	daysInMonth[9]=31;
	daysInMonth[10]=30;
	daysInMonth[11]=31;

	numDaysInMonth = daysInMonth[numMonth];

	if (isLeapYear(numYear) == true && numMonth == 1)
	{
		numDaysInMonth = numDaysInMonth + 1;
	}
	
	return numDaysInMonth;
}

function isLeapYear(numYear)
{
	if ((numYear % 4) == 0)
	{
		return true;
	}
	
	return false;
}

function gotoStep2()
{
	window.setTimeout("redirectToStep2()", 100);
}

function redirectToStep2()
{
	try
	{
		var cboArriveDay = getElement(strArriveDay);
		var cboArriveMonth = getElement(strArriveMonth);
		var cboDepartDay = getElement(strDepartDay);
		var cboDepartMonth = getElement(strDepartMonth);
		var txtCorporateId = getElement(strCorporateId);
		var txtPromoCode = getElement(strPromoCode);

		var cboHotel = getElement(strHotel);
		var cboRooms = getElement(strRooms);

		var dtmDepart = new Date();
		var dtmArrive = new Date();

		dtmDepart.setDate(getSelectedValue(cboDepartDay));
		var strMonthYear = getSelectedValue(cboDepartMonth);

		var arrParts = strMonthYear.split("/");

		dtmDepart.setMonth(arrParts[0] - 1);
		dtmDepart.setYear(arrParts[1]);

		dtmArrive.setDate(getSelectedValue(cboArriveDay));
		strMonthYear = getSelectedValue(cboArriveMonth);

		var arrParts = strMonthYear.split("/");

		dtmArrive.setMonth(arrParts[0] - 1);
		dtmArrive.setYear(arrParts[1]);

		var strURL = "https://www.celtic-manor.com/booking1.aspx?";

		strURL += "Arrive=" + dtmArrive.getDate() + "/" + eval(dtmArrive.getMonth() + 1) + "/" + dtmArrive.getFullYear();
		strURL += "&Depart=" + dtmDepart.getDate() + "/" + eval(dtmDepart.getMonth() + 1) + "/" + dtmDepart.getFullYear();

		strURL += "&Hotel=" + getSelectedValue(cboHotel);
		strURL += "&Rooms=" + getSelectedValue(cboRooms);

		strURL += getRoomData(1, strAdults1, strChildren1, strInfants1);
		strURL += getRoomData(2, strAdults2, strChildren2, strInfants2);
		strURL += getRoomData(3, strAdults3, strChildren3, strInfants3);
		strURL += getRoomData(4, strAdults4, strChildren4, strInfants4);
		strURL += getRoomData(5, strAdults5, strChildren5, strInfants5);
		
		strURL += "&PromoCode=" + txtPromoCode.value;
		strURL += "&CorpId=" + txtCorporateId.value;

		pleaseWait();

		if (blnDebug == true)
		{
			alert(strURL);
		}
		else
		{
			strURL += "&Proceed=1";
		}

		if (window.location)
		{
			window.location = strURL;
		}
		else
		{
			alert("Cannot redirect!");
		}
	}
	catch (exc)
	{
		showError(exc)
	}
	
	return false;
}

function getRoomData(numRoom, strAdults, strChildren, strInfants)
{
	var cboAdults = getElement(strAdults);
	var cboChildren = getElement(strChildren);
	var cboInfants = getElement(strInfants);
	var cboRooms = getElement(strRooms);

	var strURL = "";

	strURL += "&Adults" + numRoom + "=" + getSelectedValue(cboAdults);
	strURL += "&Children" + numRoom + "=" + getSelectedValue(cboChildren);
	strURL += "&Infants" + numRoom + "=" + getSelectedValue(cboInfants);
	
	if (eval(numRoom) > eval(getSelectedValue(cboRooms)))
	{
		return "";
	}
	
	return strURL;
}

function changeRooms(cboRooms)
{
	try
	{
		var numRooms = getSelectedValue(cboRooms);

		var i = 0;
		for (i = 2; i <= 5; i++)
		{
			if (i <= eval(numRooms))
			{
				show("room" + i);
			}
			else
			{
				hide("room" + i);
			}
		}
	}
	catch (exc)
	{
		showError(exc)
	}
}

/*Reserve Online*/
function showPopupMessage(strMessage)
{
	var popupMessage = document.getElementById("popupMessage");
	popupMessage.style.zIndex = 100;
	popupMessage.style.display = "block";
	popupMessage.style.left = numX + "px";
	popupMessage.style.top = numY + "px";
	popupMessage.innerHTML = strMessage;
}

function hidePopupMessage()
{
	var popupMessage = document.getElementById("popupMessage");
	popupMessage.style.display = "none";
}

function mouseOverAges()
{
	showPopupMessage("Click here for help on Reserving Online.</a>");
}
function mouseOverFamilyPolicy()
{
	showPopupMessage("The ages for adults, children and infants are shown below:<br /><br />Adults 13+<br />Children 2-12 years<br />Infants: 0-1 years.");
}

function mouseOutAges()
{
	hidePopupMessage();
}


var IE = document.all?true:false;

// If NS -- that is, !IE -- then set up for mouse capture
if (!IE) document.captureEvents(Event.MOUSEMOVE);

// Set-up to use getMouseXY function onMouseMove
document.onmousemove = getMouseXY;

// Temporary variables to hold mouse x-y pos.s
var numX = 0;
var numY = 0;

// Main function to retrieve mouse x-y pos.s

function getMouseXY(e) 
{
	if (IE) 
	{ // grab the x-y pos.s if browser is IE
		numX = event.clientX + document.body.scrollLeft;
		numY = event.clientY + document.body.scrollTop;
	}
	else
	{  // grab the x-y pos.s if browser is NS
		numX = e.pageX;
		numY = e.pageY;
	}  
	// catch possible negative values in NS4
	if (numX < 0){numX = 0}
	if (numY < 0){numY = 0}  
	
	// show the position values in the form named Show
	// in the text fields named MouseX and MouseY
	return true;
}

