/**
 * @author wukalischer
 */

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 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;
						})												
						
					}					
					
					function showEventDays() {
						$(xml).find("termin").each(function(i) {	
							var range = $(this).attr("days");	
							$("ul.displayWeek li[@id="+ $(this).children("datumStart").text() +"]").addClass("hasEvent");	
							$("ul.displayWeek li[@id="+ $(this).children("datumEnd").text() +"]").addClass("hasEvent");	
							
							/* den Bereich zwischen start- u. endtermin holen */
							$("ul.displayWeek li[id="+ $(this).children("datumStart").text() +"]").nextAll().slice(0,range-1).addClass("hasEvent");	
							$("ul.displayWeek li[id="+ $(this).children("datumEnd").text() +"]").prevAll().slice(0,range-1).addClass("hasEvent");				
							
						});	
					}
					
					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); 
			}
			
		});	
}	
