
var calDate = new Date();
var baseDate = new Date();
var arrivalDate = new Date();
var departureDate = new Date();
var arrivalFieldName;
var departureFieldName;
var numdaysFieldName;
var calType = 'arrival';
var	elementName;
var formObject = '';
var calPosLeft = 0;
var calPosTop = 0;


var todayStr = "Today";
var weekdayList  = new Array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday');
var weekdayArray = new Array('Su','Mo','Tu','We','Th','Fr','Sa');
var monthArray = new Array('January', 'February', 'March', 'April', 'May', 'June','July', 'August', 'September', 'October', 'November', 'December');

var isCSS, isW3C, isIE4, isNN4, isIE6CSS;

function initDHTMLAPI(){
	if (document.images){
		isCSS = (document.body && document.body.style) ? true : false;
		isW3C = (isCSS && document.getElementById) ? true : false;
		isIE4 = (isCSS && document.all) ? true : false;
		isNN4 = (document.layers) ? true : false;
		isEI6CSS = (document.compatMode && document.compatMode.indexOf("CSS1") >=0) ? true : false;
	}
}

function reDrawCalendar(adjMonth)
	{
	AdjustCalDate(adjMonth);
	hideCalendar();
	buildCalendar();
	}


function moveElement(obj, x, y)
	{
	var theObj = getElement(obj);
	if (theObj)
		{
		if (isCSS && ! isNaN(x) && ! isNaN(y) )
			{
			var units =  "px";
				theObj.style.left = x + units;
				theObj.style.top = y + units;
			//alert("x is " + theObj.style.left + ", y is " + theObj.style.top);
			}
		}
	}

function isCurrentMonth()
	{
	var month=calDate.getMonth();
	var year =calDate.getFullYear();

	var curDate = new Date();
	var curMonth = curDate.getMonth();
	var curYear = curDate.getFullYear();
	var value = 0;

	if (curYear == year &&
	    curMonth == month)
		{
	    value = 1;
		}
	return value;
	}

function seekLayer(doc, name){
	var theObj;

	for (var i = 0; i < doc.layers.length; i++){
		if (doc.layers[i].name == name){
			theObj = doc.layers[i];
			break;
		}

		if (doc.layers[i].document.layers.length > 0){
			theObj = seekLayer(document.layers[i].document, name);
		}

	}

	return theObj;
}

function SetCalDate(newDate)
	{
	calDate = newDate;
	}

function AdjustCalDate(adjMonth)
	{
	var month=calDate.getMonth();
	var year =calDate.getFullYear();
	var day  =calDate.getDate();	

	month += adjMonth;
	
	if (month > 11){
		month = 0;
		year++;
	}else if (month < 0){
		month = 11;
		year--;
	}

	curDate = new Date();
	curMonth = curDate.getMonth();
	curYear = curDate.getFullYear();

	//if (curYear <= year || (curYear == year &&
	//   curMonth <= month))
		{

		// Set the date to the month specified		
		calDate = new Date (year, month, day);	
		}
	}

function setDate(id)
	{
	var objYearMonth = eval ("formObject." + elementName + "_yearmonth");
	if (objYearMonth)
		{
		var objDay = eval("formObject." + elementName + "_day");
		var offset = getMonthOffset();
		//alert ("offset is " + offset);
		objDay.options[id - 1].selected = true;
		objYearMonth[offset - 1].selected = true;
		}
	else
		{
		var objYear = eval ("formObject." + elementName + "_year");
		var objMonth = eval ("formObject." + elementName + "_month");
		var objDay = eval("formObject." + elementName + "_day");
		objDay.options[id - 1].selected = true;

		var bookMonth = calDate.getMonth();
		objMonth.options[bookMonth].selected = true;
		var bookYear = calDate.getYear();
		if (bookYear < 2000)
			{
			bookYear += 1900;
			}

		var counter;
		for (counter=0; counter < objYear.length; counter++)
			{
			if (objYear.options[counter].value == bookYear)
				{
				objYear.options[counter].selected = true;
				break;
				}
			}

		}

	if (calType == 'arrival' && departureFieldName)
		{
		CheckDepartureDate(formObject,arrivalFieldName,departureFieldName,numdaysFieldName);
		}
	else if (calType == 'departure' && arrivalFieldName)
		{
		//alert ("arrival field is " + arrivalFieldName);
		CheckArrivalDate(formObject,arrivalFieldName,departureFieldName,numdaysFieldName);
		}
	else if (calType == 'departure')
		{
		// The arrival date is fixed, therefore change num_nights due to change in departure date
		SetNumDays(formObject,arrivalFieldName,departureFieldName);
		}

	hideCalendar();
	}

