/***
Japanese JavaScript Calendar
Copyright 2007 by Stephen Curtis
PRTech/PacRim Marketing
scurtis@prtech.com
All Rights Reserved
***/

//The calendars start out as hidden and starts out with the starting calendar and starting date 
var calHidden = true;
var calSwitch = true;
var startEndSwitch = true;

//Empty dates to be filled
var startDateYear = 0;
var startDateMonth = 0;
var startDateDay = 0;
var endDateYear = 0;
var endDateMonth = 0;
var endDateDay = 0;
var lengthOfStay = 0;

//Construct arrays for string values of months/days of week and numeric values of total month days
//Numeric values of month or formal japanese can be set in month array
var monthArray=['1','2','3','4','5','6','7','8','9','10','11','12'];
var totalDaysArray=[31,28,31,30,31,30,31,31,30,31,30,31];
var dayOfWeek =["日", "月", "火", "水", "木", "金", "土"];	

//Check if mozilla or IE
var IE = false;
if ((document.all) && (navigator.userAgent.indexOf('Opera')== -1))
{IE = true;}
//Function to construct calendar pop box and icon string
//If user passes 0 0 then calendar starts with current month and year
function displayCalendar (year, month) {
	
	//Set individual date visual properties
	var dateHeight = 15;
	var dateWidth = 20;
	var dateBorder = 1;
	var dateMargin = 2;
	var dateBorderColor = "gray";
	var dateBackgroundColor = "white";
	var dateBackgroundColor2 = "#EBEBEB";
	var dateBackgroundColor3 = "#9B9B9B";	
	var dateFontSize = 10;
	var dateFontColor = "black";
	var dateFontFamily = "arial";

	//Set month visual properties
	var calBorder = 0;
	var calBorderColor = "gray";
	var calBackgroundColor = "white";
	var calFontSize = 14;
	var calFontColor = "gray";
	var calFontFamily = "arial";	
	
	//Set pop box visual properties
	var popBorder = 1;
	var popBorderColor = "gray";
	var popBackgroundColor = "white";
	var popFontSize = 14;
	var popFontColor = "gray";
	var popFontFamily = "arial";
	
	//Set calendar icon and calendar pop-up placement	
	var calIcon = "../img/toppage/calendar.gif";
	var calIconId;
	var calXIcon = 0;
	var calYIcon = 0;
	
	//correction for ie
	if (IE) {
		dateFontSize--;
		calFontSize--;
		popFontSize--;
		calXIcon = Math.floor(calXIcon * .5);
		calYIcon = Math.floor(calYIcon * .5);		
	}
	
	//Grab current date if 0 and 0 are passed
	if (year == 0 && month == 0) {
		
		var d = new Date();
		
		year = d.getFullYear();
		month = d.getMonth();

		//Starwood rates start from 2009 
		//year = "2009";
		//month = "2";
	}		

	//Creates string of calendars and icon to print into holding div
	var returnString;
	
	//Add to string calendar icon
	returnString=("<a href='' onClick='showCalendar();return false' style='margin: 0px; padding: 0px;cursor:pointer'>");
	returnString+=("<img src='" + calIcon + "' id='calIcon' border='0'/>");
	returnString+=("</a>&nbsp;");
	//Add to string pop div opening	
	returnString+=("<div id='calendarPop' class='calPop'>");
	
	//Add to string table because IE 6 sucks
	returnString+=("<table width='450' cellpadding='0' cellspacing='0'>");
	returnString+=("<tr>");	
	
		returnString+=("<td width='19'>");	
		//Add to string move calendars back one month	
		returnString+=("<div style='float:left'><a href='' onClick='changeMonth(" + year + ", " + (month-1) + ");return false' style='cursor:pointer'><img src='../img/toppage/calLeft.gif' id='calLeft' border='0' /></a></div>");
		returnString+=("</td>");			
	
		//Start for loop to build to calendars
		for (j=0; j<=1; j++) {
			
			//Conditional to increment month if first calendar is already built
			if(!calSwitch) {
				
				month++;
				
				if(month > 11) {
					month = 0;
					year++;
				}
				else if(month < 0) {
					month = 11;
					year--;					
				}
			}
			
			//Add to string CSS attributes of all the different divs, values passed from initialized variables		
			returnString+=("<style type='text/css'>");
			returnString+=(".calendarBoxInner { width: " + dateWidth + "px; height: " + dateHeight + "px; margin: " + dateMargin + "px; border-style: solid; border-color: " + dateBorderColor + "; border-width: " + dateBorder + "px; background-color:" + dateBackgroundColor + "; float: left; text-align: center; font-family: " + dateFontFamily + "; font-size: " + dateFontSize + "px; color: " + dateFontColor + "; overflow: hidden}");		
			returnString+=(".bigCalBox { border-style: solid; overflow:hidden; border-color: " + calBorderColor + "; border-width: " + calBorder + "px; background-color:" + calBackgroundColor + "; text-align: center; font-family: " + calFontFamily + "; font-size: " + calFontSize + "px; color: " + calFontColor + ";}");
			returnString+=(".calPop { z-index:100; overflow:hidden; padding: 10px; margin-top:" + calYIcon + "px; margin-left:" + calXIcon + "px; position: absolute; float:left; visibility: hidden; border-style: solid; border-color: " + popBorderColor + "; border-width: " + popBorder + "px; background-color:" + popBackgroundColor + "; float: left; text-align: center; font-family: " + popFontFamily + "; font-size: " + popFontSize + "px; color: " + popFontColor + ";}");		
			returnString+=(".calendarBox { overflow: hidden; border-style: solid; border-width: " + calBorder + "px; border-color: " + calBorderColor + "; background-color:" + calBackgroundColor + ";}");	
			returnString+=(".unavailableCalendarBoxInner { width: " + dateWidth + "px; height: " + dateHeight + "px; margin: " + dateMargin + "px; border-style: solid; border-width: " + dateBorder + "px; float: left; text-align: center; font-family: " + dateFontFamily + "; font-size: " + dateFontSize + "px; color: " + dateFontColor + "; background-color: " + dateBackgroundColor2 +"; border-color: " + calBackgroundColor + "}");	
		returnString+=(".noDayCalendarBoxInner { width: " + dateWidth + "px; height: " + dateHeight + "px; margin: " + dateMargin + "px; border-style: solid; border-width: " + dateBorder + "px; float: left; text-align: center; font-family: " + dateFontFamily + "; font-size: " + dateFontSize + "px; color: " + dateFontColor + "; background-color: " + calBackgroundColor +"; border-color: " + calBackgroundColor + "}");			
			returnString+=(".calPop a:link {color: " + dateFontColor + "; text-decoration: none;} .calPop a:hover { color: " + dateFontColor + "; text-decoration: none;} .calPop a:visited {color: " + dateFontColor + "; text-decoration: none;}")
			returnString+=("</style>");
	
			//get current selected date for this month build
			var selectedDate = new Date(year, month, 1, 0, 0, 0, 0);
	
			//get days already selected for input
			var stayStartDate = new Date (startDateYear, startDateMonth, startDateDay, 0, 0, 0, 0);
			var stayEndDate = new Date (endDateYear, endDateMonth, endDateDay, 0, 0, 0, 0);		
			
			//get the day of the week the first day of the month starts on
			var startDays = selectedDate.getDay();
			
			//calculate how many days of week are left after last day of month		
			var endDays = 7 - ( ( totalDaysArray[month] + (startDays) ) % 7 );
			if (endDays == 7){ endDays = 0;}
			
			//change total days for february on leap years		
			if ((year%4) == 0) {totalDaysArray[1] = 29;}	
			
			//calc height and width of current calendar based on declared values
			var totalBoxes = startDays + totalDaysArray[month] + endDays;
			var variable1 = (totalBoxes/7) + 1;
			var variable2 = variable1 * 2;
				
			var calBoxHeight = (dateHeight * variable1) + (dateMargin * variable2) + (dateBorder * variable2) + 3;
			var calBoxWidth = (dateWidth * 7) + (dateMargin * 14) + (dateBorder * 14) + 2;				
			
			returnString+=("<td  width='206' align='center' valign='top'>");				
			//start div for individual calendar based on if it id first or second	
			if (calSwitch) {
				returnString+=("<div id='startC' class='bigCalBox' style='width:" + calBoxWidth + "px'>");
				
			}
			else {
				returnString+=("<div id='endC' class='bigCalBox' style='width:" + calBoxWidth + "px'>");		
			}
			
			//start calendar header
			returnString+=("<div class='calendarTitle' style='width:" + calBoxWidth + "px'>");
			returnString+=(year +  "年 " + monthArray[month] + "月"); 
			returnString+=("</div>");	
			//start current calendar layout based on calculated width and height
			returnString+=("<div class='calendarBox' style='height:" + calBoxHeight + "px; width:" + calBoxWidth + "px'>");
	
			//get current date for comparison
			var currentDate = new Date();

			//set 6days ahead date
			var baseSec = currentDate.getTime();
			var addSec = 7 * 86400000;//days * milliseconds per day
			var targetSec = baseSec + addSec;
			currentDate.setTime(targetSec);

			//fill in days of the week		
			for (var i = 0; i < 7; i++){returnString+=("<div class='calendarBoxInner' style='padding-top:3px; text-align:center'>" + dayOfWeek[i] + "</div>");}
			//fill in days before first day of month		
			for (var i = 0; i < startDays; i++){returnString+=("<div class='noDayCalendarBoxInner'></div>");}
			//fill in dates of month, highlighting based on comparison to current date, start date and end date	
			for (var i = 1; i <= totalDaysArray[month]; i++){
				
				//grab currently building day
				var rollingDate = new Date (year, month, i, 0, 0, 0, 0);			
				
					if (currentDate <= rollingDate) {
						//highlight duration of stay
						if (rollingDate > stayStartDate && rollingDate < stayEndDate) {
							returnString+=("<div class='calendarBoxInner' style='background-color: " + dateBackgroundColor2 + "'>");						
						}					
						//highlight start and end day				
						else if (rollingDate >= stayStartDate && rollingDate <= stayEndDate ) {
							returnString+=("<div class='calendarBoxInner' style='background-color: " + dateBackgroundColor3 + "'>");					
						}	
						
						else {
						//highlight unselected but valid days					
							returnString+=("<div class='calendarBoxInner'>");						
						}
							//build the rest of the date div
							returnString+=("<a href='' onClick='changeDate(" + year + ", " + month + ", " + i + ");return false' style='cursor:pointer'>" + i + "</a>");		
							returnString+=("</div>");		
					}
					
					//make days already passed and today invalid
					else {	
					returnString+=("<div class='unavailableCalendarBoxInner'>");
					returnString+=(i);		
					returnString+=("</div>");
					}
				
				}
				
			//fill in days after last date of month
			for (i = 0; i < endDays; i++){returnString+=("<div class='noDayCalendarBoxInner'></div>");}	
			
			//close calendar div and dates div
			returnString+=("</div>");
			returnString+=("</div>");
			returnString+=("</td>");				
			
			//get ready to make second cal or set back to first
			if(calSwitch) {calSwitch = false;}
			else {calSwitch = true;}
			
		}
	
		returnString+=("<td width='19'>");		
		//Add to string move calendars forward one month	
		returnString+=("<div style='float:none;'><a href='' onClick='changeMonth(" + year + ", " + (month) + ");return false' style='cursor:pointer'><img src='../img/toppage/calRight.gif' id='calRight' border='0' /></a></div>");
		returnString+=("</td>");			

	returnString+=("</tr>");
	returnString+=("<tr>");	
	returnString+=("<td colspan='4' align='center'>");	
	
	//Add to string holder for bottom controls
	returnString+=("<div style='float:none; text-align:center; font-size: " + dateFontSize + "px; color: " + calFontColor + "; font-family: " + dateFontFamily + "; width:100%; margin-top: 5px;'>");
			
		//Add to string form instructions
		returnString+=("チェックイン日をクリックしてから、チェックアウト日をクリックしてください。&nbsp;&nbsp;");						
		
	//close holder div
	returnString+=("</div>");
	
	returnString+=("</td>");	
	returnString+=("</tr>");	
	returnString+=("</table>");		
	
	//controls		
	returnString+=("<div style='text-align:right; width:450px; font-size: " + dateFontSize + "px; color: " + calFontColor + "; font-family: " + dateFontFamily + ";margin-right:-5px; margin-top:-15px;'>");
	
		//easy submit
		returnString+=("<a href='' onClick='submit_form();return false' style='cursor:pointer'><!--<img src='../img/toppage/calNext.gif' id='calNext' border='0' />//--></a>");
		
	//close controls	
	returnString+=("</div>");		
	
	//controls		
	returnString+=("<div style='text-align:right; width:450px; margin-top:10px; margin-right:-5px; margin-bottom:-5px; font-size: " + dateFontSize + "px; color: " + calFontColor + "; font-family: " + dateFontFamily + ";'>");
	
		//Add to string clear box
		returnString+=("<a href=''  style='cursor:pointer' onClick='clearCalendar();return false;'>クリア</a>");
		
		//Space em out
		returnString+=(" | ");
	
		//Add to string close box
		returnString+=("<a href=''  style='cursor:pointer' onClick='showCalendar();return false;'>閉じる</a>");
		
	//close controls	
	returnString+=("</div>");		
	
	//close pop div
	returnString+=("</div>");
	
	//return it!
	return returnString;
}

