var suggestionTimers = new Array();
var suggestionHideIt = new Array();
suggestionTimers['_last_check'] = new Date().getTime();

function check_suggestion(field) {
    var new_elem = document.getElementById(field);
    var buf_elem = document.getElementById('buf_' + field); 

    var max_len = Math.max(new_elem.value.length, buf_elem.value.length);
    var min_len = Math.min(new_elem.value.length, buf_elem.value.length);
    var new_len = max_len - min_len;

    var ts = new Date().getTime();
    var td = ts - suggestionTimers['_last_check']; 

    if (new_len >= 3 || (td > 1500 && new_elem.value != buf_elem.value)) {
        buf_elem.value = new_elem.value;

        if (new_elem.value.length < 3) {
            // do not make suggestions on empty value
            document.getElementById('search_suggestion_' + field).style.display = 'none';
            return;
        }

        var uri = '/search_suggestion.htm?keywords=' + escape(new_elem.value) + '&cache=' + Math.floor(new Date().getTime() / 1000);
        call_remote(uri, ('search_suggestion_' + field), show_suggestions, '', '');

        suggestionTimers['_last_check'] = ts;
    }
}

function show_suggestions(data, div) {
    var list = document.getElementById(div);
    list.innerHTML = data;
    list.style.display = 'block';
}

function hide_show_suggestion(field, on_off) {
    var elem = document.getElementById('search_suggestion_' + field);

    if (on_off === false && suggestionHideIt[field] === true) {
        elem.style.display = 'none';
        document.getElementById('buf_' + field).value = '';

        clearInterval(suggestionTimers[field]);
        suggestionTimers[field] = null;
        suggestionHideIt[field] = false;
    } else {
        elem.style.display = 'block';
    }
}

function suggestion_timer(field, start) {
    if (start) {
        if (suggestionTimers[field.id] == null) {
            check_suggestion(field.id);

            document.getElementById('buf_' + field.id).value = field.value;
            suggestionTimers[field.id] = setInterval('check_suggestion("' + field.id + '");', 700);
        }
        suggestionHideIt[field.id] = false;
    } else {
        suggestionHideIt[field.id] = true;
        setTimeout('hide_show_suggestion("' + field.id + '", false);', 250);
    }
}

function focus_suggestion(field, focused) {
    suggestionHideIt[field] = !(focused);

    if (focused === false) {
        setTimeout('hide_show_suggestion("' + field + '", false);', 250);
    }
}

function pick_suggestion(keywords) {
    // prevent suggestions from being made
    document.getElementById('buf_searchInput').value = keywords;
    document.getElementById('searchInput').value = keywords;

    // hide the suggestions list
    document.getElementById('search_suggestion_searchInput').style.display = 'none';

    // preform a search by submitting form
    document.getElementById('searchInput').form.submit();
}

function handle_suggestion_key(e) {
    if (window.event) {
        keynum = e.keyCode;
    } else if (e.which) {
        keynum = e.which;
    }

    if (keynum == 27) { // escape key
        document.getElementById('search_suggestion_searchInput').style.display = 'none';
    } else if (keynum == 40) { // down key
        select_suggestion('search_suggestion_searchInput', 1);
    } else if (keynum == 38) { // up key
        select_suggestion('search_suggestion_searchInput', -1);
    } else if (keynum == 13) { // enter key
        var elem = document.getElementById('search_suggestion_searchInput');
        var list = elem.childNodes;
        for (var i = 0; i < list.length; i++) {
            if (list[i].className == 'search_suggestion' && list[i].style.backgroundColor != '') {
                document.getElementById('searchInput').value = list[i].getAttribute('value');
            }
        }
    }
}

function select_suggestion(field, change) {

    var elem = document.getElementById(field);
    var list = elem.childNodes;

    var found = -1;
    var itemp = 0;
    for (var i = 0; i < list.length; i++) {
        if (list[i].className == 'search_suggestion') {
            if (list[i].style.backgroundColor != '') {
                found = i;
                break;
            }
            itemp++;
        }
    }

    if (found == -1 && change > 0) {
        for (var i = 0; i < list.length; i++) {
            if (list[i].className == 'search_suggestion') {
                list[i].style.backgroundColor = '#ffe640';
                elem.scrollTop = 0;
                return; // select the first item
            }
        }
    }

    for (var i = (found + change), j = 0; i >= 0 && i < list.length; i += change) {
        if (list[i].className == 'search_suggestion') {
            list[found].style.backgroundColor = '';
            list[i].style.backgroundColor = '#ffe640';
            elem.scrollTop = (itemp + change) * list[i].offsetHeight;
            return;
        }
    }
}