var xDateNow = new Date();
var dateToday = new Date(xDateNow.getFullYear(), xDateNow.getMonth(), xDateNow.getDate());

function highlightDays(date) {
    var cssClass = "";
    if (date >= dateToday) {
        cssClass = "future";
    }

    updateDatesIfNeeded(date, true);

    if (ContainsDate(dates, date)) {
        var tempYear = year;
    	var tempMonth = month;
    	if (!tempYear || !tempMonth) {
    		tempYear = defdate.getFullYear();
    		tempMonth = defdate.getMonth() + 1;
    	}
    	
    	if (date.getMonth() + 1 != tempMonth) {
    		cssClass += " eventdayNotInSelectedMonth";
//        	if (typeof(console) !== 'undefined' && console.log) {
//        		console.log("eventdayNotInSelectedMonth! tempYear: " + tempYear + ", tempMonth: " + tempMonth + ", date: " + date);
//        	}
        } else {
        	cssClass += " eventday";
        }
    }
    
//    if (typeof(console) !== 'undefined' && console.log) {
//		console.log("cssClass: " + cssClass);
//	}

    return [true, cssClass];
}

function SelectWeekMonth() {
    //Select week
    $(".ui-datepicker-week-col").each(function () {
        if ($(this).text() == selectedWeek)
            $(this).addClass("selected");
    });
    //Select month
    if (!month) {
        month = $.inArray($(".ui-datepicker-month").text(), months) + 1;
    }
    if ($(".ui-datepicker-month").length) {
        $(".ui-datepicker-title").html("<a href='#'>" + $(".ui-datepicker-month").text() + " " + $(".ui-datepicker-year").text() + "</a>");
        if (month == selectedMonth)
            $(".ui-datepicker-title a").addClass("selected");
    }
}

function ContainsDate(a, obj) {
  var i = a.length;
  while (i--) {
    if (a[i].getTime() === obj.getTime()) {
      return true;
    }
  }
  return false;
}

function updateDatesIfNeeded(date, alsoUpdateForPreviousAndNextMonth) {
	if (!isMonthFetched(date)) {
		addMonthFetched(date);
		fetchMonthDataFromServer(date);
	}
	if (alsoUpdateForPreviousAndNextMonth) {
		updateDatesIfNeeded(previousMonth(date), false);
		updateDatesIfNeeded(nextMonth(date), false);
	}
}

function previousMonth(date) {
	var tempDate = getMonthDate(date);
	tempDate.setMonth(tempDate.getMonth() - 1);
	return tempDate;
}

function nextMonth(date) {
	var tempDate = getMonthDate(date);
	tempDate.setMonth(tempDate.getMonth() + 1);
	return tempDate;
}

function fetchMonthDataFromServer(date) {
	var baseQuery = urlParameters["baseQuery"];
	var county = urlParameters["county"];
	if (!baseQuery) {
	 baseQuery = "";
	}
	if (!county) {
	 county = "";
	}
	var url = getUrlToFetchMonthDataFromServer(date, baseQuery, county);
	
	var cache = true;
	if($.browser.msie && $.browser.version < 8) {
		cache = false;
	}
	
	$.ajax({
		  method: "get",
		  url: url,
		  cache: cache,
		  success: function(result) {processCalendarServerResponseText(result); }
	  });
}

function processCalendarServerResponseText(responseText) {
//	alert("responseText:" + responseText);
	if (responseText && responseText != "") {
		var tempArray = eval(responseText);
		var i = tempArray.length;
		while (i--) {
			dates.push(tempArray[i]);
		}
		refreshCalendar();
	} else if (typeof(console) !== 'undefined' && console.log) {
		console.log("Empty or missing responseText");
	}
}

function getMonthDate(date) {
	var monthDate = date;
	if (date.getDate != 1) {
		monthDate = new Date(date.getFullYear(), date.getMonth(), 1);
	}
	return monthDate;
}

function isMonthFetched(date) {
	var monthDate = getMonthDate(date);
	return ContainsDate(fetchedMonthDates, monthDate);
}

function addMonthFetched(date) {
	var monthDate = getMonthDate(date);
	fetchedMonthDates.push(monthDate);
}

function parseISO8601(dateStringInRange) {
    var isoExp = /^\s*(\d{4})-(\d+)-(\d+)\s*$/, date = new Date(NaN), month, parts = isoExp.exec(dateStringInRange);
    if (parts) {
        month = +parts[2];
        date.setFullYear(parts[1], month - 1, parts[3]);
        if (month != date.getMonth() + 1) {
            date.setTime(NaN);
        }
    }
    return date;
}

