/*
* Typeahead front-end configuration & setup */
jQuery(document).ready(function () {
//var bangs_prefetch_url = '/direct_searches/list'
// define the datasets for the typeahead
/*var bangs = new Dataset({
valuekey: 'value', prefetch: bangs_prefetch_url,
}).initialize(); */
var bestbets = new Bloodhound({
queryTokenizer: Bloodhound.tokenizers.whitespace, datumTokenizer: function (datum) { return datum.title.split(" "); }, sorter: function (a,b) { if (a.title.toLowerCase() < b.title.toLowerCase()) { return -1; } if (a.title.toLowerCase() > b.title.toLowerCase()) { return 1; } return 0; }, prefetch: '/typeahead?searcher=best_bets',
});
var titles = new Bloodhound({
queryTokenizer: Bloodhound.tokenizers.whitespace, datumTokenizer: Bloodhound.tokenizers.whitespace, remote: { url: '//autosuggest.trln.org/suggestservice/?source=ncsu&index=title&q=' + '%QUERY', prepare: function(query, settings) { settings.dataType = 'jsonp'; settings.url = settings.url.replace('%QUERY', query); return settings; }, filter: function(response){ return response.response.docs; }, rateLimitWait: 100, },
});
var spaces = new Bloodhound({
queryTokenizer: Bloodhound.tokenizers.whitespace, datumTokenizer: function (datum) { return datum.name.split(" "); }, valueKey: 'name', prefetch: '/typeahead?searcher=ncsu_spaces',
});
var faqs = new Bloodhound({
queryTokenizer: Bloodhound.tokenizers.whitespace, datumTokenizer: function (datum) { return datum.question.split(" "); }, valueKey: 'question', prefetch: '/typeahead?searcher=faq',
});
// pre-compile the suggestion templates
var bangs_template = Handlebars.compile([
'<div class="row">', '<div class="small-12 columns bestbet-container">', '<span class="suggestion-title">{{value}}</span>', '{{#if desc}}<p class="bestbet-description">{{desc}}</p>{{/if}}', '</div>', '</div>',
].join(''));
var bestbets_template = Handlebars.compile([
'<div class="row">', '<div class="small-12 columns bestbet-container">', '<span class="suggestion-title">{{title}}</span>', '{{#if description}}<p class="bestbet-description">{{description}}</p>{{/if}}', '</div>', '</div>',
].join(''));
var spaces_template = Handlebars.compile([
'<div class="row space-container">', '<div class="large-2 medium-2 small-2 columns">', '{{#if image_url}}<img class="space-image" src="{{image_url}}" width="100%" />', '{{else}}<img src="//www.lib.ncsu.edu/sites/all/themes/ncsulib_foundation/images/greybox.png" class="space-image" alt="" >', '{{/if}}', '</div>', '<div class="large-10 medium-10 small-10 columns">', '<span class="suggestion-title">{{name}}</span>', '</div>', '</div>'
].join(''));
var faqs_template = Handlebars.compile('<span class=“suggestion-title”>{{question}}</span>');
// Initialize typeahead
jQuery('.quicksearch-typeahead').typeahead(
{ // Don't show a hint in the search bar hint: false, // Wait for at least 3 characters input before making suggestions minLength: 3, }, // Best Bets config { name: 'bestbets', source: bestbets, display: 'title', limit: 2, templates: { header: '<div class="cat-header"><span>Best Bets</span></div>', suggestion: bestbets_template, footer: '<hr>' } }, // FAQs { name: 'faqs', source: faqs, display: 'question', limit: 3, templates: { header: '<div class="cat-header"><span>FAQs</span></div>', suggestion: faqs_template, footer: '<hr>' } }, // Search Suggestions / Titles { name: 'titles', source: titles, limit: 5, display: 'ac', templates: { header: '<div class="cat-header"><span>Search Suggestions</span></div>', footer: '<hr>' } }, // Spaces { name: 'spaces', source: spaces, display: 'name', limit: 1, templates: { header: '<div class="cat-header"><span>Spaces</span></div>', suggestion: spaces_template, footer: '<div class="space-footer"><a href="http://www.lib.ncsu.edu/reservearoom">See more spaces...</a></div>', } }
);
typeaheadUtility.listenForTypeaheadClicks(); });
/*
* Typeahead utility functions, currently handles: known vs. unknown item clicks, FAQ URL construction, logging. */
var typeaheadUtility = (function () {
var environment = 'production'; //development or production function listenForTypeaheadClicks() { jQuery('.quicksearch-typeahead').on('typeahead:selected', function (e, datum, dataset) { var link = { href: handleTypeaheadClick(datum, dataset) }; var eventValuesDefined = { category: 'typeahead-' + dataset, action: datum.value, label: window.location.href } sendEventData(eventValuesDefined, link); setTimeout(function() { document.location.href = link.href; }, 200); }); } function sendEventData (eventValues, link) { if (environment == 'development') { // console.log('click_tracking', [eventValues.category, eventValues.action, eventValues.label]); jQuery.when(logEventToDatabase(eventValues)).then(function () { if (link !== '') { document.location.href = link.href; } }); } else { jQuery.when(logEventToDatabase(eventValues)).then(function () { sendDataToGoogleAnalytics(eventValues, link) }); } } function sendDataToGoogleAnalytics (eventValues, link) { _gaq.push(['_set','hitCallback',function() { if (link !== '') { document.location = link; } }]); // _gaq.push(['_trackEvent', eventValues.category, eventValues.action, eventValues.label]); ga('send', eventValues.category, eventValues.action, eventValues.label); } function logEventToDatabase(eventValues) { //TODO: have rails replace URL with current QS root var url = '/log_event'; return jQuery.ajax({ url: url, data: { category: eventValues.category, event_action: eventValues.action, label: eventValues.label }, jsonp: 'callback', dataType: 'jsonp' }); } function handleTypeaheadClick(datum, dataset) { if (datum.url || datum.path) { return datum.url || datum.path; } else if (datum.question_id) { return "//www.lib.ncsu.edu/faq/faq.php?id=" + datum.question_id; } else { // Fire off a search when an unknown element is selected return '/?q=' + datum.ac; } } return { listenForTypeaheadClicks: listenForTypeaheadClicks };
})();