function setInitDates(pulldown_day,pulldown_month,pulldown_year)
	{
	var day;
	var month;
	var year;
	if (!pulldown_year)
		{
		day	 = pulldown_day.options[pulldown_day.selectedIndex].value;
		var yearmonth =	pulldown_month[pulldown_month.selectedIndex].value;
		year = yearmonth.substring(0,4);
		month = yearmonth.substring(4,6);
		}
	else
		{
		day	= pulldown_day.options[pulldown_day.selectedIndex].value;
		month = pulldown_month.options[pulldown_month.selectedIndex].value;
		year = pulldown_year.options[pulldown_year.selectedIndex].value;
		}
	// Remove a month because new Date uses 0 - 11 month schedules.
	parseFloat(month);
	month--;	

	var CurrentDate = new Date (year, month, day);	
	return CurrentDate;
	}

function showCalendar(formName,form_elementName,type,posElement,arrival_field_name,departure_field_name,numdays_field_name)
	{
	initDHTMLAPI();
	formObject = eval("document." + formName);
	calPosLeft = getElementLeft(posElement);
	calPosTop = getElementTop(posElement);
	arrivalFieldName = arrival_field_name;
	departureFieldName = departure_field_name;
	numdaysFieldName = numdays_field_name;

	calType = type;
	elementName = form_elementName;

	eval("basedate_ptr = formObject." + arrival_field_name + "_basedate");
	if (basedate_ptr)
		{
		basedate = eval("formObject." + arrival_field_name + "_basedate.value");
		}
	else
		{
		basedate = eval("formObject." + departure_field_name + "_basedate.value");
		}

	var basedate_year = basedate.substring(0,4);
	var basedate_month = basedate.substring(4,6);
	basedate_month--;
	baseDate = new Date (basedate_year,basedate_month,1);
	//alert("base date is " + baseDate);

	var pulldown_day = eval("formObject." + arrival_field_name + "_day");
	var pulldown_month = eval("formObject." + arrival_field_name + "_month");
	var pulldown_year;
	if (!pulldown_month)
		{
		pulldown_month = eval("formObject." + arrival_field_name + "_yearmonth");
		}
	else
		{
		pulldown_year = eval("formObject." + arrival_field_name + "_year");
		}

	if (pulldown_day)
		{
		arrivalDate = setInitDates(pulldown_day,pulldown_month,pulldown_year);
		}

	var pulldown_day = eval("formObject." + departure_field_name + "_day");
	var pulldown_month = eval("formObject." + departure_field_name + "_month");
	var pulldown_year;
	if (!pulldown_month)
		{
		pulldown_month = eval("formObject." + departure_field_name + "_yearmonth");
		}
	else
		{
		pulldown_year = eval("formObject." + departure_field_name + "_year");
		}

	if (pulldown_day)
		{
		departureDate = setInitDates(pulldown_day,pulldown_month,pulldown_year);
		}

	hideCalendar();

	if (type == 'arrival')
		{
		objDate = arrivalDate;
		}
	else
		{
		objDate = departureDate;
		}

	SetCalDate(objDate);

	buildCalendar();
	}