var dates = new Array();

var fetchedMonthDates = new Array();

var baseQuery = urlParameters["baseQuery"];
var county = urlParameters["county"];
var kalendarium = urlParameters["kalendarium"];
var yearParam = urlParameters["year"];
var monthParam = urlParameters["month"];
var weekParam = urlParameters["week"];
var dateParam = urlParameters["date"];

var year = yearParam;
var month = monthParam;
var week = weekParam;
var date = dateParam;

var selectedWeek = week;
var selectedMonth = month;

if (!baseQuery) {
	baseQuery = "";
}
if (baseQuery == "#") {
	baseQuery = "";
}
if (!county) {
	county = "";
}
if (!kalendarium) {
	kalendarium = "";
}

var defdate = new Date();
var dateUrlParam = $.getUrlVar('date');
if (dateUrlParam != undefined && dateUrlParam != '') {
    defdate = parseISO8601(dateUrlParam);
}

function refreshCalendar() {
	jQuery("#datepicker").datepicker("refresh");
}

$(document).ready(function () {
	var pageDate = urlParameters["date"];
	if (!pageDate) {
		var tempDate = new Date();
		var tempMonth = tempDate.getMonth() + 1;
		if (tempMonth < 10) {
			tempMonth = "0" + tempMonth;
		}
		pageDate = tempDate.getFullYear() + "-" + tempMonth + "-" + tempDate.getDate();
	}
	
    var datePickerSettings = {
        beforeShowDay: highlightDays,
        onSelect: function(dateText, inst) {
			var url = "?date=" + dateText + "&county=" + county + "&baseQuery=" + baseQuery;
			if (kalendarium != '') {
		    	url = url + "&kalendarium=" + kalendarium;
		    }
			location.href = url;
    	},
        showOn: "button",
        buttonImage: gfxUrl + "calendar.png",
        buttonImageOnly: true,
        showWeek: true,
        firstDay: 1,
        dayNamesMin: ['S', 'M', 'T', 'O', 'T', 'F', 'L'],
        weekHeader: 'v.',
        showOtherMonths: true,
        selectOtherMonths: true
    };
    $.datepicker.setDefaults(datePickerSettings);
	
	$('#datepicker').delegate('.ui-datepicker-week-col', "click", function(e){
		$(".ui-datepicker-week-col").removeClass("selected");
        $(this).addClass("selected");
		var week = $(this).text();
        showWeek(week, year, month);
	});
	
	$('#datepicker').delegate('.ui-datepicker-title a', "click", function(e){
		showMonth(year, month);
	});
	
	var defaultDateForDatepicker = null;
	if (dateUrlParam != undefined && dateUrlParam != '') {
		defaultDateForDatepicker = defdate;
	}
	
    $("#datepicker").datepicker({
    	//defaultDate: defdate,
    	defaultDate: defaultDateForDatepicker,
        onChangeMonthYear: function (_year, _month, _inst) {
        	year = _year;
        	month = _month;
        	setTimeout(SelectWeekMonth, 300);
        }
    });
    
    setTimeout(SelectWeekMonth, 1500);
    
    if (defaultDateForDatepicker == null) {
	    var defdateYear = defdate.getFullYear();
	    var dateTodayYear = dateToday.getFullYear();
	    var defdateMonth = defdate.getMonth();
	    var dateTodayMonth = dateToday.getMonth();
	    
	    if (defdateYear != dateTodayYear || defdateMonth != dateTodayMonth) {
	    	var offset = 12 * (defdateYear - dateTodayYear) + defdateMonth - dateTodayMonth;
	    	//alert("offset: " + offset);
	    	jQuery.datepicker._adjustDate('#datepicker', offset, 'M');
	    }
    }
    
});

function showMonth(year, month) {
    if (!year) {
    	year = defdate.getFullYear();
    }
    var url = "?year=" + year + "&month=" + month + "&county=" + county + "&baseQuery=" + baseQuery;
    if (kalendarium != '') {
    	url = url + "&kalendarium=" + kalendarium;
    }
    location.href = url;
}

function showWeek(week, year, month) {
	if (!year) {
    	year = defdate.getFullYear();
    }
	if (week >= 52 && month == 1) {
		year = year - 1;
	} else if (week == 1 && month == 12) {
		year = year + 1;
	}
	var url = "?year=" + year + "&week=" + week + "&county=" + county + "&baseQuery=" + baseQuery;
	if (kalendarium != '') {
    	url = url + "&kalendarium=" + kalendarium;
    }
	location.href = url;
}

