﻿var xhrQuickSearch = null;
var quickSearchCache = {};
var dvQuickSearchId = "dvQuickSearch";

// Função responsável pela realização da requisição AJAX da busca rápida
function doQuickSearchRequest(obj) {
    clearQuickSearchRequest();

    // Não processa a busca rápida caso o termo digitado tenha menos de 3 caracteres.
    if (!obj || !obj.value || obj.value.length < 3) {
        $('#' + dvQuickSearchId).hide();
        return;
    }

    // Tenta processar a busca da palavra usando qualquer resposta que haja em cache no Javascript
    // (Evita sobrecarga no servidor)
    if (processQuickSearchResponse(obj.value, null))
        return;

    // Efetiva a requisição AJAX da busca rápida
    xhrQuickSearch = $.ajax({
        type: "POST",
        url: "searchresults.aspx/QuickSearch",
        data: "{'dsKeyword':'" + obj.value + "'}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(msg) {
            if (msg)
                processQuickSearchResponse(msg.d.Keyword, msg.d.Results);
        },
        complete: function() {
            clearQuickSearchRequest();
        }
    });
}

// Função auxiliar, utilizada para cancelar e/ou limpar as requisições AJAX da busca rápida
// (Evita sobrecarga nos browsers devido a criação de muitas requisições AJAX durante a digitação no campo de busca)
function clearQuickSearchRequest() {
    if (xhrQuickSearch != null) {
        try {
            xhrQuickSearch.abort();
        }
        catch (e) { alert('erro'); }

        xhrQuickSearch = null;
    }
}

// Função responsável pelo processamento da resposta das requisições AJAX da busca rápida
function processQuickSearchResponse(dsKeyword, dsResults) {
    var txtKeyWord = document.getElementById(txtDsKeyWordId);
    var posX = pegarPosicaoX(txtKeyWord) - 5;
    var posY = pegarPosicaoY(txtKeyWord) + 25;

    var dvQuickSearch = document.getElementById(dvQuickSearchId);

    // Não há um resultado na solicitação.
    // Tenta recuperar um resultado do cache.
    if (dsResults == null) {

        // Tenta recuperar o resultado do cache JS
        if (quickSearchCache[dsKeyword] === undefined)
            return false;   // Não há resultado em cache para esta keyword
        else {
            if (quickSearchCache[dsKeyword] === false) {
                // Há um cache para a keyword, porém o mesmo é um resultado vazio.
                // Some com a div de resultados.
                dvQuickSearch.style.display = "none";
            }
            else {
                // Há um cache com resultados.
                // Preenche, reposiciona e exibe a div de resultados.
                dvQuickSearch.innerHTML = quickSearchCache[dsKeyword];
                
                dvQuickSearch.style.top = posY + "px";
                dvQuickSearch.style.left = posX + "px";
                dvQuickSearch.style.display = "block";
            }

            // Retorna "true" uma vez que obtivemos resposta do cache.
            return true;
        }
    }

    // Caso haja algum resultado a ser exibido...
    if (dsResults && dsResults.length > 0) {
        // Processa o resultado da solicitação e armazena no cache.
        $('#dvQuickSearch').setTemplateURL('quicksearch.htm?r=3');
        $('#dvQuickSearch').processTemplate(dsResults);
        quickSearchCache[dsKeyword] = dvQuickSearch.innerHTML;

        // Reposiciona e exibe a div de resultados.
        dvQuickSearch.style.top = posY + "px";
        dvQuickSearch.style.left = posX + "px";
        dvQuickSearch.style.display = "block";
    }
    else {
        // Não há resultados. Cria um cache "vazio".
        quickSearchCache[dsKeyword] = false;
        dvQuickSearch.style.display = "none";
    }

    return true;
}

function hideQuickSearchResults() {
    window.setTimeout("document.getElementById('" + dvQuickSearchId + "').style.display = 'none';", 250);
}
