$(document).ready(function(){
	var reservationViewDiv = $("#reservationViewDiv"); 
	if((reservationViewDiv != null) && (reservationViewDiv.size() > 0)) {
		reservationTypeChanged();
		customerCompanyChanged();
	}
	
	var dayViewTableDiv = $("#dayViewTableDiv");
	if((dayViewTableDiv != null) && (dayViewTableDiv.size() > 0)) {
		disableTextSelection();
		initDayView();
	}
	
	var weekViewTableDiv = $("#weekViewTableDiv");
	if((weekViewTableDiv != null) && (weekViewTableDiv.size() > 0)) {
		disableTextSelection();
		initWeekView();
	}
	
	var monthViewTableDiv = $("#monthViewTableDiv");
	if((monthViewTableDiv != null) && (monthViewTableDiv.size() > 0)) {
		disableTextSelection();
		initMonthView();
	}
});

function disableTextSelection() {
	document.onmousedown = function() { return false };
	document.onclick = function() { return true };
}

function initDayView() {
	$('#dayViewTable').click(function(e) {
		var elem = $(e.target);
		var expr = "#dayViewTable td:not(.time)";
		
		if(!elem.is("td:not(.time)")) {
			elem = elem.parent(expr);
		}
		
		if(elem.size() > 0) {
			var selectedRowIndex1Id = "selectedRowIndex1";
			var selectedRowIndex2Id = "selectedRowIndex2";
			var selectedColumnIndexId = "selectedColumnIndex";
			
			var selectedRowIndex1 = $("#" + selectedRowIndex1Id);
			if(selectedRowIndex1.size() <= 0) {
				$("#dayViewTable").append(createHiddenInputElement(selectedRowIndex1Id, "", ""));
				selectedRowIndex1 = $("#" + selectedRowIndex1Id);
			}
			
			var selectedRowIndex2 = $("#" + selectedRowIndex2Id);
			if(selectedRowIndex2.size() <= 0) {
				$("#dayViewTable").append(createHiddenInputElement(selectedRowIndex2Id, "", ""));
				selectedRowIndex2 = $("#" + selectedRowIndex2Id);
			}
			
			var selectedColumnIndex = $("#" + selectedColumnIndexId);
			if(selectedColumnIndex.size() <= 0) {
				$("#dayViewTable").append(createHiddenInputElement(selectedColumnIndexId, "", ""));
				selectedColumnIndex = $("#" + selectedColumnIndexId);
			}
			
			var newRowIndex = elem.parent("#dayViewTable tr").attr("rowIndex");
			if((newRowIndex != null) && (newRowIndex > 0)) {
				var oldRowIndex1 = selectedRowIndex1.val();
				var oldRowIndex2 = selectedRowIndex2.val();
				
				if((oldRowIndex2 == "") && (oldRowIndex1 == "")) {
					selectedRowIndex1.val(newRowIndex);
					//elem.siblings("td:not(.time)").andSelf().addClass((elem.hasClass("holiday") ? "selected_holiday" : "selected_day"));
					selectedColumnIndex.val(elem.attr("cellIndex"));
					elem.addClass((elem.hasClass("holiday") ? "selected_holiday" : "selected_day"));
				}
				else if((oldRowIndex2 == "") && (newRowIndex != oldRowIndex1)) {
					selectedRowIndex2.val(newRowIndex);
					
					var startRowIndex = parseInt(selectedRowIndex1.val(), 10);
					var endRowIndex = parseInt(selectedRowIndex2.val(), 10);
					
					if(startRowIndex > endRowIndex) {
						var temp = endRowIndex;
						endRowIndex = startRowIndex;
						startRowIndex = temp;
					}
					
					var rows = $("#dayViewTable tr").filter(function() {
						var index = $(this).attr("rowIndex");
						return (index >= startRowIndex) && (index <= endRowIndex);
					});

					//rows.children("td:not(.time):not(.holiday)").addClass("selected_day");
					//rows.children("td:not(.time).holiday").addClass("selected_holiday");
					var columnIndex = selectedColumnIndex.val();
					rows.children("td[cellIndex='" + columnIndex + "']:not(.time):not(.holiday)").addClass("selected_day");
					rows.children("td[cellIndex='" + columnIndex + "']:not(.time).holiday").addClass("selected_holiday");
				}
				else {
					selectedRowIndex1.val("");
					selectedRowIndex2.val("");
					$("#dayViewTable td.selected_day").removeClass("selected_day");
					$("#dayViewTable td.selected_holiday").removeClass("selected_holiday");
				}
			}
		}
	});
}

