/*

* 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
};

})();