$(document).ready(function() { 
   
});

var calendars = [];

function selectDay(calendarId, index) {
	var cal = calendars[calendarId];
	if ((cal.fieldStartId != null) && (cal.fieldEndId != null)) {
		if (cal.rangeData[index] == 0) {
			var dv = new Date(index * 1000);
			if (cal.selectedData[index] == true) {
				cal.selectedData[index] = false;
			} else {
				cal.selectedData[index] = true;
			}
		}
		
		showCalendar(calendarId);
	}
}

function calendarPrev(calendarId) {
	var cal = calendars[calendarId];
	var dPrevMonth = new Date(cal.current.setMonth(cal.current.getMonth()-1));
	cal.current = dPrevMonth;
	showCalendar(calendarId);
}

function calendarNext(calendarId) {
	var cal = calendars[calendarId];
	var dNextMonth = new Date(cal.current.setMonth(cal.current.getMonth()+1));
	cal.current = dNextMonth;
	showCalendar(calendarId);
}

function getMonday(d) {
  d = new Date(d);
  var day = d.getDay(),
      diff = d.getDate() - day + (day == 0 ? -6:1); // adjust when day is sunday
  return new Date(d.setDate(diff));
}

function renderCalendar(cal) {
	var calendarId = cal.calendarId;
	var dCurrent = cal.current;
	var dStart =  cal.rangeStart;
	var dEnd = cal.rangeEnd;
	var rangeData = cal.rangeData;
	var selectedData = cal.selectedData;
	var fieldStartId = cal.fieldStartId;
	var fieldEndId = cal.fieldEndId;
	
	// calendarId, dCurrent, dStart, dEnd, rangeData, selectedData, fieldStartId, fieldEndId) {
	var result = '<div class="calendarWrapper"><div class="calendar">';
	
	// Header
	result += '<div class="calendarHeader">';
	
	var now = new Date();
	var dNextMonth = new Date(dCurrent.setMonth(dCurrent.getMonth()+1));
	var dPrevMonth = new Date(dCurrent.setMonth(dCurrent.getMonth()-1));
	var monthName = dCurrent.toLocaleString('default', { month: 'long', timeZone: 'Europe/Prague' });
	var yearName = dCurrent.getFullYear();
	
	if (dPrevMonth > dStart) {
		result += '<span class="calendarPrevMonth" onclick="calendarPrev(\'' + calendarId + '\')"><</span>';
	} else {	
		result += '<span class="calendarPrevMonth disabled"><</span>';
	}
	
	result += '<span class="calendarCurrentMonth">' + monthName + ' ' + yearName + '</span>';
	
	if (dNextMonth < dEnd) {
		result += '<span class="calendarNextMonth" onclick="calendarNext(\'' + calendarId + '\')">></span>';
	} else {	
		result += '<span class="calendarNextMonth disabled">></span>';
	}
	
	result += '</div>';
	
	// Weeks
	result += '<div>';
	var dWeekStart = getMonday(dCurrent);
	var dCurrentDay = dWeekStart;
	var dayIndex = 0;
	
	while (dCurrentDay < dNextMonth) {
		var index = dCurrentDay.getTime() / 1000;
		var dayClass = "calendarDayAvailable";
		if (rangeData[index] == 1) {
			dayClass = "calendarDayMaybe";
		} else if (rangeData[index] == 2) {
			dayClass = "calendarDayBusy";
		}
		
		if (selectedData[index] == true) {
			dayClass += " calendarSelectedDay";
		}
		
		if (dCurrentDay < now) {
			result += '<span class="calendarDay calendarOldDay">' + dCurrentDay.getDate() + '</span>';
		} else if (dCurrentDay >= dCurrent) {
			result += '<span class="calendarDay ' + dayClass + '" onclick="selectDay(\'' + calendarId + '\', ' + index + ')">' + dCurrentDay.getDate() + '</span>';
		} else {
			result += '<span class="emptyDay"></span>';
		}
		// next day
		dCurrentDay = new Date(dCurrentDay.getTime()+(1*24*60*60*1000));
		dayIndex++;
		
		// Advance week
		if (dayIndex == 7) {
			result += '</div><div>';
			dayIndex = 0;
		}
	}
	
	result += '</div>';
	
	// show summary
	var numOfDays = 0;
	var selectedStart = null;
	var selectedEnd = null;
	// 3 days minimum
	var daysThreshold = 3;
	
	for (var key in selectedData) {
		
		// 7 days minimum for june/august (months indexed from 0!)
		var selectedDate = new Date(key * 1000);
		if ((selectedDate.getMonth() == 6) || (selectedDate.getMonth() == 7)) {
			daysThreshold = 7;
		}
		
		if (selectedData[key] == true) {
			if ((selectedStart == null) || (selectedStart > key)) {
				selectedStart = key;
			}
			if ((selectedEnd == null) || (selectedEnd < key)) {
				selectedEnd = key;
			}
			numOfDays++;
		}
	}
	
	result += '</div>';
	
	if (numOfDays > 0) {
		
    var options = {
        year: "numeric",
        month: "2-digit",
        day: "numeric",
		timeZone: 'Europe/Prague' 
    };
	
		var dSelectedStart = new Date(selectedStart * 1000);
		var dSelectedEnd = new Date(selectedEnd * 1000);
		var daysBetween = (selectedEnd - selectedStart) / 60 / 60 / 24 + 1;
		var dStartName = dSelectedStart.toLocaleString('default', options );
		var dEndName = dSelectedEnd.toLocaleString('default', options );
		
		var isValid = false;
		
		if (numOfDays < daysThreshold) {
			result += '<div class="calendarValidation"><br>Bitte wählen Sie mindestens diese Anzahl von Tagen: ' + daysThreshold + '.</div>';
		} else if (daysBetween != numOfDays) {
			result += '<div class="calendarValidation"><br>Bitte wählen Sie einen kontinuierlichen Bereich</div>';
		} else {
			result += '<div class="calendarSummary"><br><strong>SIE HABEN EIN DATUM AUSGEWÄHLT</strong><br> ' + dStartName + (dStartName != dEndName ? ' - ' + dEndName : '') + '</div>';
			isValid = true;
		}
		
		result += '<br><span class="calendarReset btn btnbrown" onclick="JavaScript: clearSelected(\'' + calendarId + '\')">X AUSWAHL AUFHEBEN</span>';
		
		$(cal.fieldSubmitId).prop('disabled', !isValid);
		
		if ((fieldStartId != null) && (fieldEndId != null)) {
			var dsWithoutZone = new Date(Date.UTC(dSelectedStart.getFullYear(), dSelectedStart.getMonth(), dSelectedStart.getDate(), 0, 0, 0));
			$(fieldStartId)[0].valueAsDate = dsWithoutZone;
			var deWithoutZone = new Date(Date.UTC(dSelectedEnd.getFullYear(), dSelectedEnd.getMonth(), dSelectedEnd.getDate(), 0, 0, 0));
			$(fieldEndId)[0].valueAsDate = deWithoutZone;
		}
	} else {
		if (cal.fieldSubmitId != null) {
			$(cal.fieldSubmitId).prop('disabled', true);
		}
	}
	
	result += '</div>';
	
	return result;
}

function clearSelected(calendarId) {
	var cal = calendars[calendarId];
	cal.selectedData = [];
	showCalendar(calendarId);
}

function showCalendar(calendarId) {
	var cal = calendars[calendarId];
	var content = renderCalendar(cal);
	$(cal.targetId).html(content);
}

function initCalendar(calendarId, rangeStart, rangeEnd, rangeData, targetId, fieldStartId, fieldEndId, fieldSubmitId) {
	calendars[calendarId] = { calendarId, fieldStartId, fieldEndId, current: new Date(rangeStart * 1000), rangeStart: new Date(rangeStart * 1000), rangeEnd: new Date(rangeEnd * 1000), rangeData, selectedData: [], targetId, fieldSubmitId };
	showCalendar(calendarId);
}
