/**
 * kereső autosuggest.
 * cssFocusClassName-ben meghatározott class-t tartalmazó inputokra ráül - "autosuggestFocus".
 * használatához szükséges egy div, melybe a találatokat helyezi el, emlynek id-ja "results_" és az input mező id-ja 
 * @author sarkiroka - 2010.01.20.
 */
var cssFocusClassName = "autosuggestFocus";
var autosuggestVariables={};

jQuery(function(){
	jQuery.each($(".searchAutosuggestInput"),function(){
		var inputId=$(this)[0].id;
		autosuggestVariables[inputId]={
			ready:true,
			previous:"",
			values:[]
		};
		setAutosuggestNavigationKeys(inputId);
		$(this).bind("keyup",function(e){
			var inputId=$(this)[0].id;
			var config=autosuggestVariables[inputId];
			var searchString=jQuery.trim($("#"+inputId).val());
			var old_val=config["previous"];
			if(config["ready"] && searchString!=old_val && searchString.length > 2){//ha nem foglalt, és van 3 betű és nem ugyanaz mint előbb volt
				
				autosuggestVariables[inputId]["previous"]=searchString;//eltároljuk amit most kérdezünk
				autosuggestVariables[inputId]["ready"]=false;//foglaltság jelzése	
				
				SearchAutoSuggest.getAutoSuggest(searchString, inputId, autoSuggestCharacterMustEqual, autoSuggestCompareDifferenceFirst, autoSuggestSearchPlace, autoSuggestSimilarity, cb_getAutoSuggest);
			} else {
				var suggest_div=$("#results_"+inputId);
				suggest_div.html("");
				suggest_div.hide();
			}
		});
	});
});

function cb_getAutoSuggest(data) {
	var inputId=data["inputId"];
	var hits=data["result"];
	autosuggestVariables[inputId]["ready"]=true;
	var suggest_div=$("#results_"+inputId);
	suggest_div.html("");
	suggest_div.hide();

	if (hits != null && hits.length > 0) {
		suggest_div.show();
		var suggest_list = $("<ul></ul>");
		var counter=0;
		for (hit in hits) {
			var display_word = hits[hit]["displayString"].replace($("#"+inputId).val(),
					"<strong>" + $("#"+inputId).val() + "</strong>");
			autosuggestVariables[inputId]["values"][counter]=(hits[hit]["displayString"]);
			var path=(hits[hit]["type"]=="sw3si.menu"?data["menuPath"]:data["filePath"]);
			var suggest_list_item = $("<li id=\"av_"+inputId+"_"+counter+"\"><a onclick=\"send('" + hits[hit]["displayString"] + "', '" + inputId + "'); return false;\" href=\"\">" + display_word + " (" + hits[hit]["docFreq"] + ")</a></li>");

			suggest_list.append(suggest_list_item);
			counter++;
		}

		var pos = $("#"+inputId).offset();
		$(suggest_div).css( {
			"position" : "absolute",
			"left" : pos.left + "px",
			"top" : (pos.top + $("#"+inputId).height()+parseInt($("#"+inputId).css("padding-bottom"))) + 4 + "px"
		});

		suggest_div.append(suggest_list);
		$("#results_" + inputId + " > ul > *").hover(
				function(){
					$(this).parent().children().removeClass(cssFocusClassName);
					$(this).addClass(cssFocusClassName);
					},
				function(){
					$(this).removeClass(cssFocusClassName);
					}
				);
	}
}

function send(word, inputId) {
	$("#"+inputId).val(word);
	$("#autosuggestForm_"+inputId).submit();
	
}

/**
 * beállitja a keresőmező értékét, és eltünteti a találatokat
 * @param val - az új érték
 * @param inputId az input mező id-ja
 * @return
 * @author sarkiroka
 */
function setSearchField(val,inputId) {
	$("#"+inputId).val(val);
	$("#results_"+inputId).html("");
	$("#results_"+inputId).hide();
	}

/**
 * ráülteti a billentyűzetfigyelőt az inputra. fel/le navigáció, kiválasztás(enter), eltüntetés(esc)
 * @param inputId
 * @return
 * @author sarkiroka
 */
function setAutosuggestNavigationKeys(inputId){
	$("#"+inputId).bind("keydown", "up", function(){
		step(true,inputId); 
		return false; 
		});
	$("#"+inputId).bind("keydown", "down", function(){
		step(false,inputId);
		return false; 
		});
	$("#"+inputId).bind("keydown", "return", function(){
		var lik = $("#results_" + inputId + " > ul > *");
		if(lik.length==0)return true;
		var index = getSelectedItemIndex(lik);
		if(index > -1) {
			$("#"+inputId).val(autosuggestVariables[inputId]["values"][parseInt(lik[index].id.replace("av_"+inputId+"_",""))]);
		}else{
			return true;
		}
		return false;
	});
	$("#"+inputId).bind("keydown", "esc", function(){
		$("#results_"+inputId).html("");
		$("#results_"+inputId).hide();
		$("#results_" + inputId + " > ul > *").unbind("mouseenter mouseleave");
		return false;
		});
	$("#"+inputId).blur(function(){
		setTimeout(function(){
			$("#results_"+inputId).html("");
			$("#results_"+inputId).hide();
			},1000);
		$("#results_" + inputId + " > ul > *").unbind("mouseenter mouseleave");
		//return false;
		});
	}

/**
 * egy lépés a találati listában
 * @param up_direction true ha felfelé, false ha le
 * @param inputId melyik inputhoz tartozik a lista, annak az id-ja
 * @return
 * @author sarkiroka
 */
function step(up_direction,inputId) {
	var li = $("#results_" + inputId + " > ul > *");
	var items = (li != null) ? li.length : null;

	if(items != null) {
		var index = getSelectedItemIndex(li);
		var newIndex = index;
		
		if(up_direction) {
			if(index == 0) { return; }
			if(index == -1) {
				$(li[items - 1]).addClass(cssFocusClassName);
				return;
			}
			newIndex = index - 1;
		}else{
			if(index == (items - 1)) { return; }
			if(index == -1) {
				$(li[0]).addClass(cssFocusClassName);
				return;
			}
			newIndex = index + 1;						
		}

		$(li[index]).removeClass(cssFocusClassName);
		$(li[newIndex]).addClass(cssFocusClassName);
	}
}

/**
 * visszaadja az éppen kiválasztott listaelem indexét, vagy ha nincs akkor -1et 
 * @param lik a listaelemek listája
 * @return
 * @author sarkiroka
 */
function getSelectedItemIndex(lik) {
	if(lik != "undefined" && lik != null) {
		for(var i=0; i<lik.length; i++) {
			if($(lik[i]).hasClass(cssFocusClassName)) {
				return i;
			}
		}
	}
	return -1;
}
