(function($){
    $.fn.jqueryCal = function(options){
        var defaults = {
            xmlPath: '',
            noEvents: 'Keine öffentlichen Termine.',
            noEventsToday: 'Keine öffentlichen Termine.',
            loadingGif: '<img src="../static/images/ajax-loader.gif" width="16" height="16" border="0" class="loadingGif" alt="Abendbaum">'
        };
        var options = $.extend(defaults, options);
        return this.each(function(){
            // global vars
            var dateList = new Array();
            var weekClasses = new Array("Mo", "Di", "Mi", "Do", "Fr", "Sa", "So");
            var weekday = new Array("Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag")
            var currentDate = new Date();
            currentDate.setHours(0);
            currentDate.setMinutes(0);
            currentDate.setSeconds(0);
            currentDate.setMilliseconds(0);
            var selectedDate = new Date();
            selectedDate.setDate(1)
            selectedDate.setHours(0);
            selectedDate.setMinutes(0);
            selectedDate.setSeconds(0);
            selectedDate.setMilliseconds(0);
            var tempDate = new Date();
            tempDate.setHours(0);
            tempDate.setMinutes(0);
            tempDate.setSeconds(0);
            tempDate.setMilliseconds(0);
            var clickedEventText = "";
            var todayText = "";
            var xmlPath = xmlPath;
            var tmpString = "";
            var tmpStringParts = new Array();
			var firstEvent = 1;
			var pageChanged = false;
            
            $("#eventCalendarMonth").hide();
            $(".calendarJS").removeClass("calendarJS");
            $(".contentCalendar div h2").after(options.loadingGif);
            
            parseXML();
            
            function parseXML(){
                try {
                    xmlPath = options.xmlPath + "year=" + selectedDate.getFullYear() + "&month=" + (selectedDate.getMonth() + 1);
                    // parse XML
                    $.ajax({
                        type: "GET",
                        url: xmlPath,
                        dataType: "xml",
                        success: function(xml){
                            $(xml).find('calendardoc').each(function(i){
                                dateList[i] = new Object();
                                tmpString = $(this).children("date").text();
                                tmpStringParts = tmpString.split("-");
                                tmpString = tmpStringParts[0] + "-" + tmpStringParts[2] + "-" + tmpStringParts[1];
                                dateList[i]["dateStart"] = Date.parse(tmpString); //Date.parse($(this).children("date").text());
                                dateList[i]["dateEnd"] = Date.parse(tmpString); //Date.parse($(this).children("date").text());
                                dateList[i]["title"] = $(this).find('title').text();
                                dateList[i]["text"] = $(this).find('text').text();
                                dateList[i]["url"] = $(this).find('url').text();
                            });
                            $(".contentCalendar div .loadingGif").remove();
                            fillHTML();
                        }
                    })
                } 
                catch (err) {
                    fillHTML();
                }
            }
            
            // fill HTML
            function fillHTML(){
                // clean HTML
                cleanHTML();
                $("#eventCalendarMonth").show();
                // set current day and weekday 
                $("#eventCalendarMonth .head .weekDay").text(weekday[currentDate.getDay()]);
                $("#eventCalendarMonth .currentDayContainer .dayOfMonth").text(currentDate.getDate());
                var firstOfSelectedMonth = selectedDate;
                firstOfSelectedMonth.setDate(1);
                //currentDate = new Date();
                $("#eventCalendarMonth .head .text").html(selectedDate.getMonthName() + " " + selectedDate.getFullYear());
                for (i = 0; i <= weekClasses.length; i++) {
                    $("#eventCalendarMonth .body .weekDaysContainer .weekDays." + weekClasses[i]).text(weekClasses[i]);
                }
                var startWrite = 0;
                var j = 1;
                if (selectedDate.getDay() == 0) {
                    startWrite = 6;
                }
                else {
                    startWrite = selectedDate.getDay() - 1;
                }
				if (pageChanged) {
					currentDate = tempDate;
					currentDate.setDate(getFirstEvent())
					$("#eventCalendarMonth .head .weekDay").text(weekday[currentDate.getDay()]);
                	$("#eventCalendarMonth .currentDayContainer .dayOfMonth").text(currentDate.getDate());
				}
                $("#eventCalendarMonth .body .weekDatesContainer .weekDates").each(function(i){
                    if (startWrite <= i && j <= daysInMonth(selectedDate.getMonth() + 1, selectedDate.getFullYear() + 1)) {
                        $(this).text(j);
						if ($(this).text != "*") {
	                    }
    
                        j++;
                        // mark current day
                        if ((selectedDate.getMonth() == currentDate.getMonth()) && (selectedDate.getFullYear() == currentDate.getFullYear()) && ($(this).text() == currentDate.getDate())) {
							
							if ($(this).text != "*") {
								$(this).addClass("pointer");
	                            $(this).bind("mouseenter mouseleave", function(e){
	                                $(this).toggleClass("hover");
	                            });
	                        }

							$(this).addClass("currentDate");
						} 
                    }
                });
                // mark events
                for (var i = 0; i <= dateList.length - 1; i++) {
                    $("#eventCalendarMonth .body .weekDatesContainer .weekDates").each(function(j){
                        if ($(this).text() != "") {
                            tempDate.setDate($(this).text()); // 28
                            if (tempDate.getTime() >= dateList[i]["dateStart"].getTime() && tempDate.getTime() <= dateList[i]["dateEnd"].getTime()) {
                               	$(this).addClass("pointer");
	                            $(this).bind("mouseenter mouseleave", function(e){
	                                $(this).toggleClass("hover");
	                            });
							   
							    $(this).addClass("event");
                            }
                        }
                    })
                }
                // add events
                addEventInfo();
            }
            // clean HTML
            function cleanHTML(){
                $("#eventCalendarMonth .body .weekDatesContainer .weekDates").each(function(){
                    $(this).text("");
                    $(this).removeClass("event");
                    $(this).removeClass("currentDate");
                    $(this).removeClass("pointer");
                    $(this).unbind();
                })
                $("#eventCalendarMonth .head .text").text = "";
            }
            // get days of month
            function daysInMonth(month, year){
                var m = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
                if (month != 2) 
                    return m[month - 1];
                if (year % 4 != 0) 
                    return m[1];
                if (year % 100 == 0 && year % 400 != 0) 
                    return m[1];
                return m[1] + 1;
            }
			
			function getFirstEvent(){
				var thisMonthEvents = new Array();
				for (var i = 0; i <= dateList.length - 1; i++) {
					if (dateList[i]["dateStart"].getMonth() == selectedDate.getMonth())
						thisMonthEvents.push(dateList[i]["dateStart"].getDate())
				}
				if (thisMonthEvents[thisMonthEvents.length - 1] == null)
					return 1;
				else
					return thisMonthEvents[thisMonthEvents.length - 1];
            }
            
            // add event info  
            function addEventInfo(){
				if (pageChanged) {
					currentDate = tempDate;
					tempEventNumber = getFirstEvent();	
					currentDate.setDate(getFirstEvent())
					$("#eventCalendarMonth .head .weekDay").text(weekday[currentDate.getDay()]);
                	$("#eventCalendarMonth .currentDayContainer .dayOfMonth").text(currentDate.getDate());
				}
                if ((currentDate.getMonth() == selectedDate.getMonth()) && (currentDate.getFullYear() == selectedDate.getFullYear())) {
                    todayText = "";
                    for (var i = 0; i <= dateList.length - 1; i++) {
                        if ((currentDate.toLocaleDateString() == dateList[i]["dateStart"].toLocaleDateString() || currentDate.getTime() >= dateList[i]["dateStart"].getTime()) && (currentDate.toLocaleDateString() == dateList[i]["dateEnd"].toLocaleDateString() || currentDate.getTime() <= dateList[i]["dateEnd"].getTime())) {
                            todayText = todayText.concat("<h3>" + dateList[i]["title"] + "</h3><p class='datum'>" + currentDate.toLocaleDateString() + "</p><p class='align--left'>" + dateList[i]["text"] + "</p>"); // <a href class='url'>" + dateList[i]["url"] + "</a>
                        }
                    }
                    if (todayText == "") {
                        todayText = "<h3>" + todayText.concat(options.noEventsToday) + "</h3>";
                    }
                    $(".kalenderboxtxt").html(todayText);
                }
                // add day events
                $("#eventCalendarMonth .body .weekDatesContainer .pointer").each(function(){
                    $(this).click(function(){
						$("#eventCalendarMonth .body .weekDatesContainer .pointer").each(function(){
                                $(this).removeClass("currentDate");
                            })
                        $(this).addClass("currentDate");
                        clickedEventText = "";
                        selectedDate.setDate($(this).text());
                        $("#eventCalendarMonth .head .weekDay").text(weekday[selectedDate.getDay()]);
                        $("#eventCalendarMonth .currentDayContainer .dayOfMonth").text(selectedDate.getDate());
                        for (var i = 0; i <= dateList.length - 1; i++) {
							if ((selectedDate.toLocaleDateString() == dateList[i]["dateStart"].toLocaleDateString() || selectedDate.getTime() >= dateList[i]["dateStart"].getTime()) && (selectedDate.toLocaleDateString() == dateList[i]["dateEnd"].toLocaleDateString() || selectedDate.getTime() <= dateList[i]["dateEnd"].getTime())) {
                                clickedEventText = clickedEventText.concat("<h3>" + dateList[i]["title"] + "</h3><p class='datum'>" + weekday[selectedDate.getDay()] + ", " + selectedDate.getDate() + ". " + selectedDate.getMonthName() + " " + selectedDate.getFullYear() + "</p><p class='align--left'>" + dateList[i]["text"] + "</p>"); // <a href class='url'>" + dateList[i]["url"] + "</a>
                            }
                        }
                        if (clickedEventText == "") 
                            clickedEventText = "<h3>" + clickedEventText.concat(options.noEvents) + "</h3>";
                        $(".kalenderboxtxt").html(clickedEventText);
                    })
                });
            }
            // add paging events
            $("#eventCalendarMonth .head .smallPrev").click(function(){
                selectedDate.setMonth(selectedDate.getMonth() - 1);
                tempDate.setDate(1);
                tempDate.setMonth(tempDate.getMonth() - 1);
				pageChanged = true;
				$("#eventCalendarMonth").hide();
            	$(".contentCalendar div h2").after(options.loadingGif);
                parseXML();
            });
            // add hover event
            $("#eventCalendarMonth .head .smallPrev").hover(function(){
                $(this).addClass("hoverSmallPrev");
            }, function(){
                $(this).removeClass("hoverSmallPrev");
            });
            // add paging events
            $("#eventCalendarMonth .head .smallNext").click(function(){
                selectedDate.setMonth(selectedDate.getMonth() + 1);
                tempDate.setDate(1);
                tempDate.setMonth(tempDate.getMonth() + 1);
				pageChanged = true;
				$("#eventCalendarMonth").hide();
            	$(".contentCalendar div h2").after(options.loadingGif);
                parseXML();
            });
            // add hover event
            $("#eventCalendarMonth .head .smallNext").hover(function(){
                $(this).addClass("hoverSmallNext");
            }, function(){
                $(this).removeClass("hoverSmallNext");
            });
        });
    };
})(jQuery);
