// Title: Tigra Calendar PRO
// Description: Tigra Calendar PRO is flexible JavaScript Calendar offering
//	high reliability and wide browsers support.
// URL: http://www.softcomplex.com/products/tigra_calendar_pro/
// Version: 1.1 (on page mode)
// Date: 09/15/2002 (mm/dd/yyyy)
// Technical Support: support@softcomplex.com (specify product title and order ID)
// Notes: This Script is shareware. Please visit url above for registration details.

// user configuration block:
//these items should be in the Properties.js
// months as they appear in the selection list
var ARR_MONTHS = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
// week day titles as they appear on the calendar
var ARR_WEEKDAYS = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa", ];
// day week starts from (normally 1-Mo or 0-Su)
var NUM_WEEKSTART = 1;
// when visitor tries to select date out of the range
var LOG_SHOWERROR = false; // show error message
var LOG_SETLIMIT  = false; // set closest allowed date
// in year selection box how many years to list relative to current year

//var NUM_YEARSBEFORE = 2009;
//var NUM_YEARSAFTER = 2010;
var crtDate = new Date();
var crtYear = crtDate.getYear();
var NUM_YEARSBEFORE = crtYear;
var NUM_YEARSAFTER = parseInt (crtYear) + 1;

var calendars = [];

function calendar (day, month, year, str_date, str_form_name, str_ctrl_name, str_min_date, str_max_date, cal_type, availability, events) {
	
	//alert("Calendar");
	
	this.availability=availability;
	this.events=events;
    this.cal_type=cal_type;
	this.get_html  = cal_get_html;
	this.get_body  = cal_get_body;
	this.set_year  = cal_set_year;
	this.set_month = cal_set_month;
	this.set_day   = cal_set_day;
	this.set_date  = cal_set_date;
	this.validate  = cal_validate;
	this.set_nights = cal_nights;
    
	this.update = (document.body && document.body.innerHTML
		? cal_css_update : cal_rel_update);
    
	this.id = calendars.length;
	calendars[this.id] = this;
    
	var re_url = new RegExp('cal' + this.id + '_val=(\\d+)');
	var dt_params = (str_date ? cal_parse_date(str_date) : cal_date_only());
	//this.dt_current = (re_url.exec(String(window.location))
	//	? new Date(new Number(RegExp.$1)) : dt_params);
    this.dt_current = new Date();
    this.dt_current.setHours(0);
	this.dt_current.setMinutes(0);
	this.dt_current.setSeconds(0);
	this.dt_current.setMilliseconds(0);
	this.dt_current.setYear(year);
	this.dt_current.setDate(day);
	this.dt_current.setMonth(month);
    this.dt_original=this.dt_current;
	if (!str_form_name)
		return alert('Form name is required parameter of draw method.');
	if (!document.forms[str_form_name])
		return alert ("Form with name '" + this.form_name + "' can't be found in the document.");
	this.form_name = str_form_name;
	this.control_name = (str_ctrl_name ? str_ctrl_name : 'datetime_' + this.id);
   
	var re_num = /^-?\d+$/;
	if (str_min_date != null)
		this.min_date = (re_num.exec(str_min_date)
			? new Date (dt_params.valueOf() - new Number(str_min_date * 864e5))
			: cal_parse_date(str_min_date)
		);
	if (str_max_date != null)
		this.max_date = (re_num.exec(str_max_date)
			? new Date (dt_params.valueOf() + new Number(str_max_date * 864e5))
			: cal_parse_date(str_max_date)
		);
   
	document.write (this.get_html(this.dt_current));
    
	this.control_obj = document.forms[str_form_name].elements[this.control_name];
	this.day_ctrl    = document.forms[this.form_name].elements['dt_day_'  + this.id];
	this.mon_ctrl    = document.forms[this.form_name].elements['dt_mon_'  + this.id];
	this.year_ctrl   = document.forms[this.form_name].elements['dt_year_' + this.id];
	
	//alert(this.year_ctrl.value);
}



