var IE7_PNG_SUFFIX = ".png";
var calendarIsOpen = false;
var siteMenuIsOpen = false;

var flagOver = false;
var panelOver = false;

var timeoutID;
var anotherTimeoutID;

function log(msg)
{
	window.console && window.console.log(msg);
}

$(document).ready(
		function()
		{
			log('document ready.');
			/***************************************************************************************
			*										Site menu								 	   *
			***************************************************************************************/
			// Maybe put some easing in these transitions?
			function openSiteMenu()
			{
				if (!flagOver || !panelOver)
				{
					setMenuMaskHeight('340px');
					$('#navigation').animate(
							{
								left : '0px',
								top : '0px',
								opacity : 'show'
							}, 'slow');
					$('.navigationFlag').addClass('active');
					siteMenuIsOpen = true;
				}
			}

			function closeSiteMenu()
			{
				if (!flagOver && !panelOver)
				{
					var endX = '-' + $('.sliderPanel').css('width');
					var endY = '-' + $('.sliderPanel').css('height');
					$('#navigation').animate(
							{
								left : endX,
								top : endY,
								opacity : 'hide'
							}, 'slow', 'swing', siteMenu_onHideComplete);
					$('.navigationFlag').removeClass('active');
				}
			}

			function siteMenu_onHideComplete()
			{
				if(!calendarIsOpen)
				{
					setMenuMaskHeight('0px');
				}
				siteMenuIsOpen = false;
			}
			
			/***************************************************************************************
			*										Calendar								 	   *
			***************************************************************************************/
			function openCalendar()
			{
				if (!flagOver || !panelOver)
				{
					setMenuMaskHeight('340px');
					$('#calendar').animate(
					{
						left : '0px',
						top: '0px',
						opacity : 'show'
					}, 'slow', 'swing');
					$('.calendarFlag').addClass('active');
					calendarIsOpen = true;
				}
			}

			function closeCalendar()
			{
				if (!flagOver && !panelOver)
				{
					var endX = '-' + $('.sliderPanel').css('width');
					var endY = $('.sliderPanel').css('height');
					$('#calendar').animate(
					{
						left : endX,
						top : endY,
						opacity : 'hide'
					}, 'slow', 'swing', calendar_onHideComplete);
					$('.calendarFlag').removeClass('active');
				}
			}

			function calendar_onHideComplete(event)
			{
				if (!siteMenuIsOpen)
				{
					setMenuMaskHeight('0px');
				}
				calendarIsOpen = false;
			}


		//google.load("gdata", "1", {'callback' : initializeCalendar});


		function initializeCalendar()
		{
			var now = new Date();
			HOUR_DURATION = 1000 * 60 * 60;
			DAY_DURATION = HOUR_DURATION * 24;
			WEEK_0_START = new Date(now.getFullYear(), now.getMonth(), now.getDate() - now.getDay() + 1).getTime();
			if (now.getDay() == 6)
			{
				WEEK_0_START += DAY_DURATION * 7;
			}

			initializeTimeslots();
			$.datepicker.setDefaults($.datepicker.regional['de']);
			datepicker = $("#monthlyCalendar").datepicker(
				{
					onSelect : datepicker_select
				});

			calendarService = new google.gdata.calendar.CalendarService('GoogleInc-jsguide-1.0');

			$('.loginPanel .submitButton').click(submitAppointmentRequest);


			initializeCalendarSelection();
			loadInitialEvents();
		}
		function initializeCalendarSelection()
		{
			if (location.hostname.indexOf('kfo') == -1)
			{
				$('.calendarOptions input[value="zm"]').attr('checked', 'checked');
			}
			else
			{
				$('.calendarOptions input[value="kfo"]').attr('checked', 'checked');
			}
			$('.calendarOptions input[name="appointments"]').change(treatmentType_change);

			treatmentType_change();
		}

		function treatmentType_change()
		{
			var dropdown = $('.calendarOptions input[name="calSelection"]');
			dropdown.empty();

			if ($('.calendarOptions input[name="appointments"]').val() == 'zm')
			{
				dropdown.append()
			}
			loadEventsForWeek(0);
		}
		
		function datepicker_select(dateText, datepicker)
		{
			loadEventsForWeek(getWeekOffsetForDate($("#monthlyCalendar").datepicker('getDate')));
		}
		function submitAppointmentRequest()
		{
			var dayStart = weekStartTime + selectedTimeslot.day * DAY_DURATION;
			var startDate = new Date();
			startDate.setTime(dayStart + selectedTimeslot.start);
			var endDate = new Date();
			endDate.setTime(dayStart + selectedTimeslot.end);
			var data =
			{
				email : $('input[name="email"]').val(),
				pass : $('input[name="password"]').val(),
				date : startDate.getFullYear() + '-' + pad(startDate.getMonth() + 1) + '-' + pad(startDate.getDate()),
				start : pad(startDate.getHours()) + ':' + pad(startDate.getMinutes()),
				end : pad(endDate.getHours()) + ':' + pad(endDate.getMinutes())
			};
			$.post('/workspace/uploads/addAppointmentOption.php', data, function(data) {
				console.log(data);
				loadEventsForWeek(currentWeek);
			});
		}

		function initializeTimeslots()
		{
			var startDay = 0;
			var daysCount = 5;
			var dayStartTime = 9 * HOUR_DURATION;
			var dayEndTime = 21 * HOUR_DURATION;
			var timeslotDuration = 0.5 * HOUR_DURATION;

			var timeslotsCount = (dayEndTime - dayStartTime) / timeslotDuration;

			calendarDays = [];
			var table = $('#weeklyCalendar');
			for (var timeslotIndex = 0; timeslotIndex < timeslotsCount; timeslotIndex++)
			{
				var hour = (dayStartTime + timeslotIndex * timeslotDuration) / HOUR_DURATION;
				var minutes = (hour % 1) * 60;
				hour = Math.floor(hour);
				table.append("<tr><th scope='row' class='spec'>" + hour + ":" + pad(minutes) + "</th></tr>");
			}

			var calRows = $('#weeklyCalendar tr');

			for (var dayIndex = startDay; dayIndex < startDay + daysCount; dayIndex++)
			{
				var timeslots = [];
				calendarDays[dayIndex] = timeslots;
				for (var timeslotIndex = 0; timeslotIndex < timeslotsCount; timeslotIndex++)
				{
					$(calRows[timeslotIndex + 2]).
							append("<td><input type='radio' name='appointments' value=''/></td>")[0];
					var radio = $(calRows[timeslotIndex + 2]).find('td:last :radio');
					var startHour = dayStartTime + timeslotIndex * timeslotDuration;
					var timeslot =
					{
						day : dayIndex,
						start : startHour,
						end : startHour + timeslotDuration,
						radio : radio
					};
					radio.data('timeslot', timeslot);
					timeslots[timeslotIndex] = timeslot;
				}
				for (var timeslotIndex = timeslotsCount; timeslotIndex < timeslotsCount + 2; timeslotIndex++)
				{
				}
			}
			for (var dayIndex = startDay + daysCount; dayIndex < startDay + daysCount + 2; dayIndex++)
			{
				for (var timeslotIndex = 0; timeslotIndex < timeslotsCount; timeslotIndex++)
				{
					var cell = $(calRows[timeslotIndex + 2]).
							append("<td class='closed'></td>");
				}
			}

			$('#weeklyCalendar :radio').change(function()
			{
				selectedTimeslot = $(this).data().timeslot;
			});
		}

		function getWeekOffsetForDate(date)
		{
			var weekStart = new Date(date.getFullYear(), date.getMonth(), date.getDate() - date.getDay()).getTime();
			var weekOffset = Math.ceil((weekStart - WEEK_0_START ) / (DAY_DURATION * 7));
			return weekOffset;
		}

		function loadEventsForWeek(week)
		{
			currentWeek = week;

			calculateWeekStartTime();

			calsToLoad = 0;

			var feedUri = 'http://www.google.com/calendar/feeds/5bsu56bfls4u4g1f1ekh3f8vd8%40group.calendar.google.com/public/free-busy';
			var query = new google.gdata.calendar.CalendarEventQuery(feedUri);

			var endDate = new Date();
			endDate.setTime(weekStartDate.getTime() + DAY_DURATION * 5);
			query.setMinimumStartTime(new google.gdata.DateTime(weekStartDate));
			query.setMaximumStartTime(new google.gdata.DateTime(endDate));
			query.setOrderBy('starttime');

			calendarService.getEventsFeed(query, updateCalendar, handleEventsFeedError);
		}
		function calculateWeekStartTime()
		{
			weekStartTime = WEEK_0_START + currentWeek * 7 * DAY_DURATION;
			weekStartDate = new Date();
			weekStartDate.setTime(weekStartTime);

			//remove effects from switch to/ from DST
			if (weekStartDate.getHours() == 1)
			{
				weekStartDate.setHours(0);
			}
			else if (weekStartDate.getHours() == 23)
			{
				weekStartDate.setHours(0);
				weekStartDate.setDate(weekStartDate.getDate() + 1);
			}
			weekStartTime = weekStartDate.getTime();
		}
		function handleEventsFeedError(error)
		{
			alert(error);
		}

		function updateCalendar(feedRoot)
		{
			$('#weeklyCalendar :radio').attr('checked', false);
			
			updateTimeslots(feedRoot.feed.getEntries());

			var calRows = $('#weeklyCalendar tr');

			//apply dates
			var date = new Date(weekStartDate.getTime());
			var dateCols = $(calRows[1]).find('td');
			dateCols.each(function(dateIndex)
			{
				$(this).text(pad(date.getDate()) + '.' + pad(date.getMonth() + 1) + '.' + date.getFullYear());
				date.setTime(date.getTime() + DAY_DURATION);
			});

			$(calendarDays).each(function(dayIndex)
			{
				$(this).each(function(timeslotIndex)
				{
					var cell = $(calRows[timeslotIndex + 2]).find('td:eq(' + dayIndex + ')');
					cell.toggleClass('available', !this.busy);
					cell.toggleClass('busy', this.busy);
				});
			});
		}

		function updateTimeslots(blockingCal, alternativeBusyCals)
		{
			resetTimeslots();

			var cutoffDate = new Date();
			cutoffDate.setHours(0);
			cutoffDate.setTime(cutoffDate.getTime() + DAY_DURATION * 3);
			
			$.each(events, function(eventIndex, event)
			{
				var times = event.getTimes();
				$.each(times, function(timeIndex, time)
				{
					var startTime = time.getStartTime().getDate().getTime();
					var endTime = time.getEndTime().getDate().getTime();
					var date = new Date();
					date.setTime(startTime);
					date.setTime(endTime);
					$.each(calendarDays, function(dayIndex, day)
					{
						var dayStart = weekStartTime + dayIndex * DAY_DURATION;
						$.each(day, function(timeslotIndex, timeslot)
						{
							var start = dayStart + timeslot.start;
							var end = dayStart + timeslot.end;
							timeslot.busy = timeslot.busy ||
									start < cutoffDate || end < cutoffDate ||
									startTime <= start && endTime > start ||
									startTime < end && endTime >= end;
						});
					});
				});
			});
		}
		function resetTimeslots()
		{
			$.each(calendarDays, function(dayIndex, day)
			{
				$.each(day, function(timeslotIndex, timeslot)
				{
					timeslot.busy = false;
				});
			});
		}

			/***************************************************************************************
			*								General menu container							 	   *
			***************************************************************************************/
			function setMenuMaskHeight(newHeight)
			{
				if (!flagOver)
				{
					$('.sliderMenuMask').css(
					{
						'height' : newHeight
					});
				}
			}

			/***************************************************************************************
			*										Events									 	   *
			***************************************************************************************/

			/***
			 * navigation button - event handling
			 */
			$('.navigationFlag').hover(navigationButton_onRollOver, navigationButton_onRollOut);

			function navigationButton_onRollOver()
			{
				if (calendarIsOpen)
				{
					closeCalendar();
				}
				
				openSiteMenu();
				flagOver = true;
			}

			function navigationButton_onRollOut()
			{
				flagOver = false;
				timeoutID = window.setTimeout(closeSiteMenu, 500);
			}

			/***
			 * main menu area - event handling
			 */
			$('.sliderMenuMask').hover(sliderMenu_onRollOver, sliderMenu_onRollOut);

			function sliderMenu_onRollOver()
			{
				panelOver = true;
			}

			function sliderMenu_onRollOut()
			{
				panelOver = false;

				if (calendarIsOpen)
					timeoutID = window.setTimeout(closeCalendar, 500);

				if (siteMenuIsOpen)
					timeoutID = window.setTimeout(closeSiteMenu, 500);
			}

			/***
			 * calendar button - event handling
			 */
			$('.calendarFlag').hover(calendarButton_onRollOver, calendarButton_onRollOut);

			function calendarButton_onRollOver()
			{
				if (siteMenuIsOpen)
				{
					closeSiteMenu();
				}
				
				openCalendar();
				flagOver = true;
			}

			function calendarButton_onRollOut()
			{
				flagOver = false;
				timeoutID = window.setTimeout(closeCalendar, 500);
			}

			$('.quicknav').hover(function()
			{
				$('.quicknav_listMenu').slideToggle('fast');
			});

			/***************************************************************************************
			*										Term definitions						 	   *
			***************************************************************************************/
			$.getJSON("/termdefinitions/", function (data) {
				if (!data)
				{
					return;
				}
				
				terms = {};
				function linkTermOccurences(word, term)
				{
					var paragraphs = $('#content .rightColumn p').each(function(index)
					{
						var content = $(this).html();
						content = content.replace(new RegExp('(\\w*' + word + '\\w*)', 'gi'),
								'<a class="termLink" onmouseover="showTermDefinition(\'' + term +  '\', this)">$1<img src="/workspace/images/icons/info_icon.png" /></a>');
						$(this).html(content);
					});
				};
				$.each(data.terms, function(index)
				{
					terms[this.term] = this;
					linkTermOccurences(this.term, this.term);
					this.plural && linkTermOccurences(this.plural, this.term);
				});
			});

			/***************************************************************************************
			*						Inital display of the navigation menu 					 	   *
			***************************************************************************************/
            if (readCookie('menuShownOnce') == null)
            {
                setTimeout(openSiteMenu, 1000);
                setTimeout(closeSiteMenu, 2500);
                createCookie('menuShownOnce', true, 30);
            }
		});