//Function to change the selected start and end dates, receives arguments from displayCalendar()
function changeDate (year, month, day) {
	
	//validate date
	if (month > 11) { month = 11;}
	if (day > totalDaysArray[month]) { day = totalDaysArray[month];}
	if (year > 2100) {year = 2100;}
		
	if (endDateYear == 0 && endDateMonth == 0 && endDateDay == 0) {
	
		//set start and default end values	
		startDateYear = year;
		startDateMonth = month;
		startDateDay = day;

		endDateYear = year;
		endDateMonth = month;
		endDateDay = day;
		
		startEndSwitch = false;		
	
	}
	
	else if (startEndSwitch) {
	
		//set start and default end values	
		startDateYear = year;
		startDateMonth = month;
		startDateDay = day;

		startEndSwitch = false;		
	
	}
	
	else {
	
		endDateYear = year;
		endDateMonth = month;
		endDateDay = day;	

		startEndSwitch = true;
	
	}
	
	//evaluate which is start and which is end
	var testStart = new Date(startDateYear, startDateMonth, startDateDay, 0,0,0,0);
	var testEnd = new Date(endDateYear, endDateMonth, endDateDay, 0,0,0,0);
	
	if ( !(testStart > testEnd) &&  !(testStart < testEnd) ) {
		
		//set start and default end values	
		startDateYear = year;
		startDateMonth = month;
		startDateDay = day;

		endDateYear = year;
		endDateMonth = month;
		endDateDay = day;
		
		startEndSwitch = false;		
		
	}


	if (testStart > testEnd) {
		
		endDateYear = startDateYear;
		endDateMonth = startDateMonth;
		endDateDay = startDateDay;	
		
		startDateYear = year;
		startDateMonth = month;
		startDateDay = day;		

		startEndSwitch = false;		
		
	}
	
	//create two formats of date, one for display and one for form value
	var startChosenDate = startDateYear + "-" + formatNumber(startDateMonth+1) + "-" + formatNumber(startDateDay);
	var startChosenDateString = startDateYear + "/" + (startDateMonth+1) + "/" + startDateDay + "";
	var endChosenDate = endDateYear + "-" + formatNumber(endDateMonth+1) + "-" + formatNumber(endDateDay);
	var endChosenDateString = endDateYear + "/" + (endDateMonth+1) + "/" + endDateDay + "";	
	

	//check browser then set form values, flip the selected date switch
	if(IE) { document.getElementById('arrivalDate').value = startChosenDate;
		document.getElementById('cin').value = startChosenDateString;
		document.getElementById('departureDate').value = endChosenDate;
		document.getElementById('cout').value = endChosenDateString;			
	}
	else { document.forms['reservation'].elements['arrivalDate'].value = startChosenDate;
	 document.forms['reservation'].elements['cin'].value = startChosenDateString;	
	 document.forms['reservation'].elements['departureDate'].value = endChosenDate;
	 document.forms['reservation'].elements['cout'].value = endChosenDateString;		
	}

	
	var sMonthCompare = new Date(startDateYear, startDateMonth, startDateDay, 0, 0, 0, 0);
	var eMonthCompare = new Date(endDateYear, endDateMonth, endDateDay, 0, 0, 0, 0);		
	var day_divide=1000*60*60*24;

	lengthOfStay = Math.ceil((eMonthCompare.getTime()-sMonthCompare.getTime())/(day_divide));
		
	//check browser then set form values, flip the selected date switch			
	if(IE) { document.getElementById('lengthOfStay').value = lengthOfStay;	}	

	else{document.forms['reservation'].elements['lengthOfStay'].value = lengthOfStay;}
	
	
	//rebuild calendar	
	var newCalendar = displayCalendar(startDateYear, startDateMonth);

	//replace div html, reset hidden variable then display calendar
	document.getElementById("Calendar").innerHTML = newCalendar;
	calHidden = true;					
	showCalendar ();	

}