function cal_css_update (dt_datetime) {
	
	//alert(dt_datetime);
	this.dt_current = dt_datetime;
	//alert(this.dt_current);
	this.control_obj.value = cal_generate_date(dt_datetime);

	var obj_container = (document.all ?
		document.all['cal_body_' + this.id] :
		document.getElementById('cal_body_' + this.id)
	);
	obj_container.innerHTML =  this.get_body(dt_datetime);
	this.day_ctrl.selectedIndex = dt_datetime.getDate()-1;
	this.mon_ctrl.selectedIndex = dt_datetime.getMonth();
	this.year_ctrl.selectedIndex =
		dt_datetime.getFullYear() - Number(this.year_ctrl.options[1].text) + 1;
	this.control_obj.value = cal_generate_date(dt_datetime);
	
	
	
	if(this.cal_type=='from')
	{ 
		//alert("****"+dt_datetime.getDate());
		document.calendar.from_day.value=dt_datetime.getDate();
	  	document.calendar.from_month.value=dt_datetime.getMonth();
	  	document.calendar.from_year.value=dt_datetime.getFullYear();
	}else
	{ document.calendar.to_day.value=dt_datetime.getDate();
	  document.calendar.to_month.value=dt_datetime.getMonth();
	  document.calendar.to_year.value=dt_datetime.getFullYear();
	}
	this.set_nights();

}

function cal_rel_update (dt_datetime) {
	
	//alert("rel: "+dt_datetime);
	
	var arr_location = String(window.location).split('?');
	var arr_params = String(arr_location[1]).split('&');
	var num_found = -1;
	for (var i = 0; i < arr_params.length; i++)
		if((arr_params[i].split('='))[0] == 'cal' + this.id + '_val') {
			num_found = i;
			break;
		}
	arr_params[(num_found == -1 ? (arr_location[1] ? arr_params.length : 0) : num_found)]
		= 'cal' + this.id + '_val=' + dt_datetime.valueOf();

	this.control_obj.value = cal_generate_date(dt_datetime);
	window.location = arr_location[0] + '?' + arr_params.join('&');
	
	if(this.cal_type=='from')
	{ document.calendar.from_day.value=dt_datetime.getDate();
	  document.calendar.from_month.value=dt_datetime.getMonth();
	  document.calendar.from_year.value=dt_datetime.getFullYear();
	}else
	{ document.calendar.to_day.value=dt_datetime.getDate();
	  document.calendar.to_month.value=dt_datetime.getMonth();
	  document.calendar.to_year.value=dt_datetime.getFullYear();
	}
	this.set_nights();

}

function cal_set_day (num_datetime) {
	//alert("cal-set-day");
	var dt_newdate = new Date(num_datetime);
	this.update(this.validate(dt_newdate));
	//updateFieldFromCalendar(dt_newdate.valueOf());
}



function cal_set_date () {
	//alert("cal_set_date");
	var dt_newdate = new Date(this.dt_current);
	var num_day = this.day_ctrl.options[this.day_ctrl.selectedIndex].text;
	dt_newdate.setDate(num_day);
	dt_newdate = this.validate(dt_newdate);
	if (dt_newdate == this.dt_current)
		this.day_ctrl.selectedIndex = this.dt_current.getDate();
	else
		this.update(dt_newdate);
		
    //updateFieldFromCalendar(dt_newdate.valueOf());
}

function cal_set_month () {
	var dt_newdate = new Date(this.dt_current);
	var num_month = this.mon_ctrl.options[this.mon_ctrl.selectedIndex].value;
	dt_newdate.setMonth(num_month);
	while(!this.validate(dt_newdate, true))	
	  {	dt_newdate.setDate(dt_newdate.getDate()+1);
	  }
	if (num_month != dt_newdate.getMonth())
	{ dt_newdate.setDate(1);
	}
	dt_newdate = this.validate(dt_newdate);
	if (dt_newdate == this.dt_current)
	{ this.mon_ctrl.selectedIndex = this.dt_current.getMonth();
	}else
	{ this.update(dt_newdate);
	}
	       

	
	
    //updateFieldFromCalendar(dt_newdate.valueOf());
}