function initWeekView() {
	$('#weekViewTable').click(function(e) {
		var elem = $(e.target);
		var expr = "#weekViewTable tr[rowIndex!='0'] td:not(.time)";

		if(!elem.is("td:not(.time)")) {
			elem = elem.parent(expr);
		}
		
		if(elem.size() > 0) {
			var selectedDay1Id = "selectedDay1";
			var selectedDay2Id = "selectedDay2";
			
			var selectedDay1 = $("#" + selectedDay1Id);
			if(selectedDay1.size() <= 0) {
				$("#weekViewTableDiv").append(createHiddenInputElement(selectedDay1Id, "", ""));
				selectedDay1 = $("#" + selectedDay1Id);
			}
			
			var selectedDay2 = $("#" + selectedDay2Id);
			if(selectedDay2.size() <= 0) {
				$("#weekViewTableDiv").append(createHiddenInputElement(selectedDay2Id, "", ""));
				selectedDay2 = $("#" + selectedDay2Id);
			}
			
			var selectedRowIndex1Id = "selectedRowIndex1";
			var selectedRowIndex2Id = "selectedRowIndex2";
			
			var selectedRowIndex1 = $("#" + selectedRowIndex1Id);
			if(selectedRowIndex1.size() <= 0) {
				$("#weekViewTableDiv").append(createHiddenInputElement(selectedRowIndex1Id, "", ""));
				selectedRowIndex1 = $("#" + selectedRowIndex1Id);
			}
			
			var selectedRowIndex2 = $("#" + selectedRowIndex2Id);
			if(selectedRowIndex2.size() <= 0) {
				$("#weekViewTableDiv").append(createHiddenInputElement(selectedRowIndex2Id, "", ""));
				selectedRowIndex2 = $("#" + selectedRowIndex2Id);
			}
			
			var newDayValue = elem.attr("name");
			var oldDayValue1 = selectedDay1.val();
			var oldDayValue2 = selectedDay2.val();

			var newRowIndex = elem.parent("#weekViewTable tr[rowIndex!='0']").attr("rowIndex");
			if((newDayValue != null) && (newDayValue != "") && (newRowIndex != null)) {
				var oldRowIndex1 = selectedRowIndex1.val();
				var oldRowIndex2 = selectedRowIndex2.val();
				
				if(((oldDayValue2 == "") && (oldDayValue1 == "")) || ((oldRowIndex2 == "") && (oldRowIndex1 == ""))) {
					selectedDay1.val(newDayValue);
					selectedRowIndex1.val(newRowIndex);
					elem.siblings("td[name='" + newDayValue + "']").andSelf().addClass((elem.hasClass("holiday") ? "selected_holiday" : "selected_day"));
				}
				else if(((oldDayValue2 == "") && (newDayValue != oldDayValue1)) || ((oldRowIndex2 == "") && (newRowIndex != oldRowIndex1))) {
					selectedDay2.val(newDayValue);
					selectedRowIndex2.val(newRowIndex);
					
					var nameStartStr = "dayIndex_";
					var startDayIndex = parseInt(selectedDay1.val().substring(nameStartStr.length), 10);
					var endDayIndex = parseInt(selectedDay2.val().substring(nameStartStr.length), 10);
					
					if(startDayIndex > endDayIndex) {
						var temp = endDayIndex;
						endDayIndex = startDayIndex;
						startDayIndex = temp;
					}
					
					var startRowIndex = parseInt(selectedRowIndex1.val(), 10);
					var endRowIndex = parseInt(selectedRowIndex2.val(), 10);
					
					if(startRowIndex > endRowIndex) {
						var temp = endRowIndex;
						endRowIndex = startRowIndex;
						startRowIndex = temp;
					}
					
					var rows = $("#weekViewTable tr[rowIndex!='0']").filter(function() {
						var index = $(this).attr("rowIndex");
						return (index >= startRowIndex) && (index <= endRowIndex);
					});
					
					for(var i=startDayIndex;i<=endDayIndex;i++) {
						var name = (nameStartStr + i);
						rows.children("td[name='" + name + "']:not(.time):not(.holiday)").addClass("selected_day");
						rows.children("td[name='" + name + "'].holiday").addClass("selected_holiday");
					}
				}
				else {
					selectedDay1.val("");
					selectedDay2.val("");
					selectedRowIndex1.val("");
					selectedRowIndex2.val("");
					$("#weekViewTable td.selected_day").removeClass("selected_day");
					$("#weekViewTable td.selected_holiday").removeClass("selected_holiday");
				}
			}
		}
	});
}

