/**
 * @version		1.0.2 - 2 februari 2010
 *
 * @copyright	1.0.2,	2 februari 2010,	Jan Niemantsverdriet,	Focus terug naar veld, werkt nu ook met toetsen
 * @copyright	1.0.1,	4 maart 2009,		Jan Niemantsverdriet,	Aanpassingen voor CpFormFieldTags.js, trimt nu de waarde voor zoeken
 * @copyright	1.0.0,	9 september 2008,	Jan Niemantsverdriet,	Gemaakt
 * 
 * @copyright		afhankelijkheid:	BB/Ajax/simpleajax.js
 * @copyright		afhankelijkheid:	BB/Screen/screen.js
 * @copyright		afhankelijkheid:	BB/JSDivers/DOM.js
 * @copyright		afhankelijkheid:	BB/JSDivers/check.js
 */

/**
 * @var INPUT			de input van het suggestieveld wat nu openstaat
 */
var CpFormFieldSuggest_oCurrentInput = null;

/**
 * @var string			de waarde waarop gezocht wordt
 */
var CpFormFieldSuggest_sCurrentValue = null;

/**
 * @var string			de functie die het resultaat plaatst
 */
var CpFormFieldSuggest_hPlaceFunction = null;

/**
 * @var integer			de door de toetsen geselecteerde optie
 */
var CpFormFieldSuggest_iKeySelectedIndex = 0;

/**
 * @var integer			het aantal opties in de suggestie lijst
 */
var CpFormFieldSuggest_iListSize = 0;

/**
 * Verwerkt de wijzigingen in het input veld
 * 
 * @param INPUT	a_oInput					het input veld
 * @param string a_sTable					de naam van de tabel
 * @param string a_sNameField				de naam van het veld
 * @param integer a_iMax					het maximaal aantal elementen
 * @param string|void a_sValue				de waarde van het input veld
 * @param string|void a_sOrderField			de naam van het veld waar op gesorteerd moet worden
 * @param string|void a_sOrderDirection		de richting waar op gesorteerd moet worden ('ASC' of 'DESC') 
 */
function CpFormFieldSuggest_vChanged(a_oInput, a_sTable, a_sNameField, a_iMax, a_sValue, a_sOrderField, a_sOrderDirection) {
	var oPopup = document.getElementById(a_oInput.id + "_popup");
	if (CpFormFieldSuggest_sCurrentValue != a_oInput.value || bIsNull(oPopup)) {
		vSimpleAjaxClear();
		var sValue = (bIsString(a_sValue) ? a_sValue : a_oInput.value);
		var sOrderField = (bIsString(a_sOrderField) ? a_sOrderField : a_sNameField);
		var sOrderDirection = (bIsString(a_sOrderDirection) ? a_sOrderDirection : 'ASC');
		var oPopup = document.getElementById(a_oInput.id + "_popup");
		sValue = sValue.replace(/^\s+|\s+$/g,"");
		if (sValue == '') {
			if (!bIsNull(oPopup)) bRemoveLayer(a_oInput.id + "_popup_layer");
			return;
		}
		var sURL = "http://" + document.domain + "/DBInterface/veldwaarde/" + a_sTable + "/" + a_sNameField + "/max" + a_iMax;
		var sPost = 'filter=%' + sValue + '%&filtertype=LIKE' + '&orderfield=' + sOrderField + '&orderdirection=' + sOrderDirection;
		vSimpleAjaxSend(sURL, sPost, CpFormFieldSuggest_vReceiveAjax);
		CpFormFieldSuggest_oCurrentInput = a_oInput;
		CpFormFieldSuggest_sCurrentValue = sValue;
		CpFormFieldSuggest_hPlaceFunction = "CpFormFieldSuggest_vSetValue";
	}
}

/**
 * Verwerkt de reaktie op het ajax verzoek
 * 
 * @param XMLHttpRequest a_oResponse			het antwoord
 */
function CpFormFieldSuggest_vReceiveAjax(a_oResponse) {
	var oPopup = document.getElementById(CpFormFieldSuggest_oCurrentInput.id + "_popup");
	var oXML = a_oResponse.responseXML;
	var aRoot = oXML.getElementsByTagName('result');
	var aInfo = aRoot[0].getElementsByTagName('info');
	var aResult = aInfo[0].getElementsByTagName('resultsize');
	var iResult = aResult[0].childNodes[0].nodeValue;
	if (iResult == 0) {
		if (!bIsNull(oPopup)) bRemoveLayer(CpFormFieldSuggest_oCurrentInput.id + "_popup_layer");
		return;
	}
	var aTotal = aInfo[0].getElementsByTagName('listsize');
	var iTotal = aTotal[0].childNodes[0].nodeValue;
	var aValues = aRoot[0].getElementsByTagName('values');
	aValues = aValues[0].getElementsByTagName('value');
	var sHTML = '';
	var sInput = CpFormFieldSuggest_sCurrentValue;
	for (var iCounter = 0; iCounter < aValues.length; iCounter++) {
		var sValue = aValues[iCounter].childNodes[0].nodeValue;
		var oRegExp = new RegExp(sInput, "i");
		var aResult = oRegExp.exec(sValue);
		var sLabel = 	sValue.substring(0, aResult.index) + '<b>' + 
						sValue.substring(aResult.index, aResult.index + sInput.length) + '</b>' +
						sValue.substring(aResult.index + sInput.length);
		sHTML += 	'<div onclick="' + CpFormFieldSuggest_hPlaceFunction + '(\'' + sValue + '\');" ' +
					'class="CpFormFieldSuggest_suggestions_element" ' +
					'onmouseover="bAddCssClass(this,\'CpFormFieldSuggest_suggestions_element_hover\');" ' +
					'onmouseout="bRemoveCssClass(this,\'CpFormFieldSuggest_suggestions_element_hover\');" ' +
					'id="' + CpFormFieldSuggest_oCurrentInput.id + '_' + (iCounter + 1) + '"><span>' + sLabel + '</span></div>';
	}
	CpFormFieldSuggest_iListSize = iCounter;
	if (bIsNull(oPopup)) { 
		var	CpFormFieldSuggest_currentPopup = new cScreen(sHTML, 'CpFormFieldSuggest_suggestions', CpFormFieldSuggest_oCurrentInput.id + "_popup");
		var aPositie = aFindScreenPos(CpFormFieldSuggest_oCurrentInput);
		CpFormFieldSuggest_currentPopup.vSetWidth(CpFormFieldSuggest_oCurrentInput.offsetWidth);
		CpFormFieldSuggest_currentPopup.vSetPosition(aPositie[0], aPositie[1] + CpFormFieldSuggest_oCurrentInput.offsetHeight);
		CpFormFieldSuggest_currentPopup.vSetClose(false);
		CpFormFieldSuggest_currentPopup.vSetCloseOnMis(true);
		CpFormFieldSuggest_currentPopup.vToScreen();
		keys_vBind(13, CpFormFieldSuggest_vKeyEnter);
		keys_vBind(38, CpFormFieldSuggest_vKeyUp);
		keys_vBind(40, CpFormFieldSuggest_vKeyDown);
	} else {
		oPopup.innerHTML = sHTML;
	}
	CpFormFieldSuggest_iKeySelectedIndex = 0;
}