function showTermDefinition(term, target)
{
	$('#termDefinitionLayer').remove();
	var termData = terms[term];
	definitionLayer = $('<div id="termDefinitionLayer"></div>');
	definitionLayer.append('<p><strong>' + (termData.title || termData.term) + ' </strong>' +
			termData.definition + '<p>');
	$(target).mousemove(function(event)
	{
		var border_top = $(window).scrollTop();
		var border_right = $(window).width();
		var left_pos;
		var top_pos;
		var offset = 15;
		if (border_right - (offset * 2) >= definitionLayer
				.width()
				+ event.pageX)
		{
			left_pos = event.pageX + offset;
		}
		else
		{
			left_pos = border_right
					- definitionLayer.width() - offset;
		}
		top_pos = event.pageY;

//		if (border_top + (offset * 2) >= event.pageY
//				- definitionLayer.height())
//		{
//			top_pos = border_top + offset;
//		}
//		else
//		{
//					- definitionLayer.height() - offset;
//		}
		definitionLayer.css(
		{
			left : left_pos,
			top : top_pos
		});
	});
	$(target).mouseleave(function(event)
	{
		$('#termDefinitionLayer').remove();
	});
	$("body").append(definitionLayer);
}

/***************************************************************************************
*										SlideShow								 	   *
***************************************************************************************/			
function startSlideShow()
{
	$('.slides').cycle({
		fx: 'scrollRight',
		timeout: 10000,
		speed: 1500,
		before: slide_beforeChange,
		after: slide_onChanged
	});
}

