Calendar = function(dataSource, eventServiceUrl)
{
	this.date = new Array();
	this.today = null;
	this.currentMonth = "#month";
	this.headline = "#events-head";
	this.eventPages = "#event-pages";
	this.eventContent = "#event-pre-content";
	this.dateDisplayFormat = "dd. M yy";
	this.dateTransferFormat = "yy-mm-dd";
	this.dataSource = dataSource;
	this.prev = null;
	this.next = null;
	this.eventServiceUrl = eventServiceUrl;
	
	this.init = function()
	{
		//--------------------------------------------------------------
		// Datum dieses Monats parsen
		this.today = $.datepicker.parseDate(this.dateTransferFormat, this.dataSource.date);
		var year = this.today.getYear() < 999 ? this.today.getYear() + 1900 : this.today.getYear();
		//--------------------------------------------------------------
		
		//--------------------------------------------------------------
		// Aktueller Monat anzeigen
		var md = $.datepicker.formatDate("MM yy", new Date(year, this.today.getMonth()), 1);
		$(this.currentMonth).html(md);
		//--------------------------------------------------------------
		
		//--------------------------------------------------------------
		// Datum für Preview und Next Button setzen
		var prevDate = new Date(year, this.today.getMonth() - 1, this.today.getDate());
		this.prev = $.datepicker.formatDate("yy-mm", prevDate);
		var nextDate = new Date(year, this.today.getMonth() + 1, this.today.getDate());
		this.next = $.datepicker.formatDate("yy-mm", nextDate);
		//--------------------------------------------------------------
		
		//--------------------------------------------------------------
		// Preview für die Termine zusammenbauen
		if (this.dataSource.data.length > 0)
		{
			this.printEvents();
		}
		else
		{
			$(this.headline).html("Keine Termine vorhanden.");
			$(this.eventContent).html("");
			$(this.eventPages).html("");
		}
		//--------------------------------------------------------------
	}
	
	this.printEvents = function()
	{
		var dataLen = this.dataSource.data.length;
		
		//--------------------------------------------------------------
		// Print preview of events
		var html = '';
		for (var i = 0; i < dataLen; i++)
		{
			var data = this.dataSource.data[i];
			var date = new Array();
			var time = new Array();
			
			var d = $.datepicker.parseDate(this.dateTransferFormat, data.date[0]);
			date.push($.datepicker.formatDate("DD d M", d).split(" "));
			
			if (data.date.length == 2)
			{
				var tempD = $.datepicker.parseDate(this.dateTransferFormat, data.date[1]);
				date.push($.datepicker.formatDate("dd.mm.yy", tempD));
				//var time = data.time[0] + " - " + date[1] + " " + data.time[1];
				var time = data.time[0] + " - " + date[1] + " " + "";
			}
			else
			{
				var time = data.time[0];
				if (data.time.length == 2)
				{
					time += " - " + data.time[1];
				}
			}
			html += '<div class="event">';
			html += '<div class="event-date">' + date[0][2] + '<p>' + date[0][1] + '</p></div>';
			html += '<div class="event-day">' + date[0][0] + ' ' + time + '</div>';
			html += '<div class="event-title"><a href="' + data.url + '">' + data.title + '</a></div>';
			html += '</div>';
		}
		$(this.eventContent).html(html);
		//--------------------------------------------------------------
		
		//--------------------------------------------------------------
		// Print headline
			var from = this.transformToDisplayFormat(this.dataSource.data[0].date);
			var to = this.transformToDisplayFormat(this.dataSource.data[dataLen - 1].date);
			$(this.headline).html(from + " - " + to);
		//--------------------------------------------------------------
		
		
		//--------------------------------------------------------------
		// Print page numbers
		var page = this.dataSource.page;
		var pages = this.dataSource.pages;
		var html = '';
		var maxN = 2;
		
		if (page > 1)
		{
			html += this.pageNumber(page - 1, '&lt;');
		}
		if (page > maxN + 1)
		{
			html += this.pageNumber(1, 1);
			if (page > maxN + 2)
			{
				html += " ... ";
			}
		}
		
		if (page > 1)
		{
			for (var i = page - maxN >= 1 ? page - maxN : 1; i < page; i++)
			{
				html += this.pageNumber(i, i);
			}
		}
		
		html += "<span>" + page + "</span>";
		
		if (page < pages)
		{
			for (var i = (page + 1) <= pages ? page+1 : pages; i <= page + maxN && i <= pages; i++)
			{
				html += this.pageNumber(i, i);
			}
		}
		
		if (page <= pages - (maxN + 1))
		{
			if (page <= pages - (maxN + 2))
			{
				html += " ... ";
			}
			html += this.pageNumber(pages, pages);
		}
		if (page < pages)
		{
			html += this.pageNumber(page + 1,'&gt;');
		}
		$(this.eventPages).html(html);
		//--------------------------------------------------------------
	}
	
	this.pageNumber = function(p, name)
	{
		return '<a href="javascript:calendar.goto({p:' + p + '});">' + name + '</a>';
	}
	
	this.transformToDisplayFormat = function(value)
	{
		var d = $.datepicker.parseDate(this.dateTransferFormat, value);
		return $.datepicker.formatDate(this.dateDisplayFormat, d);
	}
	
	this.prevMonth = function()
	{
		this.goto({month: this.prev, p: 1});
	}
	
	this.nextMonth = function()
	{
		this.goto({month: this.next, p: 1});
	}
	
	this.goto = function(t)
	{
		var pMonth = null;
		var pPage = null;
		
		//--------------------------------------------------------------
		// Parameter prüfen
		if (t.month == undefined)
		{
			pMonth = $.datepicker.formatDate("yy-mm", this.today);
			if (t.p > this.dataSource.pages)
			{
				pPage = this.dataSource.pages;
			}
		}
		else
		{
			pMonth = t.month;
		}
		
		if (t.p < 1)
		{
			pPage = 1;
		}
		else
		{
			pPage = t.p;
		}
		//--------------------------------------------------------------

		outerThis = this;
		
		$.ajax(
		{
			url: this.eventServiceUrl,
			type: "POST",
			data: {month: pMonth, page: pPage},
			dataType: "json",
			success: function(data)
			{
				if (data == null)
				{
					alert("Keine Daten erhalten. DRECK!");
				}
				else
				{
					outerThis.dataSource = data;
					outerThis.init();
				}
			},
			error: function(xhr, text)
			{
				alert("Verbindung zum Server fehlgeschlagen!\nError: " + text);
			}
		});
	}
}

