
function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      if (oldonload) {
        oldonload();
      }
      func();
    }
  }
}

addLoadEvent(initGlossary);


//window.onload = initGlossary;

var w3c = (typeof document.getElementById) != 'undefined';
var ajax = (typeof window.XMLHttpRequest != 'undefined' || typeof window.ActiveXObject != 'undefined');

var triggerTimer;
var fadeTimer; 
var minQueryLength = 2;
var lastQuery;

var limitedMode = true;

var theLimit = 10;

var popup;


function initGlossary() {

	if(!w3c || !ajax) {
		alert('no W3C DOM or Ajax support, sorry');
		return;
	}

	$('loading').style.display = 'none';
	
	queryObj = $('glossaryquery');
	
	queryObj.onkeyup = triggerResult;
	//queryObj.onclick = triggerResult;
	
	result = $('lookupresult');
	result.onmouseover = function() {
		window.clearTimeout(fadeTimer);
	}
	result.onmouseout = function() {
		fadeTimer = window.setTimeout('hideTermList()', 1000);
	}
	result.onclick = hideTermList;
}

function preparePopup() {
	popup = window.open('','glossarypopup','left=10,top=10,width=700,height=850,toolbar=no,location=no,status=no,menubar=no,resizable=yes,scrollbars=yes');
	if(window.focus) {
		popup.focus();
	}

	return true;
}

function triggerResult() {

	window.clearTimeout(triggerTimer);
	
	queryObj = $('glossaryquery');
	
	if(triggerTimer != null && queryObj.value.length >= minQueryLength) {
		handleQueryChange();
	} else if (queryObj.value.length >= minQueryLength) {
		triggerTimer = window.setTimeout('handleQueryChange()', 500);
	} else {
		hideTermList();
	}
		
}

function handleQueryChange() {

	obj = $('glossaryquery');
	
	if(obj.value != lastQuery) {
	
		theParameters = (limitedMode) ? {query: obj.value, limit: theLimit} : {query: obj.value};

		$('loading').style.display = 'block';

		new Ajax.Request(glossaryDataUrl, 
	  	{
	    method:'get',
		parameters: theParameters,
	    onCreate: function(resp){
	    	// needed for correct handling of "Umlaute" and special characters
	    	resp.request.url = decodeURI(resp.request.url);
	    },
	    onSuccess: function(transport){
		  $('loading').style.display = 'none';
	      var response = transport.responseText || "no response text";	
	      drawTermList(eval('(' + response + ')'));
	    },
	    onFailure: function(){ 
			$('loading').style.display = 'none';
			alert('Something went wrong...') 
		}
	  });

	} else {
		alert('void request');
		showTermList();
	}
}



function handleDetailsRequest(linkObj, id, details) {

	formObj = $('glossaryfm');
	queryInputObj = $('glossaryquery');

	linkText = (linkObj.textContent) ? linkObj.textContent : linkObj.innerHTML;
	// another once: we have to unescape the string, which was automatically escaped with
	// the statement before..
	linkText = linkText.replace(/&amp;/g,'&').replace(/&lt;/g,'<').replace(/&gt;/g,'>');

	queryInputObj.value = linkText;


	// if available include contentUrl in request for content display portlet
	if(details != null && details != '') {
		formObj.contentUrl.value = details;
	} else {
		formObj.contentUrl.value = '';
	}

	formObj.id.value = id;
	formObj.showDetails.value = 'showDetails';

	formObj.submit();
}


function drawTermList(data) {
	resultObj = $('lookupresult');
	
	if(!resultObj) return;
	if(data == null || data['entries'].length == 0) {
		hideTermList();
		return;
	}
	
	var list = '<ul id=\"searchSuggestion\">';


	for(i = 0; i < data['entries'].length; i++) {
		var entry = data['entries'][i];
		var details = '';

		if(entry['details'] != null  && entry['details'] != '') {
			details += ", '" + entry['details'] + "'";
		}
		id = entry['id'];

		list += "<li><a href=\"#\" onclick=\"handleDetailsRequest(this, " + id + details + ")\">" + entry['headline'] + "</a></li>";
	}
	list += '</ul>';

	resultObj.innerHTML = list;
	resultObj.style.display = 'block';

	window.clearTimeout(fadeTimer);
	fadeTimer = window.setTimeout('hideTermList()', 3000);
}

function triggerUnlimited() {
	limitedMode = false;
	handleQueryChange();
}

function showTermList() {
	obj = $('lookupresult');
	if(obj) obj.style.display = 'block';
}

function hideTermList() {
	obj = $('lookupresult');
	if(obj) obj.style.display = 'none';
}


