ging/social_stream

View on GitHub
base/app/assets/javascripts/social_stream/search_header.js

Summary

Maintainability
B
5 hrs
Test Coverage
//= require social_stream/callback

SocialStream.SearchHeader = (function(SS, $, undefined){
  var callback = new SS.Callback();

  var nav, mat, timestamp_query, new_query;
  var MIN_TIME_BETWEEN_QUERIES = 1200; // ms
  var WAITING_TIME_FOR_QUICK_SEARCH = 2000; // ms

  var initMat = function() {
    new_query = false;
    nav = $('.search-nav');
    $('input.search-query', nav).focus(focusMat);
    $('input.search-query', nav).on('input', searchQuery);

    timestamp_query = new Date().getTime();
    setInterval(searchIfDirty, WAITING_TIME_FOR_QUICK_SEARCH);

    mat = $('.mat', nav);
    $('div', mat).hide();
  };

  var searchIfDirty = function(){
    if(new_query){
      new_query = false;
      searchQuery();
    }
  };

  var searchQuery = function() {  
    var dif =  new Date().getTime() - timestamp_query;
    if(dif < MIN_TIME_BETWEEN_QUERIES){
      new_query = true;
      return;
    }    

    var input = $('input.search-query', nav);
    var mat = $('.mat', nav);
    var minQuery = input.attr('data-min_query');

    $('div', mat).hide();

    if (input.val().length < minQuery) {
      $('.query_too_short', mat).show();
      return;
    }

    $('.loading', mat).show();

    timestamp_query = new Date().getTime();

    $.ajax({
      url: $('.navbar-search').attr('action'),
      data: {
        q: input.val(),
        mode: 'quick'
      },
      dataType: 'html',
      type: 'GET',
      success: function(data) {
        $('.loading', mat).hide();

        if (data.length > 1) {
          $('.results', mat).html(data).show();
        } else {
          $('.no_results', mat).show();
        }
      }
    });
  };

  var focusMat = function() {
    mat.show();

    $('html').on('click.close-search-header', closeMat);
  };

  var closeMat = function(e) {
    eventMat = $(e.target).closest('.quick-search');
    
    if (eventMat.length > 0) {
      return;
    }

    mat.hide();

    $('html').off('click.close-search-header');
  };
  
  callback.register('show', initMat);

  return callback.extend({
  });
}) (SocialStream, jQuery);