'use strict';

(function ($, lunr, database) {

var resultsContainer = $('#search-results')
var navigationContainer = $('#navigation')
var nothingFound = $('<li>Nothing found.</li>')
var searchQuery = $('#search-input')
database = database || {}

function createSearchStore(data) {
        var searchStore = lunr(function () {
                var self = this

                self.field('id');
                self.field('title', { boost: 10 });
                self.field('category');
                self.field('content');

                Object.keys(data).forEach(function (key) {
                        self.add({
                                id: key,
                                title: data[key].title,
                                category: data[key].category,
                                content: data[key].content
                        });
                })

        });

        return searchStore
}

function resultEntry(result) {
        var searchEntry = $('<li />')
        var searchLink = $('<a />')

        var categoryPath = result.url.split('/')
        categoryPath.shift()
        categoryPath.pop()

        searchEntry
                .append(searchLink)

        searchLink.attr('href', result.href)

        searchLink.text(result.title)

        return searchEntry
}

function displayResults(results) {
        resultsContainer.empty()

        if (results.length > 0) {
                results.map(function(entry) {
                        resultsContainer.append(resultEntry(entry))
                })
        } else {
                resultsContainer.append(nothingFound)
        }

        navigationContainer.hide()
        resultsContainer.show()
}

function hideResults() {
        resultsContainer.hide()
        navigationContainer.show()
}

function searchStore(store, data) {
        return function (term) {
                var results = store.search(term)

                return results.map(function (result) {
                        return data[result.ref]
                })
        }
}

function queryChange(display, hide, search) {
        return function (event) {
                var value = event.srcElement.value

                if (value.length === 0) {
                        hide()
                }

                if (value.length > 2) {
                        display(search(value))
                }
        }
}

function keyboardControls(hide) {
        return function (event) {
                switch (event.keyCode) {
                        case 27:
                                hide()
                        break
                }
        }
}

function getQueryVariable(variable) {
        var query = window.location.search.substring(1);
        var vars = query.split('&')

        for (var i = 0; i < vars.length; i++) {
                var pair = vars[i].split('=')

                if (pair[0] === variable) {
                        return decodeURIComponent(pair[1].replace(/\+/g, '%20'))
                }
        }
}

var search = searchStore(createSearchStore(database), database)
var searchTerm = getQueryVariable('query')

if (searchTerm) {
        displayResults(search(searchTerm))
        searchQuery.attr('value', searchTerm)
}

searchQuery.on('input', queryChange(displayResults, hideResults, search))
$(document).on('keyup', keyboardControls(hideResults))

})(Zepto, lunr, window.database)