function initMonthView() {
	var idStartStr = "day_";
	var monthViewTableCells = $("#monthViewTable td:not(.empty_date)[id^=" + idStartStr + "]");
	
	monthViewTableCells.hover(function() {
		var selectedDay1 = $("#selectedDay1").val();
		var selectedDay2 = $("#selectedDay2").val();
		
		if((selectedDay2 == null) || (selectedDay2 == "")) {
			if((selectedDay1 != null) && (selectedDay1 != "")) {
				var startDay = parseInt(selectedDay1.substring(idStartStr.length), 10);
				var endDay = parseInt($(this).attr("id").substring(idStartStr.length), 10);
				
				if(startDay > endDay) {
					var temp = endDay;
					endDay = startDay;
					startDay = temp;
				}
				
				var containHolidays = ($("#monthViewTable td.holiday").filter(function() {
					var value = parseInt($(this).attr("id").substring(idStartStr.length), 10);
					if((value >= startDay) && (value <= endDay)) {
						$(this).addClass("selected_holiday");
						return true;
					}
					
					return false;
				}).size() > 0);
				
				if(!containHolidays) {
					$("#monthViewTable td:not(.empty_date)").each(function() {
						var day = parseInt($(this).attr("id").substring(idStartStr.length), 10);
						if((day >= startDay) && (day <= endDay)) {
							$(this).addClass("selected_day");
						}else {
							$(this).removeClass("selected_day");
						}
						
						$(this).removeClass("selected_holiday");
					});
				}
				else {
					$("#monthViewTable td.selected_day:not(#" + selectedDay1 + ")").removeClass("selected_day");
				}
			}
			else {
				if($(this).hasClass("holiday")) {
					$(this).addClass("selected_holiday");
				}
				else {
					$(this).addClass("selected_day");
				}
			}
		}
	}, function() {
		var day = $("#selectedDay1").val();
		if((day == null) || (day == "")) {
			$(this).removeClass("selected_day");
		}
		
		$(this).removeClass("selected_holiday");
	});
	
	monthViewTableCells.click(function() {
		var selectedDay1Id = "selectedDay1";
		var selectedDay2Id = "selectedDay2";
		
		var selectedDay1 = $("#" + selectedDay1Id);
		if(selectedDay1.size() <= 0) {
			$("#monthViewTableDiv").append(createHiddenInputElement(selectedDay1Id, "", ""));
			selectedDay1 = $("#" + selectedDay1Id);
		}
		
		var selectedDay2 = $("#" + selectedDay2Id);
		if(selectedDay2.size() <= 0) {
			$("#monthViewTableDiv").append(createHiddenInputElement(selectedDay2Id, "", ""));
			selectedDay2 = $("#" + selectedDay2Id);
		}
		
		var newValue = $(this).attr("id");
		var oldValue1 = selectedDay1.val();
		var oldValue2 = selectedDay2.val();

		if((oldValue2 == "") && (oldValue1 == "")) {
			if(!$(this).hasClass("holiday")) {
				selectedDay1.val(newValue);
				$(this).addClass("selected_day");
			}
		}
		else if((oldValue2 == "") && (newValue != oldValue1)) {
			if($("#monthViewTable td.selected_holiday").size() <= 0) {
				selectedDay2.val(newValue);
				$(this).addClass("selected_day");
			}
		}
		else {
			selectedDay1.val("");
			selectedDay2.val("");
			$("#monthViewTable td.selected_day").removeClass("selected_day");
		}
	});
	
	var monthViewTableDiv = $("#monthViewTableDiv");
	monthViewTableDiv.hover(function(){}, function() {
		var selectedDay2 = $("#selectedDay2").val();
		if((selectedDay2 == null) || (selectedDay2 == "")) {
			$("#monthViewTable td.selected_day").removeClass("selected_day");
			$("#monthViewTable td.selected_holiday").removeClass("selected_holiday");
		}
	});
}