//Function increments display month of calendar, receives arguments from displayCalendar()
function changeMonth (year, month) {
	
	//flip and flop year if month wraps either way
	if (month == -1) {
		year = year - 1;	
		month = 11;
	}
	else if (month == 12) {
		year = year + 1;
		month = 0;
	}
	
	//rebuild calendar	
	var newCalendar = displayCalendar(year, month);
	
	//replace div html, reset hidden variable then display calendar	
	document.getElementById("Calendar").innerHTML = newCalendar;
	calHidden = true;					
	showCalendar ();

	
}

//Function used to show and hide pop box
function showCalendar () {
	
	//If switch is flipped, display then turn off switch
	if (calHidden) {
	document.getElementById("calendarPop").style.visibility = "visible";
	calHidden = false;
	}
	//If switch isn't flipped, hide then turn on switch	
	else{
	document.getElementById("calendarPop").style.visibility = "hidden";
	calHidden = true;			
	}
}

//Function used to clear calendar and form
function clearCalendar () {

		//clear calendar values
		startDateYear = 0;
		startDateMonth = 0;
		startDateDay = 0;

		endDateYear = 0;
		endDateMonth = 0;
		endDateDay = 0;
		
		lengthOfStay = 0;		
	
		//check browser then clear form values and flip switch on
		if(IE) {document.getElementById('arrivalDate').value = "";
			document.getElementById('cin').value = "";
			document.getElementById('departureDate').value = "";
			document.getElementById('cout').value = "";	
			document.getElementById('lengthOfStay').value = "";				
			startEndSwitch = true;
		}
		else { document.forms['reservation'].elements['arrivalDate'].value = "";
		 document.forms['reservation'].elements['cin'].value = "";	
		 document.forms['reservation'].elements['departureDate'].value = "";
		 document.forms['reservation'].elements['cout'].value = "";	
		 document.forms['reservation'].elements['lengthOfStay'].value = "";			 
			startEndSwitch = true;		 
		}
		
		//rebuild calendar	
		var newCalendar = displayCalendar(startDateYear, startDateMonth);
	
		//replace div html, reset hidden variable then display calendar
		document.getElementById("Calendar").innerHTML = newCalendar;
		calHidden = true;					
		showCalendar ();		
}