function cal_set_year () {
	var dt_newdate = new Date(this.dt_current);
	var str_year = this.year_ctrl.options[this.year_ctrl.selectedIndex].text;
	var num_year = new Number(str_year);

	dt_newdate.setFullYear(num_year);
	var num_month = this.mon_ctrl.options[this.mon_ctrl.selectedIndex].value;
	while(!this.validate(dt_newdate, true))	
	  {	dt_newdate.setDate(dt_newdate.getDate()+1);
	  }
	if (num_month != dt_newdate.getMonth())
		dt_newdate.setDate(1);

	dt_newdate = this.validate(dt_newdate);
	if (dt_newdate == this.dt_current) {
		this.year_ctrl.selectedIndex =
			this.dt_current.getFullYear() - Number(this.year_ctrl.options[1].text) + 1;
		return;
	}

	this.update(dt_newdate);
	//updateFieldFromCalendar(dt_newdate.valueOf());
}

function cal_get_html (dt_datetime) {
    
	// print calendar header
	var i, str_buffer = new String (
		'<table cellspacing="0" class="calOuterTable" border="1" bordercolor="#e0a3a3" bgcolor="#ffffff" ><tr>' +
		'<td><input type="Hidden" name="' + this.control_name + '" value="' + cal_generate_date(this.dt_current) + '">' +
		'<table cellspacing="0" class="calSelectTable" cellpadding="3"><tr><td>' +
		'<select name="dt_mon_' + this.id + '" class="input" onchange="return calendars[' + this.id + '].set_month();">');
	
	for (i = 0; i < 12; i++)
			str_buffer += '<option value="' + i + '"' + (i == dt_datetime.getMonth() ? ' selected' : '') + '>' + ARR_MONTHS[i] + "</option>\n";
	//years
	str_buffer += '</select></td>';
	str_buffer += '<td align="right"><select name="dt_day_' + this.id + '" class="input" onchange="return calendars[' + this.id + '].set_date();">';
    for (i = 1; i <= 31; i++)
			str_buffer += '<option value="'+i+'" ' + (i == dt_datetime.getDate() ? ' selected' : '') + '>' + (i) + "</option>\n";
	str_buffer += '</select></td>';
	
	str_buffer += '<td align="right"><select name="dt_year_' + this.id + '" class="input" onchange="return calendars[' + this.id + '].set_year();">';
   	for (i = NUM_YEARSBEFORE; i <= NUM_YEARSAFTER; i++)
			str_buffer += '<option value="'+(i)+'"' + (i == dt_datetime.getYear() ? ' selected' : '') + '>' + (i) + "</option>\n";
	str_buffer += '</select></td>';
	
	
	
	str_buffer += '</tr></table></td></tr>' +
		'<tr><td valign="top"><div id="cal_body_' + this.id + '">' + this.get_body(dt_datetime) +'</div>'
		+ '</td>'
		+ '</tr></table>';
	
	return (str_buffer);
}