function submitNewReservationLinkForm() {
	var newReservationLinkForm = $("#newReservationLinkForm");
	
	var startDate = null;
	var endDate = null;
	var startTime = null;
	var endTime = null;
	
	if($("#weekViewTableDiv").size() > 0) {
		nameStartStr = "dayIndex_";
		var startDateArray = $("#weekViewTableDiv tr[rowIndex='0'] th[cellIndex='" + parseInt($("#selectedDay1").val().substring(nameStartStr.length), 10) + "']").attr("id").split("_");
		var endDateArray = $("#weekViewTableDiv tr[rowIndex='0'] th[cellIndex='" + parseInt($("#selectedDay2").val().substring(nameStartStr.length), 10) + "']").attr("id").split("_");
		
		startDate = new Date();
		startDate.setFullYear(parseInt(startDateArray[1], 10), parseInt(startDateArray[2], 10)-1, parseInt(startDateArray[3], 10));

		endDate = new Date();
		endDate.setFullYear(parseInt(endDateArray[1], 10), parseInt(endDateArray[2], 10)-1, parseInt(endDateArray[3], 10));
	}
	else if($("#monthViewTableDiv").size() > 0) {
		idStartStr = "day_";
		var startDay = parseInt($("#selectedDay1").val().substring(idStartStr.length), 10);
		var endDay = parseInt($("#selectedDay2").val().substring(idStartStr.length), 10);
		var month = parseInt($("#selectedMonth").val(), 10);
		var year = parseInt($("#selectedYear").val(), 10);
		
		startDate = new Date();
		startDate.setFullYear(year, month-1, startDay);

		endDate = new Date();
		endDate.setFullYear(year, month-1, endDay);
	}
	else if($("#dayViewTableDiv").size() > 0) {
		startDate = new Date();
		startDate.setFullYear(parseInt($("#selectedYear").val(), 10), parseInt($("#selectedMonth").val(), 10)-1, parseInt($("#selectedDay").val(), 10));
		endDate = startDate;
	}
	
	var selectedRowIndex1 = $("#selectedRowIndex1").val();
	var selectedRowIndex2 = $("#selectedRowIndex2").val();
	if((selectedRowIndex1 != null) && (selectedRowIndex1 != "")) {
		var startRowIndex = parseInt(selectedRowIndex1, 10);
		
		if((selectedRowIndex2 != null) && (selectedRowIndex2 != "")) {
			var endRowIndex = parseInt(selectedRowIndex2, 10);
	
			if(startRowIndex > endRowIndex) {
				var temp = endRowIndex;
				endRowIndex = startRowIndex;
				startRowIndex = temp;
			}
			
			startTime = $("#content table tr[rowIndex='" + startRowIndex + "']").attr("id").split("-")[0];
			endTime = $("#content table tr[rowIndex='" + endRowIndex + "']").attr("id").split("-")[1];
		}
		else {
			var timeArray = $("#content table tr[rowIndex='" + startRowIndex + "']").attr("id").split("-"); 
			startTime = timeArray[0];
			endTime = timeArray[1];
		}
	}
	
	if((startDate != null) && (endDate != null)) {
		if(startDate > endDate) {
			var temp = endDate;
			endDate = startDate;
			startDate = temp;
		}
		
		if(dateEquals(startDate, endDate)) {
			newReservationLinkForm.append(createHiddenInputElement("", "singleStartDate[0]", startDate.getDate()));
			newReservationLinkForm.append(createHiddenInputElement("", "singleStartDate[1]", startDate.getMonth()+1));
			newReservationLinkForm.append(createHiddenInputElement("", "singleStartDate[2]", startDate.getFullYear()));
			
			if((startTime != null) && (endTime != null)) {
				newReservationLinkForm.append(createHiddenInputElement("", "singleStartTime", startTime));
				newReservationLinkForm.append(createHiddenInputElement("", "singleEndTime", endTime));
			}
			
			newReservationLinkForm.append(createHiddenInputElement("", "reservationType", "SINGLE"));
		}
		else {
			newReservationLinkForm.append(createHiddenInputElement("", "dailyStartDate[0]", startDate.getDate()));
			newReservationLinkForm.append(createHiddenInputElement("", "dailyStartDate[1]", startDate.getMonth()+1));
			newReservationLinkForm.append(createHiddenInputElement("", "dailyStartDate[2]", startDate.getFullYear()));
			newReservationLinkForm.append(createHiddenInputElement("", "dailyEndDate[0]", endDate.getDate()));
			newReservationLinkForm.append(createHiddenInputElement("", "dailyEndDate[1]", endDate.getMonth()+1));
			newReservationLinkForm.append(createHiddenInputElement("", "dailyEndDate[2]", endDate.getFullYear()));
			
			if((startTime != null) && (endTime != null)) {
				newReservationLinkForm.append(createHiddenInputElement("", "dailyStartTime", startTime));
				newReservationLinkForm.append(createHiddenInputElement("", "dailyEndTime", endTime));
			}
			
			newReservationLinkForm.append(createHiddenInputElement("", "reservationType", "DAILY"));
		}
	}
	
	newReservationLinkForm.submit();
}

