holderdeord/hdo-site

View on GitHub
app/assets/javascripts/searchAutocomplete.js

Summary

Maintainability
A
1 hr
Test Coverage
/*global HDO, cull */

(function (H, $, c) {

  HDO.searchAutocomplete = {
    create: function (params) {
      var instance = Object.create(this);
      instance.server = params.server;
      instance.throttler = HDO.throttler.create(150);
      instance.nameMap = {};
      return instance;
    },

    search: function (query, process) {
      var self = this;      
      return this.throttler.queue(query, function (q) {
        self.contactServer(q, function (data) {          
          var result = [];
          if (data.issue) {
            result.push(c.map(function(i) { return self.parseIssue(i); }, data.issue));
          }
          if (data.representative) {
            result.push(c.map(function(r) { return self.parseRepresentative(r); }, data.representative));
          }
          process(cull.flatten(result));
        });
      });
    },

    contactServer: function (query, callback) {
      this.server.search(query, callback);
    },

    parseIssue: function (issue) {
      var label = issue.title;
      this.nameMap[label] = {
        url: issue.url,
        img: issue.img_src
      };
      return label;
    },

    parseRepresentative: function (rep) {
      var label = rep.full_name + " (" + rep.party_name + ")";
      this.nameMap[label] = {
        url: rep.url,
        img: rep.img_src
      };
      return label;
    },

    getUrl: function (label) {
      return this.nameMap[label].url;
    },

    getImgSrc: function (label) {
      return this.nameMap[label].img;
    },

    redirect: function (label) {
      H.redirect(this.getUrl(label));
      return label;
    }
  };

  H.setupSearchWidget = function () {
    var input, autocomplete;

    input = document.getElementById("appendedInputButton");

    autocomplete = H.searchAutocomplete.create({
      server: H.searchServerFacade.create()
    });

    $(input).typeahead({
      source: autocomplete.search.bind(autocomplete),
      updater: autocomplete.redirect.bind(autocomplete),
      items: 15,
      minLength: 3,
      matcher: function () { return true; },
      highlighter: function (item) {
        return "<img src='" + autocomplete.getImgSrc(item) +
          "' width='24' height='24'>" + item;
      }
    });
  };

}(HDO, jQuery, cull));