function cal_get_body (dt_datetime) {
    var dt_other = new Date();
	
	dt_other.setHours(0);
	dt_other.setMinutes(0);
	dt_other.setSeconds(0);
	if(this.cal_type=='from')
	{ dt_other.setDate(document.calendar.to_day.value);
	  dt_other.setMonth(document.calendar.to_month.value);
	  dt_other.getFullYear(document.calendar.to_year.value);
	}else
	{ dt_other.setDate(document.calendar.from_day.value);
	  dt_other.setMonth(document.calendar.from_month.value);
	  dt_other.getFullYear(document.calendar.from_year.value);
	}

	
	// get same date in the previous year
	var dt_prev_year = new Date(dt_datetime);
	dt_prev_year.setFullYear(dt_prev_year.getFullYear() - 1);
	if (dt_prev_year.getDate() != dt_datetime.getDate())
		dt_prev_year.setDate(1);

	// get same date in the next year
	var dt_next_year = new Date(dt_datetime);
	dt_next_year.setFullYear(dt_next_year.getFullYear() + 1);
	if (dt_next_year.getDate() != dt_datetime.getDate())
		dt_next_year.setDate(1);

	// get first day to display in the grid for current month
	var dt_firstday = new Date(dt_datetime);
	dt_firstday.setDate(1);
	dt_firstday.setDate(0 - (7 + dt_firstday.getDay() - NUM_WEEKSTART) % 7);

	// print calendar body
	var str_buffer = new String (
	'<table cellspacing="1" cellpadding="3" class="calDaysTable" width="100%">');

	// print weekdays titles
	str_buffer += '<tr>';
	for (var n = 0; n < 7; n++)
		str_buffer += '<td class="calWTitle">' + ARR_WEEKDAYS[(NUM_WEEKSTART + n) % 7] + '</td>';
	// print calendar table
	str_buffer += "</tr>\n";
	var dt_current_day = new Date(dt_firstday);
	var rowCount = 5;
	var day_event=false;
	var other_day=false;
	var period_day=false;
	
	var dt_from = new Date();
    var dt_to = new Date();
	
	if(this.availability==4 || this.availability==5)
	{ 
	  dt_from.setHours(0);
	  dt_from.setMinutes(0);
	  dt_from.setSeconds(0);
	  dt_from.setMilliseconds(0);
	  dt_from.setFullYear(this.events.substring(1,5));
	  dt_from.setMonth(this.events.substring(5,7)-1);
	  dt_from.setDate(this.events.substring(7,9));
	  dt_to.setHours(0);
	  dt_to.setMinutes(0);
	  dt_to.setSeconds(0);
	  dt_to.setMilliseconds(0);
	  dt_to.setFullYear(this.events.substring(10,14));
	  dt_to.setMonth(this.events.substring(14,16)-1);
	  dt_to.setDate(this.events.substring(16,18));
	  
      
	}
	
	dt_current_day.setDate(dt_current_day.getDate() + 1);
	//alert(dt_current_day.getMonth()+' '+dt_datetime.getMonth()+' '+dt_firstday.getMonth());
	while (dt_current_day.getMonth() == dt_datetime.getMonth() ||
		dt_current_day.getMonth() == dt_firstday.getMonth()) {
		// print row heder
		str_buffer += '<tr>';
		for (var n_current_wday = 0; n_current_wday < 7; n_current_wday++) {

				day_event=false;
				other_day=false;
				period_day=false;
				
				if(this.availability==2 && this.events.indexOf('!'+(n_current_wday+1)+'!')>-1)
                { 
					day_event=true;
                  
                }
				if(this.availability==3 && this.events.indexOf('!'+dt_current_day.getDate()+'!')>-1)
                { day_event=true;
                }
                
				if(this.availability==4)
                { 
                  dt_to.setFullYear(dt_current_day.getFullYear());
                  dt_from.setFullYear(dt_current_day.getFullYear());
				  if(dt_to>=dt_from)
                  { if(dt_current_day>=dt_from && dt_current_day<=dt_to)
                    { day_event=true;
                    }
                  }else
                  { if(dt_current_day>=dt_from || dt_current_day<=dt_to)
                    { day_event=true;
                    }
                  }
                }
                if(this.availability==5)
                { 
                  if(dt_current_day>=dt_from && dt_current_day<=dt_to)
                  { day_event=true;
				  	
                  }
                }
				
				if(dt_current_day.getDate()==dt_other.getDate() && dt_current_day.getMonth()==dt_other.getMonth() && dt_current_day.getYear()==dt_other.getYear())
				{ other_day=true;
				}else
				{ if(this.cal_type=='from' && dt_current_day<dt_other && dt_current_day>dt_datetime)
				  { period_day=true;
				  }
				  if(this.cal_type=='to' && dt_current_day>dt_other && dt_current_day<dt_datetime)
				  { period_day=true;
				  }
				}
				
				
				// --- set background style ---
				if (dt_current_day.getDate() == dt_datetime.getDate() && dt_current_day.getMonth() == dt_datetime.getMonth()) {	// print current date
				   var cd = "1";
				   if (dt_current_day.getDay() == 0 || dt_current_day.getDay() == 6) {
				      if(day_event==true) {
					     if(this.cal_type=='to') {
						    str_buffer += '<td class="calDayWeekendEventTo" align="center" valign="middle">';
					     }
						 else {
						    str_buffer += '<td class="calDayWeekendEventFrom" align="center" valign="middle">';
					     }
					  }
					  else {
					     if(this.cal_type=='to') {
						    str_buffer += '<td class="calDayWeekendTo" align="center" valign="middle">';
					     }
					     else {
						    str_buffer += '<td class="calDayWeekendFrom" align="center" valign="middle">';
					     }
                      }
				   }
				   else {
				     if (day_event==true) { 
					    if(this.cal_type=='to') {
						   str_buffer += '<td class="calDayWorkingEventTo" align="center" valign="middle">';
					    }
					    else {
					       str_buffer += '<td class="calDayWorkingEventFrom" align="center" valign="middle">';
					    }
					 }
					 else {
				        if(this.cal_type=='to') {
						   str_buffer += '<td class="calDayWorkingTo" align="center" valign="middle">';
					    }
					    else {
						   str_buffer += '<td class="calDayWorkingFrom" align="center" valign="middle">';
					    }
                     }
				  }
			   }
			   else {
				  var cd = "0";
			      if (dt_current_day.getDay() == 0 || dt_current_day.getDay() == 6)	{
				     if(day_event==true) {
					    str_buffer += '<td class="calDayWeekendEvent" align="center" valign="middle">';
				     }
					 else {
				        str_buffer += '<td class="calDayWeekend" align="center" valign="middle">';
				     }
				  }
				  else {
				     if(day_event==true) {
					    str_buffer += '<td class="calDayWorkingEvent" align="center" valign="middle">';
				     }
					 else {
				        str_buffer += '<td class="calDayWorking" align="center" valign="middle">';
				     }
				  }	
			   }	
				
				// --- set foreground style ---
				// forbidden dates
				if (!this.validate(dt_current_day, true)) {
					str_buffer += '<span class="calForbDate">'
						+ dt_current_day.getDate() + '</span></td>';
				}
				// dates of current month
				else if (dt_current_day.getMonth() == dt_datetime.getMonth()) {
				      str_buffer += '<a href="javascript:calendars[' + this.id +
						'].set_day(' + dt_current_day.valueOf() + ');"';
					 if (cd == "1") {
					    str_buffer += ' class="calThisMonth2">';
					 }
					 else {
					    str_buffer += ' class="calThisMonth">';
					 }
					 str_buffer += dt_current_day.getDate() + '</a></td>';
				}
				// dates of other months
				else {
					str_buffer += '<a href="javascript:calendars[' + this.id +
						'].set_day(' + dt_current_day.valueOf() + ');" class="calOtherMonth">'
						+ dt_current_day.getDate() + '</a></td>';
				}
				dt_current_day.setDate(dt_current_day.getDate() + 1);
		}
		// print row footer
		str_buffer += "</tr>\n";
		rowCount--;
	}
	// print calendar footer
    while(rowCount >= 0){
        str_buffer += '<tr><td class="calDayWorking" align="center" valign="middle"></td><td class="calDayWorking" align="center" valign="middle"></td>';
		str_buffer += '<td class="calDayWorking" align="center" valign="middle"></td><td class="calDayWorking" align="center" valign="middle"></td>';
		str_buffer += '<td class="calDayWorking" align="center" valign="middle"></td><td class="calDayWeekend" align="center" valign="middle"></td>';
		str_buffer += '<td class="calDayWeekend" align="center" valign="middle"></td></tr>';
        rowCount--;
    }
	str_buffer +=
		'</table>';

	return (str_buffer);
}