function slide_beforeChange(curr,next,opts) {
	$('.slideCaption').fadeOut(500);
}

function slide_onChanged(curr,next,opts) {
	$('.slideCaption').html(next.alt).fadeIn(500);
	
	$('.slideCount').empty();
	$('.slideCount').append('<img src="/workspace/images/slideshow_dotActive0' + (opts.currSlide + 1) + '.png" />');
}

function createTagCloud(elementID)
{
	$(document).ready(
	function ()
	{
		var element = document.getElementById(elementID);
		var params =
		{
			allowScriptAccess : 'always',
			wmode: 'transparent'
		}
		var variables =
		{
			tcolor: "0x333333",
			tcolor2: "0x999999",
			hicolor: "0x000000",
			tspeed: "100",
			distr: "true",
			mode: "tags",
			tagcloud: '<tags>'
		}
		var items = $(element).find('a');
		var serializedItems = [];
		items.each(function(index)
		{
			var size = parseInt(this.className.substr(5)) * 10;
			serializedItems[index] = '<a href="' + this.href + '" style="' + size + '">' + this.text + '</a>';
		});
		variables.tagcloud += serializedItems.join('');
		variables.tagcloud += '</tags>';
		swfobject.embedSWF("/workspace/js/tagcloud.swf", elementID, "290", "177", "9", null,
				variables, params, {}, onEmbed);
	});
	function onEmbed(result)
	{
		if (result.success)
		{
			result.ref.setAttribute('class', 'cloud');
			result.ref.setAttribute('className', 'cloud');
		}
	}
}