/**
 * Stelt de opgegeven waarde in
 *
 * @param string a_sValue			de waarde
 */
function CpFormFieldSuggest_vSetValue(a_sValue) {
	vSimpleAjaxClear();
	CpFormFieldSuggest_oCurrentInput.value = a_sValue;
	var oPopup = document.getElementById(CpFormFieldSuggest_oCurrentInput.id + "_popup");
	if (!bIsNull(oPopup)) bRemoveLayer(CpFormFieldSuggest_oCurrentInput.id + "_popup_layer");
	vSetFormFieldFocus(CpFormFieldSuggest_oCurrentInput);
}

/**
 * Verwerkt een aanslag op de toets pijl naar beneden
 *
 * @param Object a_oEvent			het event
 * @since 1.0.2 - 2 februari 2010
 * @author Jan Niemantsverdriet
 */
function CpFormFieldSuggest_vKeyDown(a_oEvent) {
	// niet verder omlaag als de bodem van de lijst is berijkt
	if (CpFormFieldSuggest_iKeySelectedIndex >= CpFormFieldSuggest_iListSize) return;
	CpFormFieldSuggest_oCurrentInput.blur();
	
	// verwijder css klasse bij vorige item
	var sId = CpFormFieldSuggest_oCurrentInput.id + '_' + CpFormFieldSuggest_iKeySelectedIndex;
	var oItem = document.getElementById(sId);
	if (bIsObject(oItem)) bRemoveCssClass(oItem, 'CpFormFieldSuggest_suggestions_element_hover');
	
	// ga 1 item naar onder
	CpFormFieldSuggest_iKeySelectedIndex++;
	
	// zet css klasse bij nieuw item
	sId = CpFormFieldSuggest_oCurrentInput.id + '_' + CpFormFieldSuggest_iKeySelectedIndex;
	oItem = document.getElementById(sId);
	if (bIsObject(oItem)) bAddCssClass(oItem, 'CpFormFieldSuggest_suggestions_element_hover');

	return false;
}

/**
 * Verwerkt een aanslag op de toets pijl naar boven
 *
 * @param Object a_oEvent			het event
 * @since 1.0.2 - 2 februari 2010
 * @author Jan Niemantsverdriet
 */
function CpFormFieldSuggest_vKeyUp(a_oEvent) {
	// niet verder omlaag als de bodem van de lijst is berijkt
	if (CpFormFieldSuggest_iKeySelectedIndex <= 1) return;
	
	// verwijder css klasse bij vorige item
	var sId = CpFormFieldSuggest_oCurrentInput.id + '_' + CpFormFieldSuggest_iKeySelectedIndex;
	var oItem = document.getElementById(sId);
	if (bIsObject(oItem)) bRemoveCssClass(oItem, 'CpFormFieldSuggest_suggestions_element_hover');
	
	// ga 1 item naar onder
	CpFormFieldSuggest_iKeySelectedIndex--;
	
	// zet css klasse bij nieuw item
	sId = CpFormFieldSuggest_oCurrentInput.id + '_' + CpFormFieldSuggest_iKeySelectedIndex;
	oItem = document.getElementById(sId);
	if (bIsObject(oItem)) bAddCssClass(oItem, 'CpFormFieldSuggest_suggestions_element_hover');
	
	return false;
}

/**
 * Verwerkt de enter toets
 * 
 * @param Object a_oEvent			het event
 * @since 1.0.2 - 2 februari 2010
 * @author Jan Niemantsverdriet
 */
function CpFormFieldSuggest_vKeyEnter(a_oEvent) {
	var sId = CpFormFieldSuggest_oCurrentInput.id + '_' + CpFormFieldSuggest_iKeySelectedIndex;
	var oItem = document.getElementById(sId);
	if (bIsObject(oItem)) {
		var aSpans = oItem.getElementsByTagName('span');
		var sValue = aSpans[0].innerHTML;
		sValue = sValue.replace('<b>', '');
		sValue = sValue.replace('</b>', '');
		CpFormFieldSuggest_vSetValue(sValue);
		return false;
	}
}