/** * Created by SpeedProg on 05.04.2015. */ /* Takes a prefix, query typeahead callback, Bloodhound typeahead adapter and returns the completions it gets from the bloodhound engine prefixed. */ function prefixed_source(prefix, query, cb, bh_adapter) { bh_adapter(query, function(retArray){ var matches = []; for (var i = 0; i < retArray.length; i++) { var obj = {name : prefix + retArray[i].name}; matches.push(obj); } cb(matches); }); } var authors = new Bloodhound({ name: 'authors', datumTokenizer: function(datum) { return [datum.name]; }, queryTokenizer: Bloodhound.tokenizers.whitespace, remote: { url: '/get_authors_json?q=%QUERY' } }); function authors_source(query, cb) { var bh_adapter = authors.ttAdapter(); var tokens = query.split("&"); var current_author = tokens[tokens.length-1].trim(); tokens.splice(tokens.length-1, 1); // remove last element var prefix = ""; for (var i = 0; i < tokens.length; i++) { var author = tokens[i].trim(); prefix += author + " & "; } prefixed_source(prefix, current_author, cb, bh_adapter); } var promise = authors.initialize(); promise.done(function(){ $("#bookAuthor").typeahead( { highlight: true, minLength: 1, hint: true }, { name: 'authors', displayKey: 'name', source: authors_source } ) }); var series = new Bloodhound({ name: 'series', datumTokenizer: function(datum) { return [datum.name]; }, queryTokenizer: function(query) { return [query]; }, remote: { url: '/get_series_json?q=', replace: function(url, query) { url_query = url+encodeURIComponent(query); return url_query; } } }); var promise = series.initialize(); promise.done(function(){ $("#series").typeahead( { highlight: true, minLength: 0, hint: true }, { name: 'series', displayKey: 'name', source: series.ttAdapter() } ) }); var tags = new Bloodhound({ name: 'tags', datumTokenizer: function(datum) { return [datum.name]; }, queryTokenizer: function(query) { tokens = query.split(","); tokens = [tokens[tokens.length-1].trim()]; return tokens }, remote: { url: '/get_tags_json?q=%QUERY' } }); function tag_source(query, cb) { var bh_adapter = tags.ttAdapter(); var tokens = query.split(","); var current_tag = tokens[tokens.length-1].trim(); tokens.splice(tokens.length-1, 1); // remove last element var prefix = ""; for (var i = 0; i < tokens.length; i++) { var tag = tokens[i].trim(); prefix += tag + ", "; } prefixed_source(prefix, current_tag, cb, bh_adapter); } var promise = tags.initialize(); promise.done(function(){ $("#tags").typeahead( { highlight: true, minLength: 0, hint: true }, { name: 'tags', displayKey: 'name', source: tag_source } ) }); var languages = new Bloodhound({ name: 'languages', datumTokenizer: function(datum) { return [datum.name]; }, queryTokenizer: function(query) { return [query]; }, remote: { url: '/get_languages_json?q=', replace: function(url, query) { url_query = url+encodeURIComponent(query); return url_query; } } }); function language_source(query, cb) { var bh_adapter = languages.ttAdapter(); var tokens = query.split(","); var current_language = tokens[tokens.length-1].trim(); tokens.splice(tokens.length-1, 1); // remove last element var prefix = ""; for (var i = 0; i < tokens.length; i++) { var tag = tokens[i].trim(); prefix += tag + ", "; } prefixed_source(prefix, current_language, cb, bh_adapter); } var promise = languages.initialize(); promise.done(function(){ $("#languages").typeahead( { highlight: true, minLength: 0, hint: true }, { name: 'languages', displayKey: 'name', source: language_source } ) });