(function($){
	var _old = $.unique;
 
	$.unique = function(arr){
		// do the default behavior only if we got an array of elements
		if (!!arr[0].nodeType){
			return _old.apply(this,arguments);
		} else {
			// reduce the array to contain no dupes via grep/inArray
			return $.grep(arr,function(v,k){
				return $.inArray(v,arr) === k;
			});
		}
	};
})(jQuery);


var apiUrl = '/api/json/';
var now = new Date();
var nowStr = dateFormat(now, 'yyyy-mm-dd');
var nowUrl = dateFormat(now, 'yyyy/mm/dd/');
var tomorrow = new Date();
tomorrow.setDate(tomorrow.getDate() + 1);
var tomorrowStr = dateFormat(tomorrow, 'yyyy-mm-dd');
var tomorrowUrl = dateFormat(tomorrow, 'yyyy/mm/dd/');
var times = [800, 945, 1130, 1300, 1400, 1545, 1730, 1915];


function addSpinner(element){
	$('<div class="spinner"></div>')
	.appendTo(element);
}

function addTag(elements, text){
	elements
		.append(' ')
		.append(
			$('<span class="tag"/>')
			.html(text)
		);
}

function formatDate(string){
	var date = new Date(Date.parse(string));
	return date.format('dd.mm.yyyy');
}

function formatDatetime(string){
	var date = new Date(Date.parse(string));
	return date.format('dd.mm.yyyy HH:MM') + ' Uhr';
}

function setCurrent(){
	var current_now = new Date();
	var current = current_now.getHours() * 100 + current_now.getMinutes();
	var index = 0;
	$.each(times, function(i, time){
		if (current < 800 || current > 2045){
			return false;
		} else if (current > time){
			index = i + 2;
		}
	});
	if (index === 0){
		return;
	}
	$('#schedule tbody td.current').removeClass('current');
	$('#schedule tbody td:nth-child(' + index + ')').addClass('current');
}

function mkInt(timeString){
	return parseInt(timeString.replace(':', '').replace(/^0/, ''), '');
}

function appendReschedule(fosArr, ulEle, item){
	var info = $('<div class="info"/>');
	var del = $('<del/>');
	fosArr.push(item.fos);
	if (item.date_new === '' && item.room_new === ''){
		del
			.append(formatDatetime(item.date_old))
			.append(' ')
			.append(item.room_old)
			.appendTo(info);
	}
	else if (item.date_old === '' && item.room_old === ''){
		$('<span class="new"/>')
			.html(formatDatetime(item.date_new) + ' ' + item.room_new)
			.appendTo(info);
	}
	else if (item.date_new != item.date_old && item.room_new != item.room_old){
		info
			.append(
				del
					.append(formatDatetime(item.date_old))
					.append(' ')
					.append(item.room_old)
			)
			.append(' ')
			.append(
				$('<span class="new"/>')
					.append(formatDatetime(item.date_new))
					.append(' ')
					.append(item.room_new)
			);
	}
	else if (item.date_new != item.date_old){
		info
			.append(
				del
					.append(formatDatetime(item.date_old))
					.appendTo(info)
			)
			.append(' ')
			.append(
					$('<span class="new"/>').append(formatDatetime(item.date_new))
			)
			.append(' ')
			.append(item.room_new);
	}
	else if (item.room_new != item.room_old){
		info
			.append(formatDatetime(item.date_old) + ' ')
			.append(
				del.append(item.room_old)
			)
			.append(
				$(' <span class="new"/>').append(item.room_new)
			);
	}
	$('<li/>')
		.append(
			$('<h3/>')
				.append($('<span class="tag"/>').html(item.fos))
				.append(' ')
				.append($('<span class="course"/>').html(item.course))
		)
		.append(info)
		.appendTo(ulEle);
}


