
/* this is the function that generatest the code for the calendar */
function create_calendar (str_target, str_calendarname, str_datetime, str_datetimestart, str_datetimeend)
{
	var arr_months 			= ["January","February","March","April","May","June","July","August","September","October","November","December"];
	var week_days 			= ["Su","Mo","Tu","We","Th","Fr","Sa"];	var n_weekstart 		= 0; 	// day week starts from (normally 0 or 1)	var dt_today_date		= new Date();
	var dt_datetime 		= (str_datetime == null || str_datetime == "" ? ((str_datetimeend != null && str_datetimeend != '') ? (str2dt(str_datetimeend) < dt_today_date ? str2dt(str_datetimeend) : (str_datetimestart != null && str_datetimestart != '' ? str2dt(str_datetimestart) : dt_today_date)) : (str_datetimestart != null && str_datetimestart != '' ? str2dt(str_datetimestart) : dt_today_date)) : str2dt(str_datetime));
	var dt_prev_month 		= new Date(dt_datetime);
	var dt_next_month 		= new Date(dt_datetime);
	var dt_firstday 		= new Date(dt_datetime);
	var dt_lastday 			= new Date(dt_next_month);
	var dt_datetimestart	= '';
	var dt_datetimeend		= '';
	var dt_today 				= new Date();
	var travel_output		= "";
	
	var strLocation = document.location.href;
	if (strLocation.indexOf("bookonline") == -1) {
		travel_output = "showTravellers();";
	}
	
	dt_prev_month.setDate(1);
	dt_prev_month.setMonth(dt_datetime.getMonth()-1);
	if (dt_prev_month.getMonth() == dt_today.getMonth()) {
		dt_prev_month.setDate(dt_today.getDate());
	}

	dt_next_month.setDate(1);
	dt_next_month.setMonth(dt_datetime.getMonth()+1);
	
	dt_firstday.setDate(1);
	dt_firstday.setDate(1-(7+dt_firstday.getDay()-n_weekstart)%7);
	dt_lastday.setDate(0);
	
	var strPrevButton	= 	'<a href="javascript:create_calendar(\'' + str_target + '\',\'' + str_calendarname + '\',\'' + dt2dtstr(dt_prev_month) + '\',\'' + str_datetimestart + '\',\'' + str_datetimeend + '\');">' +							'	<img src="https://bookonline.clippervacations.com/ibe/prev.gif" width="16" height="16" border="0" alt="previous month" style="display:block;">\n' +
							'</a>\n';
							
	var strNextButton	= 	'<a href="javascript:create_calendar(\'' + str_target + '\',\'' + str_calendarname + '\',\'' + dt2dtstr(dt_next_month) + '\',\'' + str_datetimestart + '\',\'' + str_datetimeend + '\');">' +							'	<img src="https://bookonline.clippervacations.com/ibe/next.gif" width="16" height="16" border="0" alt="next month" style="display:block;">\n' +
							'</a>\n';
	
	if (str_datetimestart != null && str_datetimestart != '')
	{
		dt_datetimestart = str2dt(str_datetimestart);
		
		if (dt_datetime.getMonth() <= dt_datetimestart.getMonth() && dt_datetime.getYear() == dt_datetimestart.getYear())
		{
			strPrevButton = '&nbsp;';
		}
	}

	
	if (str_datetimeend != null && str_datetimeend != '')
	{
		dt_datetimeend = str2dt(str_datetimeend);
		
		if (dt_datetime.getMonth() >= dt_datetimeend.getMonth() && dt_datetime.getYear() == dt_datetimeend.getYear())
		{
			strNextButton = '&nbsp;';
		}
	}

	var str_buffer = new String 	(	'<table class="calendar_outer" cellspacing="0" cellpadding="2" border="0">\n' +										'<tr>\n' +
										'	<td style="background:#4682B4;">\n' +										'		<table cellspacing="1" cellpadding="3" width="100%" class="calendar_inner">\n' +										'		<tr>\n' +
										'			<td bgcolor="#4682B4">\n' +
														strPrevButton +
										'			</td>\n' +										'			<td style="background:#4682B4;text-align:center;color:white;" colspan="5" nowrap>' +										'				<select name="selectmonth" size="1" onchange="javascript:change_date(\'month\',this.options[this.options.selectedIndex].value,\'' + dt2dtstr(dt_datetime) + '\',\'' + str_target + '\',\'' + str_calendarname + '\',\'' + str_datetimestart + '\',\'' + str_datetimeend + '\');">' +
															get_all_months(dt_datetime.getMonth()) +
										'				</select>' +					
										'				<select name="selectyear" size="1" onchange="javascript:change_date(\'year\',this.options[this.options.selectedIndex].value,\'' + dt2dtstr(dt_datetime) + '\',\'' + str_target + '\',\'' + str_calendarname + '\',\'' + str_datetimestart + '\',\'' + str_datetimeend + '\');">' +
															get_year_list(dt_datetime.getFullYear(), (dt_datetimestart == '' ? '' : dt_datetimestart.getFullYear()), (dt_datetimeend == '' ? '' : dt_datetimeend.getFullYear())) +
										'				</select>' +
										'			</td>\n' +										'			<td bgcolor="#4682B4" align="right">\n' +
														strNextButton +
										'			</td>\n' +
										'		</tr>\n' +
										'		<tr>\n'
									);	
	var dt_current_day 	= new Date(dt_firstday);
	
	// print weekdays titles
	for (var n=0; n<7; n++)	{
		str_buffer += 					'			<td class="titleweekday">' +														week_days[(n_weekstart+n)%7] +
										'			</td>\n'
										
											}
	str_buffer +=						'		</tr>\n';				
	
	// print calendar table
	while (dt_current_day.getMonth() == dt_datetime.getMonth() || dt_current_day.getMonth() == dt_firstday.getMonth()) 
	{
		str_buffer +=					'		<tr>\n';
		
		for (var n_current_wday=0; n_current_wday<7; n_current_wday++) 
		{
			// print current date
			if (dt_current_day.getDate() == dt_datetime.getDate() && dt_current_day.getMonth() == dt_datetime.getMonth())
			{	
				str_buffer += 			'			<td bgcolor="#FFB6C1" align="right">';			}
			// weekend days
			else if (dt_current_day.getDay() == 0 || dt_current_day.getDay() == 6)			{
				str_buffer += 			'			<td bgcolor="#DBEAF5" align="right">';			}
			else	// print working days of current month			{
				str_buffer += 			'			<td bgcolor="white" align="right">';			}
			
			if (dt_current_day.getMonth() == dt_datetime.getMonth())			{
				var dateOutOfRange = false;
				
				if (dt_datetimestart != '')
				{
					if (dt_current_day < dt_datetimestart) { dateOutOfRange = true; } 
				}
				
				if (dt_datetimeend != '')
				{
					if (dt_current_day > dt_datetimeend) { dateOutOfRange = true; }
				}
				
				// print days of current month
				if (dateOutOfRange)
				{
					str_buffer +=		'				<span class="datepassed">' + dt_current_day.getDate() + '</span>';
				}
				else
				{
//					str_buffer +=		'				<a class="linkdaynumber" href="javascript:void(0);" onclick="javascript:document.getElementById(\'' + str_target + '\').value=\'' + dt2dtstr(dt_current_day) + '\';document.getElementById(\'' + str_calendarname + '\').style.display=\'none\';document.getElementById(\'' + str_target + '\').focus();">' +
//														dt_current_day.getDate() +
//										'				</a>';
					str_buffer +=		'				<a class="linkdaynumber" href="javascript:void(0);" onclick="javascript:document.' + str_target + '.value=\'' + dt2dtstr(dt_current_day) + '\';document.getElementById(\'' + str_calendarname + '\').style.display=\'none\';' + travel_output + 'document.' + str_target + '.focus();">' +
														dt_current_day.getDate() +
										'				</a>';
				}
			}
			str_buffer += 				'			</td>\n';
			
			dt_current_day.setDate(dt_current_day.getDate()+1);
		}
		str_buffer += 					'		</tr>\n';
	}

	str_buffer +=						'		</table>\n' +
										'	</td>\n' +
										'</tr>\n' +
										'<tr>' +
										'	<td style="padding:3px;text-align:center;color:#ffffff;background:#4682B4;">' +
										'		<a style="color:#ffffff;" href="javascript:void(0);" onclick="javascript:document.getElementById(\'' + str_calendarname + '\').style.display=\'none\';' + travel_output + '">close calendar</a>' +
										'	</td>' +
										'</tr>' +
										'</table>\n';				
	
	document.getElementById(str_calendarname).style.width 		= '220px';
	document.getElementById(str_calendarname).innerHTML			= str_buffer;
	document.getElementById(str_calendarname).style.display 	= 'block';
}