function dateEquals(date1, date2) {
	return ((date1.getDate() == date2.getDate()) && (date1.getMonth() == date2.getMonth()) && (date1.getFullYear() == date2.getFullYear()));
}

function createHiddenInputElement(id, name, value)
{
	var inputElem = document.createElement("input");
	inputElem.setAttribute("type", "hidden");
	inputElem.setAttribute("id", id);
	inputElem.setAttribute("name", name);
	inputElem.setAttribute("value", value);
	
	return inputElem;
}

function reservationTypeChanged() {
	var selectedType = $("#reservationType").children("option:selected").val();
	
	if(selectedType == "SINGLE") {
		$("#reservationSingle").show();
		$("#reservationDaily").hide();
		$("#reservationWeekly").hide();
	}
	else if(selectedType == "DAILY") {
		$("#reservationSingle").hide();
		$("#reservationDaily").show();
		$("#reservationWeekly").hide();
	}
	else if(selectedType == "WEEKLY") {
		$("#reservationSingle").hide();
		$("#reservationDaily").hide();
		$("#reservationWeekly").show();
	}
}

function customerCompanyChanged() {
	if($("#customerCompanyId:checked").length > 0) {
		$("#billingInfoDiv").hide();
		$("#definitionInfoDiv").show();
	}
	else {
		$("#billingInfoDiv").show();
		$("#definitionInfoDiv").hide();
	}
}

function removeReservation(url, fragmentPage) {
	$("#container").load(url, { fragment : fragmentPage });
}

function updateEditReservation(url, fragmentPage) {
	var params = $("#editCompanyReservationForm").serializeArray();
	params.push({ 'name' : 'fragment', 'value' : fragmentPage });
	
	$("#container").load(url, params);
}

