/**
 * Copyright 2005 Zervaas Enterprises (www.zervaas.com.au)
 * Modified 2005 by iCKI - USCKI Incognito
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *	 http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


// Verkrijg een lijst van namen die aan de zoekcriteria voldoen
function getList(qElt, lElt)
{
	resultCount = 0;
	resultArray = new Array;
		
	inputValue = qElt.value;
	inputLength = inputValue.length;

	// kijk per element...
	for (optionCounter = 0; optionCounter < lElt.length; optionCounter++)
	{
		// ...of de zoekterm er ergens in voorkomt
		if (inputValue != "" && lElt.options[optionCounter].text.toLowerCase().indexOf(inputValue.toLowerCase()) != -1)
		{
			resultArray[resultCount] = new Array(lElt.options[optionCounter].text, lElt.options[optionCounter].value);
			resultCount++;

			// als we 10 resultaten hebben hoeven we niet meer verder te zoeken
			if (resultCount >= 10) return resultArray;
		}
	}

	return resultArray;
}
		

function gsc_emptyresults(elt)
{
	if (!elt) return;

	elt.innerHTML = '';
	elt.numResults = 0;
	elt.selectedIndex = 0;
	elt.results = [];
	$(elt).hide();
}

function gsc_addresult(elt, qElt, q, c, sel, lElt)
{
	if (!elt) return;
	
	

	if (sel) elt.selectedIndex = elt.numResults;

	elt.s = 1;

	idx = elt.numResults;
	elt.results[elt.numResults++] = q;

    var _res = '';
    _res += '<div class="' + (sel ? 'Suggest_srs' : 'Suggest_sr') + '"'
         +  ' onmouseover="gsc_mouseover(\'' + getId(elt) + '\', ' + idx + ')"'
         +  ' onmouseout="gsc_mouseout(\'' + getId(elt) + '\', ' + idx + ')"'
         +  ' onclick="gsc_mouseclick(\'' + getId(elt) + '\', ' + idx + ')">';
    _res += q;
    _res += '</div>';

	$(elt).append(_res);
}

// werk de waarde van het selectboxje bij
function changeSelectBox(rElt, lElt)
{
	if (rElt.selectedIndex == 0)		// als niets geselecteerd
		selectedText = ''
	else
		selectedText = rElt.results[rElt.selectedIndex - 1];

	for (optionCounter = 0; optionCounter < lElt.length; optionCounter++)
	{
		if (lElt.options[optionCounter].text == selectedText)
		{
			lElt.options[optionCounter].selected = true;
		}
	}

}

// maak de waarde van het selectboxje weer de lege optie
function clearSelectBox(lElt)
{
	lElt.options[0].selected = true;
}

// werk de waarde van het invoervakje bij
function updateQueryField(queryElt, selectElt, freeChoice)
{
	queryValue = selectElt.options[selectElt.selectedIndex].text;
	if (queryValue != '' || !(freeChoice))
	{
		queryElt.value = queryValue;
	}
}

// aangeroepen na muisover-activiteit uitvouwlijstje
function gsc_mouseover(id, idx)
{
	elt = getField(id, '.Suggest_Results');
	elt.selectedIndex = idx + 1;
	qElt = getField(id, '.Suggest_Query');
	qElt.focus();

	gsc_highlightsel(elt);
}

// aangeroepen na muisout-activiteit uitvouwlijstje
function gsc_mouseout(id, idx)
{
	elt = getField(id, '.Suggest_Results');
	elt.selectedIndex = -1;

	gsc_highlightsel(elt);
}

function gsc_blur(qElt, freeChoice)
{
	rElt = getFieldFromObj(qElt, '.Suggest_Results');
	lElt = getFieldFromObj(qElt, '.Suggest_List');

	this.tp = window.setTimeout("$(rElt).hide()", 500);
	updateQueryField(qElt, lElt, freeChoice);
}

// aangeroepen na muisklik uitvouwlijstje
function gsc_mouseclick(id, idx)
{
	elt = getField(id, '.Suggest_Results');
	qElt = getField(id, '.Suggest_Query');
	lElt = getField(id, '.Suggest_List');

	changeSelectBox(elt, lElt);
	$(elt).hide();

	qElt.value = elt.results[idx];
}

// aangeroepen door __query.onkeydown
function gsc_handleup(elt, qElt, lElt)
{
	if (elt.numResults > 0) {
		$(elt).show();
	}
	if (elt.selectedIndex == 0)
		return;
	else if (elt.selectedIndex < 0)
		elt.selectedIndex = elt.numResults - 1;
	else
		elt.selectedIndex--;
	
	gsc_highlightsel(elt, qElt);
	
	changeSelectBox(elt, lElt);
}

// aangeroepen door __query.onkeydown
function gsc_handledown(elt, qElt, lElt)
{
	if (elt.numResults > 0) {
		$(elt).show();
	}
	if (elt.selectedIndex == elt.numResults) {
		gsc_highlightsel(elt, qElt);
		return;
	}
	else if (elt.selectedIndex < 0)
		elt.selectedIndex = 0;
	else
		elt.selectedIndex++;

	gsc_highlightsel(elt, qElt);
	
	changeSelectBox(elt, lElt);
	
}

function selectWhenWholeElementWritten(elt, qElt, lElt, freeChoice)
{
	// kijk of er een volledige option staat
	if (wholeElementWritten(lElt, qElt))
	{
		// selectbox bijwerken 
		lElt.options[optionCounter].selected = true;
		
		// uitklapding aanpassen
		elt.selectedIndex = 1;
		gsc_highlightsel(elt, qElt);
	
		// hoofdlettergebruik gelijk maken
		updateQueryField(qElt, lElt, freeChoice);
	}	
}

// kijkt of de handmatige invoer overeenkomt met een element uit de lijst
function wholeElementWritten(lElt, qElt)
{
	// kijk per element...
	for (optionCounter = 0; optionCounter < lElt.length; optionCounter++)
	{
		// ...of die gelijk is aan de zoekterm
		
		if (lElt.options[optionCounter].text.toLowerCase() == qElt.value.toLowerCase())
		{
			return optionCounter;
		}
	}
	return false;
}



// aangeroepen door gsc_handledown en gsc_handleup en zo
function gsc_highlightsel(elt, qElt)
{
	divs = elt.getElementsByTagName('div');

	for (i = 0; i < divs.length; i++) {
		if (i == elt.selectedIndex - 1) {
			divs[i].className = 'Suggest_srs';
			elt.tempQuery = elt.results[i];
		}
		else
			divs[i].className = 'Suggest_sr';
	}
	
	
}

function keydownonelement(key, qElt, rElt, lElt, freeChoice)
{
	switch (key) {
		case 9: // tab
			$(rElt).hide();
			updateQueryField(qElt, lElt, freeChoice);
			break;
		case 27: // escape
			$(rElt).hide();
			updateQueryField(qElt, lElt, freeChoice);
			return false;
			break;
		case 13: // enter
			$(rElt).hide();
			updateQueryField(qElt, lElt, freeChoice);
			return false;
			break;
		case 38: // up arrow
			gsc_handleup(rElt, qElt, lElt);
			updateQueryField(qElt, lElt, freeChoice);
			return false;
			break;
		case 40: // down arrow
			gsc_handledown(rElt, qElt, lElt);
			updateQueryField(qElt, lElt, freeChoice);
			return false;
			break;
		default:
			break;
	}
	return true;
}



function fieldExpired(id, freeChoice)
{

	var rElt = getField(id, '.Suggest_Results');
	var qElt = getField(id, '.Suggest_Query');
	var lElt = getField(id, '.Suggest_List');

	_data = getList(qElt, lElt, rElt);

	gsc_emptyresults(rElt);
	if (_data.length > 0) {
		for (i = 0; i < _data.length; i++) {
			gsc_addresult(rElt, qElt, _data[i][0], _data[i][1], false, lElt);
		}
		$(rElt).show();

		changeSelectBox(rElt, lElt);
	}
	else
	{
		clearSelectBox(lElt);
	}
	
	selectWhenWholeElementWritten(rElt, qElt, lElt, freeChoice);
	
	return false;
}
  

function ajaxac_countdowntimer(ms, free, obj)
{
	this.id = getId(obj);
	this.free = free;
	this.ms = ms;
	this.tp = 0;
}

ajaxac_countdowntimer.prototype.start = function()
{
	if (this.tp > 0)
		this.reset();
	this.tp = window.setTimeout('ontimerexpire(\''+this.id+'\', '+this.free+')', this.ms);
}


function ontimerexpire(id, free) {
	return fieldExpired(id, free);
}

ajaxac_countdowntimer.prototype.reset = function()
{
	if (this.tp > 0)
		window.clearTimeout(this.tp);
	this.tp = 0;
}

function delay(milliseconds)
{
	var then, now;
	then = new Date().getTime();
	now = then;
	while ((now - then) < milliseconds) {
		now = new Date().getTime();
	}
}

function ajaxac_getkeycode(e)
{
	if (document.layers)
		return e.which;
	else if (document.all)
		return event.keyCode;
	else if (document.getElementById)
		return e.keyCode;
	return 0;
}

function keydown(obj, e, freechoice)
{
	key = ajaxac_getkeycode(e);
	if (key > 40 || key == 8 || key == 32)
	{
		obj.timer.start();
	}
	return keydownonelement(key, obj,  
		getFieldFromObj(obj,'.Suggest_Results'),
		getFieldFromObj(obj,'.Suggest_List'), 
		freechoice);
}

function getId(obj)
{
	return $(obj).parents('.Suggest_container').attr('id');
}

function getField(id, field)
{
	return $('#'+id).find(field).get(0);
}
function getFieldFromObj(obj, field)
{
	return $('#'+getId(obj)).find(field).get(0);
}

$(document).ready(function(){

		$('.Suggest_Query').attr('autocomplete', 'off');

		$('.Suggest_QueryContainer').css('display','inline');
		$('.Suggest_SelectBoxContainer').hide();

		$('.Suggest_Query').css('display','inline');
		$('.Suggest_List').hide();

		$('.Suggest_QueryFreeChoice').blur(function() {
			gsc_blur(this, true);
		});
		$('.Suggest_QueryNoFreeChoice').blur(function() {
			gsc_blur(this, false);
		});
		$('.Suggest_QueryLabel').each(function() {
			$(this).html(eval('labletext_'+getId(this)));
		});


		// aangeroepen als een toets wordt ingedrukt in het query-veld
		$('.Suggest_QueryFreeChoice').keydown( function(e)
		{
			keydown(this, e, true);
		});

		$('.Suggest_QueryNoFreeChoice').keydown( function(e)
		{
			keydown(this, e, false);
		});
		
		$('.Suggest_Results').each(function() { gsc_emptyresults(this); });

		$('.Suggest_QueryFreeChoice').each(function() {
			this.timer = new ajaxac_countdowntimer(100, true, this);
		});	

		$('.Suggest_QueryNoFreeChoice').each(function() {
			this.timer = new ajaxac_countdowntimer(100, true, this);
		});
});