$(document).ready(function()
{
	jQuery(function($){
        $.datepicker.regional['de'] = {clearText: 'löschen', clearStatus: 'aktuelles Datum löschen',
                closeText: 'schließen', closeStatus: 'ohne Änderungen schließen',
                prevText: '&#x3c;zurück', prevStatus: 'letzten Monat zeigen',
                nextText: 'Vor&#x3e;', nextStatus: 'nächsten Monat zeigen',
                currentText: 'heute', currentStatus: '',
                monthNames: ['Januar','Februar','März','April','Mai','Juni',
                'Juli','August','September','Oktober','November','Dezember'],
                monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun',
                'Jul','Aug','Sep','Okt','Nov','Dez'],
                monthStatus: 'anderen Monat anzeigen', yearStatus: 'anderes Jahr anzeigen',
                weekHeader: 'Wo', weekStatus: 'Woche des Monats',
                dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],
                dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'],
                dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'],
                dayStatus: 'Setze DD als ersten Wochentag', dateStatus: 'Wähle D, M d',
                dateFormat: 'dd.mm.yy', firstDay: 1, 
                initStatus: 'Wähle ein Datum', isRTL: false};
        $.datepicker.setDefaults($.datepicker.regional['de']);
	});
	$("#event-navigation a.nav").first().css("font-weight", "bold");	
	calendarNavigation();
	slider("#slider");

	$("ul.mainnav li ul.subnav").map(function()
	{
		$(this).find("li").last().css("-moz-border-radius-bottomleft","10px");
		$(this).find("li").last().css("-moz-border-radius-bottomright","10px");
		$(this).find("li").last().css("border-bottom-left-radius","10px");
		$(this).find("li").last().css("border-bottom-right-radius","10px");
		$(this).find("li").last().css("border-bottom","0");
	});

	// Beschreibung der Reiter zentrieren.
	if ($("ul.bottomnav li a span").length > 0)
	{
		$("ul.bottomnav li a span").each(function()
		{
			var height = $(this).css("height");
			height = height.substr(0, height.length - 2);
			$(this).css("margin-top", height/2 * -1);
		});
	}
	
	$("ul.mainnav li").mouseover(function() 
	{				
		//Dropdown?
		if ($(this).find("ul.subnav").length != 0)
		{
			var menuHead = $(this);
			if (!menuHead.hasClass("mainnavmenu"))
			{
				menuHead.addClass("mainnavmenu");
				menuHead.find("ul.subnav").slideDown('fast').show();
			}
		}
		
		$(this).hover(function(){}, 
			function()
			{
				$(this).find("ul.subnav").slideUp('fast').queue(function()
				{
					menuHead.removeClass("mainnavmenu");
					$(this).dequeue();
				});
			}
		);
	});
	
	//Browserweiche für FF
	if (navigator.userAgent.toLowerCase().indexOf("firefox/4.0b") > -1)
	{
		$("ul.bottomnav li").css("margin-top","7px");
	}
});