function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function eraseCookie(name) {
	createCookie(name,"",-1);
}


function setBackgroundImage()
{
    // TODO Background images des jeweiligen Hosts zeigen
	var bgImageIndex;
	var cookie = readCookie('bgImageIndex');
	if (cookie)
	{
		bgImageIndex = parseInt(cookie);
	}
	else
	{
		bgImageIndex = Math.floor(Math.random() * 3) + 1;
		createCookie('bgImageIndex', bgImageIndex, 0);
	}

    var imgUrl;
    var backCol;

	var rootUrl = location.host;

    if (rootUrl == 'www.kfo-stgeorg.de' || rootUrl == 'kfo-stgeorg.de'
		    || rootUrl == 'www.kfo-stgeorg.com' || rootUrl == 'kfo-stgeorg.com'
		    || rootUrl == 'www.kfo-sanktgeorg.de' || rootUrl == 'kfo-sanktgeorg.de')
    {
        console.log(location.host);
        imgUrl = 'url(/workspace/css/img/bwp_background_' + bgImageIndex + '_kfo.jpg)';
        backCol = '#55a6ce';
    }
    else
    {
        imgUrl = 'url(/workspace/css/img/bwp_background_' + bgImageIndex + '_zm.jpg)';
        backCol = '#ffffff';
    }
    document.body.style.backgroundColor = backCol;
    document.body.style.backgroundImage = imgUrl;
}


function pad(n)
{
	return n < 10 ? '0' + n : n
}
