window.setInterval(reloadHistory, 500);
$(document).ready(function(){
	//toggle menu
	$('a#toggle').bind('mouseover click', function(e){
		var ul = $('#navigation-meta').find('ul');
		if( ul.is('animated') ){
			ul.stop();
		}
		ul.slideDown(300);
		return false;
	});
	
	//hide menu on mouse leave
	$('#navigation-meta').mouseleave(function(e){
		var ul = $(this).find('ul');
		if( ul.is('animated') ){
			ul.stop();
		}		
		ul.slideUp(300);
	});
	
	/*
	 * FULLTEXT 
	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
	
	//click on fulltext input
	$('#query').live('click', function(e){
		if( $(this).val() == 'Suchbegriff eingeben ...' ){
			$(this).val('');
		}
		return false;
	});	
	
	//reset default input value
	$('#query').live('blur', function(e){
		if( $(this).val() == '' ){
			$(this).val('Suchbegriff eingeben ...');
		}
	});
	
	$('input.submit').live('click', function(){
		var currHistArr = [];
		if(currHist != ''){
			currHistArr = currHist.split('|');
		}
		currHistArr[2] = $('#query').val();
		currHist = currHistArr.join('|');
		prevHist = currHist;		
		updateList(1);
		return false;
	});
	
	//reset fulltext search
	$('#resetQ').live('click', function(){
		if($('#query').val() != 'Suchbegriff eingeben ...' && $('#query').val() != ''){
			$('#query').val('Suchbegriff eingeben ...');
			var currHistArr = [];
			if(currHist != ''){
				currHistArr = currHist.split('|');
			}
			currHistArr[2] = undefined;
			currHist = currHistArr.join('|');
			prevHist = currHist;
			updateList(1);			
		}
		return false;
	});
	
	/*
	 * TOGGLE  
	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
	
	//open/close toggle element
	$('div.toggle .header').click(function(e){
		
		var more 	= $(this).find('.more');
		var less 	= $(this).find('.less');
		var content = $(this).next();
		
		if( more.is(':visible') ){
			more.hide();
			less.show();
			content.slideDown(350);
		}else{
			more.show();
			less.hide();
			content.slideUp(250);
		}
		
		return false;
	});	
	
	
	/*
	 * CRITERIA
	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

	//open filter criteria
	$('#open-selection, #reopen-selection').click(function(e){
		
		$('#filter').fadeOut(250, function(){
			
			//fadin my critera
			$('#mycriteria').fadeIn(400);
			
			//show helper div with white bg to overlay incoming selection
			$('#overlay').show();
			
			//show criteria
			$('#selection')
				.animate({right:234},500)
				.addClass('open');
		});
		
		if( $(this).attr('id') == 'reopen-selection' ){
			$(this).fadeOut(150);
		}else{
			//fade out sidebar
			$('.news, .recommendations').fadeOut();
		}
		
		return false;
	});
	
	//close filter criteria
	$('#close-selection').click(function(e){
		
		var count = $('#criteria input:checked').length;
		
		$('#selection').animate({right:-960},350, function(){
			$('.news, .recommendations').fadeIn();
			$(this).removeClass('open');
		});
		
		$('#reopen-selection').fadeIn();
		
		return false;
	});

	//add items to mycriteria
	$('#criteria input').click(function(e){
		
		var count = $('#criteria input:checked').length;

		if( count == 0 ){
			$('#mycriteria p').fadeIn();
			$('#mycriteria ul').remove();
		}else{
		
			if(count == 1){
				$('#mycriteria p').hide();
				$('#mycriteria').append( $('<ul>') );
			}

			var li = '<li><a href="#" rel="'+ $(this).attr('id') +'">'+ $(this).parent().text() +'</a></li>';
			
			$('#mycriteria ul').append( li );
			
		}
				
		$.ajax({
			type: "POST",
			url: "/datasources/criteria.php",
			data: "id=" + $(this).attr('id') + "&name=" + $(this).parent().text() + "&ds=criteria&category=" + $(this).parents("fieldset").attr('class') + "&action=add",
			success: function(){
				updateList(1);
			}
		});
		
		//fadeout label
		$(this).parent().fadeOut();
		
		var selection = $('#criteria input:checked');
		var currHistArr, tmpArr = [];
		currHistArr = currHist.split('|');
		selection.each(function(i){
			tmpArr.push('{"id": "' + $(this).attr('id') + '", "name": "' + $(this).parent().text() + '", "category": "' + $(this).parents("fieldset").attr('class') + '"}');
		});
		currHistArr[3] = tmpArr.join(',');
		currHist = currHistArr.join('|');
		prevHist = currHist;
		changeHistory();
	});

	//remove items
	$('#mycriteria li a').live('click', function(e){
		
		//fade out and uncheck input
		$('#'+$(this).attr('rel'))
			.removeAttr('checked')
			.parent()
			.fadeIn();		

		//remove li
		$(this).parent().remove();
		
		//if emtpy show message, remove ul
		var count = $('#criteria input:checked').length;
		if( count == 0 ){
			$('#mycriteria p').fadeIn();
			$('#mycriteria ul').remove();
		}
		
		$.ajax({
			type: "POST",
			url: "/datasources/criteria.php",
			data: "id=" + $(this).attr('rel') + "&name=" + $(this).parent().text() + "&ds=criteria&category=" + $(this).attr('rel').split('-')[0] + "&action=remove",
			success: function(){
				updateList(1);
			}
		});
		
		var currHistArr = [];
		currHistArr = currHist.split('|');
		var selectedCriteria = eval('({"crit":[' + currHistArr[3] + ']})');
		var mycrit = selectedCriteria.crit;
		var currCrit = [];
		for(var i = 0; i < mycrit.length; i++){
			if(mycrit[i].name !=  $(this).parent().text()){
				currCrit.push('{"id": "' + mycrit[i].id + '", "name": "' + mycrit[i].name + '", "category": "' + mycrit[i].category + '"}');
			}
		}
		currHistArr[3] = currCrit.join(',');
		currHist = currHistArr.join('|');
		prevHist = currHist;
		changeHistory();
		
		if( !$('#selection').hasClass('open') ){
			//opt. animate
		}
		
		return false;
	});
	
	/*
	 * CATEGORIES
	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
	
	//load categories result via AJAX
	$('ul.categories li a').live('click', function(){
		var url = $(this).attr('href');
		var catId = $(this).parent().attr('id');
		selArr = url.substr(1, url.length-2).split('/');
		$.cookie('selArr', selArr);
		var currHistArr = [];
		if(currHist != ''){
			currHistArr = currHist.split('|');
		}
		currHistArr[0] = catId;
		currHistArr[1] = selArr;
		currHist = currHistArr.join('|');
		prevHist = currHist;
		var h1 = $('#categories h1');
		// set up DOM
		h1.attr('id', 'category-results');
		$('ul.categories').remove();
		$('#categories h1 a').html('Ergebnisse in diesen Kategorien');
		h1.after('<ul class="subcategories"></ul>');
		h1.after('<div id="category-helper">Das Ergebnis kann über die Unter- kategorien weiter eingeschränkt werden.</div>');
		h1.after('<ul class="categories-selection"></ul>');
		$('ul.subcategories').addClass('loader');
		$('ul.categories-selection').append('<li><a>' + $(this).text() + '</a></li>');
		// insert selected category link
		$.getJSON('/datasources/categoriesSelected.php?ds=categoriesSelected&sel=' + selArr, function(data){
			$('ul.categories-selection > li a').attr('href', data[0].category_link);
		});
		// update search result
		updateList(1);
		// insert subcategories
		$.getJSON('/datasources/categories.php?ds=categories&moi=' + catId + '&sel=' + selArr, function(data){
			var list = '';
			for(i in data){
				list += '<li class="' + data[i].row + '" id="f' + data[i].obj_id + '"><a href="' + data[i].category_link + '">' + data[i].name + '</a></li>';
			}
			$('ul.subcategories').removeClass('loader').hide().append(list).fadeIn();
		});
		return false;
	});
	
	//load subcategories result via AJAX
	$('ul.subcategories li a').live('click', function(){
		var url = $(this).attr('href');
		var catId = $(this).parent().attr('id');
		selArr = url.substr(1, url.length-2).split('/');
		$.cookie('selArr', selArr);
		var currHistArr = [];
		if(currHist != ''){
			currHistArr = currHist.split('|');
		}
		currHistArr[0] += ','+catId;
		currHistArr[1] = selArr;
		currHist = currHistArr.join('|');
		prevHist = currHist;
		var h1 = $('#categories h1');
		$('ul.subcategories').fadeOut().empty();
		$('ul.subcategories').addClass('loader');
		// insert selected categories
		$.getJSON('/datasources/categoriesSelected.php?ds=categoriesSelected&sel=' + selArr, function(data){
			if(data){
				$('ul.categories-selection').empty();
				var list = '';
				for(var i = 0; i < data.length; i++){
					list += '<li><a href="' + data[i].category_link + '">' + data[i].name + '</a></li>';
				}
				$('ul.categories-selection').append(list);
			}
		});
		// update search result
		updateList(1);
		// insert subcategories if any
		$.getJSON('/datasources/categories.php?ds=categories&moi=' + catId + '&sel=' + selArr, function(data){
			if(data){
				var list = '';
				for(i in data){
					list += '<li class="' + data[i].row + '" id="f' + data[i].obj_id + '"><a href="' + data[i].category_link + '">' + data[i].name + '</a></li>';
				}
				$('ul.subcategories').removeClass('loader').hide().append(list).fadeIn();
			}
		});
		return false;
	});
	
	//remove selections via AJAX
	$('ul.categories-selection li a').live('click', function(){
		var url = $(this).attr('href');
		selArr = url.substr(1, url.length-2).split('/');
		$.cookie('selArr', selArr);
		var clickIndex = $('ul.categories-selection li').index($(this).parent());
		var cnt = 0;
		$('ul.categories-selection li').each(function(i){
			if(i >= clickIndex){
				$(this).remove();
				cnt++;
			}
		});
		var currHistArr = [];
		if(currHist != ''){
			currHistArr = currHist.split('|');
		}
		catId = currHistArr[0];
		if(catId){
			catId = catId.split(',');
			for(var i = 1; i <= cnt; i++){
				catId.pop();
			}
			currHistArr[0] = catId.join(',');
		}
		currHistArr[1] = selArr;
		currHist = currHistArr.join('|');
		prevHist = currHist;	
		$('ul.subcategories').fadeOut().empty();
		$('ul.subcategories').addClass('loader');
		// update search result
		updateList(1);
		// update categories & subcategories
		$.getJSON('/datasources/categories.php?ds=categories&sel=' + selArr, function(data){
			if(data){
				$.getJSON('/datasources/categoriesSelected.php?ds=categoriesSelected&sel=' + selArr, function(dataSel){
					if(dataSel){
						var list = '';
						for(var i = 0; i < data.length; i++){
							list += '<li class="' + data[i].row + '" id="f' + data[i].obj_id + '"><a href="' + data[i].category_link + '">' + data[i].name + '</a></li>';
						}
						$('ul.subcategories').hide().append(list).removeClass('loader').fadeIn();
					} else {
						$('#categories h1').attr('id', '');
						$('ul.categories-selection').remove();
						$('#category-helper').remove();
						$('ul.subcategories').remove();
						$('#categories h1').after('<ul class="categories"></ul>');
						var list = '';
						for(var i = 0;i < data.length; i++){
							list += '<li class="' + data[i].row + '" id="f' + data[i].obj_id + '"><a href="' + data[i].category_link + '">' + data[i].name + '</a></li>';
						}
						$('ul.categories').hide().append(list).fadeIn();
					}
				});
			}
		});
		return false;
	});
	
	
	/*
	 * PAGING
	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
	
	// capture paging clicks
	$('#paging a').live('click', function(){
		var pagenumArr = $(this).attr('href').split('/');
		var pagenum = pagenumArr[pagenumArr.length-1];
		updateList(parseInt(pagenum, 10));
		$('html, body').animate({scrollTop:0}, 700);
		return false;
	});
	
});

function debug(v){
	if( console ){ console.log(v); }
}

function resetCriteria(){
	$('#criteria input').removeAttr('checked');
}

// update search result listing
var currHist = window.location.hash;
var selArr = [];
var searchResultData = null;
var total = null;
var offset = 25;
var current = 1;
function updateList(current){
	var search = $('#search');
	var hide = $('div.hide', '#content');
	if($.cookie('selArr')){
		selArr = $.cookie('selArr');	
	} else {
		selArr = '';
	}
	changeHistory();
	$('#content').empty().append(hide).append(search);
	$('#search').after('<div class="hide"><a name="wai_content">Inhalt:</a><br /></div><!-- list --> <div id="results" class="loader"><div class="search-header"><p></p></div></div>');
	$.getJSON('/datasources/searchresult.php?ds=searchresult&sel=' + selArr + '&q=' + $('#query').attr('value') + '&curr=' + current, function(data){
		if(data){
			total = data.resultCount;
			delete data.resultCount;
			searchResultData = data;
			var selection = $('#criteria input:checked');
			var selected = [];
			for(var i = 0; i < selection.length; i++){
				selected.push(selection[i].nextSibling.nodeValue);
			}
			$('div.search-header').after('<div id="courses"></div><div id="paging"><div class="prev"></div><div class="current"></div><div class="next"></div></div>');
			var searchHeaderText = '<p>Ihre Suche';
			if($('#query').attr('value') != '' && $('#query').attr('value') != 'Suchbegriff eingeben ...'){
				searchHeaderText += ' nach <b>' + $('#query').attr('value') + '</b>';
			}
			selText = [];
			$('ul.categories-selection li').each(function(){
				selText.push($(this).find('a').text());
			});
			if(selArr && selArr.length){
				searchHeaderText += ' ergab <b>' + total + '</b> Treffer in der Kategorie <b><span>' + selText[selText.length-1] + '</span></b>.</p>';
			} else {
				searchHeaderText += ' ergab <b>' + total + '</b> Treffer.</p>'; 				
			}
			if(selection.length){
				searchHeaderText += '<br>Folgende Filterkriterien wurden gesetzt: <b>' + selected.join(', ') + '</b></p>';
			}
			searchHeaderText += '<p><a href="/home.php">Suche zur&uuml;cksetzen</a></p>';
			$('div.search-header').empty().append(searchHeaderText);
			if(total > offset && !selection.length){
				$('div.search-header').append('<p class="search-notice">Die Suche kann über Kategorien und Filterkriterien weiter engeschränkt werden.</p>');
			}
			if(selText.length){
				$('div.search-header').after('<h2><span>' + selText[0] + '</span> </h2>');	
			}
			if(selText.length > 1){
				var tmpStr = '';
				for(var i = 1; i <= selText.length-1; i++){
					tmpStr += selText[i] + ' &raquo; ';
				}
				$('#results h2').append(' &raquo; ' + tmpStr.substr(0, tmpStr.length-9));
			}
			showResults(current);
		} else {
			$('#results').removeClass('loader');
			$('div.search-header').html('<p>Die Suche ergab leider keine Treffer. <br /> <br />Durch das Ändern des Suchbegriffes oder das Entfernen von Kategorien, kann die Suche erweitert werden.</p>');
		}
	});
}

function showResults(current){	
	var data = searchResultData;
	var list = '';
	var index = offset * (current - 1);
	paging(current);
	
	for(var i in data){
		var row = (i%2 == 0 ) ? 'odd' : 'even';
		var inhalt = (data[i].inhalt) ? data[i].inhalt.substr(0, 150) : 'Keine Einleitung vorhanden';
		list += '<!-- item --><div class="course ' + row + '"><h2>' + data[i].studium + '</h2><b>' + data[i].typ + '&nbsp;&raquo;&nbsp;' + data[i].ort + '</b><p>' + inhalt + '&hellip; <a href="' + data[i].detailLink + '">Mehr</a></p></div><!-- item -->';
	}
	$('#results').removeClass('loader');
	$('#courses').hide().empty().append(list).fadeIn();
}

function paging(current){
	var data = searchResultData;
	var pagelist = '';
	var sum = Math.floor(total/offset)+1;

	if(current > sum){
		current = sum;
	}

	if(current > 1){
		var prev = '<a href="' + (current - 1) + '">Zurück</a>';
	} else {
		var prev = 'Zurück';
	}

	if(current < sum){
		var next = '<a href="' + (current + 1) + '">Weiter</a>';
	} else {
		var next= 'Weiter';
	}

	//calculate start and end pages in paging
	var start = (current <= 2) ? 1 : current - 2;
	var end = (current >= sum - 2) ? sum : current + 2;

	for(var i = start; i <= end; i++) {
		if (i == current) {
			pagelist += '<b>' + i + '</b>';
		} else {
			pagelist += '<a href="/studien/' + i + '">' + i + '</a>';
		}
	}

	//show ... at the end
	if(current < (sum-2)){
		pagelist += '&hellip;';
	}
	$('#paging').find('div.prev').html(prev);
	$('#paging').find('div.next').html(next);
	$('#paging').find('div.current').html('Seite: ' + pagelist);
}

function changeHistory(){
	if(currHist!='|' || currHist!='||' || currHist!='|||'){
		window.location.hash = currHist;	
	} else {
		window.location.hash = '';	
	}
}

var prevHist = window.location.hash;
function reloadHistory(){
	if(prevHist != window.location.hash.substr(1, window.location.hash.length)){
		prevHist = window.location.hash.substr(1, window.location.hash.length);
		currHist = prevHist;
		currHistArr = currHist.split('|');
		if(currHistArr[1] != undefined){
			selArr = currHistArr[1];			
		} else {
			selArr = [];
		}
		$.cookie('selArr', selArr);

		var catId = currHistArr[0];
		if(catId.indexOf(',') > 0){
			catId = catId.split(',');
			catId = catId.pop();
		}
		
		if(currHistArr[2]){
			$('#query').val(currHistArr[2]);
		} else {
			$('#query').val('Suchbegriff eingeben ...');
		}
		
		if(currHistArr[3]){
			loadCriteria(currHistArr[3]);
		} else {
			resetCriteria();
		}
		
		if(catId){
			loadSearchstate(catId);
		} else {
			resetState();
		}
		
		updateList(1);
	}
}

function loadCriteria(hist){
	var prevSel = [];
	var thisSel = [];
	$('#criteria input:checked').each(function(){
		$(this).attr('checked', false);
	});
	$.ajax({
		type: "POST",
		url: "/datasources/criteria.php",
		data: "ds=criteria&action=flush&crit=[" + hist + "]"
	});
	var selectedCriteria = eval('({"crit":[' + hist + ']})');	
	var mycrit = selectedCriteria.crit;

	$('#mycriteria ul li').each(function(){
		prevSel.push($(this).find('a').attr('rel'));
	});
	for(var i = 0; i < mycrit.length; i++){
		$('#' + mycrit[i].id).attr('checked', true);
		thisSel.push(mycrit[i].id);
	}

	if(thisSel.length > prevSel.length){
		$('#mycriteria ul').empty();
		var selection = $('#criteria input:checked');
		selection.each(function(i){
			el = $('#'+selection[i].id);
			$('#mycriteria ul').append('<li><a href="#" rel="'+ selection[i].id +'">'+ el.parent().text() +'</a></li>');
		});
	} else {
		$('#mycriteria ul li').each(function(){
			if($(this).find('a').attr('rel') == prevSel.diff(thisSel)){
				$(this).remove();
			}
		});
	} 
}

function resetCriteria(){
	$('#criteria input:checked').each(function(){
		$(this).attr('checked', false);
	});
	$.ajax({
		type: "POST",
		url: "/datasources/criteria.php",
		data: "ds=criteria&action=flush&crit=null"
	});
	$('#mycriteria ul li').each(function(){
		$(this).remove();
	});
}

Array.prototype.diff = function(a) {
    return this.filter(function(i) {return !(a.indexOf(i) > -1);});
};

function resetState(){
	if(!$('ul.categories').length){
		$('#categories h1').attr('id', '');
		$('ul.categories-selection').remove();
		$('#category-helper').remove();
		$('ul.subcategories').remove();
		$('#categories h1').after('<ul class="categories"></ul>');
		$.getJSON('/datasources/categories.php?ds=categories&sel=' + selArr, function(data){
			var list = '';
			for(var i = 0; i < data.length; i++){
				list += '<li class="' + data[i].row + '" id="f' + data[i].obj_id + '"><a href="' + data[i].category_link + '">' + data[i].name + '</a></li>';
			}
			$('ul.categories').hide().append(list).fadeIn();
		});
	}
}

function loadSearchstate(catId){
	$('ul.categories').remove();
	var h1 = $('#categories h1');
	// set up DOM
	h1.attr('id', 'category-results');
	if(!$('ul.categories-selection').length){
		$('ul.categories').remove();
		$('#categories h1 a').html('Ergebnisse in diesen Kategorien');
		h1.after('<ul class="subcategories"></ul>');
		h1.after('<div id="category-helper">Das Ergebnis kann über die Unter- kategorien weiter eingeschränkt werden.</div>');
		h1.after('<ul class="categories-selection"></ul>');
	} else {
		$('ul.categories-selection').empty();
		$('ul.subcategories').empty();		
	}
	$('ul.subcategories').addClass('loader');
	// insert selected categories
	$.getJSON('/datasources/categoriesSelected.php?ds=categoriesSelected&sel=' + selArr, function(data){
		var list = '';
		for(var i = 0; i < data.length; i++){
			list += '<li><a href="'+data[i].category_link+'">'+data[i].name+'</a></li>';
		}
		$('ul.categories-selection').append(list);
	});
	// insert subcategories
	$.getJSON('/datasources/categories.php?ds=categories&moi=' + catId + '&sel=' + selArr, function(data){
		if(data){
			var list = '';
			for(var i = 0; i < data.length; i++){
				list += '<li class="' + data[i].row + '" id="f' + data[i].obj_id + '"><a href="' + data[i].category_link + '">' + data[i].name + '</a></li>';
			}
			$('ul.subcategories').removeClass('loader').hide().append(list).fadeIn();
		}
	});
}

/**
 * jQuery Cookie plugin
 *
 * Copyright (c) 2010 Klaus Hartl (stilbuero.de)
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 *
 */
jQuery.cookie = function (key, value, options) {
    if (arguments.length > 1 && String(value) !== "[object Object]") {
        options = jQuery.extend({}, options);
        if (value === null || value === undefined) {
            options.expires = -1;
        }
        if (typeof options.expires === 'number') {
            var days = options.expires, t = options.expires = new Date();
            t.setDate(t.getDate() + days);
        }
        value = String(value);
        return (document.cookie = [
            encodeURIComponent(key), '=',
            options.raw ? value : encodeURIComponent(value),
            options.expires ? '; expires=' + options.expires.toUTCString() : '',
            options.path ? '; path=' + options.path : '',
            options.domain ? '; domain=' + options.domain : '',
            options.secure ? '; secure' : ''
        ].join(''));
    }
  options = value || {};
    var result, decode = options.raw ? function (s) { return s; } : decodeURIComponent;
    return (result = new RegExp('(?:^|; )' + encodeURIComponent(key) + '=([^;]*)').exec(document.cookie)) ? decode(result[1]) : null;
};
