// start searchprompting.js
// thanks to mininova 
// heavily modified by Julien @ peschars.com
// -----------------------

var searchfield = document.getElementById('query');
var searchform  = document.getElementById('searchform');
var sugbox      = document.getElementById('searchsuggestions');
var queries     = new Array();
var suggestions = new Array();
var searchValue;
var hoveredSuggestion = -1;

// Calculate real offset values of elements
function realOffset(el, offsetType) {
    var offset = 0;
    while(el) {
        offset += el[offsetType]; 
        el = el.offsetParent;
    }
    return offset;
}

// Array.indexOf fix
if(!Array.indexOf) {
    Array.prototype.indexOf = function(elValue) {

        for(var i=0; i<this.length; i++) {
            if(this[i] === elValue)
                return i;
        }
        return -1;
    };
}

// XMLHttpRequest bug fix for IE
if(!window.XMLHttpRequest) {
    window.XMLHttpRequest = function() {
        var types = [
            'Microsoft.XMLHTTP',
            'MSXML2.XMLHTTP.5.0',
            'MSXML2.XMLHTTP.4.0',
            'MSXML2.XMLHTTP.3.0',
            'MSXML2.XMLHTTP'
        ];

        for(var i = 0; i < types.length; i++) {
            try {
                return new ActiveXObject(types[i]);
            } catch(e) {}
        }

        return false; // XMLHttpRequest not supported
    };
}


function buildSearch(topQueries) { // Construct the search suggestions

    queries = topQueries;

    // Search field settings
    //searchfield.setAttribute('autocomplete', 'off');
    
    searchfield.onkeydown = function(ev) {
        try { searchKeyDown(event.keyCode); }
        catch(e) { searchKeyDown(ev.keyCode); }
    };
    
    searchfield.onkeyup = function(ev) {
        try { searchKeyUp(event.keyCode); }
        catch(e) { searchKeyUp(ev.keyCode); }
    };

    searchfield.onblur = function() {
        setTimeout(hideSugbox, 250);
    };

}

function hoverSuggestion(sug) {
    for (var i=0; i<suggestions.length; i++)
        sugbox.getElementsByTagName('a')[i].className = '';
    if (sug != -1) {
        sugbox.getElementsByTagName('a')[sug].className = 'hovered';
        hoveredSuggestion = sug;
    }
}

function searchKeyDown(iKeyCode) {
    if (sugbox.style.display == 'block') {

        if (iKeyCode != 38 && iKeyCode != 40 && iKeyCode != 13)
            hoveredSuggestion = -1;

        if (iKeyCode == 38 && hoveredSuggestion != -1) { // Key code 38 is the up arrow key
            hoveredSuggestion--;
            hoverSuggestion(hoveredSuggestion);
            searchfield.value = suggestions[hoveredSuggestion][0];
        }

        if (iKeyCode == 40 && hoveredSuggestion < suggestions.length-1) { // Key code 40 is the down arrow key
            hoveredSuggestion++;
            hoverSuggestion(hoveredSuggestion);
            searchfield.value = suggestions[hoveredSuggestion][0];
        }
        
        if (iKeyCode == 13) {
            searchform.method = "post"; // alter the search forms method
            searchform.action = "_s.aspx?t=k&q=" + searchfield.value + "&u=" + suggestions[hoveredSuggestion][1]; // and action
        } 

        if (iKeyCode == 38 && hoveredSuggestion == -1)
            searchfield.value = searchValue; // Recall the old search value
    }
}

function searchKeyUp(iKeyCode) {

    if (iKeyCode != 38 && iKeyCode != 40)
        searchValue = searchfield.value; // Save the current search field value

    if (searchfield.value != '' && iKeyCode != 13 && iKeyCode != 27 && iKeyCode != 38 && iKeyCode != 40) // Key code 13 is the enter key and 27 is the escape key
        giveSuggestions();

    if ((searchfield.value == '' || iKeyCode == 27) && sugbox.style.display == 'block')
        hideSugbox();
}

function giveSuggestions() {

    suggestions = new Array(); // Clear array

    for(var i=0; i<queries.length && suggestions.length<15; i++) {
        if(queries[i][0].toLowerCase().indexOf(searchfield.value.toLowerCase()) == 0)
            suggestions.push(queries[i]); // Save Queries that begin with search string
    }

    for(var i=0; i<queries.length && suggestions.length<15; i++) {
        if(queries[i][0].toLowerCase().indexOf(searchfield.value.toLowerCase()) > 0)
            suggestions.push(queries[i]); // Save Queries that contain the search string
    }

    if(suggestions.length == 0)
        hideSugbox();
    else
        showSugbox();

    // Create the Output code
    sugbox.innerHTML = "";
    var sText;
    var nStart;
    var nLen;
    var sOutput;
    for (var i=0; i<suggestions.length; i++) {
        sText = suggestions[i][0];
        nStart = suggestions[i][0].toLowerCase().indexOf(searchfield.value.toLowerCase());
        nLen = searchfield.value.length;
        sOutput = sText.substring(0, nStart) + "<b>" + sText.substring(nStart,nStart+nLen) + "</b>" + sText.substring(nStart+nLen,sText.length);
        sugbox.innerHTML += '<a href="_s.aspx?t=m&q=' + searchfield.value + '&u='+ suggestions[i][1] +  
                            '" style="width:' + (searchfield.offsetWidth-6) + 
                            'px;" onmouseover="hoverSuggestion(' + i + ')">' + 
                            sOutput + '</a>';
    }
}

function showSugbox() {
    sugbox.style.top   = (realOffset(searchfield, 'offsetTop') + searchfield.offsetHeight - 12) + 'px';
    sugbox.style.left  = (realOffset(searchfield, 'offsetLeft') - 12 ) + 'px';
    sugbox.style.width = (searchfield.offsetWidth) + 'px';
    sugbox.style.display = 'block';
}

function hideSugbox() {
    sugbox.style.display = 'none';
}

//=============================================================