//Function used check date
function checkDate (x) {
	

		//start date
		if (x) {
			
			//start date mode
			startEndSwitch = true;

			//grab entered date
			var currentFormat;
			
			if(IE) {currentFormat = document.getElementById('cin').value; }
			else {currentFormat = document.forms['reservation'].elements['cin'].value;}			
			
			checkDateSub(currentFormat);
				
			//end date mode
			startEndSwitch = false;				
			
		}
		//end date
		else {

			//end date mode
			startEndSwitch = false;

			//grab entered date
			var currentFormat
			
			if(IE) {currentFormat = document.getElementById('cout').value; }
			else {currentFormat = document.forms['reservation'].elements['cout'].value;}
			
			checkDateSub(currentFormat);
				
			//end date mode
			startEndSwitch = true;			
		
		}
}

//Function used reformat date
function checkDateSub (currentFormat) {

		//regular expressions
		var shortFormat = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{2}$/;
		var longFormat = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/;
		var japaneseShort = /^\d{2}(\-|\/|\.|年)\d{1,2}(\-|\/|\.|月)\d{1,2}(\-|\/|\.|日)$/;
		var japaneseLong = /^\d{4}(\-|\/|\.|年)\d{1,2}(\-|\/|\.|月)\d{1,2}(\-|\/|\.|日)$/;
		var splitter = /\-|\/|\.|年|月|日/;
			

			
		if ( shortFormat.exec(currentFormat) ) {
			
			var splitDate = currentFormat.split(splitter);
			
			changeDate("20" + splitDate[2],Math.round(splitDate[0])-1,Math.round(splitDate[1]));
			
		}
		else if ( longFormat.exec(currentFormat) ) {
			
			var splitDate = currentFormat.split(splitter);

			changeDate(splitDate[2],Math.round(splitDate[0])-1,Math.round(splitDate[1]));
			
		}
		else if ( japaneseShort.exec(currentFormat) ) {
			
			var splitDate = currentFormat.split(splitter);

			changeDate("20" + splitDate[0],Math.round(splitDate[1])-1,Math.round(splitDate[2]));

		}
		else if ( japaneseLong.exec(currentFormat) ) {
			
			var splitDate = currentFormat.split(splitter);
			
			changeDate(splitDate[0],Math.round(splitDate[1])-1,Math.round(splitDate[2]));			
			
		}
		else
		{
			//set 7days ahead date
			var myDate = new Date();
			var nowSec = myDate.getTime()
			var addSec = 7 * 86400000;//days * milliseconds per day
			var targetSec = nowSec + addSec;
			myDate.setTime(targetSec);

			if(startEndSwitch) {
				if(myDate.getDate() == totalDaysArray[myDate.getMonth()]) {
					changeDate(myDate.getFullYear(),myDate.getMonth()+1,1);
				}
				else {
					changeDate(myDate.getFullYear(),myDate.getMonth(),myDate.getDate()+1);				
				}
			}
			else {
				if(myDate.getDate() == totalDaysArray[myDate.getMonth()]) {
					changeDate(myDate.getFullYear(),myDate.getMonth()+1,3);
				}
				else {
					changeDate(myDate.getFullYear(),myDate.getMonth(),myDate.getDate()+3);				
				}				
			}
		}
}

//Add zero to start for res dates
function formatNumber(x) {

	if (x > 0 && x < 10) {x = "0" + x;}
	return x;	
}

//submit form
function submit_form() {

	if(IE) { document.getElementById('roomOccupancyTotal').value = document.getElementById('numberOfAdults').value;}
	else { document.forms['reservation'].elements['roomOccupancyTotal'].value = document.forms['reservation'].elements['numberOfAdults'].value;}
			
	document.reservation.submit();
}


function fillCalendar(){
//window.onload = function(){ //call as window.onload. No need to call onload in each page

	arrDate= new Date();
	//calYar=arrDate.getFullYear();
	//calMonth=arrDate.getMonth()+1;

	arrDate.setDate(arrDate.getDate()+8);
	calDate = arrDate.getFullYear()+"/"+(arrDate.getMonth()+1)+"/"+arrDate.getDate();

	arrDate.setDate(arrDate.getDate()+4);
	calDate2 = arrDate.getFullYear()+"/"+(arrDate.getMonth()+1)+"/"+arrDate.getDate();

	document.forms['reservation'].cin.value=calDate;
	document.forms['reservation'].cout.value=calDate2;
}