function hideCalendar()
	{
	DisplayFrame("calFrame", 0);
	DisplayFrame("calHeadingArrival", 0);
	DisplayFrame("calHeadingDeparture", 0);
	DisplayFrame("calFrame", 0);
	DisplayFrame("calArrowLeft", 0);
	DisplayFrame("calArrowRight", 0);
	DisplayFrame("calLayerClose", 0);

	// Remove if done on close
	for (var i=1; i<100; i++)
		{
    	obj = getElement("calMonth" + i);
		if (!obj)
			break;

		DisplayFrame("calMonth" + i, 0);
		}	

	// Remove if done on close
	for (var i=1; 8 > i; i++)
		{
		DisplayFrame("calWDay" + i, 0);
		}	

	// Remove if done on close
	for (var i=1; 32 > i; i++)
		{
		DisplayFrame("calDay" + i, 0);
		}	
	}


function getElement(obj){
	var theObj;

	if (typeof obj == "string"){
		if (isW3C){
			theObj = document.getElementById(obj);
		}else if (isIE4){
			theObj = document.all(obj);
		}else if (isNN4){
			theObj = seekLayer(document, obj);
		}
	}else{
		theObj = obj;
	}

	return theObj;
}

function getElementLeft(obj){
	var elem = getElement(obj);
	var result = 0;

	if (document.defaultView) {
		var style = document.defaultView;
		if (elem.style.pixelLeft){
			result = elem.style.pixelLeft;
		}else{
			//Netscape needs the image size added
			result = style.getComputedStyle(elem, "").getPropertyValue("left");
			result = parseInt(result) + 17;
		}
	} else if (elem.currentStyle) {
		result = elem.currentStyle.left;
		if (! result || result == 'auto'){
			result = elem.offsetLeft;
		}
	} else if (elem.style) {
		result = elem.style.left;
	} else if (isNN4) {
		result = elem.left;
	}
	return parseInt(result);
}


function getElementTop(obj){
	var elem = getElement(obj);
	var result = 0;

	if (document.defaultView) {
		if (elem.style.pixelTop){
			result = elem.style.pixelTop;
		}else{
			var style = document.defaultView;
			result = style.getComputedStyle(elem, "").getPropertyValue("top");
			result = parseInt(result) - 21;
		}
	} else if (elem.currentStyle) {
		result = elem.currentStyle.top;
		if (! result || result == 'auto'){	
			result = elem.offsetTop;

			//elem = getElement('test');
			//result = elem.y;
		}
	} else if (elem.style){
		result = elem.style.top;
	} else if (isNN4){
		result = elem.top;
	}

	return parseInt(result);
}



function DisplayFrame(szDivID, iState) // 1 visible, 0 hidden
	{
    if(document.layers)	   //NN4+
		{
		document.layers[szDivID].visibility = iState ? "show" : "hide";
		}
	else if(document.getElementById)	  //gecko(NN6) + IE 5+
		{
		var obj = document.getElementById(szDivID);
		obj.style.visibility = iState ? "visible" : "hidden";
		}
	else if(document.all)	// IE 4
		{
		document.all[szDivID].style.visibility = iState ? "visible" : "hidden";
		}
	return false;
	}