$(document).ready(function(){
	var mensa = $('#mensa');
	var reschedules = $('#reschedules');
	var rooms = $('#rooms');
	var refreshInverval = setInterval(setCurrent, 30 * 1000);

	addSpinner(mensa);
	addSpinner(reschedules);
	addSpinner(rooms);

	$.ajax({
		url: apiUrl + 'mensa/' + nowUrl + 'next/',
		error: function(xhr, status, error){
			mensa.html('<div class="error">' + error + '</div>');
		},
		success: function(data){
			addTag($('#dishes-h'), formatDate(data.data_date));
			mensa.empty();
			if (data.items === false){
				mensa.html('<p><i>nix Mensa: Wochende</i></p>');
				return;
			}
			//if (data.items.length === 0){
				//mensa.html('<p><i>sorry grade keine Daten</i></p>');
				//return;
			//}
			var ulToday = $('<ul id="mensa-list"/>');
			var ulTomorrow = $('<ul id="mensa-list-tomorrow"/>');
			$.each(data.items, function(date, dishes){
				$.each(dishes.items, function(i, dish){
					var li = $('<li/>');
					li.html(dish.dish);
					if (dish.is_homemade){
						addTag(li, 'hausgemacht');
					}
					if (dish.is_vegetarian){
						addTag(li, 'vegetarisch');
					}
					if (date == nowStr){
						li.appendTo(ulToday);
					} else {
						li.appendTo(ulTomorrow);
					}
				});
			});
			mensa.empty();
			if (ulToday.find('li').length > 0){
				mensa.append(ulToday);
			}
			if (ulTomorrow.find('li').length > 0){
				mensa.append(ulTomorrow);
			}
		}
	});

	$.ajax({
		url: apiUrl + 'reschedules/' + nowUrl + 'next/',
		error: function(xhr, status, error){
			reschedules.html('<div class="error">' + error + '</div>');
		},
		success: function(data){
			//var dataLength = data.items.length;
			//var dataLengthTomorrow = dataTomorrow.items.length;
			//if (dataLength === 0 && dataLengthTomorrow === 0){
				//reschedules.html('<p><i>keine vorhanden</i></p>');
				//return;
			//}
			//if (dataLength > 0){
				//addTag($('#reschedules-h'), formatDate(data.data_date));
			//} else {
				//addTag($('#reschedules-h'), formatDate(dataTomorrow.data_date));
			//}
			addTag($('#reschedules-h'), formatDate(data.data_date));
			var fosArrToday = [];
			var fosArrTomorrow = [];
			var ulRescToday = $('<ul id="reschedules-list"/>');
			var ulRescTomorrow = $('<ul id="reschedules-tomorrow-list"/>');

			// append to uls
			$.each(data.items[nowStr], function(i, item){
				appendReschedule(fosArrToday, ulRescToday, item);
			});
			$.each(data.items[tomorrowStr], function(i, item){
				appendReschedule(fosArrTomorrow, ulRescTomorrow, item);
			});

			// setup field of study selector
			var fosSelectUl = $('<ul id="reschedules-selector"></ul>');
			// put today and tomorrow in one big unique sorted array
			var fosArr = $.unique(fosArrToday.concat(fosArrTomorrow)).sort();
			$.each(fosArr, function(i, item){
				var extraClasses = '';
				if (fosArrToday.indexOf(item) < 0){
					extraClasses += 'tomorrow-item';
				}
				fosSelectUl.append('<li class="' + extraClasses + '"><a href="#" class="tag">' + item + '</a></li> ');
			});
			fosSelectUl.find('a').click(function(event){
				event.preventDefault();
				var fos_a = $(this);
				fosSelectUl.find('a').removeClass('active');
				fos_a.addClass('active');
				$('#reschedules-list .tag, #reschedules-tomorrow-list .tag').parents('li').show();
				$('#reschedules-list .tag:not(:contains("' + fos_a.text() + '")), #reschedules-tomorrow-list .tag:not(:contains("' + fos_a.text() + '"))')
					.parent()
					.parent()
					.hide();
			});
			ulRescToday.find('li').hide();
			ulRescTomorrow.find('li').hide();
			reschedules.html(ulRescToday);
			reschedules.append(ulRescTomorrow);
			fosSelectUl.insertBefore(ulRescToday);
		}
	});

	$.ajax({
		url: apiUrl + 'rooms/' + dateFormat(now, 'yyyy/mm/dd/'),
		error: function(xhr, status, error){
			rooms.html('<div class="error">' + error + '</div>');
		},
		success: function(data){
			addTag($('#rooms-h'), formatDate(data.data_date));
			rooms.empty();
			if (data.items.length === 0){
				rooms.html('<p><i>keine vorhanden</i></p>');
				return;
			}
			var table = $('<table id="schedule"/>');
			table.append('<thead><tr><th></th><th>8:00</th><th>9:45</th><th>11:30</th><th>-</th><th>14:00</th><th>15:45</th><th>17:30</th><th>19:15</th></tr></thead>');
			var tbody = $('<tbody/>');
			var timetable;
			$.each(data.items, function(i, item){
				timetable = {};
				$.each(times, function(i, time){
					timetable[time] = true;
				});
				var tr = $('<tr/>');
				tr.append($('<th/>').html(item.room));
				$.each(item.schedule, function(j, schedule){
					var time_start = mkInt(schedule.time_start);
					// if class lies outside of timeframe: ignore
					if (time_start > times[times.length - 1] + 130 || time_start + schedule.periods * 60 < times[0]){
						return;
					}
					
					var index = $.inArray(time_start, times);
					if (index == -1){
						$.each(times, function(i, time){
							if (time_start > time){
								index = i;
							}
						});
						if (time_start > times[times.length - 1]){
							index = times.length - 1;
						} else if (time_start < times[0]){
							var length = time_start + schedule.periods * 120 - times[0];
							schedule.periods = Math.ceil(length / 60);
							start_time = times[0];
						}
					}
					var dateObj = new Date();
					dateObj.setHours(Math.floor(time_start / 100));
					dateObj.setMinutes(time_start % 100);
					dateObj.setMinutes(dateObj.getMinutes() + schedule.periods * 45);
					var time_end = dateObj.getHours() * 100 + dateObj.getMinutes();
					$.each(times, function(i, time){
						if (i >= index && time < time_end){
							timetable[times[i]] = false;
						}
					});
				});
				$.each(timetable, function(i, item){
					var td = $('<td/>');
					if (item){
						td.addClass('free');
					} else {
						td.addClass('unfree');
					}
					if (i == 1300){
						td.addClass('break');
					}
					td.appendTo(tr);
				});
				tr.appendTo(tbody);
			});
			table.append(tbody);
			rooms.html(table);
			setCurrent();
		}
	});

});