function calendarNavigation()
{	
	$("#event-navigation a.nav").click(function(){
		$("#event-navigation a.nav").css("font-weight", "normal");
		$(this).css("font-weight", "bold");
	});
}

function slider(el)
{
	if ($(el + " img").size() >= 2)
	{
		var parent = $(el).parent();
		parent.html(parent.html() + '<div id="slider-info"></div>');
		
		$(el).cycle({
			fx: 'fade',
			before: function()
			{
				if($("#slider-info").size() > 0)
				{
					$("#slider-info").html(this.alt);
				}
			},
			speed: 1000,
			timeout: 6000		
		});
	}
}

function popup(url, title, width, height)
{
	window.open(url, title, 'width=' + width + ',height=' + height + 'status=yes,scrollbars=yes,resizeable=yes');
}

function printPage(printbar)
{
	$("#printbar").css("display", "none");
	focus();
	window.print();
}

function showInfo(type, messages)
{
	$("#info-message").css("display", "none");
	if (type == "error")
	{
		$("#info-message").removeClass("info-message-ok");
		$("#info-message").addClass("info-message-error");
	}
	else if (type == "ok")
	{
		$("#info-message").removeClass("info-message-error");
		$("#info-message").addClass("info-message-ok");
	}
	
	var msg = "<ul>";
	for (var i = 0; i < messages.length; i++) 
	{
		msg += "<li>" + messages[i] + "</li>";
	}
	msg += "</ul>";
	
	$("#info-message").html(msg);
	$("#info-message").slideDown("slow").delay(5000).slideUp("slow");
}

var lastMailSend = 0;

function sendMail(dest)
{
	var errors = new Array();
	var items = new Array(6);
		
	items["name"] = $('#name').attr("value");
	items["email"] = $('#email').attr("value");
	items["subject"] = $('#subject').attr("value");
	items["receiver"] = $('#receiver').attr("value");
	items["message"] = $('#message').attr("value");
	items["sendCopy"] = $('#sendCopy').attr("checked");
	
	if ($.trim(items["name"]).length == 0)
	{
		errors.push("Sie müssen einen Namen eingeben.\n");
	}
	var regex = new RegExp("^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$");
	if (!regex.test(items["email"]))
	{
		errors.push("Sie müssen eine gültige E-Mail Adresse angeben.\n");
	}
	if ($.trim(items["subject"]).length == 0)
	{
		errors.push("Sie müssen einen Betreff eingeben.\n");
	}
	if ($.trim(items["message"]).length == 0)
	{
		errors.push("Sie müssen eine Nachricht eingeben.\n");
	}
	
	if (errors.length == 0)
	{
		var time = new Date();
		if (lastMailSend == 0 || (time.getTime() - lastMailSend) > 3000)
		{
			lastMailSend = time.getTime();
			
			$.ajax(
			{
				url: dest,
				type: "POST",
				data: $("#contactform").serialize(),
				dataType: "text",
				success: function (data)
				{
					if (data.indexOf("error") > 0)
					{
						showInfo("error", new Array("Nachricht wurde nicht versendet, da ein Fehler aufgetreten ist."));
					}
					else if (data.indexOf("ok") > 0)
					{
						showInfo("ok", new Array("Die Nachricht wurde versendet."));
					}
					else
					{
						alert("Es ist ein unbekannter Fehler aufgetreten.\nDEBUG: " + data);
					}
				},
				error: function ()
				{
					alert("Die Nachricht konnte nicht versendet werden.\n(Server nicht erreichbar?)");
				}
			});
		}
	}
	else
	{
		showInfo("error", errors);
	}
	
	return false;
}


