/***
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;

//Empty dates to be filled
var startDateYear = 0;
var startDateMonth = 0;
var startDateDay = 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 = "#F7F7F2";
	var dateBackgroundColor3 = "#9B9B9B";	
	var dateFontSize = 10;
	var dateFontColor = "#6f6953";
	var dateFontFamily = "arial";

	//Set month visual properties
	var calBorder = 0;
	var calBorderColor = "#E2E2D2";
	var calBackgroundColor = "white";
	var calFontSize = 14;
	var calFontColor = "#6f6953";
	var calFontFamily = "arial";	
	
	//Set pop box visual properties
	var popBorder = 1;
	var popBorderColor = "#E2E2D2";
	var popBackgroundColor = "white";
	var popFontSize = 14;
	var popFontColor = "#E2E2D2";
	var popFontFamily = "arial";
	
	//Set calendar icon and calendar pop-up placement	
	var calIcon = "/images/layout/book_cal.gif";
	var calIconId;
	var calXIcon = 5;
	var calYIcon = 5;
	
	//correction for ie
	if (IE) {
		dateFontSize--;
		calFontSize--;
		popFontSize--;
		calXIcon = Math.floor(calXIcon * .5);
		calYIcon = Math.floor(calYIcon * .5);
		dateHeight += 5;
		dateWidth += 2;
	}
	
	//Grab current date if 0 and 0 are passed
	if (year == 0 && month == 0) {
		
		var d = new Date();
		
		year = d.getFullYear();
		month = d.getMonth();
	}		

	//Creates string of calendars and icon to print into holding div
	var returnString;
	
	//Add to string calendar icon
	returnString=("<a href='#' onClick='showCalendar()' style='margin: 0px; padding: 0px'>");
	returnString+=("<img src='" + calIcon + "' id='calIcon' border='0' />");
	returnString+=("</a>");
	
	//Add to string pop div opening	
	returnString+=("<div id='calendarPop' class='calPop'>");
	
	//Add to string table because IE 6 sucks
	returnString+=("<table width='225' 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) + ")'><</a></div>");
		returnString+=("</td>");		

			
			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);
			
			//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;		
			
			if (IE) {calBoxWidth-=15;}
			
			returnString+=("<td  width='206' align='center' valign='top'>");				
			//start div for calendar based
			returnString+=("<div id='startC' 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+5) + "px'>");
	
			//get current date for comparison
			var currentDate = new Date();
			
			//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 <= stayStartDate) {
							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 + ")'>" + 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>");				
			
	
		returnString+=("<td width='19'>");		
		//Add to string move calendars forward one month	
		returnString+=("<div style='float:none;'><a href='#' onClick='changeMonth(" + year + ", " + (month + 1) + ")'>></a></div></td>");			

	returnString+=("</tr>");

	returnString+=("</table>");			
	
	//controls		
	returnString+=("<div style='text-align:right; width:225px; margin-top:0px; margin-right:0px; margin-bottom:0px; font-size: " + dateFontSize + "px; color: " + calFontColor + "; font-family: " + dateFontFamily + ";'>");
	
		//Add to string clear box
		returnString+=("<a href='#' onClick='clearCalendar()'>クリア</a>");
		
		//Space em out
		returnString+=(" | ");
	
		//Add to string close box
		returnString+=("<a href='#' onClick='showCalendar()'>閉じる</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;}
	
	//set start and default end values	
	startDateYear = year;
	startDateMonth = month;
	startDateDay = day;

	//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 + "日";
	

	//check browser then set form values, flip the selected date switch
	if(IE) { document.getElementById('DateIn').value = startChosenDate;
		document.getElementById('startDateShow').innerHTML = startChosenDateString;	
	}
	else { document.forms['iHotelierForm'].elements['DateIn'].value = startChosenDate;
	 document.getElementById('startDateShow').innerHTML = startChosenDateString;		
	}

	
	//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 < 0) {
		year = year - 1;	
		month = 11;
	}
	else if (month > 11) {
		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;

		//check browser then clear form values and flip switch on
		if(IE) { document.getElementById('DateIn').value = "";
			document.getElementById('startDateShow').innerHTML = "";

		}
		else { document.forms['iHotelierForm'].elements['DateIn'].value = "";
		 document.getElementById('startDateShow').innerHTML = "";	
		}
		
		//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 () {
		

			//grab entered date
			var currentFormat;
			
			if(IE) {currentFormat = document.getElementById('startDateShow').value; }
			else {currentFormat = document.getElementById('startDateShow').innerHTML;}			
			
			checkDateSub(currentFormat);

}

//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
		{
			var myDate = new Date();
			
			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;	
}