/*
-----------------------------------------------
Reservation booking form functionality
----------------------------------------------- */

// Check In & Check Out variables are specified in the global scope to talk with datepicker.js
var date_inputs = document.getElementsByTagName('select');

var regExp1 = /date(arrive|depart)/g;		// encapsulating parent of the day and monthyear ddls
var regExp2 = /dateday/g;               // day ddl
var regExp3 = /dateyear/g;              // monthyear ddl

for (var i=0; i < date_inputs.length; i++ ) {
	var inp = date_inputs[i];
	
  if(inp.className && inp.parentNode.id.search(regExp1) != -1 && inp.className.search(regExp3) != -1 && inp.name) {
      var dayselect, myselect, CheckIn_d, CheckOut_d, CheckIn_my, CheckOut_my;
      
      // find the day and monthyear ddl inputs
      for (var n=0; n < inp.parentNode.childNodes.length; n++) {
          if (!inp.parentNode.childNodes[n].className) continue;
          
			    if (inp.parentNode.childNodes[n].className.search(regExp2) != -1) {
              if (inp.parentNode.id == "datearrive") {
								CheckIn_d = inp.parentNode.childNodes[n];
              } else if (inp.parentNode.id == "datedepart") {
								CheckOut_d = inp.parentNode.childNodes[n];
							}
          } else if (inp.parentNode.childNodes[n].className.search(regExp3) != -1) {
              if (inp.parentNode.id == "datearrive") {
								CheckIn_my = inp.parentNode.childNodes[n];
              } else if (inp.parentNode.id == "datedepart") {
								CheckOut_my = inp.parentNode.childNodes[n];
							}
          }
      }
  }	
} 

// returns number of days in a month and also accounts for leap years.
function getDaysInMonth(month, year) {
	// array of number of days in each month
	var monthdays  = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

	if (month == 1) {
		return isLeapYear(year) ? 29 : 28;
	} else {
		return monthdays[month];
	}

	function isLeapYear(year) {
		return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0)) ? 1 : 0;
	}
}

function getCheckInDate(CheckIn_d, CheckIn_my) {
	var day =  CheckIn_d.options[CheckIn_d.selectedIndex].value;
	var monthyear = CheckIn_my.options[CheckIn_my.selectedIndex].value;
	var month = (monthyear.substr(4, 2) - 1);
	var year = monthyear.substr(0, 4);
  
	if (day === "" || month === "") return null;
  
	// if "31 Feb" is selected in the drop down, doing new Date( 31 feb ) will create a date on
	// march 1/2/3 or thereabouts.  this is a workaround:
	var date = new Date(year, month, day);
  
	if (month != date.getMonth()) {
		date = new Date(year, month, getDaysInMonth(month, year));
	}
	return date;
}

function getCheckOutDate(CheckOut_d, CheckOut_my) {
	var day =  CheckOut_d.options[CheckOut_d.selectedIndex].value;
	var monthyear = CheckOut_my.options[CheckOut_my.selectedIndex].value;
	var month = (monthyear.substr(4, 2) - 1);
	var year = monthyear.substr(0, 4);
  
	if (day === "" || month === "") return null;

	// if "31 Feb" is selected in the drop down, doing new Date( 31 feb ) will create a date on
	// march 1/2/3 or thereabouts.  this is a workaround:
	var date = new Date(year, month, day);

	if (month != date.getMonth()) {
		date = new Date( year, month, getDaysInMonth(month, year) );
	}
	return date;
}

function setCheckOutDate(checkOut, CheckOut_d, CheckOut_my) {
	var day = "" + checkOut.getDate();
	if (day.length < 2) {
		day = "0" + day;
	}

	for (var i=0; i < CheckOut_d.options.length; i++ ) {
		if (CheckOut_d.options[i].value == day ) {
			CheckOut_d.options[i].selected = true;
		}
	}
  
	var mo = "" + (checkOut.getMonth() + 1);
	if (mo.length < 2) {
		mo = "0" + mo;
		}

	var moyear = "" + checkOut.getFullYear() + mo;
	for (i=0; i < CheckOut_my.options.length; i++) {
		if (CheckOut_my.options[i].value == moyear) {
			CheckOut_my.options[i].selected = true;
		}
	}
}  
	
function updateCheckOut(CheckIn_d, CheckIn_my, CheckOut_d, CheckOut_my) {
	var checkIn = getCheckInDate(CheckIn_d, CheckIn_my);
	
	if (getCheckOutDate(CheckOut_d, CheckOut_my) <= checkIn) {
		setCheckOutDate(new Date(checkIn.getTime() + 86400000), CheckOut_d, CheckOut_my);
		if(getCheckOutDate(CheckOut_d, CheckOut_my).getDay() == getCheckInDate(CheckIn_d, CheckIn_my).getDay()){
				setCheckOutDate(new Date(checkIn.getTime() + 90000000), CheckOut_d, CheckOut_my);
		}
	}
}