function cal_date_only (dt_datetime) {
	if (!dt_datetime)
		dt_datetime = new Date();
	dt_datetime.setHours(0);
	dt_datetime.setMinutes(0);
	dt_datetime.setSeconds(0);
	dt_datetime.setMilliseconds(0);
	return dt_datetime;
}

function cal_validate (dt_datetime, b_silent) {
	if (this.max_date && dt_datetime > this.max_date) {
		if (b_silent) return false;
		if (LOG_SHOWERROR) alert ('Sorry, dates after ' + cal_generate_date(this.max_date) + ' are not allowed.');
		return (LOG_SETLIMIT ? this.max_date : this.dt_current);
	}
	if (this.min_date && dt_datetime < this.min_date) {
		if (b_silent) return false;
		if (LOG_SHOWERROR) alert ('Sorry, dates before ' + cal_generate_date(this.min_date) + ' are not allowed.');
		return (LOG_SETLIMIT ? this.min_date : this.dt_current);
	}
	// more validation can be added here
	return dt_datetime;
}

function cal_parse_date (str_date) {
	var re_date = /^(\d+)\/(\d+)\/(\d+)$/;
	if (!re_date.exec(str_date))
		return alert("Parsing error: unsupported date format '" + str_date + "'");
	return (new Date (RegExp.$3, RegExp.$1-1, RegExp.$2));
}

