2012-11-13 04:12:17 +00:00
|
|
|
(function(context,$) {
|
|
|
|
|
|
2013-02-14 07:48:01 +00:00
|
|
|
// NOTE - not currently used. Was hooked up in header before
|
|
|
|
|
// Jeff's new mockups moved search to sidebar and made search results
|
|
|
|
|
// a full-blown screen. This should probably be removed, along with
|
|
|
|
|
// any HTML that accompanies it. Tests too.
|
|
|
|
|
|
2012-12-07 00:57:01 +00:00
|
|
|
"use strict";
|
|
|
|
|
|
2012-11-13 04:12:17 +00:00
|
|
|
context.JK = context.JK || {};
|
|
|
|
|
context.JK.Searcher = function(app) {
|
|
|
|
|
var logger = context.JK.logger;
|
|
|
|
|
|
|
|
|
|
var searchSectionTemplate;
|
|
|
|
|
var searchItemTemplate;
|
|
|
|
|
var noResultsTemplate;
|
2013-02-01 02:42:07 +00:00
|
|
|
var usernames = ['Brian', 'David'];
|
|
|
|
|
var userids = ['1', '2'];
|
2012-11-13 04:12:17 +00:00
|
|
|
|
|
|
|
|
function events() {
|
|
|
|
|
$('.searchtextinput').keyup(handleKeyup);
|
|
|
|
|
$('.searchtextinput').focus(function(evt) {
|
|
|
|
|
var searchVal = $(this).val();
|
|
|
|
|
search(searchVal);
|
|
|
|
|
});
|
|
|
|
|
$('.searchtextinput').blur(hideSearchResults);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function templates() {
|
|
|
|
|
searchSectionTemplate = $('#template-search-section').html();
|
|
|
|
|
searchItemTemplate = $('#template-search-item').html();
|
|
|
|
|
noResultsTemplate = $('#template-search-noresults').html();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function hideSearchResults() {
|
|
|
|
|
$('.searchresults').hide();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function showSearchResults() {
|
|
|
|
|
$('.searchresults').show();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function handleKeyup(evt) {
|
|
|
|
|
if (evt.which === 27) {
|
|
|
|
|
return hideSearchResults();
|
|
|
|
|
}
|
2012-12-07 00:57:01 +00:00
|
|
|
var searchVal = $(evt.currentTarget).val();
|
2012-11-13 04:12:17 +00:00
|
|
|
search(searchVal);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function search(query) {
|
|
|
|
|
if (query.length < 2) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
$.ajax({
|
|
|
|
|
type: "GET",
|
|
|
|
|
url: "/api/search?query=" + query,
|
|
|
|
|
success: searchResponse,
|
|
|
|
|
error: app.ajaxError
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function searchResponse(response) {
|
|
|
|
|
ensureResultsDiv();
|
|
|
|
|
updateResultsDiv(response);
|
|
|
|
|
positionResultsDiv();
|
|
|
|
|
showSearchResults();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function ensureResultsDiv() {
|
|
|
|
|
if ($('.searchresults').length === 0) {
|
2012-12-07 00:57:01 +00:00
|
|
|
var $searchresults = $('<div/>');
|
2012-11-13 04:12:17 +00:00
|
|
|
$searchresults.addClass('searchresults');
|
|
|
|
|
$searchresults.css({position:'absolute'});
|
|
|
|
|
$('body').append($searchresults);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function updateResultsDiv(searchResults) {
|
|
|
|
|
var sections = ['musicians', 'bands', 'fans', 'recordings'];
|
|
|
|
|
var fullHtml = '';
|
|
|
|
|
$.each(sections, function() {
|
|
|
|
|
fullHtml += getSectionHtml(this, searchResults);
|
|
|
|
|
});
|
|
|
|
|
if (fullHtml === '') {
|
|
|
|
|
fullHtml += getNoResultsMessage();
|
|
|
|
|
}
|
|
|
|
|
$('.searchresults').html(fullHtml);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function getNoResultsMessage() {
|
|
|
|
|
// No replacement needed at the moment.
|
|
|
|
|
return noResultsTemplate;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function getSectionHtml(section, searchResults) {
|
|
|
|
|
if (section in searchResults && searchResults[section].length === 0) {
|
|
|
|
|
return '';
|
|
|
|
|
}
|
|
|
|
|
var items = '';
|
|
|
|
|
$.each(searchResults[section], function() {
|
|
|
|
|
items += getItemHtml(this);
|
|
|
|
|
});
|
2012-12-07 00:57:01 +00:00
|
|
|
var html = context.JK.fillTemplate(
|
2012-11-13 04:12:17 +00:00
|
|
|
searchSectionTemplate,
|
|
|
|
|
{ section: section, items: items });
|
|
|
|
|
return html;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function getItemHtml(item) {
|
|
|
|
|
var replacements = {
|
|
|
|
|
id: item.id,
|
2015-10-16 19:01:18 +00:00
|
|
|
name: item.name,
|
2012-11-13 04:12:17 +00:00
|
|
|
image: item.photo_url,
|
|
|
|
|
subtext: item.location
|
|
|
|
|
};
|
2012-12-07 00:57:01 +00:00
|
|
|
return context.JK.fillTemplate(
|
2012-11-13 04:12:17 +00:00
|
|
|
searchItemTemplate, replacements);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function positionResultsDiv() {
|
|
|
|
|
var bodyOffset = $('body').offset();
|
|
|
|
|
var inputOffset = $('.searchtextinput').offset();
|
|
|
|
|
var inputHeight = $('.searchtextinput').outerHeight();
|
|
|
|
|
var resultsTop = bodyOffset.top + inputOffset.top + inputHeight;
|
|
|
|
|
var resultsLeft = bodyOffset.left + inputOffset.left;
|
|
|
|
|
$('.searchresults').css({
|
|
|
|
|
top: resultsTop + 'px',
|
|
|
|
|
left: resultsLeft + 'px'});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.initialize = function() {
|
|
|
|
|
events();
|
|
|
|
|
templates();
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
})(window,jQuery);
|