/* calculates the distance from the left margin to the input field */
function get_offset_left (theobj)
{
	var offsetleft = 0;
	
	if (theobj.offsetParent)
	{
		while (theobj.offsetParent)
		{
			offsetleft 	+= theobj.offsetLeft;
			theobj 		 = theobj.offsetParent;
		}
	}
	else if (theobj.x)
	{
		offsetleft = theobj.x;
	}
	return offsetleft;
}

/* calculates the distance from the top margin to the input field */
function get_offset_top (theobj)
{
	var offsettop 	= 0;
	var localobj 	= theobj;
	
	if (localobj.offsetParent)
	{
		while (localobj.offsetParent)
		{
			offsettop		+= localobj.offsetTop;
			localobj		 = localobj.offsetParent;
		}
	}
	else if (localobj.y)
	{
		offsettop = localobj.y;
	}
	offsettop += theobj.offsetHeight;
	
	return offsettop;
}

/* datetime parsing and formatting routimes */
function str2dt (str_datetime) 
{	var re_date = new RegExp("^(\\d+)[-/.,\\ \](\\d+)[-/.,\\ \](\\d+)$");
	if (!re_date.exec(str_datetime))	{
		alert('Invalid Datetime format: "'+ str_datetime + '"');
		return '';	}
	
	return (new Date (RegExp.$3, RegExp.$1-1, RegExp.$2));
}/* convert a date time string into a chracter string */
function dt2dtstr (dt_datetime) 
{
	return (new String ((dt_datetime.getMonth()+1)+"-"+dt_datetime.getDate()+"-"+dt_datetime.getFullYear()));
}
function dt2tmstr (dt_datetime) 
{
	return (new String (""));
	//	dt_datetime.getHours()+":"+dt_datetime.getMinutes()+":"+dt_datetime.getSeconds()));
}

