﻿var blankValue = "Company, Industry or Booth";
var lastFilterExrpression;

function initializeFilter() {
    setFilter('', true);

    $filterinput.focus(function() {
        this.focused = true;
        setFilterInputText();
    }).blur(function() {
        this.focused = false;
        setFilterInputText();
    }).keydown(function(e) {
        if (e.keyCode == 13) { e.preventDefault(); }
    }).keyup(function(e) {
        // we need to pre-evaluate this textbox value
        var value = getFilterValue();
        window.setTimeout(function() { applyFilterDelayed(value); }, 300);
        window.setTimeout(function() { logSearchDelayed(value); }, 3000);
        setFilterRemove();
    }).change(function(e) {
        applyFilter();
        setFilterRemove();
    });
}

function getFilterValue() {
    return $filterinput.val() == blankValue ? "" : $filterinput.val();
}

function setFilterInputText() {
    var value = getFilterValue();
    if (!value && !$filterinput.get(0).focused)
        $filterinput.addClass("blank").val(blankValue);
    else
        $filterinput.val(value).removeClass("blank");
}

function setFilter(value, dontApply) {
    if (value == null) value = getFilterValue();
    $filterinput.val(value);
    setFilterRemove();
    setFilterInputText();
    if (!dontApply) { applyFilter(); logSearchDelayed(value); }
}

function setFilterRemove() {
    $filterclear.css("visibility", getFilterValue() ? "visible" : "hidden");
}

function applyFilterDelayed(value) {
    if (value == getFilterValue()) {
        applyFilter();
    }
}

var lastLoggedSearch;

function logSearchDelayed(value) {
    if (value == getFilterValue() && lastLoggedSearch != value) {
        lastLoggedSearch = value;
        logEvent("search", value);
    }
}

function applyFilter() {
    var value = getFilterValue();
    log("Filtering by " + value);

    var text = $.trim(value.toLowerCase()).replace(/\./g, "").replace(/[^a-z0-9\.]/g, " ");
    var expression;
    var force = false;
    if (text == "selected") {
        expression = ".fav";
        force = true;
    } else {
        expression = "";
        var parts = text.split(" ");
        for (var i = 0; i < parts.length; i++) {
            var part = parts[i];
            // avoid using short expressions
            if (part.length > 2) expression += "[value*=" + part + "]";
        }
        expression = ":has(input" + expression + ")";
    }

    if (expression != lastFilterExrpression || force) {
        lastFilterExrpression = expression;
        $("#companies-empty").hide();
        if (text.length > 0) {
            $("#companies-list div").hide();
            $(".bo div.l").removeClass("l").addClass("n");

            var empty = $("#companies-list div" + expression).show().
                each(function() { $("." + this.id).removeClass("n").addClass("l"); }).length == 0;
            if (empty) $("#companies-empty").show();
        } else {
            $("#companies-list div").show();
            $(".bo div.g").addClass("l").removeClass("n");
        }

        centerMap();
        var titleText;
        if (text == "selected")
            titleText = "Selected";
        else if (expression.length > 0)
            titleText = "Filtered by: " + $('<div/>').text(value).html();
        else
            titleText = "";

        $("#print-title").text(titleText);
    }
}