
function initCalendar(url) {
	var dat = new Date();	
	var datum = dat.getDate()+"."+(dat.getMonth()+1)+"."+dat.getFullYear();	
	var defaultCurrentDatum = dat.getDate()+"."+(dat.getMonth()+1)+"."+dat.getFullYear();
	var datumTag = dat.getDate();
	var tag = dat.getDay();
	var montagDatum = datumTag - (tag-1);
	var dienstagDatum = montagDatum + 1;
	var mittwochDatum = montagDatum + 2;
	var donnerstagDatum = montagDatum + 3;
	var freitagDatum = montagDatum + 4;
	var sonnabendDatum = montagDatum + 5;
	var sonntagDatum = montagDatum + 6;
	var calWeek = "";
	var year = dat.getFullYear();
	var monthName = dat.getMonthName();
	var wochendaten = new Array(montagDatum, dienstagDatum, mittwochDatum, donnerstagDatum, freitagDatum, sonnabendDatum, sonntagDatum);
	var up = true;
	var noEvents = "";
	var noEventsToday = "";
	var currentCalWeek = "";

	$.get(url, function(xml) {	
		/* Aktuelle Kalenderwoche setzen */
		$("span.calWeek").text(getCalWeek(dat.getFullYear(),(dat.getMonth()+1),dat.getDate()));
		$("span.monthName").text(monthName);
		$("span.year").text(year);
		currentCalWeek = getCalWeek(dat.getFullYear(),(dat.getMonth()+1),dat.getDate());
		/* Den Text für "keine Termine" sprachspezifisch aus der XML-Datei holen */
		noEvents = $(xml).find("noEvents[lang="+ $("html").attr("lang")+"]").text();		
		noEventsToday = $(xml).find("noEventsToday[lang="+ $("html").attr("lang")+"]").text();	
			
		showWeek();		 
	  
		/*Defaultanzeige der Termine für das aktuelle Datum (now) */		
		
		findTermin(defaultCurrentDatum);
				
		function updateWeekShow() {			
			$("ul.displayWeek").empty();			
			dat.getDate();						
			calWeek = getCalWeek(dat.getFullYear(),(dat.getMonth()+1),dat.getDate());
			monthName = dat.getMonthName();
			year = dat.getFullYear();					
			$("span.calWeek").text(calWeek);
			$("span.monthName").text(monthName);
			$("span.year").text(year);								
		}
		
		function updateEventShow() {
			$("div.displayEvents dl").empty();							
		}
		
		function showEventDays() {
			$(xml).find("termin").each(function(i) {	
				var range = $(this).attr("days");	
				var dateStart = $(this).children("datumStart").text().split(".").join("\\.");
				var dateEnd = $(this).children("datumEnd").text().split(".").join("\\.");
				
				$("#"+ dateStart).addClass("hasEvent");	
				$("#"+ dateEnd).addClass("hasEvent");
				
				/* den Bereich zwischen start- u. endtermin holen */
				$("#"+ dateStart).nextAll().slice(0,range-1).addClass("hasEvent");	
				$("#"+ dateEnd).prevAll().slice(0,range-1).addClass("hasEvent");				
				
			});	
		}
		
		function showWeek(up){
			var startEventArr = new Array();
			var endEventArr = new Array();	
			
			/* Daten sortieren */				
			$(xml).find("termin").each(function(i) {				
				var arrLength = $(xml).find("termin").length;													
				startEventArr[i] = Date.parse($(this).children("datumStart").text()).getTime();
				endEventArr[i] = Date.parse($(this).children("datumEnd").text()).getTime();				
			});		
			startEventArr.sort();
			endEventArr.sort();
			
			if (up == true) {
				dat.addDays(8).getDate();				
				updateWeekShow();						
			} else if (up == false){				
				dat.addDays(-6).getDate();				
				updateWeekShow();
			} else {
				dat.setDate(montagDatum);				
			}		
				
			for (i = 0; i < 7; i++) {	
				if (dat.getDate()+"."+(dat.getMonth()+1)+"."+dat.getFullYear() == datum) {	
					$("div ul.displayWeek").append("<li class=\"today\" id=\""+dat.getDate()+"."+(dat.getMonth()+1)+"."+dat.getFullYear()+"\"><a rel=\"heute\" href=\"#\"><span class=\"tagesdatum\">" + dat.getDate() + "</span><span class=\"tag\">" + dat.getDayName(true) + "</span></a></li>");
						
					$("ul.displayWeek li a").click(function(){																	
						return false;						
					});									
				} else {
					$("div ul.displayWeek").append("<li id=\""+dat.getDate()+"."+(dat.getMonth()+1)+"."+dat.getFullYear()+"\"><a href=\"#\"><span class=\"tagesdatum\">" + dat.getDate() + "</span><span class=\"tag\">" + dat.getDayName(true) + "</span></a></li>");
					
					$("ul.displayWeek li a").click(function(){						
						findTermin($(this).parents().attr("id"));						
						$(this).parents().siblings().removeClass("today");						
						$(this).parents().addClass("today");						
						if ($(this).parents().attr("class") == "today") {
							$(".eventCalendar div.displayEvents dl").html("<dt class=\"noEvents\">" + noEvents + "</dt><dd>&nbsp;</dd>");
						};	
						if ($(this).attr("rel") == "heute" && $(this).parents("li").attr("class") != "hasEvent today" && $(this).parents("li").attr("class") != "today hasEvent") {							
							$(".eventCalendar div.displayEvents dl").html("<dt class=\"noEvents\">" + noEventsToday + "</dt><dd>&nbsp;</dd>");
						};															
																
						return false;
					});												
					
				}					
				
				showEventDays();
				dat.addDays(1);							
									
			}
			
			/* Sonntag der aktuellen Woche mit dem letzten Termin vergleichen */			
			var currentSunday = dat.addDays(-1).getTime();
			var currentMonday = dat.addDays(-7).getTime();	
			var last = endEventArr[endEventArr.length-1];
			var first = startEventArr[0];			
			
			if (hasDatesInFuture(currentSunday,last) == false) {
				$("a.nextWeek").hide();
			} else {
				$("a.nextWeek").show();
			}			
			
			if ((hasDatesInPast(currentMonday,first) == false) && (currentCalWeek == $("span.calWeek").text())) {				
				$("a.prevWeek").hide();
			} else {
				$("a.prevWeek").show();
			}				
		}			
			
		/* Eine Kalenderwoche weiter schalten */
			$("a.nextWeek").click(function(){										
				showWeek(true);											
				return false;
			}
		);
		
		/* Eine Kalenderwoche zurück schalten */
		$("a.prevWeek").click (						
			function() {												
				showWeek(false);	
				return false;									
			}
		);
		
		/* Termine suchen und anzeigen */
		function findTermin(weekID) {			
			updateEventShow();	
			var weekIDmilli = Date.parse(weekID).getTime();				
			if(currentCalWeek == $("span.calWeek").text()) {
				$(".eventCalendar div.displayEvents dl").html("<dt class=\"noEvents\">" + noEventsToday + "</dt><dd>&nbsp;</dd>");	
			} else {
				$(".eventCalendar div.displayEvents dl").html("<dt class=\"noEvents\">" + noEvents + "</dt><dd>&nbsp;</dd>");
			}								
			$(xml).find("termin").each(function(i) {								
				var range = $(this).attr("days");	
				var startMilli = Date.parse($(this).children("datumStart").text()).getTime();
				var endMilli = Date.parse($(this).children("datumEnd").text()).getTime();
				if ($(this).children("datumStart").text() == weekID || $(this).children("datumEnd").text() == weekID || (startMilli < weekIDmilli && endMilli > weekIDmilli)) {					
					$(".eventCalendar div.displayEvents dl dt[class=noEvents]").hide();
					$(".eventCalendar div.displayEvents dl dt[class=noEvents]").next("dd").hide();
					var loc = $(this).find("location").text();
					if (loc!="")
						loc = ", " + loc;
					else
						loc = loc;
					if (range > 1) {												
						$("div.displayEvents dl").append("<dt class=\"eventDate black\">" + $(this).children("datumStart").text() + " - " + $(this).children("datumEnd").text() + "</dt><dd class=\"eventText\"><a href=\"" + $(this).find("url").text() + "\">" + $(this).find("text").text() + loc + "</a></dd>");
					}
					else {						
						$("div.displayEvents dl").append("<dt class=\"eventDate black\">" + $(this).children("datumStart").text() + "</dt><dd class=\"eventText\"><a href=\"" + $(this).find("url").text() + "\">" + $(this).find("text").text() + loc + "</a></dd>");
					}					
				}							
				
			});	
			
		}
		
		/* Gibt es noch Termine nach dem Sonntag dieser Woche? */
		function hasDatesInFuture (currentSunday,last) {
			return currentSunday < last;			
		}
		
		/* Gibt es noch Termine vor dem Montag dieser Woche? */		
		function hasDatesInPast (currentMonday,first) {			
			return currentMonday > first;			
		}
		
		
		/* Kalenderwoche berechnen, da die funktion getWeekOfYear() fehlerhaft ist */
		function getCalWeek(jahr,monat,tag) {
		  var datum=new Date(jahr,monat-1,tag); 
		  var jh=jahr+1; 
		  var kalwo=getCalDiff(datum,jh);
		  while(kalwo<1) { jh--; kalwo=getCalDiff(datum,jh); }
		  return kalwo;
		}
		
		function getCalDiff(datum,jahr) {
		  var d4j=new Date(jahr,0,4);
		  var wt4j=(d4j.getDay()+6)%7; 
		  var m1wjT=Math.floor(0.01+d4j.getTime()/864e5-wt4j); 
		  var datumT=Math.floor(0.01+datum.getTime()/864e5); 
		  return Math.floor(1+(datumT-m1wjT)/7); 
		}
		
	});	
}	

