var Calendar = {
	
	Define: {
		IDs: {},
		startDate: null,
		endDate: null,
		actualDate: null,
		todayDate: null,
		dayLink: null,
		isVisible: false,
		filterQuery: null,
		calendar: null
	},

	init: function(Define) {
		Calendar.Define = Define;
		Calendar.Define.todayDate = new Date();
		Calendar.Define.todayDate.setHours(0,0,0,0);
		
		Calendar.Define.startDate = {
			timestamp: Calendar.Define.startDate,
			date: new Date(Calendar.Define.startDate)
		};
		Calendar.Define.endDate = {
			timestamp: Calendar.Define.endDate,
			date: new Date(Calendar.Define.endDate)
		};
		Calendar.Define.actualDate = {
			timestamp: Calendar.Define.actualDate,
			date: new Date(Calendar.Define.actualDate)
		};
		
		Calendar.isVisible = false;
		
		$('body').click(function(E) {
			if (Calendar.isVisible) {
				Calendar.toggle();
			}
		});
	},
	
	run: function() {
		if (Calendar.Define.type == 'schedule') {
			$(Calendar.Define.IDs.showLink).click(function(E){
				E.preventDefault();
				E.stopPropagation();
				Calendar.toggle();
				$(this).blur();
			});
		}
		else if (Calendar.Define.type == 'search') {
			$(Calendar.Define.IDs.showLink).click(function(E){
				E.preventDefault();
				E.stopPropagation();
			});
			
			$(Calendar.Define.IDs.showLink).focus(function(E){
				openingElement = $(this);
				if (!Calendar.isVisible) {
					Calendar.toggle();
				}
				$(Calendar.Define.IDs.container).css({
					top: $(this).position().top + 15,
					left: $(this).position().left - 8
				});
				// nastaveni datumu v kalendari
				if ($(this).val() != '' && $(Calendar.Define.IDs.container).find('a[href="' + $(this).val() + '"]')) {
					var selectedDate = $(this).val().split('.');
					$(Calendar.selectedDay).val(parseInt(selectedDate[0], 10));
					$(Calendar.selectedMonth).val(parseInt(selectedDate[1], 10)-1);
					$(Calendar.selectedYear).val(parseInt(selectedDate[2], 10));
					if (Calendar.isValid()) {
						Calendar.fill();
					}
					$(Calendar.Define.IDs.container).find('a.actual').removeClass('actual');
					$(Calendar.Define.IDs.container).find('a[href="' + $(this).val() + '"]').addClass('actual');
					$(Calendar.Define.IDs.container).find('a.calendarToday').removeClass('actual');
				}
			});
		}
		
		Calendar.create();
		
		$('a.calendarClose').click(function(E){
			E.preventDefault();
			E.stopPropagation();
			Calendar.Define.type == 'schedule' ? Calendar.setDate() : Calendar.toggle();
		});
		
		$('select[name="selectedYear"], select[name="selectedMonth"]').click(function(E) {
			E.stopPropagation();
		});
		$('select[name="selectedYear"]').change(function() {
			Calendar.fill();
		});
		$('select[name="selectedMonth"]').change(function() {
			Calendar.fill();
		});
		if (Calendar.Define.type == 'schedule') {
			$('a[name="calendarCell"]').click(function(E) {
				var d = $(this).text();
				if (parseInt(d, 10)) {
					if ($(this).attr('rel') == (Calendar.Define.endDate.date.getMonth() + 1) && (d > Calendar.Define.endDate.date.getDate() && Calendar.Define.endDate.date.getFullYear() == Calendar.Define.actualDate.date.getFullYear())) {
						E.preventDefault();
						E.stopPropagation();
					}
				}
				else {
					E.preventDefault();
					E.stopPropagation();
				}
			});
		}
		else if (Calendar.Define.type == 'search') {
			$('a[name="calendarCell"]').click(function(E) {
				E.preventDefault();
				E.stopPropagation();
				var d = $(this).text();
				if (parseInt(d, 10)) {
					if (!($(this).attr('rel') == (Calendar.Define.endDate.date.getMonth() + 1) && d > Calendar.Define.endDate.date.getDate())) {
						openingElement.val($(this).attr('href'));
					}
				}
				Calendar.toggle();
			});
			
			$(Calendar.Define.IDs.todayLink).click(function(E) {
				E.preventDefault();
				E.stopPropagation();
				openingElement.val($(this).attr('href'));
				Calendar.toggle();
			});
		}
//		$(Calendar.Define.IDs.previousLink).dblclick(function(E) {
//			E.preventDefault();
//			E.stopPropagation();
//			$(Calendar.Define.IDs.previousLink).trigger('click');
//		});
		$(Calendar.Define.IDs.previousLink).click(function(E) {
			E.preventDefault();
			E.stopPropagation();
			Calendar.changeMonth(-1);
			Calendar.fill();
		});
//		$(Calendar.Define.IDs.nextLink).dblclick(function(E) {
//			E.preventDefault();
//			E.stopPropagation();
//			$(Calendar.Define.IDs.nextLink).trigger('click');
//		});
		$(Calendar.Define.IDs.nextLink).click(function(E) {
			E.preventDefault();
			E.stopPropagation();
			Calendar.changeMonth(-3);
			Calendar.fill();
		});
		$('#scheduleCalendarTable').mousewheel(function(event, delta) {
			event.stopPropagation();
			event.preventDefault(); 
			Calendar.changeMonth(delta < 0 ? -3 : -1);
			Calendar.fill();
		});
		$('#scheduleCalendarSwitchMonth').mousewheel(function(event, delta) {
			event.stopPropagation();
			event.preventDefault(); 
			Calendar.changeMonth(delta < 0 ? -3 : -1);
			Calendar.fill();
		});
		$('#scheduleCalendarSwitchYear').mousewheel(function(event, delta) {
			event.stopPropagation();
			event.preventDefault(); 
			Calendar.changeYear(delta);
			Calendar.fill();
		});
		
		
		Calendar.calendarCell = $('a[name="calendarCell"]');
		Calendar.selectedDay = $('input[name="selectedDay"]')[0];
		Calendar.selectedMonth = $('select[name="selectedMonth"]')[0];
		Calendar.selectedYear = $('select[name="selectedYear"]')[0];

		Calendar.selectedDay.value = Calendar.Define.actualDate.date.getDate() > 0 ? Calendar.Define.actualDate.date.getDate() : Calendar.Define.todayDate.getDate();
		Calendar.selectedYear.value = Calendar.Define.actualDate.date.getFullYear() > 0 ? Calendar.Define.actualDate.date.getFullYear() : Calendar.Define.todayDate.getFullYear();
		Calendar.selectedMonth.value = (Calendar.Define.actualDate.date.getMonth()) >= 0 ? (Calendar.Define.actualDate.date.getMonth()) : Calendar.Define.todayDate.getMonth();
		Calendar.calendarDayValue = 0;
		Calendar.selectedMonthValue = 0;
		Calendar.selectedYearValue = 0;
		
		Calendar.isValid();
		Calendar.fill();
	},
	
	create: function() {
		var monthsTitles = new Array("leden", "únor", "březen", "duben", "květen", "červen", "červenec", "srpen", "září", "říjen", "listopad", "prosinec");
		var calendarHTML = '<div class="shadow"></div><table cellpadding="0" id="scheduleCalendarTable" cellspacing="2" border="0" width="1"><tr><td><a href="#" id="calendarPrevMonth" title="předchozí měsíc"><span>předchozí měsíc</span></a></td><td colspan="5" title="Měsíc nebo rok lze rychle měnit kolečkem myši" nowrap><input name="selectedDay" type="hidden" size="1"><select name="selectedMonth" size="1"  id="scheduleCalendarSwitchMonth">';
		for (var month = 0; month < 12; month++) {
			calendarHTML += '<option value="' + month + '">' + monthsTitles[month] + '</option>';
		}
		calendarHTML += '</select><select name="selectedYear" size="1" id="scheduleCalendarSwitchYear">';
		for (var year = Calendar.Define.startDate.date.getFullYear(); year <= Calendar.Define.endDate.date.getFullYear(); year++) {
			calendarHTML += '<option value="' + year + '">' + year + '</option>';
		}
		calendarHTML += '</select></td><td><a href="#" id="calendarNextMonth" title="následující měsíc"><span>následující měsíc</span></a></td></tr><tr><td>po</td><td>út</td><td>st</td><td>čt</td><td>pá</td><td>so</td><td>ne</td></tr>';
		for (var row = 1; row <= 6; row++) {
			calendarHTML += '<tr>';
			for (var cell = 1; cell <= 7; cell++) {
				calendarHTML += '<td><a name="calendarCell" href="#">&nbsp;</a></td>';
			}
			calendarHTML += '</tr>';
		}
		var actualDate = new Date(Calendar.Define.actualDate);
		calendarHTML += '<tr><td colspan="6"><a href="' + (Calendar.Define.type == 'schedule' ? '/' + Calendar.Define.dayLink + '/' : '') + Calendar.padZero(Calendar.Define.todayDate.getDate()) + '.' + Calendar.padZero(Calendar.Define.todayDate.getMonth() + 1) + '.' + Calendar.Define.todayDate.getFullYear() + '" class="calendarToday" name="calendarToday" rel="' + Calendar.Define.todayDate.getFullYear() + '-' + Calendar.padZero(Calendar.Define.todayDate.getMonth() + 1) + '-' + Calendar.padZero(Calendar.Define.todayDate.getDate()) + '">Dnes ' + Calendar.Define.todayDate.getDate() + '. ' + (Calendar.Define.todayDate.getMonth() + 1) + '. ' + Calendar.Define.todayDate.getFullYear() + '</a></td><td><a href="#" title="zavřít kalendář" class="calendarClose">zavřít</a></td></tr></table>';
		$(Calendar.Define.IDs.container).html(calendarHTML);
	},
	
	fill: function() {
		var calendarDayNumber = new Date();
		calendarDayNumber.setYear(Calendar.selectedYear.value);
		calendarDayNumber.setMonth(Calendar.selectedMonth.value, 1);
		calendarDayNumber.setHours(-24, 0, 0, 0);
		var difference = calendarDayNumber.getDay() + (calendarDayNumber.getDay() == 0) * 7 - 1;
		calendarDayNumber.setHours(-24 * difference);

		for (var d = 0; d < 42; d++) {
			var activeDen = (Calendar.selectedMonth.value == calendarDayNumber.getMonth() && calendarDayNumber >= Calendar.Define.startDate.date && calendarDayNumber <= Calendar.Define.endDate.date) * 1;
			var actualDay = calendarDayNumber.getDate() == Calendar.Define.actualDate.date.getDate() && calendarDayNumber.getMonth()==(Calendar.Define.actualDate.date.getMonth()) && calendarDayNumber.getFullYear() == Calendar.Define.actualDate.date.getFullYear();
			var showDate = (Calendar.selectedMonth.value == calendarDayNumber.getMonth() || (calendarDayNumber>=Calendar.Define.startDate.date && calendarDayNumber<=Calendar.Define.endDate.date));
			
			$(Calendar.calendarCell[d]).attr('rel', calendarDayNumber.getMonth() + 1);
			$(Calendar.calendarCell[d]).removeClass('actual');
			$(Calendar.calendarCell[d]).removeClass('today');
			if (activeDen) {
				$(Calendar.calendarCell[d]).addClass('active');
				$(Calendar.calendarCell[d]).removeClass('not-active');
			} else {
				$(Calendar.calendarCell[d]).addClass('not-active');
				$(Calendar.calendarCell[d]).removeClass('active');
			}
			if (actualDay) {
				$(Calendar.calendarCell[d]).addClass('actual');
			}
			
			if (calendarDayNumber * 1 == Calendar.Define.todayDate * 1 && !actualDay) {
				$(Calendar.calendarCell[d]).addClass('today');
			}
			
			if (showDate) {
				Calendar.calendarCell[d].innerHTML = calendarDayNumber.getDate();
				Calendar.calendarCell[d].href = calendarDayNumber >= Calendar.Define.startDate.date && calendarDayNumber <= Calendar.Define.endDate.date ? Calendar.padZero(calendarDayNumber.getDate()) + '.' + Calendar.padZero(calendarDayNumber.getMonth() + 1) + '.' + calendarDayNumber.getFullYear() : '';
				Calendar.calendarCell[d].rel = calendarDayNumber >= Calendar.Define.startDate.date && calendarDayNumber <= Calendar.Define.endDate.date ?  calendarDayNumber.getFullYear() + '-' + Calendar.padZero(calendarDayNumber.getMonth() + 1) + '-' + Calendar.padZero(calendarDayNumber.getDate()) : '';
				if (!(calendarDayNumber >= Calendar.Define.startDate.date && calendarDayNumber <= Calendar.Define.endDate.date)) {
					$(Calendar.calendarCell[d]).removeAttr('href');
				}
			}
			else {
				Calendar.calendarCell[d].innerHTML = '&nbsp;';
				$(Calendar.calendarCell[d]).removeAttr('href');
			}
			
			calendarDayNumber.setHours(24);
		}
	},
	
	isValid: function() {
		if(!Calendar.selectedYear.value) {
			Calendar.selectedMonth.value = Calendar.selectedMonthValue * 1;
			Calendar.selectedYear.value = Calendar.selectedYearValue * 1;
			return false;
		}
		var selectedDate = new Date(Calendar.selectedYear.value, Calendar.selectedMonth.value, Calendar.selectedDay.value)
		if (selectedDate < Calendar.Define.startDate.date) {
			Calendar.selectedDay.value = Calendar.Define.startDate.date.getDate();
			Calendar.selectedMonth.value = Calendar.Define.startDate.date.getMonth();
			Calendar.selectedYear.value = Calendar.Define.startDate.date.getFullYear();
			return false;
		}
		if (selectedDate < Calendar.Define.startDate.date || selectedDate > Calendar.Define.endDate.date) {
			Calendar.selectedDay.value = Calendar.Define.endDate.date.getDate();
			Calendar.selectedMonth.value = Calendar.Define.endDate.date.getMonth();
			Calendar.selectedYear.value = Calendar.Define.endDate.date.getFullYear();
			return false;
		}
		selectedDate = new Date(Calendar.selectedYear.value, Calendar.selectedMonth.value, 0);
		if (selectedDate < Calendar.Define.startDate.date) selectedDate = Calendar.Define.startDate.date;
		if (selectedDate > Calendar.Define.endDate.date) selectedDate = Calendar.Define.endDate.date;
		$("#calendarPrevMonth").attr("href", Calendar.padZero(selectedDate.getDate()) + '.' + Calendar.padZero(selectedDate.getMonth() + 1) + '.' + selectedDate.getFullYear() + '/?calendar');
		selectedDate = new Date(Calendar.selectedYear.value, 1 * Calendar.selectedMonth.value + 1, 1);
		if (selectedDate < Calendar.Define.startDate.date) selectedDate = Calendar.Define.startDate.date;
		if (selectedDate > Calendar.Define.endDate.date) selectedDate = Calendar.Define.endDate.date;
		$("#calendarPrevMonth").attr("href", Calendar.padZero(selectedDate.getDate()) + '.' + Calendar.padZero(selectedDate.getMonth() + 1) + '.' + selectedDate.getFullYear() + '/?calendar');
		Calendar.calendarDayValue = Calendar.selectedDay.value;
		Calendar.selectedMonthValue = Calendar.selectedMonth.value;
		Calendar.selectedYearValue = Calendar.selectedYear.value;
		return true;
	},

	changeMonth: function(month) {
		if (month < 0) {
			Calendar.selectedDay.value = 1;
			var k = Calendar.selectedMonth.value - (month + 2);
			if(k >= 0 && k <= 11) {
				Calendar.selectedMonth.value = k;
			} else {
				if (k == -1 && Calendar.selectedYear.value > Calendar.Define.startDate.date.getFullYear()) {
					Calendar.selectedMonth.value = 11;
					Calendar.selectedYear.value--;
				} else if (k == 12 && Calendar.selectedYear.value < Calendar.Define.endDate.date.getFullYear()) {
					Calendar.selectedMonth.value = 0;
					Calendar.selectedYear.value++;
				}
			}
		} else {
			Calendar.selectedMonth.value = month;
		}
		return Calendar.isValid()
	},

//	zmenitDnes: function(z) {
//		if (z) {
//			var puvDen = Calendar.calendarToday.getDate();
//			var puvMesic = Calendar.calendarToday.getMonth();
//			var puvRok = Calendar.calendarToday.getFullYear();
//		}
//		Calendar.selectedDay.value = Calendar.calendarToday.getDate();
//		Calendar.selectedMonth.value = Calendar.calendarToday.getMonth();
//		Calendar.selectedYear.value = Calendar.calendarToday.getFullYear();
//		if (z) {
//			Calendar.setDate(Calendar.padZero(puvDen) + '.' + Calendar.padZero(puvMesic + 1) + '.' + puvRok);
//		}
//		else {
//			Calendar.fill();
//		}
//	},

	changeYear: function(r) {
		Calendar.selectedYear.value = Calendar.selectedYear.value * 1 + (r < 0 ? 1 : -1);
		if (Calendar.isValid()) {
			Calendar.fill();
		}
	},

	padZero: function(n) {
		n *= 1;
		return (n < 10 ? "0" : "") + n;
	},

	setDate: function(v) {
		Calendar.fill();
		if (!v) {
			Calendar.toggle();
		}
	},
	
	toggle: function() {
		if (!Calendar.isVisible) {
			$(Calendar.Define.IDs.container + " .shadow").css("display", "none");
			$(Calendar.Define.IDs.container).fadeIn("fast",function(){
				$(Calendar.Define.IDs.container + " .shadow").css("display", "block");
			});
		} else {
			$(Calendar.Define.IDs.container + " .shadow").css("display", "none");
			$(Calendar.Define.IDs.container).fadeOut("fast");
		}
		Calendar.isVisible = !Calendar.isVisible;
	}

}