function check_valid_date (elementid, datestring)
{
	var isvaliddate		= false;
	var daterange		= '';
	var begindate		= null;
	var enddate			= null;
	var thedate 		= document.getElementById(elementid).value;
	
	if (thedate.length == 0 || datestring.length == 0) { return false; }
	else { thedate = js_dateParser(document.getElementById(elementid).value); }
	
	if (thedate == -1) { return false; }
	
	while (datestring.indexOf('|') > 0)
	{
		daterange 	= datestring.substring(0,datestring.indexOf('|'));
		
		if (daterange.indexOf(':') > 0)
		{
			begindate	= js_dateParser(daterange.substring(0,daterange.indexOf(':')));
			enddate		= js_dateParser(daterange.substring(daterange.indexOf(':')+1));
		}
		else 
		{ 
			begindate	= js_dateParser(daterange);
			enddate		= js_dateParser(daterange);
		}
		
		if (begindate != -1 && enddate != -1) 
		{
			if (thedate >= begindate && thedate <= enddate) { return false; }
		}
		datestring = datestring.substring(datestring.indexOf('|')+1);
	}
	
	if (datestring.length > 0)
	{
		daterange 	= datestring;
		
		if (daterange.indexOf(':') > 0)
		{
			begindate	= js_dateParser(daterange.substring(0,daterange.indexOf(':')));
			enddate		= js_dateParser(daterange.substring(daterange.indexOf(':')+1));
		}
		else
		{
			begindate	= js_dateParser(daterange);
			enddate		= js_dateParser(daterange);
		}
		
		if ((thedate >= begindate && thedate <= enddate) || (begindate == -1 || enddate == -1))
		{
			return false;
		}
	}
	
	alert('This date is not within the valid range.\nPlease pick a date within the specified range.');
	document.getElementById(elementid).value = '';
	document.getElementById(elementid).focus();
} 

function get_all_months (selectedMonth)
{
	var strMonths = '';
	var strMonthName = '';
	var intMonthNumber = 0;
	var intCount = 0;
	var arrMonths = new Array('January:0','February:1','March:2','April:3','May:4','June:5','July:6','August:7','September:8','October:9','November:10','December:11');
	
	for (intCount=0; intCount<arrMonths.length; intCount++)
	{
		strMonthName = arrMonths[intCount].substring(0,arrMonths[intCount].indexOf(':'));
		intMonthNumber = arrMonths[intCount].substring(arrMonths[intCount].indexOf(':')+1,arrMonths[intCount].length);
		
		strMonths += '<option value="' + intMonthNumber + '"';
		if (parseInt(selectedMonth) == parseInt(intMonthNumber)) { strMonths += ' selected '; } 
		strMonths += '>' + strMonthName + '</option>\n';
	}

	return strMonths;
}

function get_year_list (selectedYear, yearMin, yearMax)
{
	var strYearList = ''
	var todayDate = new Date();
	var intMinYear = (yearMin == '' ? (parseInt(selectedYear) >= 1901 ? 1901 : parseInt(selectedYear)) : parseInt(yearMin));
	var intMaxYear = (yearMax == '' ? (parseInt(selectedYear) > todayDate.getFullYear() ? parseInt(selectedYear) : todayDate.getFullYear()) : parseInt(yearMax));
	var intCount;
	
	for (intCount=intMaxYear; intCount>=intMinYear; intCount--)
	{
		strYearList += '<option value="' + intCount + '"';
		if (parseInt(selectedYear) == parseInt(intCount)) { strYearList += ' selected '; } 
		strYearList += '>' + intCount + '</option>\n';
	}

	return strYearList;
}

function change_date (criteria, value, thedate, target, calendarname, starttime, endtime)
{
	var objDate = str2dt(thedate);
	
	switch (criteria)
	{
		case 'month':
			objDate.setMonth(parseInt(value));
			create_calendar(target, calendarname, dt2dtstr(objDate), starttime, endtime);
			break;
		case 'year':
			objDate.setYear(parseInt(value));
			create_calendar(target, calendarname, dt2dtstr(objDate), starttime, endtime);
			break;
		default:
			break;
	}
}