// date object to string converter, output format is mm/dd/yyyy hh:mm:ss
// this method may be customized - string date format
function cal_generate_date (dt_date) {
	
//	alert("dt_date: "+dt_date);
	return (
		new String (
			(dt_date.getMonth() < 9 ? '0' : '') + (dt_date.getMonth() + 1) + '/'
			+ (dt_date.getDate() < 10 ? '0' : '') + dt_date.getDate() + '/'
			+ dt_date.getFullYear()
		)
	);
}


function validate_arriv_depart_date () {
	
  var validDate = false;	
  var dt_from = new Date();
  var dt_to = new Date();
  var one_day=1000*60*60*24;
  var duration=0;
  dt_from.setHours(0);
  dt_from.setMinutes(0);
  dt_from.setSeconds(0);
  dt_from.setMilliseconds(0);
  dt_from.setFullYear(document.calendar.from_year.value);
  dt_from.setMonth(document.calendar.from_month.value);
  dt_from.setDate(document.calendar.from_day.value);
  dt_to.setHours(0);
  dt_to.setMinutes(0);
  dt_to.setSeconds(0);
  dt_to.setMilliseconds(0);
  dt_to.setFullYear(document.calendar.to_year.value);
  dt_to.setMonth(document.calendar.to_month.value);
  dt_to.setDate(document.calendar.to_day.value);

  if(dt_to<=dt_from)
  { 
  	document.calendar.nights.value=0;
	//alert("false");
	alert("We can not submit your request as the arrival date is greater than the departure date. Thanks.");
  	//alert("Pick another date");
  }
  else
  { 
  	document.calendar.nights.value=Math.round((Math.abs(dt_to - dt_from))/one_day)
	validDate = true;
	
  }
  /*if(document.calendar.nights.value<1)
  { 
  	document.getElementById("nights_display").innerHTML="Departure date must be after Arrival date";
  }
  else
  {  
  	document.getElementById("nights_display").innerHTML="Number of Nights Selected: "+document.calendar.nights.value;
  }*/
  
  return validDate;
}




function cal_nights () {
	
  //var validDate = false;	
  var dt_from = new Date();
  var dt_to = new Date();
  var one_day=1000*60*60*24;
  var duration=0;
  dt_from.setHours(0);
  dt_from.setMinutes(0);
  dt_from.setSeconds(0);
  dt_from.setMilliseconds(0);
  dt_from.setFullYear(document.calendar.from_year.value);
  dt_from.setMonth(document.calendar.from_month.value);
  dt_from.setDate(document.calendar.from_day.value);
  dt_to.setHours(0);
  dt_to.setMinutes(0);
  dt_to.setSeconds(0);
  dt_to.setMilliseconds(0);
  dt_to.setFullYear(document.calendar.to_year.value);
  dt_to.setMonth(document.calendar.to_month.value);
  dt_to.setDate(document.calendar.to_day.value);
/*
  if(this.cal_type=='from')
  { if(dt_to<=dt_from)
    { document.calendar.to_day.value++;
      update_to();
	}
  }else
  { if(dt_to<=dt_from)
    { document.calendar.from_day.value--;
      update_from();
    }
  }
*/
	//alert(dt_from + "  " + dt_to);
  if(dt_to<=dt_from)
  { 
  	document.calendar.nights.value=0;
	//alert("false");
	//alert("We can not submit your request as the arrival date is greater than the departure date. Thanks.");
  	//alert("Pick another date");
  }
  else
  { 
  	document.calendar.nights.value=Math.round((Math.abs(dt_to - dt_from))/one_day)
	//validDate = true;
	
  }
  if(document.calendar.nights.value<1)
  { 
  	document.getElementById("nights_display").innerHTML="Departure date must be after Arrival date";
  }
  else
  {  
  	document.getElementById("nights_display").innerHTML="Number of Nights Selected: "+document.calendar.nights.value;
  }
  
  //return validDate;
}