function buildCalendar() 
	{  
	//Turn off everything before turning it back on

	month = calDate.getMonth();
	year = calDate.getFullYear();
	day  = calDate.getDate();

	var columnCount=0;
	var days = getDaysInMonth(calDate);
	if (day > days)
		day = days;
	var firstOfMonth = new Date (year, month, 1);
	var startingPos  = firstOfMonth.getDay();
	
	var frameX = 500;
	var frameY = 600;
	var frameColumnX = 20
	var frameColumnY = 20;

	var x = 10;
	var y = 55;

	//alert("x is " + calPosLeft + ", y is " + calPosTop);
	moveElement("calFrame", calPosLeft, calPosTop);
	DisplayFrame("calFrame", 1);
   
	if (calType == 'arrival')
		{
		DisplayFrame("calHeadingArrival", 1);
		}
	else
		{
		DisplayFrame("calHeadingDeparture", 1);
		}
   
	//DisplayFrame("calHeadingArrival", 1);

	// Display the Navigation Arrows
	if (getMonthOffset() > 1)
		{
		moveElement("calArrowLeft",10,40);
    	DisplayFrame("calArrowLeft", 1);
		}

	//if (getMonthOffset() < 12)
		//{
    	obj = getElement("calArrowRight");
		moveElement("calArrowRight",128,40);
    	DisplayFrame("calArrowRight", 1);
		//}
	
    offset = getMonthOffset();
	moveElement("calMonth" + offset,27,40);
    DisplayFrame("calMonth" + offset, 1);

	moveElement("calLayerClose",55,190);
    DisplayFrame("calLayerClose", 1);

	// Display The Weekdays
	for (i = 1; 8 > i; i++)
		{
  		/// Positioning Layers here
  		moveElement("calWDay"+i,x,y);
  		DisplayFrame("calWDay" + i, 1);
		x += frameColumnX;
		}

	// Add space for the next column
	x = 10; 
	y += frameColumnY;

	// Calculate the stating position for the day
	for (i=0; i < startingPos; i++) 
		{
 		x += frameColumnX;
 		columnCount++;
		}


	var currentDay=0;

	for (i=startingPos; i < days+startingPos; i++) 
		{
		currentDay = i-startingPos+1;
 
		/// Positioning Layers here
		moveElement("calDay"+currentDay,x,y);
		DisplayFrame("calDay" + currentDay, 1);
		x += frameColumnX;
 
		var obj = getElement("calDay" + currentDay);
		if (
				(currentDay == arrivalDate.getDate() && month == arrivalDate.getMonth() && year == arrivalDate.getFullYear())
				|| (currentDay == departureDate.getDate() && month == departureDate.getMonth() && year == departureDate.getFullYear())
	   		)
			{
			obj.style.background = "white";
			}
		else
			{
			obj.style.background = "#eeece0";
			}

 		columnCount++;
 		if (columnCount % 7 == 0)
			{
			x = 10; y += frameColumnY;
			}
		}
	}

function getDaysInMonth(cDate)  
	{
	var days=28;
	var month=cDate.getMonth()+1;
	var year =cDate.getFullYear();
	if (month==1||month==3||month==5||month==7||month==8||month==10||month==12) 
		{
 		days=31;
		}
	else if (month==4 || month==6 || month==9 || month==11) 
		{
 		days=30;
		}
	else if (month==2 && ( (year%4)==0 && (year%100)!=0 || (year%400)==0 )) 
		{
 		days=29;
		}
	return (days);
	}

function incDate(cDate)
	{
	var month = cDate.getMonth();
	var year = cDate.getFullYear();
	var day = cDate.getDate();	

	if (day < getDaysInMonth(cDate))
		{
		day++;
		}
	else
		{
		day = 1;
		month++;
		if (month > 12)
			{
			month = 1;
			year++;
			}
		}
	
	var cDate = new Date (year, month, day);	
	return cDate;
	}

function isDateValid(year,month,day)
	{
	if (year < 2000 || year > 2100)
		{
		return 0;
		}
	if (month <= 0 || month > 12)
		{
		return 0;
		}

	var cDate = new Date (year, month-1, 1);	
	maxdays = getDaysInMonth(cDate);

	if (day < 1 || day > maxdays)
		{
		return 0;
		}

	return 1;
	}

function daysBetween(date1, date2) 
	{
    // The number of milliseconds in one day
    var ONE_DAY = 1000 * 60 * 60 * 24

    // Convert both dates to milliseconds
    var date1_ms = date1.getTime()
    var date2_ms = date2.getTime()

    // Calculate the difference in milliseconds
    var difference_ms = Math.abs(date1_ms - date2_ms)
    
    // Convert back to days and return
    return Math.round(difference_ms/ONE_DAY)
	}

function getMonthOffset() 
	{
	var offset = 1;

	//var date = new Date();
	var date = baseDate;
	var curMonth = date.getMonth();
	var bookMonth = calDate.getMonth();
	var curYear = date.getFullYear();
	var bookYear = calDate.getFullYear();

	//alert("dates are " + date + ", " + calDate);
	while (curMonth != bookMonth || curYear != bookYear )
		{
		offset++;
		curMonth ++;
		if (curMonth == 12) { curMonth = 0; curYear++; }
		}		
	
	return offset;
	}
