﻿var knownSuggestions = Array();
var showLoadedSuggestion = false;
var maxSuggestionSelection=10;
var currentSuggestionSelection = -1;
var currentSuggestions;
var lastSearchPhrase = "";
var hideAndClearSuggestionsTimeoutId = -1;
var hideAndClearSuggestionsLock = false;
var suggestionItemHeight = 14;
var suggestionItemWidth = 200;
var searchInputID = "";



// gui event hander

function onKeyUp_suggest(evt)
{		
    var keyCode=evt.keyCode;
    var result = true;            
    if(keyCode==38 || keyCode==40)
    {
        moveSelectedSuggestion(keyCode==40);       
    }
    else if(keyCode != 13)
    {
        updateSuggestionList();
    }
    return result;
}

function onKeyPress_suggest(evt)
{
	var result = true;
	var keyCode = evt.keyCode;
	if (keyCode == 13)
	{
		var container = document.getElementById('SuggestionContainerBox');
		if (container.style.display != 'none')
		{
			if (evt)
			{
				evt.cancelBubble = true;
			}
			if (window.event)
			{
				window.event.cancelBubble = true;
			}
			hideAndClearSuggestions();
			result = false;
		}
	}
	return result;
}


function onFocus_showSuggestions(){
    if(hideAndClearSuggestionsTimeoutId>=0){
        clearTimeout(hideAndClearSuggestionsTimeoutId);
        hideAndClearSuggestionsTimeoutId = -1;
    }
}

function onBlur_hideAndClearSuggestions()
{
	if (!hideAndClearSuggestionsLock)
	{
		hideAndClearSuggestionsTimeoutId = setTimeout(
        hideAndClearSuggestions
        , 500);
	}
}

function onClick_setSuggestionText(id){
    var detailbox = document.getElementById(searchInputID);
    
    detailbox.focus();
    detailbox.value = document.getElementById('suggestion'+id).innerHTML;
    	    
    markHtmlSuggestion(currentSuggestionSelection,false);
    currentSuggestionSelection=id;
    markHtmlSuggestion(currentSuggestionSelection,true);
}

// helpers

function hideAndClearSuggestions(){
    hideAndClearSuggestionsTimeoutId = -1;
    showSuggestions("");        
}

function moveSelectedSuggestion(down){
    markHtmlSuggestion(currentSuggestionSelection,false);
    
    if(currentSuggestionSelection<0){
        lastSearchPhrase = document.getElementById(searchInputID).value;
    }
    
    if(down){
        currentSuggestionSelection++;   
    }else{
        currentSuggestionSelection--;
    }
    if(currentSuggestionSelection<-1){
        currentSuggestionSelection=maxSuggestionSelection-1;
    }else if(currentSuggestionSelection>=maxSuggestionSelection){
        currentSuggestionSelection=-1;
    }
    
    markHtmlSuggestion(currentSuggestionSelection,true);
    
    if(currentSuggestionSelection<0){
        document.getElementById(searchInputID).value = lastSearchPhrase;
    }else{
        document.getElementById(searchInputID).value = currentSuggestions[currentSuggestionSelection];
    }
    
    var containerbox = document.getElementById('SuggestionContainerBox');
    var itemTop = (currentSuggestionSelection*suggestionItemHeight)+5;
    var contHeight = parseInt(containerbox.style.height.replace("px",""));
    if (itemTop < containerbox.scrollTop)
    {
        containerbox.scrollTop =  itemTop;
    }
    else if ((itemTop + suggestionItemHeight) > containerbox.scrollTop + contHeight)
    {    	
        containerbox.scrollTop =  (itemTop+suggestionItemHeight - contHeight);  
    }
}

function updateSuggestionList(){
    var startPhrase = document.getElementById(searchInputID).value;
    if(startPhrase=="" || startPhrase==null){
        showLoadedSuggestion = false;
        showSuggestions("");
    }else{
        var phraseKey = startPhrase.substr(0,1);;
    
        if(knownSuggestions[phraseKey]==null){
            knownSuggestions[phraseKey] = "";
            loadSuggestions(startPhrase);
            showLoadedSuggestion = true;
        }else if(knownSuggestions[phraseKey] != ""){
            showLoadedSuggestion = false;
            showSuggestions(startPhrase);
        }
    }
}    

function showSuggestions(startPhrase){
    currentSuggestionSelection = -1;
    var detailbox = document.getElementById('SuggestionContainer');
    var container = document.getElementById('SuggestionContainerBox');
    
    if(startPhrase!=""){
        phraseKey = startPhrase.substr(0,1);
    
        currentSuggestions = filterSuggestions(startPhrase,knownSuggestions[phraseKey]);
        maxSuggestionSelection = currentSuggestions.length;
	    detailbox.innerHTML = buildSuggestionHtml(currentSuggestions);	    
	}else{
	    currentSuggestions = null;
	    maxSuggestionSelection = 0;
	}
	
	if(maxSuggestionSelection == 0){
	    detailbox.innerHTML = "";
	    container.style.display = "none";
	    container.style.height = "0px";		
	}else{
        container.style.display = "";
	    var calcHeight = (maxSuggestionSelection*suggestionItemHeight)+10;
	    if(calcHeight>100){
	        container.style.height = "100px";    
	        container.style.width = (suggestionItemWidth+16)+"px"
	    }else{
            container.style.height = calcHeight+ "px";    
	        container.style.width = (suggestionItemWidth)+"px"		    
	    }			
	}
}    

function filterSuggestions(startPhrase, allSuggestions){
    startPhrase = startPhrase.toLowerCase();
    var result = Array();
    var found = false;
    var phraseLen = startPhrase.length;
    for(var i=0; i<allSuggestions.length; i++){
        var currSugg = allSuggestions[i];
        if(currSugg.length>=phraseLen){
            if(currSugg.substr(0,phraseLen).toLowerCase() == startPhrase){
                result.push(currSugg);
                if(!found)
                    found = true;	            
            }else if(found){
                break;
            }
        }
    }
    return result;
}
// html

function markHtmlSuggestion(suggestionSelection,active){
    var markItem = document.getElementById("suggestion"+suggestionSelection);
    if(markItem!=null){
        if(active){
            markItem.className="suggestionitem_active";
        }else{
            markItem.className="suggestionitem";
        }
    }
}

function buildSuggestionHtml(suggestions){
    var result = "";
    for(var i = 0; i < suggestions.length; i++){
        result += "<div id=\"suggestion"+i+"\" class=\"suggestionitem\" onclick=\"onClick_setSuggestionText("+i+")\">"+suggestions[i]+"</div>";
    }
    return result;
}

// ajax

function loadSuggestions(startPhrase)
{
    phraseKey = startPhrase.substr(0,1);
	var a = new Ajax.Request("/SearchSuggestions.aspx?s=" + phraseKey,
		{method:'get', onComplete: function(req){return onLoadSuggestions(req,startPhrase);}}
	);
}

function onLoadSuggestions(req,startPhrase)
{
    phraseKey = startPhrase.substr(0,1);
    var suggestions = req.responseText.split("\r\n");

	knownSuggestions[phraseKey] = suggestions;
	if(showLoadedSuggestion)
	    showSuggestions(startPhrase);
	  }

function cancelHide_suggest()
{
	hideAndClearSuggestionsLock = true;
	window.setTimeout('hideAndClearSuggestionsLock=false', 500);
}